Moved common async input handling to core library.

This commit is contained in:
Armin Novak 2016-09-13 09:53:16 +02:00
parent b8b84473a3
commit f2d7766db6
7 changed files with 173 additions and 222 deletions

View File

@ -4,7 +4,7 @@ buildscript {
jcenter() jcenter()
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:2.1.2' classpath 'com.android.tools.build:gradle:2.1.3'
} }
} }

View File

@ -1,6 +1,6 @@
#Wed Jul 06 13:01:23 CEST 2016 #Mon Sep 12 15:54:49 CEST 2016
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip

View File

@ -555,13 +555,6 @@ static int android_freerdp_run(freerdp* instance)
if (async_input) if (async_input)
{ {
if (!(inputEvent = freerdp_get_message_queue_event_handle(instance,
FREERDP_INPUT_MESSAGE_QUEUE)))
{
WLog_ERR(TAG, "async input: failed to get input event handle");
goto disconnect;
}
if (!(inputThread = CreateThread(NULL, 0, if (!(inputThread = CreateThread(NULL, 0,
(LPTHREAD_START_ROUTINE) jni_input_thread, instance, 0, NULL))) (LPTHREAD_START_ROUTINE) jni_input_thread, instance, 0, NULL)))
{ {
@ -576,10 +569,11 @@ static int android_freerdp_run(freerdp* instance)
{ {
DWORD tmp; DWORD tmp;
count = 0; count = 0;
handles[count++] = inputEvent;
if (inputThread) if (inputThread)
handles[count++] = inputThread; handles[count++] = inputThread;
else
handles[count++] = inputEvent;
tmp = freerdp_get_event_handles(context, &handles[count], 64 - count); tmp = freerdp_get_event_handles(context, &handles[count], 64 - count);
@ -622,18 +616,6 @@ static int android_freerdp_run(freerdp* instance)
break; break;
} }
} }
else if (inputEvent)
{
if (WaitForSingleObject(inputEvent, 0) == WAIT_OBJECT_0)
{
if (!freerdp_message_queue_process_pending_messages(instance,
FREERDP_INPUT_MESSAGE_QUEUE))
{
WLog_INFO(TAG, "User Disconnect");
break;
}
}
}
} }
disconnect: disconnect:
@ -641,15 +623,7 @@ disconnect:
if (async_input && inputThread) if (async_input && inputThread)
{ {
wMessageQueue* input_queue = freerdp_get_message_queue(instance,
FREERDP_INPUT_MESSAGE_QUEUE);
if (input_queue)
{
if (MessageQueue_PostQuit(input_queue, 0))
WaitForSingleObject(inputThread, INFINITE); WaitForSingleObject(inputThread, INFINITE);
}
CloseHandle(inputThread); CloseHandle(inputThread);
} }

View File

@ -1315,7 +1315,7 @@ static void* xf_input_thread(void* arg)
{ {
DWORD status; DWORD status;
DWORD nCount; DWORD nCount;
HANDLE events[2]; HANDLE events[3];
XEvent xevent; XEvent xevent;
wMessage msg; wMessage msg;
wMessageQueue* queue; wMessageQueue* queue;
@ -1327,6 +1327,7 @@ static void* xf_input_thread(void* arg)
nCount = 0; nCount = 0;
events[nCount++] = MessageQueue_Event(queue); events[nCount++] = MessageQueue_Event(queue);
events[nCount++] = xfc->x11event; events[nCount++] = xfc->x11event;
events[nCount++] = instance->context->abortEvent;
while (1) while (1)
{ {
@ -1366,6 +1367,11 @@ static void* xf_input_thread(void* arg)
if (!process_status) if (!process_status)
break; break;
} }
if (WaitForSingleObject(events[2], 0) == WAIT_OBJECT_0)
{
break;
}
} }
MessageQueue_PostQuit(queue, 0); MessageQueue_PostQuit(queue, 0);
@ -1408,7 +1414,7 @@ static BOOL xf_auto_reconnect(freerdp* instance)
if (freerdp_reconnect(instance)) if (freerdp_reconnect(instance))
{ {
xfc->disconnect = FALSE; freerdp_abort_connect(instance);
return TRUE; return TRUE;
} }
@ -1485,17 +1491,10 @@ static void* xf_client_thread(void* param)
if (!settings->AsyncInput) if (!settings->AsyncInput)
{ {
inputEvent = xfc->x11event; inputEvent = xfc->x11event;
handles[0] = inputEvent;
} }
else else
{ {
if (!(inputEvent = freerdp_get_message_queue_event_handle(instance,
FREERDP_INPUT_MESSAGE_QUEUE)))
{
WLog_ERR(TAG, "async input: failed to get input event handle");
exit_code = XF_EXIT_UNKNOWN;
goto disconnect;
}
if (!(inputThread = CreateThread(NULL, 0, if (!(inputThread = CreateThread(NULL, 0,
(LPTHREAD_START_ROUTINE) xf_input_thread, instance, 0, NULL))) (LPTHREAD_START_ROUTINE) xf_input_thread, instance, 0, NULL)))
{ {
@ -1505,7 +1504,7 @@ static void* xf_client_thread(void* param)
} }
} }
while (!xfc->disconnect && !freerdp_shall_disconnect(instance)) while (!freerdp_shall_disconnect(instance))
{ {
/* /*
* win8 and server 2k12 seem to have some timing issue/race condition * win8 and server 2k12 seem to have some timing issue/race condition
@ -1518,8 +1517,7 @@ static void* xf_client_thread(void* param)
xf_keyboard_focus_in(xfc); xf_keyboard_focus_in(xfc);
} }
nCount = 0; nCount = (settings->AsyncInput) ? 0 : 1;
handles[nCount++] = inputEvent;
if (!settings->AsyncTransport) if (!settings->AsyncTransport)
{ {
@ -1556,29 +1554,11 @@ static void* xf_client_thread(void* param)
break; break;
} }
} }
else
{
if (WaitForSingleObject(inputEvent, 0) == WAIT_OBJECT_0)
{
if (!freerdp_message_queue_process_pending_messages(instance,
FREERDP_INPUT_MESSAGE_QUEUE))
{
WLog_INFO(TAG, "User Disconnect");
xfc->disconnect = TRUE;
break;
}
}
}
} }
if (settings->AsyncInput) if (settings->AsyncInput)
{ {
wMessageQueue* inputQueue = freerdp_get_message_queue(instance,
FREERDP_INPUT_MESSAGE_QUEUE);
if (MessageQueue_PostQuit(inputQueue, 0))
WaitForSingleObject(inputThread, INFINITE); WaitForSingleObject(inputThread, INFINITE);
CloseHandle(inputThread); CloseHandle(inputThread);
} }
@ -1611,21 +1591,7 @@ DWORD xf_exit_code_from_disconnect_reason(DWORD reason)
static void xf_TerminateEventHandler(rdpContext* context, TerminateEventArgs* e) static void xf_TerminateEventHandler(rdpContext* context, TerminateEventArgs* e)
{ {
wMessageQueue* queue; freerdp_abort_connect(context->instance);
xfContext* xfc = (xfContext*) context;
if (context->settings->AsyncInput)
{
queue = freerdp_get_message_queue(context->instance,
FREERDP_INPUT_MESSAGE_QUEUE);
if (queue)
MessageQueue_PostQuit(queue, 0);
}
else
{
xfc->disconnect = TRUE;
}
} }
#ifdef WITH_XRENDER #ifdef WITH_XRENDER
@ -1699,8 +1665,6 @@ static int xfreerdp_client_start(rdpContext* context)
return -1; return -1;
} }
xfc->disconnect = FALSE;
if (!(xfc->thread = CreateThread(NULL, 0, if (!(xfc->thread = CreateThread(NULL, 0,
(LPTHREAD_START_ROUTINE) xf_client_thread, (LPTHREAD_START_ROUTINE) xf_client_thread,
context->instance, 0, NULL))) context->instance, 0, NULL)))
@ -1716,19 +1680,7 @@ static int xfreerdp_client_stop(rdpContext* context)
{ {
xfContext* xfc = (xfContext*) context; xfContext* xfc = (xfContext*) context;
if (context->settings->AsyncInput) freerdp_abort_connect(context->instance);
{
wMessageQueue* queue;
queue = freerdp_get_message_queue(context->instance,
FREERDP_INPUT_MESSAGE_QUEUE);
if (queue)
MessageQueue_PostQuit(queue, 0);
}
else
{
xfc->disconnect = TRUE;
}
if (xfc->thread) if (xfc->thread)
{ {

View File

@ -645,7 +645,7 @@ static UINT xf_rail_server_execute_result(RailClientContext* context,
{ {
WLog_ERR(TAG, "RAIL exec error: execResult=%s NtError=0x%X\n", WLog_ERR(TAG, "RAIL exec error: execResult=%s NtError=0x%X\n",
error_code_names[execResult->execResult], execResult->rawResult); error_code_names[execResult->execResult], execResult->rawResult);
xfc->disconnect = TRUE; freerdp_abort_connect(xfc->context.instance);
} }
else else
{ {

View File

@ -125,7 +125,6 @@ struct xf_context
xfFullscreenMonitors fullscreenMonitors; xfFullscreenMonitors fullscreenMonitors;
int current_desktop; int current_desktop;
BOOL remote_app; BOOL remote_app;
BOOL disconnect;
HANDLE mutex; HANDLE mutex;
BOOL UseXThreads; BOOL UseXThreads;
BOOL cursorHidden; BOOL cursorHidden;

View File

@ -294,6 +294,14 @@ DWORD freerdp_get_event_handles(rdpContext* context, HANDLE* events,
else else
return 0; return 0;
if (context->settings->AsyncInput)
{
if (nCount >= count)
return 0;
events[nCount++] = freerdp_get_message_queue_event_handle(
context->instance, FREERDP_INPUT_MESSAGE_QUEUE);
}
return nCount; return nCount;
} }
@ -320,6 +328,16 @@ BOOL freerdp_check_event_handles(rdpContext* context)
return FALSE; return FALSE;
status = checkChannelErrorEvent(context); status = checkChannelErrorEvent(context);
if (!status)
return FALSE;
if (context->settings->AsyncInput)
{
status = freerdp_message_queue_process_pending_messages(
context->instance, FREERDP_INPUT_MESSAGE_QUEUE);
}
return status; return status;
} }
@ -404,6 +422,14 @@ BOOL freerdp_disconnect(freerdp* instance)
rdp_client_disconnect(rdp); rdp_client_disconnect(rdp);
update_post_disconnect(instance->update); update_post_disconnect(instance->update);
if (instance->settings->AsyncInput)
{
wMessageQueue* inputQueue = freerdp_get_message_queue(instance,
FREERDP_INPUT_MESSAGE_QUEUE);
MessageQueue_PostQuit(inputQueue, 0);
}
if (freerdp_channels_disconnect(instance->context->channels, if (freerdp_channels_disconnect(instance->context->channels,
instance) != CHANNEL_RC_OK) instance) != CHANNEL_RC_OK)
rc = FALSE; rc = FALSE;