From 7e481d31b257b618ab5a34eb399900953885c9cc Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Mon, 26 May 2014 22:54:34 +0200 Subject: [PATCH] Now processing input messages in async thread. --- client/X11/xf_client.c | 44 ++++++++++++++++++++++++++---------------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/client/X11/xf_client.c b/client/X11/xf_client.c index de9509f1d..2decedd7f 100644 --- a/client/X11/xf_client.c +++ b/client/X11/xf_client.c @@ -1293,33 +1293,43 @@ void* xf_input_thread(void* arg) queue = freerdp_get_message_queue(instance, FREERDP_INPUT_MESSAGE_QUEUE); event[0] = CreateFileDescriptorEvent(NULL, FALSE, FALSE, xfc->xfds); event[1] = MessageQueue_Event(queue); - while(WaitForMultipleObjects(2, event, FALSE, INFINITE) == WAIT_OBJECT_0) + while(TRUE) { - do + DWORD ev = WaitForMultipleObjects(2, event, FALSE, INFINITE); + + if (ev == WAIT_OBJECT_0) { - xf_lock_x11(xfc, FALSE); - - pending_status = XPending(xfc->display); - - xf_unlock_x11(xfc, FALSE); - - if (pending_status) + do { xf_lock_x11(xfc, FALSE); - ZeroMemory(&xevent, sizeof(xevent)); - XNextEvent(xfc->display, &xevent); - process_status = xf_event_process(instance, &xevent); + pending_status = XPending(xfc->display); xf_unlock_x11(xfc, FALSE); - if (!process_status) - break; + if (pending_status) + { + xf_lock_x11(xfc, FALSE); + + ZeroMemory(&xevent, sizeof(xevent)); + XNextEvent(xfc->display, &xevent); + process_status = xf_event_process(instance, &xevent); + + xf_unlock_x11(xfc, FALSE); + + if (!process_status) + break; + } } + while(pending_status && WaitForSingleObject(event[1], 0) != WAIT_OBJECT_0); + if(!process_status) + break; + } + else if (ev == WAIT_OBJECT_0 + 1) + { + if (!freerdp_message_queue_process_pending_messages(instance, FREERDP_INPUT_MESSAGE_QUEUE)) + break; } - while(pending_status && WaitForSingleObject(event[1], 0) != WAIT_OBJECT_0); - if(!process_status) - break; } MessageQueue_PostQuit(queue, 0);