Sebastian Lackner : server: Add fallback to desktop keystate in get_key_state wineserver call.
Module: wine Branch: master Commit: 8723d3455eb78fb0321a94970b2b8f39262f65d3 URL: http://source.winehq.org/git/wine.git/?a=commit;h=8723d3455eb78fb0321a94970b... Author: Sebastian Lackner <sebastian(a)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 ); } }
participants (1)
-
Alexandre Julliard