From 67b6acc7a8ee399cfca8606b1bb1b629fa96b5ab Mon Sep 17 00:00:00 2001 From: Jay Sorg Date: Tue, 18 Sep 2012 15:57:19 -0700 Subject: [PATCH] rail: fixes for crash when creating and deleting windows fast and added support for xrdp rail / local decoration --- client/X11/xf_event.c | 54 ++++++++++++++++++++++++++++++++++++++++---------- client/X11/xf_window.c | 26 +++++++++++++++++++++++- client/X11/xf_window.h | 1 + 3 files changed, 70 insertions(+), 11 deletions(-) diff --git a/client/X11/xf_event.c b/client/X11/xf_event.c index 2c788ba..fd3af05 100644 --- a/client/X11/xf_event.c +++ b/client/X11/xf_event.c @@ -129,6 +129,11 @@ static boolean xf_event_MotionNotify(xfInfo* xfi, XEvent* event, boolean app) if (app) { + /* make sure window exists */ + if (xf_rdpWindowFromWindow(xfi, event->xmotion.window) == 0) + { + return true; + } // Translate to desktop coordinates XTranslateCoordinates(xfi->display, event->xmotion.window, RootWindowOfScreen(xfi->screen), @@ -227,8 +232,13 @@ static boolean xf_event_ButtonPress(xfInfo* xfi, XEvent* event, boolean app) { if (app) { + /* make sure window exists */ + if (xf_rdpWindowFromWindow(xfi, event->xbutton.window) == 0) + { + return true; + } // Translate to desktop coordinates - XTranslateCoordinates(xfi->display, event->xmotion.window, + XTranslateCoordinates(xfi->display, event->xbutton.window, RootWindowOfScreen(xfi->screen), x, y, &x, &y, &childWindow); } @@ -305,8 +315,13 @@ static boolean xf_event_ButtonRelease(xfInfo* xfi, XEvent* event, boolean app) { if (app) { + /* make sure window exists */ + if (xf_rdpWindowFromWindow(xfi, event->xbutton.window) == NULL) + { + return true; + } // Translate to desktop coordinates - XTranslateCoordinates(xfi->display, event->xmotion.window, + XTranslateCoordinates(xfi->display, event->xbutton.window, RootWindowOfScreen(xfi->screen), x, y, &x, &y, &childWindow); } @@ -522,12 +537,28 @@ static boolean xf_event_ConfigureNotify(xfInfo* xfi, XEvent* event, boolean app) (uint32) xfw->handle, xfw->left, xfw->top, xfw->right, xfw->bottom, xfw->width, xfw->height, event->xconfigure.send_event); - //additonal checks for not in a local move and not ignoring configure to send position update to server, - //also should the window not be focused then do not send to server yet(ie. resizing using window decoration). - //The server will be updated when the window gets refocused. - if (app && (!event->xconfigure.send_event || xfi->window->local_move.state == LMS_NOT_ACTIVE) - && !xfw->rail_ignore_configure && xfi->focused) + /* additonal checks for not in a local move and not ignoring configure to send + * position update to server, also should the window not be focused then do not + * send to server yet(ie. resizing using window decoration). + * The server will be updated when the window gets refocused. */ + if (app && xfw->decorations) + { + /* moving resizing using window decoration */ xf_rail_adjust_position(xfi, window); + window->windowOffsetX = xfw->left; + window->visibleOffsetX = window->windowOffsetX; + window->windowOffsetY = xfw->top; + window->visibleOffsetY = window->windowOffsetY; + window->windowWidth = xfw->width; + window->windowHeight = xfw->height; + } + else + { + if (app && (!event->xconfigure.send_event || xfi->window->local_move.state == LMS_NOT_ACTIVE) + && !xfw->rail_ignore_configure && xfi->focused) + xf_rail_adjust_position(xfi, window); + } + } return True; @@ -642,9 +673,12 @@ static boolean xf_event_PropertyNotify(xfInfo* xfi, XEvent* event, boolean app) if (app == true) { rdpWindow* window; - rdpRail* rail = ((rdpContext*) xfi->context)->rail; - - window = window_list_get_by_extra_id(rail->list, (void*) event->xany.window); + + window = xf_rdpWindowFromWindow(xfi, event->xproperty.window); + if (window == NULL) + { + return true; + } if ((((Atom)event->xproperty.atom == xfi->_NET_WM_STATE) && (event->xproperty.state != PropertyDelete)) || (((Atom)event->xproperty.atom == xfi->WM_STATE) && (event->xproperty.state != PropertyDelete))) diff --git a/client/X11/xf_window.c b/client/X11/xf_window.c index 87d95d5..899242f 100644 --- a/client/X11/xf_window.c +++ b/client/X11/xf_window.c @@ -482,7 +482,10 @@ xfWindow* xf_CreateWindow(xfInfo* xfi, rdpWindow* wnd, int x, int y, int width, window->width = width; window->height = height; - window->decorations = false; + /* this window need decorations + the WS_EX_APPWINDOW is used to tell the client to use local decorations + only sent from xrdp */ + window->decorations = (wnd->extendedStyle & WS_EX_APPWINDOW) ? true : false; window->fullscreen = false; window->window = wnd; window->local_move.state = LMS_NOT_ACTIVE; @@ -916,3 +919,24 @@ void xf_DestroyWindow(xfInfo* xfi, xfWindow* window) xfree(window); } + +rdpWindow* xf_rdpWindowFromWindow(xfInfo* xfi, Window wnd) +{ + rdpRail* rail; + + if (xfi != NULL) + { + if (wnd != 0) + { + if (xfi->_context != NULL) + { + rail = xfi->_context->rail; + if (rail != NULL) + { + return window_list_get_by_extra_id(rail->list, (void*)(long)wnd); + } + } + } + } + return NULL; +} diff --git a/client/X11/xf_window.h b/client/X11/xf_window.h index f77795d..8508350 100644 --- a/client/X11/xf_window.h +++ b/client/X11/xf_window.h @@ -104,6 +104,7 @@ void xf_SetWindowStyle(xfInfo* xfi, xfWindow* window, uint32 style, uint32 ex_st void xf_UpdateWindowArea(xfInfo* xfi, xfWindow* window, int x, int y, int width, int height); boolean xf_IsWindowBorder(xfInfo* xfi, xfWindow* xfw, int x, int y); void xf_DestroyWindow(xfInfo* xfi, xfWindow* window); +rdpWindow* xf_rdpWindowFromWindow(xfInfo* xfi, Window wnd); boolean xf_GetWindowProperty(xfInfo* xfi, Window window, Atom property, int length, unsigned long* nitems, unsigned long* bytes, uint8** prop); -- 2.7.4