Sebastian Lackner : server: Add fallback to desktop keystate in get_key_state wineserver call.

Alexandre Julliard julliard at wine.codeweavers.com
Fri Jul 10 08:50:49 CDT 2015


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

Author: Sebastian Lackner <sebastian at fds-team.de>
Date:   Wed Jul  8 13:31:14 2015 +0200

server: Add fallback to desktop keystate in get_key_state wineserver call.

---

 dlls/user32/tests/input.c |  1 -
 server/queue.c            | 13 +++++++++++++
 2 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/dlls/user32/tests/input.c b/dlls/user32/tests/input.c
index 83f99ad..d662d6f 100644
--- a/dlls/user32/tests/input.c
+++ b/dlls/user32/tests/input.c
@@ -2437,7 +2437,6 @@ static DWORD WINAPI get_key_state_thread(void *arg)
     ok(result == WAIT_OBJECT_0, "WaitForSingleObject returned %u\n", result);
 
     result = GetKeyState('X');
-    todo_wine
     ok((result & 0x8000) || broken(!(result & 0x8000)), /* > Win 2003 */
        "expected that highest bit is set, got %x\n", result);
 
diff --git a/server/queue.c b/server/queue.c
index a19af02..13ca2b2 100644
--- a/server/queue.c
+++ b/server/queue.c
@@ -2851,13 +2851,26 @@ DECL_HANDLER(get_key_state)
     }
     else
     {
+        unsigned char *keystate;
         if (!(thread = get_thread_from_id( req->tid ))) return;
         if (thread->queue)
         {
             if (req->key >= 0) reply->state = thread->queue->input->keystate[req->key & 0xff];
             set_reply_data( thread->queue->input->keystate, size );
+            release_object( thread );
+            return;
         }
         release_object( thread );
+
+        /* fallback to desktop keystate */
+        if (!(desktop = get_thread_desktop( current, 0 ))) return;
+        if (req->key >= 0) reply->state = desktop->keystate[req->key & 0xff] & ~0x40;
+        if ((keystate = set_reply_data_size( size )))
+        {
+            unsigned int i;
+            for (i = 0; i < size; i++) keystate[i] = desktop->keystate[i] & ~0x40;
+        }
+        release_object( desktop );
     }
 }
 




More information about the wine-cvs mailing list