mirror of
https://github.com/morgan9e/FreeRDP
synced 2026-04-15 00:44:19 +09:00
libfreerdp-core: fix some async updates race conditions
This commit is contained in:
@@ -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
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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__)
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user