diff --git a/client/X11/xf_event.c b/client/X11/xf_event.c index f8ac78336..4d02be6dd 100644 --- a/client/X11/xf_event.c +++ b/client/X11/xf_event.c @@ -69,12 +69,7 @@ static const char* const X11_EVENT_STRINGS[] = }; #endif -void xf_send_mouse_motion_event(rdpInput* input, boolean down, uint32 button, uint16 x, uint16 y) -{ - input->MouseEvent(input, PTR_FLAGS_MOVE, x, y); -} - -boolean xf_event_Expose(xfInfo* xfi, XEvent* event, boolean app) +static boolean xf_event_Expose(xfInfo* xfi, XEvent* event, boolean app) { int x, y; int w, h; @@ -106,55 +101,51 @@ boolean xf_event_Expose(xfInfo* xfi, XEvent* event, boolean app) return true; } -boolean xf_event_VisibilityNotify(xfInfo* xfi, XEvent* event, boolean app) +static boolean xf_event_VisibilityNotify(xfInfo* xfi, XEvent* event, boolean app) { xfi->unobscured = event->xvisibility.state == VisibilityUnobscured; return true; } -boolean xf_event_MotionNotify(xfInfo* xfi, XEvent* event, boolean app) +static boolean xf_event_MotionNotify(xfInfo* xfi, XEvent* event, boolean app) { rdpInput* input; + int x, y; + Window childWindow; input = xfi->instance->input; + x = event->xmotion.x; + y = event->xmotion.y; - if (app != true) + if (xfi->mouse_motion != true) { - if (xfi->mouse_motion != true) - { - if ((event->xmotion.state & (Button1Mask | Button2Mask | Button3Mask)) == 0) - return true; - } + if ((event->xmotion.state & (Button1Mask | Button2Mask | Button3Mask)) == 0) + return true; + } - input->MouseEvent(input, PTR_FLAGS_MOVE, event->xmotion.x, event->xmotion.y); - - if (xfi->fullscreen) - XSetInputFocus(xfi->display, xfi->window->handle, RevertToPointerRoot, CurrentTime); + if (app) + { + // Translate to desktop coordinates + XTranslateCoordinates(xfi->display, event->xmotion.window, + RootWindowOfScreen(xfi->screen), + x, y, &x, &y, &childWindow); } - else if (xfi->mouse_motion == true) + + input->MouseEvent(input, PTR_FLAGS_MOVE, x, y); + + if (xfi->fullscreen) { - rdpWindow* window; - int x = event->xmotion.x; - int y = event->xmotion.y; - rdpRail* rail = ((rdpContext*) xfi->context)->rail; - - window = window_list_get_by_extra_id(rail->list, (void*) event->xmotion.window); - - if (window != NULL) - { - x += window->windowOffsetX; - y += window->windowOffsetY; - input->MouseEvent(input, PTR_FLAGS_MOVE, x, y); - } + XSetInputFocus(xfi->display, xfi->window->handle, RevertToPointerRoot, CurrentTime); } return true; } -boolean xf_event_ButtonPress(xfInfo* xfi, XEvent* event, boolean app) +static boolean xf_event_ButtonPress(xfInfo* xfi, XEvent* event, boolean app) { - uint16 x, y; - uint16 flags; + int x, y; + int flags; + Window childWindow; boolean wheel; boolean extended; rdpInput* input; @@ -232,16 +223,10 @@ boolean xf_event_ButtonPress(xfInfo* xfi, XEvent* event, boolean app) { if (app) { - rdpWindow* window; - rdpRail* rail = ((rdpContext*) xfi->context)->rail; - - window = window_list_get_by_extra_id(rail->list, (void*) event->xbutton.window); - - if (window != NULL) - { - x += window->windowOffsetX; - y += window->windowOffsetY; - } + // Translate to desktop coordinates + XTranslateCoordinates(xfi->display, event->xmotion.window, + RootWindowOfScreen(xfi->screen), + x, y, &x, &y, &childWindow); } if (extended) @@ -254,10 +239,11 @@ boolean xf_event_ButtonPress(xfInfo* xfi, XEvent* event, boolean app) return true; } -boolean xf_event_ButtonRelease(xfInfo* xfi, XEvent* event, boolean app) +static boolean xf_event_ButtonRelease(xfInfo* xfi, XEvent* event, boolean app) { - uint16 x, y; - uint16 flags; + int x, y; + int flags; + Window childWindow; boolean extended; rdpInput* input; @@ -315,16 +301,10 @@ boolean xf_event_ButtonRelease(xfInfo* xfi, XEvent* event, boolean app) { if (app) { - rdpWindow* window; - rdpRail* rail = ((rdpContext*) xfi->context)->rail; - - window = window_list_get_by_extra_id(rail->list, (void*) event->xbutton.window); - - if (window != NULL) - { - x += window->windowOffsetX; - y += window->windowOffsetY; - } + // Translate to desktop coordinates + XTranslateCoordinates(xfi->display, event->xmotion.window, + RootWindowOfScreen(xfi->screen), + x, y, &x, &y, &childWindow); } if (extended) @@ -336,7 +316,7 @@ boolean xf_event_ButtonRelease(xfInfo* xfi, XEvent* event, boolean app) return true; } -boolean xf_event_KeyPress(xfInfo* xfi, XEvent* event, boolean app) +static boolean xf_event_KeyPress(xfInfo* xfi, XEvent* event, boolean app) { KeySym keysym; char str[256]; @@ -353,7 +333,7 @@ boolean xf_event_KeyPress(xfInfo* xfi, XEvent* event, boolean app) return true; } -boolean xf_event_KeyRelease(xfInfo* xfi, XEvent* event, boolean app) +static boolean xf_event_KeyRelease(xfInfo* xfi, XEvent* event, boolean app) { XEvent next_event; @@ -375,7 +355,7 @@ boolean xf_event_KeyRelease(xfInfo* xfi, XEvent* event, boolean app) return true; } -boolean xf_event_FocusIn(xfInfo* xfi, XEvent* event, boolean app) +static boolean xf_event_FocusIn(xfInfo* xfi, XEvent* event, boolean app) { if (event->xfocus.mode == NotifyGrab) return true; @@ -396,7 +376,7 @@ boolean xf_event_FocusIn(xfInfo* xfi, XEvent* event, boolean app) return true; } -boolean xf_event_FocusOut(xfInfo* xfi, XEvent* event, boolean app) +static boolean xf_event_FocusOut(xfInfo* xfi, XEvent* event, boolean app) { if (event->xfocus.mode == NotifyUngrab) return true; @@ -412,7 +392,7 @@ boolean xf_event_FocusOut(xfInfo* xfi, XEvent* event, boolean app) return true; } -boolean xf_event_MappingNotify(xfInfo* xfi, XEvent* event, boolean app) +static boolean xf_event_MappingNotify(xfInfo* xfi, XEvent* event, boolean app) { if (event->xmapping.request == MappingModifier) { @@ -423,7 +403,7 @@ boolean xf_event_MappingNotify(xfInfo* xfi, XEvent* event, boolean app) return true; } -boolean xf_event_ClientMessage(xfInfo* xfi, XEvent* event, boolean app) +static boolean xf_event_ClientMessage(xfInfo* xfi, XEvent* event, boolean app) { if ((event->xclient.message_type == xfi->WM_PROTOCOLS) && ((Atom) event->xclient.data.l[0] == xfi->WM_DELETE_WINDOW)) @@ -453,7 +433,7 @@ boolean xf_event_ClientMessage(xfInfo* xfi, XEvent* event, boolean app) return true; } -boolean xf_event_EnterNotify(xfInfo* xfi, XEvent* event, boolean app) +static boolean xf_event_EnterNotify(xfInfo* xfi, XEvent* event, boolean app) { if (app != true) { @@ -484,7 +464,7 @@ boolean xf_event_EnterNotify(xfInfo* xfi, XEvent* event, boolean app) return true; } -boolean xf_event_LeaveNotify(xfInfo* xfi, XEvent* event, boolean app) +static boolean xf_event_LeaveNotify(xfInfo* xfi, XEvent* event, boolean app) { if (app != true) { @@ -495,7 +475,7 @@ boolean xf_event_LeaveNotify(xfInfo* xfi, XEvent* event, boolean app) return true; } -boolean xf_event_ConfigureNotify(xfInfo* xfi, XEvent* event, boolean app) +static boolean xf_event_ConfigureNotify(xfInfo* xfi, XEvent* event, boolean app) { rdpWindow* window; rdpRail* rail = ((rdpContext*) xfi->context)->rail; @@ -533,7 +513,7 @@ boolean xf_event_ConfigureNotify(xfInfo* xfi, XEvent* event, boolean app) return True; } -boolean xf_event_MapNotify(xfInfo* xfi, XEvent* event, boolean app) +static boolean xf_event_MapNotify(xfInfo* xfi, XEvent* event, boolean app) { rdpWindow* window; rdpRail* rail = ((rdpContext*) xfi->context)->rail; @@ -554,7 +534,7 @@ boolean xf_event_MapNotify(xfInfo* xfi, XEvent* event, boolean app) return true; } -boolean xf_event_UnmapNotify(xfInfo* xfi, XEvent* event, boolean app) +static boolean xf_event_UnmapNotify(xfInfo* xfi, XEvent* event, boolean app) { rdpWindow* window; rdpRail* rail = ((rdpContext*) xfi->context)->rail; @@ -575,7 +555,7 @@ boolean xf_event_UnmapNotify(xfInfo* xfi, XEvent* event, boolean app) return true; } -boolean xf_event_SelectionNotify(xfInfo* xfi, XEvent* event, boolean app) +static boolean xf_event_SelectionNotify(xfInfo* xfi, XEvent* event, boolean app) { if (app != true) { @@ -586,7 +566,7 @@ boolean xf_event_SelectionNotify(xfInfo* xfi, XEvent* event, boolean app) return true; } -boolean xf_event_SelectionRequest(xfInfo* xfi, XEvent* event, boolean app) +static boolean xf_event_SelectionRequest(xfInfo* xfi, XEvent* event, boolean app) { if (app != true) { @@ -597,7 +577,7 @@ boolean xf_event_SelectionRequest(xfInfo* xfi, XEvent* event, boolean app) return true; } -boolean xf_event_SelectionClear(xfInfo* xfi, XEvent* event, boolean app) +static boolean xf_event_SelectionClear(xfInfo* xfi, XEvent* event, boolean app) { if (app != true) { @@ -608,7 +588,7 @@ boolean xf_event_SelectionClear(xfInfo* xfi, XEvent* event, boolean app) return true; } -boolean xf_event_PropertyNotify(xfInfo* xfi, XEvent* event, boolean app) +static boolean xf_event_PropertyNotify(xfInfo* xfi, XEvent* event, boolean app) { if (app != true) { @@ -619,7 +599,7 @@ boolean xf_event_PropertyNotify(xfInfo* xfi, XEvent* event, boolean app) return true; } -boolean xf_event_suppress_events(xfInfo *xfi, rdpWindow *window, XEvent*event) +static boolean xf_event_suppress_events(xfInfo *xfi, rdpWindow *window, XEvent*event) { if (! xfi->remote_app) return false; diff --git a/client/X11/xf_rail.c b/client/X11/xf_rail.c index f6f9dc30f..d4408a5f9 100644 --- a/client/X11/xf_rail.c +++ b/client/X11/xf_rail.c @@ -86,7 +86,7 @@ void xf_rail_paint(xfInfo* xfi, rdpRail* rail, sint32 uleft, sint32 utop, uint32 } } -void xf_rail_CreateWindow(rdpRail* rail, rdpWindow* window) +static void xf_rail_CreateWindow(rdpRail* rail, rdpWindow* window) { xfInfo* xfi; xfWindow* xfw; @@ -102,13 +102,13 @@ void xf_rail_CreateWindow(rdpRail* rail, rdpWindow* window) xf_SetWindowStyle(xfi, xfw, window->style, window->extendedStyle); - XStoreName(xfi->display, xfw->handle, window->title); + xf_SetWindowText(xfi, xfw, window->title); window->extra = (void*) xfw; window->extraId = (void*) xfw->handle; } -void xf_rail_MoveWindow(rdpRail* rail, rdpWindow* window) +static void xf_rail_MoveWindow(rdpRail* rail, rdpWindow* window) { xfInfo* xfi; xfWindow* xfw; @@ -116,21 +116,12 @@ void xf_rail_MoveWindow(rdpRail* rail, rdpWindow* window) xfi = (xfInfo*) rail->extra; xfw = (xfWindow*) window->extra; - // Do nothing if window is already in the correct position - if ( xfw->left == window->windowOffsetX && - xfw->top == window->windowOffsetY && - xfw->width == window->windowWidth && - xfw->height == window->windowHeight) - { - return; - } - - xf_MoveWindow((xfInfo*) rail->extra, xfw, - window->windowOffsetX, window->windowOffsetY, - window->windowWidth, window->windowHeight); + xf_MoveWindow(xfi, xfw, + window->windowOffsetX, window->windowOffsetY, + window->windowWidth, window->windowHeight); } -void xf_rail_ShowWindow(rdpRail* rail, rdpWindow* window, uint8 state) +static void xf_rail_ShowWindow(rdpRail* rail, rdpWindow* window, uint8 state) { xfInfo* xfi; xfWindow* xfw; @@ -138,10 +129,10 @@ void xf_rail_ShowWindow(rdpRail* rail, rdpWindow* window, uint8 state) xfi = (xfInfo*) rail->extra; xfw = (xfWindow*) window->extra; - xf_ShowWindow((xfInfo*) rail->extra, xfw, state); + xf_ShowWindow(xfi, xfw, state); } -void xf_rail_SetWindowText(rdpRail* rail, rdpWindow* window) +static void xf_rail_SetWindowText(rdpRail* rail, rdpWindow* window) { xfInfo* xfi; xfWindow* xfw; @@ -149,10 +140,10 @@ void xf_rail_SetWindowText(rdpRail* rail, rdpWindow* window) xfi = (xfInfo*) rail->extra; xfw = (xfWindow*) window->extra; - XStoreName(xfi->display, xfw->handle, window->title); + xf_SetWindowText(xfi, xfw, window->title); } -void xf_rail_SetWindowIcon(rdpRail* rail, rdpWindow* window, rdpIcon* icon) +static void xf_rail_SetWindowIcon(rdpRail* rail, rdpWindow* window, rdpIcon* icon) { xfInfo* xfi; xfWindow* xfw; @@ -166,7 +157,7 @@ void xf_rail_SetWindowIcon(rdpRail* rail, rdpWindow* window, rdpIcon* icon) xf_SetWindowIcon(xfi, xfw, icon); } -void xf_rail_SetWindowRects(rdpRail* rail, rdpWindow* window) +static void xf_rail_SetWindowRects(rdpRail* rail, rdpWindow* window) { xfInfo* xfi; xfWindow* xfw; @@ -177,7 +168,7 @@ void xf_rail_SetWindowRects(rdpRail* rail, rdpWindow* window) xf_SetWindowRects(xfi, xfw, window->windowRects, window->numWindowRects); } -void xf_rail_SetWindowVisibilityRects(rdpRail* rail, rdpWindow* window) +static void xf_rail_SetWindowVisibilityRects(rdpRail* rail, rdpWindow* window) { xfInfo* xfi; xfWindow* xfw; @@ -188,7 +179,7 @@ void xf_rail_SetWindowVisibilityRects(rdpRail* rail, rdpWindow* window) xf_SetWindowVisibilityRects(xfi, xfw, window->windowRects, window->numWindowRects); } -void xf_rail_DestroyWindow(rdpRail* rail, rdpWindow* window) +static void xf_rail_DestroyWindow(rdpRail* rail, rdpWindow* window) { xfWindow* xfw; xfw = (xfWindow*) window->extra; @@ -312,34 +303,43 @@ void xf_rail_end_local_move(xfInfo* xfi, rdpWindow *window) xfWindow* xfw; rdpChannels* channels; RAIL_WINDOW_MOVE_ORDER window_move; - int x,y; rdpInput* input = xfi->instance->input; + int x,y; + Window root_window; + Window child_window; + unsigned int mask; + int child_x; + int child_y; xfw = (xfWindow*) window->extra; channels = xfi->_context->channels; - // Send RDP client event to inform RDP server - - window_move.windowId = window->windowId; - window_move.left = xfw->left; - window_move.top = xfw->top; - window_move.right = xfw->right + 1; // In the update to RDP the position is one past the window - window_move.bottom = xfw->bottom + 1; - DEBUG_X11_LMS("window=0x%X rc={l=%d t=%d r=%d b=%d} w=%d h=%d", (uint32) xfw->handle, xfw->left, xfw->top, xfw->right, xfw->bottom, xfw->width, xfw->height); - xf_send_rail_client_event(channels, RDP_EVENT_TYPE_RAIL_CLIENT_WINDOW_MOVE, &window_move); + /* + * For keyboard moves send and explicit update to RDP server + */ + window_move.windowId = window->windowId; + window_move.left = xfw->left; + window_move.top = xfw->top; + window_move.right = xfw->right + 1; // The update to RDP the position is one past the window + window_move.bottom = xfw->bottom + 1; - // Send synthetic button up event to the RDP server. This is per the RDP spec to - // indicate a local move has finished. + xf_send_rail_client_event(channels, + RDP_EVENT_TYPE_RAIL_CLIENT_WINDOW_MOVE, &window_move); + + /* + * Simulate button up at new position to end the local move (per RDP spec) + */ - x = xfw->left + xfw->local_move.window_x; - y = xfw->top + xfw->local_move.window_y; + XQueryPointer(xfi->display, xfw->handle, + &root_window, &child_window, + &x, &y, &child_x, &child_y, &mask); input->MouseEvent(input, PTR_FLAGS_BUTTON1, x, y); - + // Proactively update the RAIL window dimensions. There is a race condition where // we can start to receive GDI orders for the new window dimensions before we // receive the RAIL ORDER for the new window size. This avoids that race condition. @@ -531,12 +531,14 @@ void xf_process_rail_server_localmovesize_event(xfInfo* xfi, rdpChannels* channe direction = _NET_WM_MOVERESIZE_MOVE_KEYBOARD; x = movesize->posX; y = movesize->posY; - break; + /* FIXME: local keyboard moves not working */ + return; case RAIL_WMSZ_KEYSIZE: //0xB direction = _NET_WM_MOVERESIZE_SIZE_KEYBOARD; x = movesize->posX; y = movesize->posY; - break; + /* FIXME: local keyboard moves not working */ + return; } if (movesize->isMoveSizeStart) diff --git a/client/X11/xf_window.c b/client/X11/xf_window.c index 234ed1392..158b6b18a 100644 --- a/client/X11/xf_window.c +++ b/client/X11/xf_window.c @@ -231,22 +231,26 @@ void xf_SetWindowStyle(xfInfo* xfi, xfWindow* window, uint32 style, uint32 ex_st if ((ex_style & WS_EX_TOPMOST) || (ex_style & WS_EX_TOOLWINDOW)) { /* - * These include tool tips, dropdown menus, etc. These won't work - * correctly if the local window manager resizes or moves them. - * Set override redirect to prevent this from occurring. + * Tooltips and menu items should be unmanaged windows + * (called "override redirect" in X windows parlance) + * If they are managed, there are issues with window focus that + * cause the windows to behave improperly. For example, a mouse + * press will dismiss a drop-down menu because the RDP server + * sees that as a focus out event from the window owning the + * dropdown. */ - XSetWindowAttributes attrs; attrs.override_redirect = True; XChangeWindowAttributes(xfi->display, window->handle, CWOverrideRedirect, &attrs); + window->is_transient = true; xf_SetWindowUnlisted(xfi, window); - window_type = xfi->_NET_WM_WINDOW_TYPE_POPUP; } else if (style & WS_POPUP) { /* this includes dialogs, popups, etc, that need to be full-fledged windows */ + window->is_transient = true; window_type = xfi->_NET_WM_WINDOW_TYPE_DIALOG; xf_SetWindowUnlisted(xfi, window); } @@ -260,6 +264,11 @@ void xf_SetWindowStyle(xfInfo* xfi, xfWindow* window, uint32 style, uint32 ex_st } +void xf_SetWindowText(xfInfo *xfi, xfWindow* window, char *name) +{ + XStoreName(xfi->display, window->handle, name); +} + xfWindow* xf_CreateDesktopWindow(xfInfo* xfi, char* name, int width, int height, boolean decorations) { xfWindow* window; @@ -315,8 +324,10 @@ xfWindow* xf_CreateDesktopWindow(xfInfo* xfi, char* name, int width, int height, XSelectInput(xfi->display, window->handle, input_mask); XMapWindow(xfi->display, window->handle); - //NOTE: This must be done here to handle reparenting the window, so that we dont miss the event and hang waiting for the next one - /* wait for VisibilityNotify */ + /* + * NOTE: This must be done here to handle reparenting the window, + * so that we dont miss the event and hang waiting for the next one + */ do { XMaskEvent(xfi->display, VisibilityChangeMask, &xevent); @@ -324,7 +335,8 @@ xfWindow* xf_CreateDesktopWindow(xfInfo* xfi, char* name, int width, int height, while (xevent.type != VisibilityNotify); } - XStoreName(xfi->display, window->handle, name); + xf_SetWindowText(xfi, window, name); + return window; } @@ -419,8 +431,8 @@ xfWindow* xf_CreateWindow(xfInfo* xfi, rdpWindow* wnd, int x, int y, int width, (uint32) window->handle, window->left, window->top, window->right, window->bottom, window->width, window->height, wnd->windowId); - xf_SetWindowDecorations(xfi, window, window->decorations); - xf_SetWindowStyle(xfi, window, wnd->style, wnd->extendedStyle); + memset(&gcv, 0, sizeof(gcv)); + window->gc = XCreateGC(xfi->display, window->handle, GCGraphicsExposures, &gcv); class_hints = XAllocClassHint(); @@ -448,11 +460,14 @@ xfWindow* xf_CreateWindow(xfInfo* xfi, rdpWindow* wnd, int x, int y, int width, ColormapChangeMask | OwnerGrabButtonMask; XSelectInput(xfi->display, window->handle, input_mask); + + xf_SetWindowDecorations(xfi, window, window->decorations); + xf_SetWindowStyle(xfi, window, wnd->style, wnd->extendedStyle); + xf_ShowWindow(xfi, window, WINDOW_SHOW); + XMapWindow(xfi->display, window->handle); - memset(&gcv, 0, sizeof(gcv)); - window->gc = XCreateGC(xfi->display, window->handle, GCGraphicsExposures, &gcv); - + /* Move doesn't seem to work until window is mapped. */ xf_MoveWindow(xfi, window, x, y, width, height); return window; @@ -486,8 +501,6 @@ void xf_SetWindowMinMaxInfo(xfInfo* xfi, xfWindow* window, void xf_StartLocalMoveSize(xfInfo* xfi, xfWindow* window, int direction, int x, int y) { - Window child_window; - if (window->local_move.state != LMS_NOT_ACTIVE) return; @@ -499,17 +512,14 @@ void xf_StartLocalMoveSize(xfInfo* xfi, xfWindow* window, int direction, int x, window->window->windowOffsetX, window->window->windowOffsetY, window->window->windowWidth, window->window->windowHeight, x, y); + /* + * Save original mouse location relative to root. This will be needed + * to end local move to RDP server and/or X server + */ window->local_move.root_x = x; window->local_move.root_y = y; window->local_move.state = LMS_STARTING; - XTranslateCoordinates(xfi->display, RootWindowOfScreen(xfi->screen), window->handle, - window->local_move.root_x, - window->local_move.root_y, - &window->local_move.window_x, - &window->local_move.window_y, - &child_window); - XUngrabPointer(xfi->display, CurrentTime); xf_SendClientEvent(xfi, window, @@ -614,6 +624,10 @@ void xf_ShowWindow(xfInfo* xfi, xfWindow* window, uint8 state) case WINDOW_SHOW: XMapWindow(xfi->display, window->handle); + if (window->is_transient) + { + xf_SetWindowUnlisted(xfi, window); + } break; } @@ -660,6 +674,9 @@ void xf_SetWindowRects(xfInfo* xfi, xfWindow* window, RECTANGLE_16* rects, int n int i; XRectangle* xrects; + if (nrects == 0) + return; + xrects = xmalloc(sizeof(XRectangle) * nrects); for (i = 0; i < nrects; i++) @@ -682,6 +699,9 @@ void xf_SetWindowVisibilityRects(xfInfo* xfi, xfWindow* window, RECTANGLE_16* re int i; XRectangle* xrects; + if (nrects == 0) + return; + xrects = xmalloc(sizeof(XRectangle) * nrects); for (i = 0; i < nrects; i++) @@ -693,7 +713,7 @@ void xf_SetWindowVisibilityRects(xfInfo* xfi, xfWindow* window, RECTANGLE_16* re } #ifdef WITH_XEXT - //XShapeCombineRectangles(xfi->display, window->handle, ShapeBounding, 0, 0, xrects, nrects, ShapeSet, 0); + XShapeCombineRectangles(xfi->display, window->handle, ShapeBounding, 0, 0, xrects, nrects, ShapeSet, 0); #endif xfree(xrects); diff --git a/client/X11/xf_window.h b/client/X11/xf_window.h index 15a2c86d6..760838c7a 100644 --- a/client/X11/xf_window.h +++ b/client/X11/xf_window.h @@ -91,6 +91,7 @@ xfWindow* xf_CreateDesktopWindow(xfInfo* xfi, char* name, int width, int height, void xf_ResizeDesktopWindow(xfInfo* xfi, xfWindow* window, int width, int height); xfWindow* xf_CreateWindow(xfInfo* xfi, rdpWindow* wnd, int x, int y, int width, int height, uint32 id); +void xf_SetWindowText(xfInfo *xfi, xfWindow* window, char *name); void xf_MoveWindow(xfInfo* xfi, xfWindow* window, int x, int y, int width, int height); void xf_ShowWindow(xfInfo* xfi, xfWindow* window, uint8 state); void xf_SetWindowIcon(xfInfo* xfi, xfWindow* window, rdpIcon* icon); diff --git a/cmake/FindXv.cmake b/cmake/FindXv.cmake index 346e6c628..0ba833d8a 100644 --- a/cmake/FindXv.cmake +++ b/cmake/FindXv.cmake @@ -29,7 +29,6 @@ #============================================================================= find_path(XV_INCLUDE_DIR NAMES X11/extensions/Xv.h - PATH_SUFFIXES X11/extensions DOC "The Xv include directory" ) diff --git a/include/freerdp/rail/window.h b/include/freerdp/rail/window.h index 43444bb3f..87eeb2318 100644 --- a/include/freerdp/rail/window.h +++ b/include/freerdp/rail/window.h @@ -43,7 +43,6 @@ struct rdp_window rdpWindow* next; uint32 windowId; uint32 ownerWindowId; - rdpWindow* ownerWindow; uint32 style; uint32 extendedStyle; uint8 showState;