Hans Leidekker : wineandroid: Synchronize keyboard lock state.

Alexandre Julliard julliard at winehq.org
Fri Jun 9 12:43:58 CDT 2017


Module: wine
Branch: master
Commit: 4f4ede56e9f5d97029b37434badd77e80ece2e93
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=4f4ede56e9f5d97029b37434badd77e80ece2e93

Author: Hans Leidekker <hans at codeweavers.com>
Date:   Fri Jun  9 09:21:52 2017 +0200

wineandroid: Synchronize keyboard lock state.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/wineandroid.drv/android.h  |  2 ++
 dlls/wineandroid.drv/keyboard.c | 63 +++++++++++++++++++++++++++++++++++++++++
 dlls/wineandroid.drv/window.c   |  1 +
 3 files changed, 66 insertions(+)

diff --git a/dlls/wineandroid.drv/android.h b/dlls/wineandroid.drv/android.h
index ca026fa..0c3f35f 100644
--- a/dlls/wineandroid.drv/android.h
+++ b/dlls/wineandroid.drv/android.h
@@ -81,6 +81,7 @@ enum android_window_messages
 
 extern HWND get_capture_window(void) DECLSPEC_HIDDEN;
 extern void init_monitors( int width, int height ) DECLSPEC_HIDDEN;
+extern void update_keyboard_lock_state( WORD vkey, UINT state ) DECLSPEC_HIDDEN;
 
 /* JNI entry points */
 extern void desktop_changed( JNIEnv *env, jobject obj, jint width, jint height ) DECLSPEC_HIDDEN;
@@ -125,6 +126,7 @@ union event_data
     {
         enum event_type type;
         HWND            hwnd;
+        UINT            lock_state;
         INPUT           input;
     } kbd;
 };
diff --git a/dlls/wineandroid.drv/keyboard.c b/dlls/wineandroid.drv/keyboard.c
index 741b76a..e6e1d02 100644
--- a/dlls/wineandroid.drv/keyboard.c
+++ b/dlls/wineandroid.drv/keyboard.c
@@ -33,6 +33,7 @@
 
 #include "android.h"
 #include "wine/unicode.h"
+#include "wine/server.h"
 #include "wine/debug.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(keyboard);
@@ -653,6 +654,67 @@ static const char* vkey_to_name( UINT vkey )
     return NULL;
 }
 
+static BOOL get_async_key_state( BYTE state[256] )
+{
+    BOOL ret;
+
+    SERVER_START_REQ( get_key_state )
+    {
+        req->tid = 0;
+        req->key = -1;
+        wine_server_set_reply( req, state, 256 );
+        ret = !wine_server_call( req );
+    }
+    SERVER_END_REQ;
+    return ret;
+}
+
+static void send_keyboard_input( HWND hwnd, WORD vkey, WORD scan, DWORD flags )
+{
+    INPUT input;
+
+    input.type             = INPUT_KEYBOARD;
+    input.u.ki.wVk         = vkey;
+    input.u.ki.wScan       = scan;
+    input.u.ki.dwFlags     = flags;
+    input.u.ki.time        = 0;
+    input.u.ki.dwExtraInfo = 0;
+
+    __wine_send_input( hwnd, &input );
+}
+
+/***********************************************************************
+ *           update_keyboard_lock_state
+ */
+void update_keyboard_lock_state( WORD vkey, UINT state )
+{
+    BYTE keystate[256];
+
+    if (!get_async_key_state( keystate )) return;
+
+    if (!(keystate[VK_CAPITAL] & 0x01) != !(state & AMETA_CAPS_LOCK_ON) && vkey != VK_CAPITAL)
+    {
+        TRACE( "adjusting CapsLock state (%02x)\n", keystate[VK_CAPITAL] );
+        send_keyboard_input( 0, VK_CAPITAL, 0x3a, 0 );
+        send_keyboard_input( 0, VK_CAPITAL, 0x3a, KEYEVENTF_KEYUP );
+    }
+
+    if (!(keystate[VK_NUMLOCK] & 0x01) != !(state & AMETA_NUM_LOCK_ON) && (vkey & 0xff) != VK_NUMLOCK)
+    {
+        TRACE( "adjusting NumLock state (%02x)\n", keystate[VK_NUMLOCK] );
+        send_keyboard_input( 0, VK_NUMLOCK, 0x45, KEYEVENTF_EXTENDEDKEY );
+        send_keyboard_input( 0, VK_NUMLOCK, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP );
+    }
+
+    if (!(keystate[VK_SCROLL] & 0x01) != !(state & AMETA_SCROLL_LOCK_ON) && vkey != VK_SCROLL)
+    {
+        TRACE( "adjusting ScrollLock state (%02x)\n", keystate[VK_SCROLL] );
+        send_keyboard_input( 0, VK_SCROLL, 0x46, 0 );
+        send_keyboard_input( 0, VK_SCROLL, 0x46, KEYEVENTF_KEYUP );
+    }
+}
+
+
 /***********************************************************************
  *           keyboard_event
  *
@@ -671,6 +733,7 @@ jboolean keyboard_event( JNIEnv *env, jobject obj, jint win, jint action, jint k
     }
     data.type = KEYBOARD_EVENT;
     data.kbd.hwnd = LongToHandle( win );
+    data.kbd.lock_state             = state;
     data.kbd.input.type             = INPUT_KEYBOARD;
     data.kbd.input.u.ki.wVk         = keycode_to_vkey[keycode];
     data.kbd.input.u.ki.wScan       = vkey_to_scancode[data.kbd.input.u.ki.wVk];
diff --git a/dlls/wineandroid.drv/window.c b/dlls/wineandroid.drv/window.c
index 2ddcdf1..33f2240 100644
--- a/dlls/wineandroid.drv/window.c
+++ b/dlls/wineandroid.drv/window.c
@@ -482,6 +482,7 @@ static int process_events( DWORD mask )
                 TRACE("KEYDOWN hwnd %p vkey %x '%c' scancode %x\n", event->data.kbd.hwnd,
                       event->data.kbd.input.u.ki.wVk, event->data.kbd.input.u.ki.wVk,
                       event->data.kbd.input.u.ki.wScan );
+            update_keyboard_lock_state( event->data.kbd.input.u.ki.wVk, event->data.kbd.lock_state );
             __wine_send_input( 0, &event->data.kbd.input );
             break;
 




More information about the wine-cvs mailing list