libfreerdp-core: fix some async updates race conditions

This commit is contained in:
Marc-André Moreau
2013-02-14 17:43:37 -05:00
parent cca810aa4c
commit c19c8a40dd
7 changed files with 130 additions and 95 deletions

View File

@@ -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
{

View File

@@ -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)

View File

@@ -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 */

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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__)

View File

@@ -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);