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()
}
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
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
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 (!(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,
(LPTHREAD_START_ROUTINE) jni_input_thread, instance, 0, NULL)))
{
@ -576,10 +569,11 @@ static int android_freerdp_run(freerdp* instance)
{
DWORD tmp;
count = 0;
handles[count++] = inputEvent;
if (inputThread)
handles[count++] = inputThread;
else
handles[count++] = inputEvent;
tmp = freerdp_get_event_handles(context, &handles[count], 64 - count);
@ -622,18 +616,6 @@ static int android_freerdp_run(freerdp* instance)
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:
@ -641,15 +623,7 @@ disconnect:
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);
}

View File

@ -153,7 +153,7 @@ static void xf_draw_screen_scaled(xfContext* xfc, int x, int y, int w, int h)
{
XSetRegion(xfc->display, xfc->gc, reg1);
XFillRectangle(xfc->display, xfc->window->handle, xfc->gc, 0, 0,
xfc->window->width, xfc->window->height);
xfc->window->width, xfc->window->height);
XSetClipMask(xfc->display, xfc->gc, None);
}
@ -163,9 +163,9 @@ static void xf_draw_screen_scaled(xfContext* xfc, int x, int y, int w, int h)
picFormat = XRenderFindVisualFormat(xfc->display, xfc->visual);
pa.subwindow_mode = IncludeInferiors;
primaryPicture = XRenderCreatePicture(xfc->display, xfc->primary, picFormat,
CPSubwindowMode, &pa);
CPSubwindowMode, &pa);
windowPicture = XRenderCreatePicture(xfc->display, xfc->window->handle,
picFormat, CPSubwindowMode, &pa);
picFormat, CPSubwindowMode, &pa);
XRenderSetPictureFilter(xfc->display, primaryPicture, FilterBilinear, 0, 0);
transform.matrix[0][0] = XDoubleToFixed(xScalingFactor);
transform.matrix[0][1] = XDoubleToFixed(0.0);
@ -185,7 +185,7 @@ static void xf_draw_screen_scaled(xfContext* xfc, int x, int y, int w, int h)
h = ceil(y2 / yScalingFactor) + 1 - y;
XRenderSetPictureTransform(xfc->display, primaryPicture, &transform);
XRenderComposite(xfc->display, PictOpSrc, primaryPicture, 0, windowPicture, x,
y, 0, 0, xfc->offset_x + x, xfc->offset_y + y, w, h);
y, 0, 0, xfc->offset_x + x, xfc->offset_y + y, w, h);
XRenderFreePicture(xfc->display, primaryPicture);
XRenderFreePicture(xfc->display, windowPicture);
}
@ -223,7 +223,7 @@ void xf_draw_screen(xfContext* xfc, int x, int y, int w, int h)
#endif
XCopyArea(xfc->display, xfc->primary, xfc->window->handle, xfc->gc, x, y, w, h,
x, y);
x, y);
}
static BOOL xf_desktop_resize(rdpContext* context)
@ -238,9 +238,9 @@ static BOOL xf_desktop_resize(rdpContext* context)
XFreePixmap(xfc->display, xfc->primary);
if (!(xfc->primary = XCreatePixmap(
xfc->display, xfc->drawable,
settings->DesktopWidth,
settings->DesktopHeight, xfc->depth)))
xfc->display, xfc->drawable,
settings->DesktopWidth,
settings->DesktopHeight, xfc->depth)))
return FALSE;
if (same)
@ -260,7 +260,7 @@ static BOOL xf_desktop_resize(rdpContext* context)
if (!xfc->fullscreen)
{
xf_ResizeDesktopWindow(xfc, xfc->window, settings->DesktopWidth,
settings->DesktopHeight);
settings->DesktopHeight);
}
else
{
@ -279,7 +279,7 @@ static BOOL xf_desktop_resize(rdpContext* context)
XSetFillStyle(xfc->display, xfc->gc, FillSolid);
XSetForeground(xfc->display, xfc->gc, 0);
XFillRectangle(xfc->display, xfc->drawable, xfc->gc, 0, 0, xfc->window->width,
xfc->window->height);
xfc->window->height);
}
return TRUE;
@ -318,7 +318,7 @@ static BOOL xf_sw_end_paint(rdpContext* context)
xf_lock_x11(xfc, FALSE);
XPutImage(xfc->display, xfc->primary, xfc->gc, xfc->image,
x, y, x, y, w, h);
x, y, x, y, w, h);
xf_draw_screen(xfc, x, y, w, h);
xf_unlock_x11(xfc, FALSE);
}
@ -336,7 +336,7 @@ static BOOL xf_sw_end_paint(rdpContext* context)
w = cinvalid[i].w;
h = cinvalid[i].h;
XPutImage(xfc->display, xfc->primary, xfc->gc,
xfc->image, x, y, x, y, w, h);
xfc->image, x, y, x, y, w, h);
xf_draw_screen(xfc, x, y, w, h);
}
@ -375,8 +375,8 @@ static BOOL xf_sw_desktop_resize(rdpContext* context)
}
if (!(xfc->image = XCreateImage(xfc->display, xfc->visual, xfc->depth, ZPixmap,
0,
(char*) gdi->primary_buffer, gdi->width, gdi->height, xfc->scanline_pad, 0)))
0,
(char*) gdi->primary_buffer, gdi->width, gdi->height, xfc->scanline_pad, 0)))
{
goto out;
}
@ -540,15 +540,15 @@ BOOL xf_create_window(xfContext* xfc)
else if (settings->ServerPort == 3389)
{
windowTitle = malloc(1 + sizeof("FreeRDP: ") + strlen(
settings->ServerHostname));
settings->ServerHostname));
sprintf(windowTitle, "FreeRDP: %s", settings->ServerHostname);
}
else
{
windowTitle = malloc(1 + sizeof("FreeRDP: ") + strlen(settings->ServerHostname)
+ sizeof(":00000"));
+ sizeof(":00000"));
sprintf(windowTitle, "FreeRDP: %s:%i", settings->ServerHostname,
settings->ServerPort);
settings->ServerPort);
}
#ifdef WITH_XRENDER
@ -593,8 +593,8 @@ BOOL xf_create_window(xfContext* xfc)
if (!xfc->primary)
xfc->primary = XCreatePixmap(xfc->display, xfc->drawable,
settings->DesktopWidth,
settings->DesktopHeight, xfc->depth);
settings->DesktopWidth,
settings->DesktopHeight, xfc->depth);
xfc->drawing = xfc->primary;
@ -603,24 +603,24 @@ BOOL xf_create_window(xfContext* xfc)
if (!xfc->gc_mono)
xfc->gc_mono = XCreateGC(xfc->display, xfc->bitmap_mono, GCGraphicsExposures,
&gcv);
&gcv);
XSetFunction(xfc->display, xfc->gc, GXcopy);
XSetFillStyle(xfc->display, xfc->gc, FillSolid);
XSetForeground(xfc->display, xfc->gc, BlackPixelOfScreen(xfc->screen));
XFillRectangle(xfc->display, xfc->primary, xfc->gc, 0, 0,
settings->DesktopWidth,
settings->DesktopHeight);
settings->DesktopWidth,
settings->DesktopHeight);
XFlush(xfc->display);
if (!xfc->image)
{
rdpGdi* gdi = xfc->context.gdi;
xfc->image = XCreateImage(xfc->display, xfc->visual,
xfc->depth,
ZPixmap, 0, (char*) gdi->primary_buffer,
settings->DesktopWidth, settings->DesktopHeight,
xfc->scanline_pad, 0);
xfc->depth,
ZPixmap, 0, (char*) gdi->primary_buffer,
settings->DesktopWidth, settings->DesktopHeight,
xfc->scanline_pad, 0);
}
return TRUE;
@ -722,7 +722,7 @@ void xf_toggle_control(xfContext* xfc)
* @return 0 on success, otherwise a Win32 error code
*/
static UINT xf_encomsp_participant_created(EncomspClientContext* context,
ENCOMSP_PARTICIPANT_CREATED_PDU* participantCreated)
ENCOMSP_PARTICIPANT_CREATED_PDU* participantCreated)
{
return CHANNEL_RC_OK;
}
@ -811,14 +811,14 @@ static BOOL xf_get_pixmap_info(xfContext* xfc)
tpl.screen = xfc->screen_number;
if (XGetWindowAttributes(xfc->display, RootWindowOfScreen(xfc->screen),
&window_attributes) == 0)
&window_attributes) == 0)
{
WLog_ERR(TAG, "XGetWindowAttributes failed");
return FALSE;
}
vis = XGetVisualInfo(xfc->display, VisualClassMask | VisualScreenMask,
&tpl, &vi_count);
&tpl, &vi_count);
if (!vis)
{
@ -853,9 +853,9 @@ static BOOL xf_get_pixmap_info(xfContext* xfc)
/* calculate color shifts required for rdp order color conversion */
xf_calculate_color_shifts(vi->red_mask, &xfc->red_shift_r, &xfc->red_shift_l);
xf_calculate_color_shifts(vi->green_mask, &xfc->green_shift_r,
&xfc->green_shift_l);
&xfc->green_shift_l);
xf_calculate_color_shifts(vi->blue_mask, &xfc->blue_shift_r,
&xfc->blue_shift_l);
&xfc->blue_shift_l);
}
XFree(vis);
@ -894,7 +894,7 @@ static int _xf_error_handler(Display* d, XErrorEvent* ev)
}
static BOOL xf_play_sound(rdpContext* context,
const PLAY_SOUND_UPDATE* play_sound)
const PLAY_SOUND_UPDATE* play_sound)
{
xfContext* xfc = (xfContext*) context;
XkbBell(xfc->display, None, 100, 0);
@ -909,7 +909,7 @@ static void xf_check_extensions(xfContext* context)
if (XkbLibraryVersion(&xkb_major, &xkb_minor)
&& XkbQueryExtension(context->display, &xkb_opcode, &xkb_event,
&xkb_error, &xkb_major, &xkb_minor))
&xkb_error, &xkb_major, &xkb_minor))
{
context->xkbAvailable = TRUE;
}
@ -920,7 +920,7 @@ static void xf_check_extensions(xfContext* context)
int xrender_error_base;
if (XRenderQueryExtension(context->display, &xrender_event_base,
&xrender_error_base))
&xrender_error_base))
{
context->xrenderAvailable = TRUE;
}
@ -1064,7 +1064,7 @@ static void xf_button_map_init(xfContext* xfc)
else
{
WLog_ERR(TAG, "Mouse physical button %d is mapped to logical button %d",
physical, logical);
physical, logical);
}
}
}
@ -1117,9 +1117,9 @@ static BOOL xf_pre_connect(freerdp* instance)
settings->OrderSupport[NEG_ELLIPSE_SC_INDEX] = FALSE;
settings->OrderSupport[NEG_ELLIPSE_CB_INDEX] = FALSE;
PubSub_SubscribeChannelConnected(instance->context->pubSub,
(pChannelConnectedEventHandler) xf_OnChannelConnectedEventHandler);
(pChannelConnectedEventHandler) xf_OnChannelConnectedEventHandler);
PubSub_SubscribeChannelDisconnected(instance->context->pubSub,
(pChannelDisconnectedEventHandler) xf_OnChannelDisconnectedEventHandler);
(pChannelDisconnectedEventHandler) xf_OnChannelDisconnectedEventHandler);
if (!freerdp_client_load_addins(channels, instance->settings))
return FALSE;
@ -1315,7 +1315,7 @@ static void* xf_input_thread(void* arg)
{
DWORD status;
DWORD nCount;
HANDLE events[2];
HANDLE events[3];
XEvent xevent;
wMessage msg;
wMessageQueue* queue;
@ -1327,6 +1327,7 @@ static void* xf_input_thread(void* arg)
nCount = 0;
events[nCount++] = MessageQueue_Event(queue);
events[nCount++] = xfc->x11event;
events[nCount++] = instance->context->abortEvent;
while (1)
{
@ -1366,6 +1367,11 @@ static void* xf_input_thread(void* arg)
if (!process_status)
break;
}
if (WaitForSingleObject(events[2], 0) == WAIT_OBJECT_0)
{
break;
}
}
MessageQueue_PostQuit(queue, 0);
@ -1408,7 +1414,7 @@ static BOOL xf_auto_reconnect(freerdp* instance)
if (freerdp_reconnect(instance))
{
xfc->disconnect = FALSE;
freerdp_abort_connect(instance);
return TRUE;
}
@ -1485,19 +1491,12 @@ static void* xf_client_thread(void* param)
if (!settings->AsyncInput)
{
inputEvent = xfc->x11event;
handles[0] = inputEvent;
}
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,
(LPTHREAD_START_ROUTINE) xf_input_thread, instance, 0, NULL)))
(LPTHREAD_START_ROUTINE) xf_input_thread, instance, 0, NULL)))
{
WLog_ERR(TAG, "async input: failed to create input thread");
exit_code = XF_EXIT_UNKNOWN;
@ -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
@ -1518,8 +1517,7 @@ static void* xf_client_thread(void* param)
xf_keyboard_focus_in(xfc);
}
nCount = 0;
handles[nCount++] = inputEvent;
nCount = (settings->AsyncInput) ? 0 : 1;
if (!settings->AsyncTransport)
{
@ -1556,29 +1554,11 @@ static void* xf_client_thread(void* param)
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)
{
wMessageQueue* inputQueue = freerdp_get_message_queue(instance,
FREERDP_INPUT_MESSAGE_QUEUE);
if (MessageQueue_PostQuit(inputQueue, 0))
WaitForSingleObject(inputThread, INFINITE);
WaitForSingleObject(inputThread, INFINITE);
CloseHandle(inputThread);
}
@ -1594,7 +1574,7 @@ disconnect:
DWORD xf_exit_code_from_disconnect_reason(DWORD reason)
{
if (reason == 0 || (reason >= XF_EXIT_PARSE_ARGUMENTS
&& reason <= XF_EXIT_AUTH_FAILURE))
&& reason <= XF_EXIT_AUTH_FAILURE))
return reason;
/* License error set */
else if (reason >= 0x100 && reason <= 0x10A)
@ -1611,26 +1591,12 @@ DWORD xf_exit_code_from_disconnect_reason(DWORD reason)
static void xf_TerminateEventHandler(rdpContext* context, TerminateEventArgs* e)
{
wMessageQueue* queue;
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;
}
freerdp_abort_connect(context->instance);
}
#ifdef WITH_XRENDER
static void xf_ZoomingChangeEventHandler(rdpContext* context,
ZoomingChangeEventArgs* e)
ZoomingChangeEventArgs* e)
{
xfContext* xfc = (xfContext*) context;
rdpSettings* settings = context->settings;
@ -1655,7 +1621,7 @@ static void xf_ZoomingChangeEventHandler(rdpContext* context,
}
static void xf_PanningChangeEventHandler(rdpContext* context,
PanningChangeEventArgs* e)
PanningChangeEventArgs* e)
{
xfContext* xfc = (xfContext*) context;
rdpSettings* settings = context->settings;
@ -1695,15 +1661,13 @@ static int xfreerdp_client_start(rdpContext* context)
if (!settings->ServerHostname)
{
WLog_ERR(TAG,
"error: server hostname was not specified with /v:<server>[:port]");
"error: server hostname was not specified with /v:<server>[:port]");
return -1;
}
xfc->disconnect = FALSE;
if (!(xfc->thread = CreateThread(NULL, 0,
(LPTHREAD_START_ROUTINE) xf_client_thread,
context->instance, 0, NULL)))
(LPTHREAD_START_ROUTINE) xf_client_thread,
context->instance, 0, NULL)))
{
WLog_ERR(TAG, "failed to create client thread");
return -1;
@ -1716,19 +1680,7 @@ static int xfreerdp_client_stop(rdpContext* context)
{
xfContext* xfc = (xfContext*) context;
if (context->settings->AsyncInput)
{
wMessageQueue* queue;
queue = freerdp_get_message_queue(context->instance,
FREERDP_INPUT_MESSAGE_QUEUE);
if (queue)
MessageQueue_PostQuit(queue, 0);
}
else
{
xfc->disconnect = TRUE;
}
freerdp_abort_connect(context->instance);
if (xfc->thread)
{
@ -1759,12 +1711,12 @@ static BOOL xfreerdp_client_new(freerdp* instance, rdpContext* context)
instance->LogonErrorInfo = xf_logon_error_info;
settings = instance->settings;
PubSub_SubscribeTerminate(context->pubSub,
(pTerminateEventHandler) xf_TerminateEventHandler);
(pTerminateEventHandler) xf_TerminateEventHandler);
#ifdef WITH_XRENDER
PubSub_SubscribeZoomingChange(context->pubSub,
(pZoomingChangeEventHandler) xf_ZoomingChangeEventHandler);
(pZoomingChangeEventHandler) xf_ZoomingChangeEventHandler);
PubSub_SubscribePanningChange(context->pubSub,
(pPanningChangeEventHandler) xf_PanningChangeEventHandler);
(pPanningChangeEventHandler) xf_PanningChangeEventHandler);
#endif
xfc->UseXThreads = TRUE;
//xfc->debug = TRUE;
@ -1784,7 +1736,7 @@ static BOOL xfreerdp_client_new(freerdp* instance, rdpContext* context)
{
WLog_ERR(TAG, "failed to open display: %s", XDisplayName(NULL));
WLog_ERR(TAG,
"Please check that the $DISPLAY environment variable is properly set.");
"Please check that the $DISPLAY environment variable is properly set.");
goto fail_open_display;
}
@ -1799,39 +1751,39 @@ static BOOL xfreerdp_client_new(freerdp* instance, rdpContext* context)
xfc->_NET_WM_ICON = XInternAtom(xfc->display, "_NET_WM_ICON", False);
xfc->_MOTIF_WM_HINTS = XInternAtom(xfc->display, "_MOTIF_WM_HINTS", False);
xfc->_NET_CURRENT_DESKTOP = XInternAtom(xfc->display, "_NET_CURRENT_DESKTOP",
False);
False);
xfc->_NET_WORKAREA = XInternAtom(xfc->display, "_NET_WORKAREA", False);
xfc->_NET_WM_STATE = XInternAtom(xfc->display, "_NET_WM_STATE", False);
xfc->_NET_WM_STATE_FULLSCREEN = XInternAtom(xfc->display,
"_NET_WM_STATE_FULLSCREEN", False);
"_NET_WM_STATE_FULLSCREEN", False);
xfc->_NET_WM_STATE_MAXIMIZED_HORZ = XInternAtom(xfc->display,
"_NET_WM_STATE_MAXIMIZED_HORZ", False);
"_NET_WM_STATE_MAXIMIZED_HORZ", False);
xfc->_NET_WM_STATE_MAXIMIZED_VERT = XInternAtom(xfc->display,
"_NET_WM_STATE_MAXIMIZED_VERT", False);
"_NET_WM_STATE_MAXIMIZED_VERT", False);
xfc->_NET_WM_FULLSCREEN_MONITORS = XInternAtom(xfc->display,
"_NET_WM_FULLSCREEN_MONITORS", False);
"_NET_WM_FULLSCREEN_MONITORS", False);
xfc->_NET_WM_NAME = XInternAtom(xfc->display, "_NET_WM_NAME", False);
xfc->_NET_WM_PID = XInternAtom(xfc->display, "_NET_WM_PID", False);
xfc->_NET_WM_WINDOW_TYPE = XInternAtom(xfc->display, "_NET_WM_WINDOW_TYPE",
False);
False);
xfc->_NET_WM_WINDOW_TYPE_NORMAL = XInternAtom(xfc->display,
"_NET_WM_WINDOW_TYPE_NORMAL", False);
"_NET_WM_WINDOW_TYPE_NORMAL", False);
xfc->_NET_WM_WINDOW_TYPE_DIALOG = XInternAtom(xfc->display,
"_NET_WM_WINDOW_TYPE_DIALOG", False);
"_NET_WM_WINDOW_TYPE_DIALOG", False);
xfc->_NET_WM_WINDOW_TYPE_POPUP = XInternAtom(xfc->display,
"_NET_WM_WINDOW_TYPE_POPUP", False);
"_NET_WM_WINDOW_TYPE_POPUP", False);
xfc->_NET_WM_WINDOW_TYPE_UTILITY = XInternAtom(xfc->display,
"_NET_WM_WINDOW_TYPE_UTILITY", False);
"_NET_WM_WINDOW_TYPE_UTILITY", False);
xfc->_NET_WM_WINDOW_TYPE_DROPDOWN_MENU = XInternAtom(xfc->display,
"_NET_WM_WINDOW_TYPE_DROPDOWN_MENU", False);
"_NET_WM_WINDOW_TYPE_DROPDOWN_MENU", False);
xfc->_NET_WM_STATE_SKIP_TASKBAR = XInternAtom(xfc->display,
"_NET_WM_STATE_SKIP_TASKBAR", False);
"_NET_WM_STATE_SKIP_TASKBAR", False);
xfc->_NET_WM_STATE_SKIP_PAGER = XInternAtom(xfc->display,
"_NET_WM_STATE_SKIP_PAGER", False);
"_NET_WM_STATE_SKIP_PAGER", False);
xfc->_NET_WM_MOVERESIZE = XInternAtom(xfc->display, "_NET_WM_MOVERESIZE",
False);
False);
xfc->_NET_MOVERESIZE_WINDOW = XInternAtom(xfc->display,
"_NET_MOVERESIZE_WINDOW", False);
"_NET_MOVERESIZE_WINDOW", False);
xfc->UTF8_STRING = XInternAtom(xfc->display, "UTF8_STRING", FALSE);
xfc->WM_PROTOCOLS = XInternAtom(xfc->display, "WM_PROTOCOLS", False);
xfc->WM_DELETE_WINDOW = XInternAtom(xfc->display, "WM_DELETE_WINDOW", False);
@ -1844,7 +1796,7 @@ static BOOL xfreerdp_client_new(freerdp* instance, rdpContext* context)
xfc->invert = (ImageByteOrder(xfc->display) == MSBFirst) ? FALSE : TRUE;
xfc->complex_regions = TRUE;
xfc->x11event = CreateFileDescriptorEvent(NULL, FALSE, FALSE, xfc->xfds,
WINPR_FD_READ);
WINPR_FD_READ);
if (!xfc->x11event)
{

View File

@ -94,7 +94,7 @@ void xf_rail_send_activate(xfContext* xfc, Window xwindow, BOOL enabled)
}
void xf_rail_send_client_system_command(xfContext* xfc, UINT32 windowId,
UINT16 command)
UINT16 command)
{
RAIL_SYSCOMMAND_ORDER syscommand;
syscommand.windowId = windowId;
@ -154,14 +154,14 @@ void xf_rail_end_local_move(xfContext* xfc, xfAppWindow* appWindow)
windowMove.left = appWindow->x;
windowMove.top = appWindow->y;
windowMove.right = windowMove.left +
appWindow->width; /* In the update to RDP the position is one past the window */
appWindow->width; /* In the update to RDP the position is one past the window */
windowMove.bottom = windowMove.top + appWindow->height;
xfc->rail->ClientWindowMove(xfc->rail, &windowMove);
/*
* Simulate button up at new position to end the local move (per RDP spec)
*/
XQueryPointer(xfc->display, appWindow->handle,
&root_window, &child_window, &x, &y, &child_x, &child_y, &mask);
&root_window, &child_window, &x, &y, &child_x, &child_y, &mask);
/* only send the mouse coordinates if not a keyboard move or size */
if ((appWindow->local_move.direction != _NET_WM_MOVERESIZE_MOVE_KEYBOARD) &&
@ -198,7 +198,7 @@ void xf_rail_invalidate_region(xfContext* xfc, REGION16* invalidRegion)
for (index = 0; index < count; index++)
{
appWindow = (xfAppWindow*) HashTable_GetItemValue(xfc->railWindows,
(void*) pKeys[index]);
(void*) pKeys[index]);
if (appWindow)
{
@ -220,8 +220,8 @@ void xf_rail_invalidate_region(xfContext* xfc, REGION16* invalidRegion)
if (appWindow)
{
xf_UpdateWindowArea(xfc, appWindow, updateRect.left, updateRect.top,
updateRect.right - updateRect.left,
updateRect.bottom - updateRect.top);
updateRect.right - updateRect.left,
updateRect.bottom - updateRect.top);
}
}
}
@ -231,7 +231,7 @@ void xf_rail_invalidate_region(xfContext* xfc, REGION16* invalidRegion)
}
void xf_rail_paint(xfContext* xfc, INT32 uleft, INT32 utop, UINT32 uright,
UINT32 ubottom)
UINT32 ubottom)
{
REGION16 invalidRegion;
RECTANGLE_16 invalidRect;
@ -248,7 +248,7 @@ void xf_rail_paint(xfContext* xfc, INT32 uleft, INT32 utop, UINT32 uright,
/* RemoteApp Core Protocol Extension */
static BOOL xf_rail_window_common(rdpContext* context,
WINDOW_ORDER_INFO* orderInfo, WINDOW_STATE_ORDER* windowState)
WINDOW_ORDER_INFO* orderInfo, WINDOW_STATE_ORDER* windowState)
{
xfAppWindow* appWindow = NULL;
xfContext* xfc = (xfContext*) context;
@ -285,7 +285,7 @@ static BOOL xf_rail_window_common(rdpContext* context,
}
}
else if (ConvertFromUnicode(CP_UTF8, 0, (WCHAR*) windowState->titleInfo.string,
windowState->titleInfo.length / 2, &title, 0, NULL, NULL) < 1)
windowState->titleInfo.length / 2, &title, 0, NULL, NULL) < 1)
{
WLog_ERR(TAG, "failed to convert window title");
/* error handled below */
@ -306,13 +306,13 @@ static BOOL xf_rail_window_common(rdpContext* context,
}
HashTable_Add(xfc->railWindows, (void*)(UINT_PTR) orderInfo->windowId,
(void*) appWindow);
(void*) appWindow);
xf_AppWindowInit(xfc, appWindow);
}
else
{
appWindow = (xfAppWindow*) HashTable_GetItemValue(xfc->railWindows,
(void*)(UINT_PTR) orderInfo->windowId);
(void*)(UINT_PTR) orderInfo->windowId);
}
if (!appWindow)
@ -373,7 +373,7 @@ static BOOL xf_rail_window_common(rdpContext* context,
}
}
else if (ConvertFromUnicode(CP_UTF8, 0, (WCHAR*) windowState->titleInfo.string,
windowState->titleInfo.length / 2, &title, 0, NULL, NULL) < 1)
windowState->titleInfo.length / 2, &title, 0, NULL, NULL) < 1)
{
WLog_ERR(TAG, "failed to convert window title");
return FALSE;
@ -414,13 +414,13 @@ static BOOL xf_rail_window_common(rdpContext* context,
if (appWindow->numWindowRects)
{
appWindow->windowRects = (RECTANGLE_16*) calloc(appWindow->numWindowRects,
sizeof(RECTANGLE_16));
sizeof(RECTANGLE_16));
if (!appWindow->windowRects)
return FALSE;
CopyMemory(appWindow->windowRects, windowState->windowRects,
appWindow->numWindowRects * sizeof(RECTANGLE_16));
appWindow->numWindowRects * sizeof(RECTANGLE_16));
}
}
@ -443,13 +443,13 @@ static BOOL xf_rail_window_common(rdpContext* context,
if (appWindow->numVisibilityRects)
{
appWindow->visibilityRects = (RECTANGLE_16*) calloc(
appWindow->numVisibilityRects, sizeof(RECTANGLE_16));
appWindow->numVisibilityRects, sizeof(RECTANGLE_16));
if (!appWindow->visibilityRects)
return FALSE;
CopyMemory(appWindow->visibilityRects, windowState->visibilityRects,
appWindow->numVisibilityRects * sizeof(RECTANGLE_16));
appWindow->numVisibilityRects * sizeof(RECTANGLE_16));
}
}
@ -473,9 +473,9 @@ static BOOL xf_rail_window_common(rdpContext* context,
if (position_or_size_updated)
{
UINT32 visibilityRectsOffsetX = (appWindow->visibleOffsetX -
(appWindow->clientOffsetX - appWindow->windowClientDeltaX));
(appWindow->clientOffsetX - appWindow->windowClientDeltaX));
UINT32 visibilityRectsOffsetY = (appWindow->visibleOffsetY -
(appWindow->clientOffsetY - appWindow->windowClientDeltaY));
(appWindow->clientOffsetY - appWindow->windowClientDeltaY));
/*
* The rail server like to set the window to a small size when it is minimized even though it is hidden
@ -491,18 +491,18 @@ static BOOL xf_rail_window_common(rdpContext* context,
appWindow->height == appWindow->windowHeight)
{
xf_UpdateWindowArea(xfc, appWindow, 0, 0, appWindow->windowWidth,
appWindow->windowHeight);
appWindow->windowHeight);
}
else
{
xf_MoveWindow(xfc, appWindow, appWindow->windowOffsetX,
appWindow->windowOffsetY,
appWindow->windowWidth, appWindow->windowHeight);
appWindow->windowOffsetY,
appWindow->windowWidth, appWindow->windowHeight);
}
xf_SetWindowVisibilityRects(xfc, appWindow, visibilityRectsOffsetX,
visibilityRectsOffsetY, appWindow->visibilityRects,
appWindow->numVisibilityRects);
visibilityRectsOffsetY, appWindow->visibilityRects,
appWindow->numVisibilityRects);
}
}
@ -515,12 +515,12 @@ static BOOL xf_rail_window_common(rdpContext* context,
}
static BOOL xf_rail_window_delete(rdpContext* context,
WINDOW_ORDER_INFO* orderInfo)
WINDOW_ORDER_INFO* orderInfo)
{
xfAppWindow* appWindow = NULL;
xfContext* xfc = (xfContext*) context;
appWindow = (xfAppWindow*) HashTable_GetItemValue(xfc->railWindows,
(void*)(UINT_PTR) orderInfo->windowId);
(void*)(UINT_PTR) orderInfo->windowId);
if (!appWindow)
return TRUE;
@ -531,13 +531,13 @@ static BOOL xf_rail_window_delete(rdpContext* context,
}
static BOOL xf_rail_window_icon(rdpContext* context,
WINDOW_ORDER_INFO* orderInfo, WINDOW_ICON_ORDER* windowIcon)
WINDOW_ORDER_INFO* orderInfo, WINDOW_ICON_ORDER* windowIcon)
{
BOOL bigIcon;
xfAppWindow* railWindow;
xfContext* xfc = (xfContext*) context;
railWindow = (xfAppWindow*) HashTable_GetItemValue(xfc->railWindows,
(void*)(UINT_PTR) orderInfo->windowId);
(void*)(UINT_PTR) orderInfo->windowId);
if (!railWindow)
return FALSE;
@ -547,13 +547,13 @@ static BOOL xf_rail_window_icon(rdpContext* context,
}
static BOOL xf_rail_window_cached_icon(rdpContext* context,
WINDOW_ORDER_INFO* orderInfo, WINDOW_CACHED_ICON_ORDER* windowCachedIcon)
WINDOW_ORDER_INFO* orderInfo, WINDOW_CACHED_ICON_ORDER* windowCachedIcon)
{
return TRUE;
}
static BOOL xf_rail_notify_icon_common(rdpContext* context,
WINDOW_ORDER_INFO* orderInfo, NOTIFY_ICON_STATE_ORDER* notifyIconState)
WINDOW_ORDER_INFO* orderInfo, NOTIFY_ICON_STATE_ORDER* notifyIconState)
{
if (orderInfo->fieldFlags & WINDOW_ORDER_FIELD_NOTIFY_VERSION)
{
@ -583,31 +583,31 @@ static BOOL xf_rail_notify_icon_common(rdpContext* context,
}
static BOOL xf_rail_notify_icon_create(rdpContext* context,
WINDOW_ORDER_INFO* orderInfo, NOTIFY_ICON_STATE_ORDER* notifyIconState)
WINDOW_ORDER_INFO* orderInfo, NOTIFY_ICON_STATE_ORDER* notifyIconState)
{
return xf_rail_notify_icon_common(context, orderInfo, notifyIconState);
}
static BOOL xf_rail_notify_icon_update(rdpContext* context,
WINDOW_ORDER_INFO* orderInfo, NOTIFY_ICON_STATE_ORDER* notifyIconState)
WINDOW_ORDER_INFO* orderInfo, NOTIFY_ICON_STATE_ORDER* notifyIconState)
{
return xf_rail_notify_icon_common(context, orderInfo, notifyIconState);
}
static BOOL xf_rail_notify_icon_delete(rdpContext* context,
WINDOW_ORDER_INFO* orderInfo)
WINDOW_ORDER_INFO* orderInfo)
{
return TRUE;
}
static BOOL xf_rail_monitored_desktop(rdpContext* context,
WINDOW_ORDER_INFO* orderInfo, MONITORED_DESKTOP_ORDER* monitoredDesktop)
WINDOW_ORDER_INFO* orderInfo, MONITORED_DESKTOP_ORDER* monitoredDesktop)
{
return TRUE;
}
static BOOL xf_rail_non_monitored_desktop(rdpContext* context,
WINDOW_ORDER_INFO* orderInfo)
WINDOW_ORDER_INFO* orderInfo)
{
xfContext* xfc = (xfContext*) context;
xf_rail_disable_remoteapp_mode(xfc);
@ -637,15 +637,15 @@ void xf_rail_register_update_callbacks(rdpUpdate* update)
* @return 0 on success, otherwise a Win32 error code
*/
static UINT xf_rail_server_execute_result(RailClientContext* context,
RAIL_EXEC_RESULT_ORDER* execResult)
RAIL_EXEC_RESULT_ORDER* execResult)
{
xfContext* xfc = (xfContext*) context->custom;
if (execResult->execResult != RAIL_EXEC_S_OK)
{
WLog_ERR(TAG, "RAIL exec error: execResult=%s NtError=0x%X\n",
error_code_names[execResult->execResult], execResult->rawResult);
xfc->disconnect = TRUE;
error_code_names[execResult->execResult], execResult->rawResult);
freerdp_abort_connect(xfc->context.instance);
}
else
{
@ -661,7 +661,7 @@ static UINT xf_rail_server_execute_result(RailClientContext* context,
* @return 0 on success, otherwise a Win32 error code
*/
static UINT xf_rail_server_system_param(RailClientContext* context,
RAIL_SYSPARAM_ORDER* sysparam)
RAIL_SYSPARAM_ORDER* sysparam)
{
return CHANNEL_RC_OK;
}
@ -672,7 +672,7 @@ static UINT xf_rail_server_system_param(RailClientContext* context,
* @return 0 on success, otherwise a Win32 error code
*/
static UINT xf_rail_server_handshake(RailClientContext* context,
RAIL_HANDSHAKE_ORDER* handshake)
RAIL_HANDSHAKE_ORDER* handshake)
{
RAIL_EXEC_ORDER exec;
RAIL_SYSPARAM_ORDER sysparam;
@ -728,7 +728,7 @@ static UINT xf_rail_server_handshake(RailClientContext* context,
* @return 0 on success, otherwise a Win32 error code
*/
static UINT xf_rail_server_handshake_ex(RailClientContext* context,
RAIL_HANDSHAKE_EX_ORDER* handshakeEx)
RAIL_HANDSHAKE_EX_ORDER* handshakeEx)
{
return CHANNEL_RC_OK;
}
@ -739,7 +739,7 @@ static UINT xf_rail_server_handshake_ex(RailClientContext* context,
* @return 0 on success, otherwise a Win32 error code
*/
static UINT xf_rail_server_local_move_size(RailClientContext* context,
RAIL_LOCALMOVESIZE_ORDER* localMoveSize)
RAIL_LOCALMOVESIZE_ORDER* localMoveSize)
{
int x = 0, y = 0;
int direction = 0;
@ -747,7 +747,7 @@ static UINT xf_rail_server_local_move_size(RailClientContext* context,
xfAppWindow* appWindow = NULL;
xfContext* xfc = (xfContext*) context->custom;
appWindow = (xfAppWindow*) HashTable_GetItemValue(xfc->railWindows,
(void*)(UINT_PTR) localMoveSize->windowId);
(void*)(UINT_PTR) localMoveSize->windowId);
if (!appWindow)
return ERROR_INTERNAL_ERROR;
@ -805,8 +805,8 @@ static UINT xf_rail_server_local_move_size(RailClientContext* context,
case RAIL_WMSZ_MOVE:
direction = _NET_WM_MOVERESIZE_MOVE;
XTranslateCoordinates(xfc->display, appWindow->handle,
RootWindowOfScreen(xfc->screen),
localMoveSize->posX, localMoveSize->posY, &x, &y, &child_window);
RootWindowOfScreen(xfc->screen),
localMoveSize->posX, localMoveSize->posY, &x, &y, &child_window);
break;
case RAIL_WMSZ_KEYMOVE:
@ -844,21 +844,21 @@ static UINT xf_rail_server_local_move_size(RailClientContext* context,
* @return 0 on success, otherwise a Win32 error code
*/
static UINT xf_rail_server_min_max_info(RailClientContext* context,
RAIL_MINMAXINFO_ORDER* minMaxInfo)
RAIL_MINMAXINFO_ORDER* minMaxInfo)
{
xfAppWindow* appWindow = NULL;
xfContext* xfc = (xfContext*) context->custom;
appWindow = (xfAppWindow*) HashTable_GetItemValue(xfc->railWindows,
(void*)(UINT_PTR) minMaxInfo->windowId);
(void*)(UINT_PTR) minMaxInfo->windowId);
if (!appWindow)
return ERROR_INTERNAL_ERROR;
xf_SetWindowMinMaxInfo(xfc, appWindow,
minMaxInfo->maxWidth, minMaxInfo->maxHeight,
minMaxInfo->maxPosX, minMaxInfo->maxPosY,
minMaxInfo->minTrackWidth, minMaxInfo->minTrackHeight,
minMaxInfo->maxTrackWidth, minMaxInfo->maxTrackHeight);
minMaxInfo->maxWidth, minMaxInfo->maxHeight,
minMaxInfo->maxPosX, minMaxInfo->maxPosY,
minMaxInfo->minTrackWidth, minMaxInfo->minTrackHeight,
minMaxInfo->maxTrackWidth, minMaxInfo->maxTrackHeight);
return CHANNEL_RC_OK;
}
@ -868,7 +868,7 @@ static UINT xf_rail_server_min_max_info(RailClientContext* context,
* @return 0 on success, otherwise a Win32 error code
*/
static UINT xf_rail_server_language_bar_info(RailClientContext* context,
RAIL_LANGBAR_INFO_ORDER* langBarInfo)
RAIL_LANGBAR_INFO_ORDER* langBarInfo)
{
return CHANNEL_RC_OK;
}
@ -879,7 +879,7 @@ static UINT xf_rail_server_language_bar_info(RailClientContext* context,
* @return 0 on success, otherwise a Win32 error code
*/
static UINT xf_rail_server_get_appid_response(RailClientContext* context,
RAIL_GET_APPID_RESP_ORDER* getAppIdResp)
RAIL_GET_APPID_RESP_ORDER* getAppIdResp)
{
return CHANNEL_RC_OK;
}

View File

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

View File

@ -116,7 +116,7 @@ BOOL freerdp_connect(freerdp* instance)
if (status)
status2 = freerdp_channels_pre_connect(instance->context->channels,
instance);
instance);
if (settings->KeyboardLayout == KBD_JAPANESE_INPUT_SYSTEM_MS_IME2002)
{
@ -153,7 +153,7 @@ BOOL freerdp_connect(freerdp* instance)
if (instance->settings->DumpRemoteFx)
{
instance->update->pcap_rfx = pcap_open(instance->settings->DumpRemoteFxFile,
TRUE);
TRUE);
if (instance->update->pcap_rfx)
instance->update->dump_rfx = TRUE;
@ -220,7 +220,7 @@ BOOL freerdp_connect(freerdp* instance)
if (rdp->errorInfo == ERRINFO_SERVER_INSUFFICIENT_PRIVILEGES)
freerdp_set_last_error(instance->context,
FREERDP_ERROR_INSUFFICIENT_PRIVILEGES);
FREERDP_ERROR_INSUFFICIENT_PRIVILEGES);
SetEvent(rdp->transport->connectedEvent);
freerdp_connect_finally:
@ -239,7 +239,7 @@ BOOL freerdp_abort_connect(freerdp* instance)
}
BOOL freerdp_get_fds(freerdp* instance, void** rfds, int* rcount, void** wfds,
int* wcount)
int* wcount)
{
rdpRdp* rdp = instance->context->rdp;
transport_get_fds(rdp->transport, rfds, rcount);
@ -278,7 +278,7 @@ BOOL freerdp_check_fds(freerdp* instance)
}
DWORD freerdp_get_event_handles(rdpContext* context, HANDLE* events,
DWORD count)
DWORD count)
{
DWORD nCount = 0;
nCount += transport_get_event_handles(context->rdp->transport, events, count);
@ -294,6 +294,14 @@ DWORD freerdp_get_event_handles(rdpContext* context, HANDLE* events,
else
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;
}
@ -320,6 +328,16 @@ BOOL freerdp_check_event_handles(rdpContext* context)
return FALSE;
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;
}
@ -354,7 +372,7 @@ HANDLE freerdp_get_message_queue_event_handle(freerdp* instance, DWORD id)
}
int freerdp_message_queue_process_message(freerdp* instance, DWORD id,
wMessage* message)
wMessage* message)
{
int status = -1;
@ -391,7 +409,7 @@ int freerdp_message_queue_process_pending_messages(freerdp* instance, DWORD id)
}
static int freerdp_send_channel_data(freerdp* instance, UINT16 channelId,
BYTE* data, int size)
BYTE* data, int size)
{
return rdp_send_channel_data(instance->context->rdp, channelId, data, size);
}
@ -404,8 +422,16 @@ BOOL freerdp_disconnect(freerdp* instance)
rdp_client_disconnect(rdp);
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,
instance) != CHANNEL_RC_OK)
instance) != CHANNEL_RC_OK)
rc = FALSE;
IFCALL(instance->PostDisconnect, instance);
@ -547,7 +573,7 @@ BOOL freerdp_context_new(freerdp* instance)
goto fail;
PubSub_AddEventTypes(context->pubSub, FreeRDP_Events,
sizeof(FreeRDP_Events) / sizeof(wEventType));
sizeof(FreeRDP_Events) / sizeof(wEventType));
context->metrics = metrics_new(context);
if (!context->metrics)
@ -721,7 +747,7 @@ void freerdp_set_last_error(rdpContext* context, UINT32 lastError)
{
if (lastError)
WLog_ERR(TAG, "freerdp_set_last_error %s [0x%04X]",
freerdp_get_last_error_name(lastError), lastError);
freerdp_get_last_error_name(lastError), lastError);
context->LastError = lastError;
@ -827,7 +853,7 @@ BOOL checkChannelErrorEvent(rdpContext* context)
if (WaitForSingleObject(context->channelErrorEvent, 0) == WAIT_OBJECT_0)
{
WLog_ERR(TAG, "%s. Error was %lu", context->errorDescription,
context->channelErrorNum);
context->channelErrorNum);
return FALSE;
}