diff --git a/client/X11/xf_event.c b/client/X11/xf_event.c index ca4d80f22..836116ab3 100644 --- a/client/X11/xf_event.c +++ b/client/X11/xf_event.c @@ -571,7 +571,7 @@ static BOOL xf_event_MapNotify(xfInfo* xfi, XEvent* event, BOOL app) { RECTANGLE_16 rect; rdpWindow* window; - //rdpUpdate* update = xfi->instance->update; + rdpUpdate* update = xfi->instance->update; rdpRail* rail = ((rdpContext*) xfi->context)->rail; if (!app) @@ -581,7 +581,7 @@ static BOOL xf_event_MapNotify(xfInfo* xfi, XEvent* event, BOOL app) rect.right = xfi->width; rect.bottom = xfi->height; - //update->SuppressOutput((rdpContext*) xfi->context, 1, &rect); + update->SuppressOutput((rdpContext*) xfi->context, 1, &rect); } else { @@ -608,14 +608,14 @@ static BOOL xf_event_MapNotify(xfInfo* xfi, XEvent* event, BOOL app) static BOOL xf_event_UnmapNotify(xfInfo* xfi, XEvent* event, BOOL app) { rdpWindow* window; - //rdpUpdate* update = xfi->instance->update; + rdpUpdate* update = xfi->instance->update; rdpRail* rail = ((rdpContext*) xfi->context)->rail; xf_kbd_release_all_keypress(xfi); if (!app) { - //update->SuppressOutput((rdpContext*) xfi->context, 0, NULL); + update->SuppressOutput((rdpContext*) xfi->context, 0, NULL); } else { diff --git a/client/X11/xf_gdi.c b/client/X11/xf_gdi.c index 8726babdb..974f28d97 100644 --- a/client/X11/xf_gdi.c +++ b/client/X11/xf_gdi.c @@ -267,11 +267,11 @@ void xf_gdi_palette_update(rdpContext* context, PALETTE_UPDATE* palette) { xfInfo* xfi = ((xfContext*) context)->xfi; - xf_lock_x11(xfi); + xf_lock_x11(xfi, FALSE); CopyMemory(xfi->clrconv->palette, palette, sizeof(rdpPalette)); - xf_unlock_x11(xfi); + xf_unlock_x11(xfi, FALSE); } void xf_gdi_set_bounds(rdpContext* context, rdpBounds* bounds) @@ -279,7 +279,7 @@ void xf_gdi_set_bounds(rdpContext* context, rdpBounds* bounds) XRectangle clip; xfInfo* xfi = ((xfContext*) context)->xfi; - xf_lock_x11(xfi); + xf_lock_x11(xfi, FALSE); if (bounds != NULL) { @@ -294,14 +294,14 @@ void xf_gdi_set_bounds(rdpContext* context, rdpBounds* bounds) XSetClipMask(xfi->display, xfi->gc, None); } - xf_unlock_x11(xfi); + xf_unlock_x11(xfi, FALSE); } void xf_gdi_dstblt(rdpContext* context, DSTBLT_ORDER* dstblt) { xfInfo* xfi = ((xfContext*) context)->xfi; - xf_lock_x11(xfi); + xf_lock_x11(xfi, FALSE); xf_set_rop3(xfi, gdi_rop3_code(dstblt->bRop)); @@ -317,7 +317,7 @@ void xf_gdi_dstblt(rdpContext* context, DSTBLT_ORDER* dstblt) XSetFunction(xfi->display, xfi->gc, GXcopy); - xf_unlock_x11(xfi); + xf_unlock_x11(xfi, FALSE); } void xf_gdi_patblt(rdpContext* context, PATBLT_ORDER* patblt) @@ -329,7 +329,7 @@ void xf_gdi_patblt(rdpContext* context, PATBLT_ORDER* patblt) xfContext* context_ = (xfContext*) context; xfInfo* xfi = context_->xfi; - xf_lock_x11(xfi); + xf_lock_x11(xfi, FALSE); brush = &patblt->brush; xf_set_rop3(xfi, gdi_rop3_code(patblt->bRop)); @@ -405,14 +405,14 @@ void xf_gdi_patblt(rdpContext* context, PATBLT_ORDER* patblt) XSetFunction(xfi->display, xfi->gc, GXcopy); - xf_unlock_x11(xfi); + xf_unlock_x11(xfi, FALSE); } void xf_gdi_scrblt(rdpContext* context, SCRBLT_ORDER* scrblt) { xfInfo* xfi = ((xfContext*) context)->xfi; - xf_lock_x11(xfi); + xf_lock_x11(xfi, FALSE); xf_set_rop3(xfi, gdi_rop3_code(scrblt->bRop)); @@ -426,7 +426,7 @@ void xf_gdi_scrblt(rdpContext* context, SCRBLT_ORDER* scrblt) XSetFunction(xfi->display, xfi->gc, GXcopy); - xf_unlock_x11(xfi); + xf_unlock_x11(xfi, FALSE); } void xf_gdi_opaque_rect(rdpContext* context, OPAQUE_RECT_ORDER* opaque_rect) @@ -435,7 +435,7 @@ void xf_gdi_opaque_rect(rdpContext* context, OPAQUE_RECT_ORDER* opaque_rect) xfContext* context_ = (xfContext*) context; xfInfo* xfi = context_->xfi; - xf_lock_x11(xfi); + xf_lock_x11(xfi, FALSE); color = freerdp_color_convert_var(opaque_rect->color, context_->settings->ColorDepth, xfi->bpp, xfi->clrconv); @@ -453,7 +453,7 @@ void xf_gdi_opaque_rect(rdpContext* context, OPAQUE_RECT_ORDER* opaque_rect) opaque_rect->nWidth, opaque_rect->nHeight); } - xf_unlock_x11(xfi); + xf_unlock_x11(xfi, FALSE); } void xf_gdi_multi_opaque_rect(rdpContext* context, MULTI_OPAQUE_RECT_ORDER* multi_opaque_rect) @@ -464,7 +464,7 @@ void xf_gdi_multi_opaque_rect(rdpContext* context, MULTI_OPAQUE_RECT_ORDER* mult xfContext* context_ = (xfContext*) context; xfInfo* xfi = context_->xfi; - xf_lock_x11(xfi); + xf_lock_x11(xfi, FALSE); color = freerdp_color_convert_var(multi_opaque_rect->color, context_->settings->ColorDepth, xfi->bpp, xfi->clrconv); @@ -486,7 +486,7 @@ void xf_gdi_multi_opaque_rect(rdpContext* context, MULTI_OPAQUE_RECT_ORDER* mult } } - xf_unlock_x11(xfi); + xf_unlock_x11(xfi, FALSE); } void xf_gdi_draw_nine_grid(rdpContext* context, DRAW_NINE_GRID_ORDER* draw_nine_grid) @@ -500,7 +500,7 @@ void xf_gdi_line_to(rdpContext* context, LINE_TO_ORDER* line_to) xfContext* context_ = (xfContext*) context; xfInfo* xfi = context_->xfi; - xf_lock_x11(xfi); + xf_lock_x11(xfi, FALSE); xf_set_rop2(xfi, line_to->bRop2); color = freerdp_color_convert_var(line_to->penColor, context_->settings->ColorDepth, xfi->bpp, xfi->clrconv); @@ -530,7 +530,7 @@ void xf_gdi_line_to(rdpContext* context, LINE_TO_ORDER* line_to) XSetFunction(xfi->display, xfi->gc, GXcopy); - xf_unlock_x11(xfi); + xf_unlock_x11(xfi, FALSE); } void xf_gdi_polyline(rdpContext* context, POLYLINE_ORDER* polyline) @@ -546,7 +546,7 @@ void xf_gdi_polyline(rdpContext* context, POLYLINE_ORDER* polyline) xfContext* context_ = (xfContext*) context; xfInfo* xfi = context_->xfi; - xf_lock_x11(xfi); + xf_lock_x11(xfi, FALSE); xf_set_rop2(xfi, polyline->bRop2); color = freerdp_color_convert_var(polyline->penColor, context_->settings->ColorDepth, xfi->bpp, xfi->clrconv); @@ -594,7 +594,7 @@ void xf_gdi_polyline(rdpContext* context, POLYLINE_ORDER* polyline) XSetFunction(xfi->display, xfi->gc, GXcopy); free(points); - xf_unlock_x11(xfi); + xf_unlock_x11(xfi, FALSE); } void xf_gdi_memblt(rdpContext* context, MEMBLT_ORDER* memblt) @@ -602,7 +602,7 @@ void xf_gdi_memblt(rdpContext* context, MEMBLT_ORDER* memblt) xfBitmap* bitmap; xfInfo* xfi = ((xfContext*) context)->xfi; - xf_lock_x11(xfi); + xf_lock_x11(xfi, FALSE); bitmap = (xfBitmap*) memblt->bitmap; xf_set_rop3(xfi, gdi_rop3_code(memblt->bRop)); @@ -618,7 +618,7 @@ void xf_gdi_memblt(rdpContext* context, MEMBLT_ORDER* memblt) XSetFunction(xfi->display, xfi->gc, GXcopy); - xf_unlock_x11(xfi); + xf_unlock_x11(xfi, FALSE); } void xf_gdi_mem3blt(rdpContext* context, MEM3BLT_ORDER* mem3blt) @@ -631,7 +631,7 @@ void xf_gdi_mem3blt(rdpContext* context, MEM3BLT_ORDER* mem3blt) xfContext* context_ = (xfContext*) context; xfInfo* xfi = context_->xfi; - xf_lock_x11(xfi); + xf_lock_x11(xfi, FALSE); brush = &mem3blt->brush; bitmap = (xfBitmap*) mem3blt->bitmap; @@ -690,7 +690,7 @@ void xf_gdi_mem3blt(rdpContext* context, MEM3BLT_ORDER* mem3blt) XSetFunction(xfi->display, xfi->gc, GXcopy); - xf_unlock_x11(xfi); + xf_unlock_x11(xfi, FALSE); } void xf_gdi_polygon_sc(rdpContext* context, POLYGON_SC_ORDER* polygon_sc) @@ -700,7 +700,7 @@ void xf_gdi_polygon_sc(rdpContext* context, POLYGON_SC_ORDER* polygon_sc) UINT32 brush_color; xfInfo* xfi = ((xfContext*) context)->xfi; - xf_lock_x11(xfi); + xf_lock_x11(xfi, FALSE); xf_set_rop2(xfi, polygon_sc->bRop2); brush_color = freerdp_color_convert_var(polygon_sc->brushColor, ((xfContext*)context)->settings->ColorDepth, xfi->bpp, xfi->clrconv); @@ -747,7 +747,7 @@ void xf_gdi_polygon_sc(rdpContext* context, POLYGON_SC_ORDER* polygon_sc) XSetFunction(xfi->display, xfi->gc, GXcopy); free(points); - xf_unlock_x11(xfi); + xf_unlock_x11(xfi, FALSE); } void xf_gdi_polygon_cb(rdpContext* context, POLYGON_CB_ORDER* polygon_cb) @@ -760,7 +760,7 @@ void xf_gdi_polygon_cb(rdpContext* context, POLYGON_CB_ORDER* polygon_cb) UINT32 backColor; xfInfo* xfi = ((xfContext*) context)->xfi; - xf_lock_x11(xfi); + xf_lock_x11(xfi, FALSE); brush = &(polygon_cb->brush); xf_set_rop2(xfi, polygon_cb->bRop2); @@ -854,7 +854,7 @@ void xf_gdi_polygon_cb(rdpContext* context, POLYGON_CB_ORDER* polygon_cb) XSetFunction(xfi->display, xfi->gc, GXcopy); free(points); - xf_unlock_x11(xfi); + xf_unlock_x11(xfi, FALSE); } void xf_gdi_ellipse_sc(rdpContext* context, ELLIPSE_SC_ORDER* ellipse_sc) @@ -875,7 +875,7 @@ void xf_gdi_surface_frame_marker(rdpContext* context, SURFACE_FRAME_MARKER* surf xfi = ((xfContext*) context)->xfi; settings = xfi->instance->settings; - xf_lock_x11(xfi); + xf_lock_x11(xfi, FALSE); switch (surface_frame_marker->frameAction) { @@ -901,7 +901,7 @@ void xf_gdi_surface_frame_marker(rdpContext* context, SURFACE_FRAME_MARKER* surf break; } - xf_unlock_x11(xfi); + xf_unlock_x11(xfi, FALSE); } static void xf_gdi_surface_update_frame(xfInfo* xfi, UINT16 tx, UINT16 ty, UINT16 width, UINT16 height) @@ -945,7 +945,7 @@ void xf_gdi_surface_bits(rdpContext* context, SURFACE_BITS_COMMAND* surface_bits RFX_CONTEXT* rfx_context = (RFX_CONTEXT*) xfi->rfx_context; NSC_CONTEXT* nsc_context = (NSC_CONTEXT*) xfi->nsc_context; - xf_lock_x11(xfi); + xf_lock_x11(xfi, FALSE); if (surface_bits_command->codecID == RDP_CODEC_ID_REMOTEFX) { @@ -1050,7 +1050,7 @@ void xf_gdi_surface_bits(rdpContext* context, SURFACE_BITS_COMMAND* surface_bits printf("Unsupported codecID %d\n", surface_bits_command->codecID); } - xf_unlock_x11(xfi); + xf_unlock_x11(xfi, FALSE); } void xf_gdi_register_update_callbacks(rdpUpdate* update) diff --git a/client/X11/xf_graphics.c b/client/X11/xf_graphics.c index 07cd18f67..6a8a6d98c 100644 --- a/client/X11/xf_graphics.c +++ b/client/X11/xf_graphics.c @@ -46,7 +46,7 @@ void xf_Bitmap_New(rdpContext* context, rdpBitmap* bitmap) xfContext* context_ = (xfContext*) context; xfInfo* xfi = context_->xfi; - WaitForSingleObject(xfi->mutex, INFINITE); + xf_lock_x11(xfi, FALSE); XSetFunction(xfi->display, xfi->gc, GXcopy); pixmap = XCreatePixmap(xfi->display, xfi->drawable, bitmap->width, bitmap->height, xfi->depth); @@ -78,19 +78,19 @@ void xf_Bitmap_New(rdpContext* context, rdpBitmap* bitmap) ((xfBitmap*) bitmap)->pixmap = pixmap; - ReleaseMutex(xfi->mutex); + xf_unlock_x11(xfi, FALSE); } void xf_Bitmap_Free(rdpContext* context, rdpBitmap* bitmap) { xfInfo* xfi = ((xfContext*) context)->xfi; - WaitForSingleObject(xfi->mutex, INFINITE); + xf_lock_x11(xfi, FALSE); if (((xfBitmap*) bitmap)->pixmap != 0) XFreePixmap(xfi->display, ((xfBitmap*) bitmap)->pixmap); - ReleaseMutex(xfi->mutex); + xf_unlock_x11(xfi, FALSE); } void xf_Bitmap_Paint(rdpContext* context, rdpBitmap* bitmap) @@ -102,7 +102,7 @@ void xf_Bitmap_Paint(rdpContext* context, rdpBitmap* bitmap) width = bitmap->right - bitmap->left + 1; height = bitmap->bottom - bitmap->top + 1; - WaitForSingleObject(xfi->mutex, INFINITE); + xf_lock_x11(xfi, FALSE); XSetFunction(xfi->display, xfi->gc, GXcopy); @@ -116,7 +116,7 @@ void xf_Bitmap_Paint(rdpContext* context, rdpBitmap* bitmap) gdi_InvalidateRegion(xfi->hdc, bitmap->left, bitmap->top, width, height); - ReleaseMutex(xfi->mutex); + xf_unlock_x11(xfi, FALSE); } void xf_Bitmap_Decompress(rdpContext* context, rdpBitmap* bitmap, @@ -206,14 +206,14 @@ void xf_Bitmap_SetSurface(rdpContext* context, rdpBitmap* bitmap, BOOL primary) { xfInfo* xfi = ((xfContext*) context)->xfi; - WaitForSingleObject(xfi->mutex, INFINITE); + xf_lock_x11(xfi, FALSE); if (primary) xfi->drawing = xfi->primary; else xfi->drawing = ((xfBitmap*) bitmap)->pixmap; - ReleaseMutex(xfi->mutex); + xf_unlock_x11(xfi, FALSE); } /* Pointer Class */ @@ -224,7 +224,7 @@ void xf_Pointer_New(rdpContext* context, rdpPointer* pointer) XcursorImage ci; xfInfo* xfi = ((xfContext*) context)->xfi; - WaitForSingleObject(xfi->mutex, INFINITE); + xf_lock_x11(xfi, FALSE); ZeroMemory(&ci, sizeof(ci)); ci.version = XCURSOR_IMAGE_VERSION; @@ -247,7 +247,7 @@ void xf_Pointer_New(rdpContext* context, rdpPointer* pointer) free(ci.pixels); - ReleaseMutex(xfi->mutex); + xf_unlock_x11(xfi, FALSE); #endif } @@ -256,12 +256,12 @@ void xf_Pointer_Free(rdpContext* context, rdpPointer* pointer) #ifdef WITH_XCURSOR xfInfo* xfi = ((xfContext*) context)->xfi; - WaitForSingleObject(xfi->mutex, INFINITE); + xf_lock_x11(xfi, FALSE); if (((xfPointer*) pointer)->cursor != 0) XFreeCursor(xfi->display, ((xfPointer*) pointer)->cursor); - ReleaseMutex(xfi->mutex); + xf_unlock_x11(xfi, FALSE); #endif } @@ -270,14 +270,14 @@ void xf_Pointer_Set(rdpContext* context, rdpPointer* pointer) #ifdef WITH_XCURSOR xfInfo* xfi = ((xfContext*) context)->xfi; - WaitForSingleObject(xfi->mutex, INFINITE); + xf_lock_x11(xfi, FALSE); /* in RemoteApp mode, window can be null if none has had focus */ if (xfi->window != NULL) XDefineCursor(xfi->display, xfi->window->handle, ((xfPointer*) pointer)->cursor); - ReleaseMutex(xfi->mutex); + xf_unlock_x11(xfi, FALSE); #endif } @@ -287,7 +287,7 @@ void xf_Pointer_SetNull(rdpContext* context) xfInfo* xfi = ((xfContext*) context)->xfi; static Cursor nullcursor = None; - WaitForSingleObject(xfi->mutex, INFINITE); + xf_lock_x11(xfi, FALSE); if (nullcursor == None) { @@ -305,7 +305,7 @@ void xf_Pointer_SetNull(rdpContext* context) if (xfi->window != NULL && nullcursor != None) XDefineCursor(xfi->display, xfi->window->handle, nullcursor); - ReleaseMutex(xfi->mutex); + xf_unlock_x11(xfi, FALSE); #endif } @@ -314,12 +314,12 @@ void xf_Pointer_SetDefault(rdpContext* context) #ifdef WITH_XCURSOR xfInfo* xfi = ((xfContext*) context)->xfi; - WaitForSingleObject(xfi->mutex, INFINITE); + xf_lock_x11(xfi, FALSE); if (xfi->window != NULL) XUndefineCursor(xfi->display, xfi->window->handle); - ReleaseMutex(xfi->mutex); + xf_unlock_x11(xfi, FALSE); #endif } @@ -335,7 +335,7 @@ void xf_Glyph_New(rdpContext* context, rdpGlyph* glyph) xf_glyph = (xfGlyph*) glyph; xfi = ((xfContext*) context)->xfi; - WaitForSingleObject(xfi->mutex, INFINITE); + xf_lock_x11(xfi, FALSE); scanline = (glyph->cx + 7) / 8; @@ -351,19 +351,19 @@ void xf_Glyph_New(rdpContext* context, rdpGlyph* glyph) XPutImage(xfi->display, xf_glyph->pixmap, xfi->gc_mono, image, 0, 0, 0, 0, glyph->cx, glyph->cy); XFree(image); - ReleaseMutex(xfi->mutex); + xf_unlock_x11(xfi, FALSE); } void xf_Glyph_Free(rdpContext* context, rdpGlyph* glyph) { xfInfo* xfi = ((xfContext*) context)->xfi; - WaitForSingleObject(xfi->mutex, INFINITE); + xf_lock_x11(xfi, FALSE); if (((xfGlyph*) glyph)->pixmap != 0) XFreePixmap(xfi->display, ((xfGlyph*) glyph)->pixmap); - ReleaseMutex(xfi->mutex); + xf_unlock_x11(xfi, FALSE); } void xf_Glyph_Draw(rdpContext* context, rdpGlyph* glyph, int x, int y) @@ -373,14 +373,14 @@ void xf_Glyph_Draw(rdpContext* context, rdpGlyph* glyph, int x, int y) xf_glyph = (xfGlyph*) glyph; - WaitForSingleObject(xfi->mutex, INFINITE); + xf_lock_x11(xfi, FALSE); XSetStipple(xfi->display, xfi->gc, xf_glyph->pixmap); XSetTSOrigin(xfi->display, xfi->gc, x, y); XFillRectangle(xfi->display, xfi->drawing, xfi->gc, x, y, glyph->cx, glyph->cy); XSetStipple(xfi->display, xfi->gc, xfi->bitmap_mono); - ReleaseMutex(xfi->mutex); + xf_unlock_x11(xfi, FALSE); } void xf_Glyph_BeginDraw(rdpContext* context, int x, int y, int width, int height, UINT32 bgcolor, UINT32 fgcolor) @@ -396,7 +396,7 @@ void xf_Glyph_BeginDraw(rdpContext* context, int x, int y, int width, int height freerdp_color_convert_var_bgr(fgcolor, context_->settings->ColorDepth, xfi->bpp, xfi->clrconv): freerdp_color_convert_var_rgb(fgcolor, context_->settings->ColorDepth, xfi->bpp, xfi->clrconv); - WaitForSingleObject(xfi->mutex, INFINITE); + xf_lock_x11(xfi, FALSE); XSetFunction(xfi->display, xfi->gc, GXcopy); XSetFillStyle(xfi->display, xfi->gc, FillSolid); @@ -407,21 +407,21 @@ void xf_Glyph_BeginDraw(rdpContext* context, int x, int y, int width, int height XSetBackground(xfi->display, xfi->gc, fgcolor); XSetFillStyle(xfi->display, xfi->gc, FillStippled); - ReleaseMutex(xfi->mutex); + xf_unlock_x11(xfi, FALSE); } void xf_Glyph_EndDraw(rdpContext* context, int x, int y, int width, int height, UINT32 bgcolor, UINT32 fgcolor) { xfInfo* xfi = ((xfContext*) context)->xfi; - WaitForSingleObject(xfi->mutex, INFINITE); + xf_lock_x11(xfi, FALSE); if (xfi->drawing == xfi->primary) { gdi_InvalidateRegion(xfi->hdc, x, y, width, height); } - ReleaseMutex(xfi->mutex); + xf_unlock_x11(xfi, FALSE); } /* Graphics Module */ diff --git a/client/X11/xf_window.c b/client/X11/xf_window.c index 809deafa4..7d9345aa6 100644 --- a/client/X11/xf_window.c +++ b/client/X11/xf_window.c @@ -112,6 +112,7 @@ void xf_SendClientEvent(xfInfo* xfi, xfWindow* window, Atom atom, unsigned int n } DEBUG_X11("Send ClientMessage Event: wnd=0x%04X", (unsigned int) xevent.xclient.window); + XSendEvent(xfi->display, RootWindowOfScreen(xfi->screen), False, SubstructureRedirectMask | SubstructureNotifyMask, &xevent); XSync(xfi->display, False); @@ -170,9 +171,8 @@ BOOL xf_GetCurrentDesktop(xfInfo* xfi) status = xf_GetWindowProperty(xfi, DefaultRootWindow(xfi->display), xfi->_NET_CURRENT_DESKTOP, 1, &nitems, &bytes, &prop); - if (status != TRUE) { + if (status != TRUE) return FALSE; - } xfi->current_desktop = (int) *prop; free(prop); @@ -199,7 +199,8 @@ BOOL xf_GetWorkArea(xfInfo* xfi) if (status != TRUE) return FALSE; - if ((xfi->current_desktop * 4 + 3) >= nitems) { + if ((xfi->current_desktop * 4 + 3) >= nitems) + { free(prop); return FALSE; } @@ -507,7 +508,7 @@ 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); - memset(&gcv, 0, sizeof(gcv)); + ZeroMemory(&gcv, sizeof(gcv)); window->gc = XCreateGC(xfi->display, window->handle, GCGraphicsExposures, &gcv); class_hints = XAllocClassHint(); @@ -939,12 +940,12 @@ rdpWindow* xf_rdpWindowFromWindow(xfInfo* xfi, Window wnd) if (xfi->_context != NULL) { rail = xfi->_context->rail; + if (rail != NULL) - { - return window_list_get_by_extra_id(rail->list, (void*)(long)wnd); - } + return window_list_get_by_extra_id(rail->list, (void*) (long) wnd); } } } + return NULL; } diff --git a/client/X11/xfreerdp.c b/client/X11/xfreerdp.c index f5804d6f5..d93abacc9 100644 --- a/client/X11/xfreerdp.c +++ b/client/X11/xfreerdp.c @@ -127,12 +127,12 @@ void xf_sw_end_paint(rdpContext* context) w = gdi->primary->hdc->hwnd->invalid->w; h = gdi->primary->hdc->hwnd->invalid->h; - xf_lock_x11(xfi); + xf_lock_x11(xfi, FALSE); XPutImage(xfi->display, xfi->primary, xfi->gc, xfi->image, x, y, x, y, w, h); XCopyArea(xfi->display, xfi->primary, xfi->window->handle, xfi->gc, x, y, w, h, x, y); - xf_unlock_x11(xfi); + xf_unlock_x11(xfi, FALSE); } else { @@ -146,7 +146,7 @@ void xf_sw_end_paint(rdpContext* context) ninvalid = gdi->primary->hdc->hwnd->ninvalid; cinvalid = gdi->primary->hdc->hwnd->cinvalid; - xf_lock_x11(xfi); + xf_lock_x11(xfi, FALSE); for (i = 0; i < ninvalid; i++) { @@ -161,7 +161,7 @@ void xf_sw_end_paint(rdpContext* context) XFlush(xfi->display); - xf_unlock_x11(xfi); + xf_unlock_x11(xfi, FALSE); } } else @@ -174,11 +174,11 @@ void xf_sw_end_paint(rdpContext* context) w = gdi->primary->hdc->hwnd->invalid->w; h = gdi->primary->hdc->hwnd->invalid->h; - xf_lock_x11(xfi); + xf_lock_x11(xfi, FALSE); xf_rail_paint(xfi, context->rail, x, y, x + w - 1, y + h - 1); - xf_unlock_x11(xfi); + xf_unlock_x11(xfi, FALSE); } } @@ -190,7 +190,7 @@ void xf_sw_desktop_resize(rdpContext* context) xfi = ((xfContext*) context)->xfi; settings = xfi->instance->settings; - xf_lock_x11(xfi); + xf_lock_x11(xfi, TRUE); if (xfi->fullscreen != TRUE) { @@ -206,7 +206,7 @@ void xf_sw_desktop_resize(rdpContext* context) } } - xf_unlock_x11(xfi); + xf_unlock_x11(xfi, TRUE); } void xf_hw_begin_paint(rdpContext* context) @@ -238,11 +238,11 @@ void xf_hw_end_paint(rdpContext* context) w = xfi->hdc->hwnd->invalid->w; h = xfi->hdc->hwnd->invalid->h; - xf_lock_x11(xfi); + xf_lock_x11(xfi, FALSE); XCopyArea(xfi->display, xfi->primary, xfi->drawable, xfi->gc, x, y, w, h, x, y); - xf_unlock_x11(xfi); + xf_unlock_x11(xfi, FALSE); } else { @@ -256,7 +256,7 @@ void xf_hw_end_paint(rdpContext* context) ninvalid = xfi->hdc->hwnd->ninvalid; cinvalid = xfi->hdc->hwnd->cinvalid; - xf_lock_x11(xfi); + xf_lock_x11(xfi, FALSE); for (i = 0; i < ninvalid; i++) { @@ -270,7 +270,7 @@ void xf_hw_end_paint(rdpContext* context) XFlush(xfi->display); - xf_unlock_x11(xfi); + xf_unlock_x11(xfi, FALSE); } } else @@ -283,11 +283,11 @@ void xf_hw_end_paint(rdpContext* context) w = xfi->hdc->hwnd->invalid->w; h = xfi->hdc->hwnd->invalid->h; - xf_lock_x11(xfi); + xf_lock_x11(xfi, FALSE); xf_rail_paint(xfi, context->rail, x, y, x + w - 1, y + h - 1); - xf_unlock_x11(xfi); + xf_unlock_x11(xfi, FALSE); } } @@ -300,7 +300,7 @@ void xf_hw_desktop_resize(rdpContext* context) xfi = ((xfContext*) context)->xfi; settings = xfi->instance->settings; - xf_lock_x11(xfi); + xf_lock_x11(xfi, TRUE); if (xfi->fullscreen != TRUE) { @@ -331,7 +331,7 @@ void xf_hw_desktop_resize(rdpContext* context) XFillRectangle(xfi->display, xfi->drawable, xfi->gc, 0, 0, xfi->width, xfi->height); } - xf_unlock_x11(xfi); + xf_unlock_x11(xfi, TRUE); } BOOL xf_get_fds(freerdp* instance, void** rfds, int* rcount, void** wfds, int* wcount) @@ -356,11 +356,11 @@ BOOL xf_process_x_events(freerdp* instance) while (pending_status) { - xf_lock_x11(xfi); + xf_lock_x11(xfi, FALSE); pending_status = XPending(xfi->display); - xf_unlock_x11(xfi); + xf_unlock_x11(xfi, FALSE); if (pending_status) { @@ -427,6 +427,8 @@ void xf_toggle_fullscreen(xfInfo* xfi) { Pixmap contents = 0; + xf_lock_x11(xfi, TRUE); + contents = XCreatePixmap(xfi->display, xfi->window->handle, xfi->width, xfi->height, xfi->depth); XCopyArea(xfi->display, xfi->primary, contents, xfi->gc, 0, 0, xfi->width, xfi->height, 0, 0); @@ -436,18 +438,34 @@ void xf_toggle_fullscreen(xfInfo* xfi) XCopyArea(xfi->display, contents, xfi->primary, xfi->gc, 0, 0, xfi->width, xfi->height, 0, 0); XFreePixmap(xfi->display, contents); + + xf_unlock_x11(xfi, TRUE); } -void xf_lock_x11(xfInfo* xfi) +void xf_lock_x11(xfInfo* xfi, BOOL display) { if (!xfi->UseXThreads) + { WaitForSingleObject(xfi->mutex, INFINITE); + } + else + { + if (display) + XLockDisplay(xfi->display); + } } -void xf_unlock_x11(xfInfo* xfi) +void xf_unlock_x11(xfInfo* xfi, BOOL display) { if (!xfi->UseXThreads) + { ReleaseMutex(xfi->mutex); + } + else + { + if (display) + XUnlockDisplay(xfi->display); + } } BOOL xf_get_pixmap_info(xfInfo* xfi) @@ -1162,21 +1180,21 @@ void* xf_input_thread(void* arg) { do { - xf_lock_x11(xfi); + xf_lock_x11(xfi, FALSE); pending_status = XPending(xfi->display); - xf_unlock_x11(xfi); + xf_unlock_x11(xfi, FALSE); if (pending_status) { - xf_lock_x11(xfi); + xf_lock_x11(xfi, FALSE); ZeroMemory(&xevent, sizeof(xevent)); XNextEvent(xfi->display, &xevent); process_status = xf_event_process(instance, &xevent); - xf_unlock_x11(xfi); + xf_unlock_x11(xfi, FALSE); if (!process_status) break; diff --git a/client/X11/xfreerdp.h b/client/X11/xfreerdp.h index ec67d92b3..992c2edac 100644 --- a/client/X11/xfreerdp.h +++ b/client/X11/xfreerdp.h @@ -215,8 +215,8 @@ enum XF_EXIT_CODE XF_EXIT_UNKNOWN = 255, }; -void xf_lock_x11(xfInfo* xfi); -void xf_unlock_x11(xfInfo* xfi); +void xf_lock_x11(xfInfo* xfi, BOOL display); +void xf_unlock_x11(xfInfo* xfi, BOOL display); #ifdef WITH_DEBUG_X11 #define DEBUG_X11(fmt, ...) DEBUG_CLASS(X11, fmt, ## __VA_ARGS__) diff --git a/libfreerdp/core/message.c b/libfreerdp/core/message.c index d484c697c..0e85442c0 100644 --- a/libfreerdp/core/message.c +++ b/libfreerdp/core/message.c @@ -1495,6 +1495,22 @@ int update_message_queue_process_message(rdpUpdate* update, wMessage* message) if (message->id == WMQ_QUIT) return 0; + /** + * FIXME: + * + * Certain messages like RefreshRect, SuppressOutput and SurfaceFrameAcknowledge + * and not really output but really input events that send a message to the server. + * Right now they will race with other code making use of the transport layer. + */ + + switch (message->id) + { + case FREERDP_UPDATE_REFRESH_RECT: + case FREERDP_UPDATE_SUPPRESS_OUTPUT: + case FREERDP_UPDATE_SURFACE_FRAME_ACKNOWLEDGE: + return 1; + } + msgClass = GetMessageClass(message->id); msgType = GetMessageType(message->id);