diff --git a/client/DirectFB/df_graphics.c b/client/DirectFB/df_graphics.c index 3203a59e8..59ca690c9 100644 --- a/client/DirectFB/df_graphics.c +++ b/client/DirectFB/df_graphics.c @@ -90,18 +90,33 @@ void df_Pointer_Set(rdpContext* context, rdpPointer* pointer) dfi->layer->SetCooperativeLevel(dfi->layer, DLSCL_ADMINISTRATIVE); - result = dfi->layer->SetCursorShape(dfi->layer, + dfi->layer->SetCursorOpacity(dfi->layer, df_pointer ? 255: 0); + + if(df_pointer != NULL) + { + result = dfi->layer->SetCursorShape(dfi->layer, df_pointer->surface, df_pointer->xhot, df_pointer->yhot); - if (result != DFB_OK) - { - DirectFBErrorFatal("SetCursorShape Error", result); - return; + if (result != DFB_OK) + { + DirectFBErrorFatal("SetCursorShape Error", result); + return; + } } dfi->layer->SetCooperativeLevel(dfi->layer, DLSCL_SHARED); } +void df_Pointer_SetNull(rdpContext* context) +{ + df_Pointer_Set(context, NULL); +} + +void df_Pointer_SetDefault(rdpContext* context) +{ + +} + /* Graphics Module */ void df_register_graphics(rdpGraphics* graphics) @@ -114,6 +129,8 @@ void df_register_graphics(rdpGraphics* graphics) pointer->New = df_Pointer_New; pointer->Free = df_Pointer_Free; pointer->Set = df_Pointer_Set; + pointer->SetNull = df_Pointer_SetNull; + pointer->SetDefault = df_Pointer_SetDefault; graphics_register_pointer(graphics, pointer); xfree(pointer); diff --git a/client/Windows/wf_graphics.c b/client/Windows/wf_graphics.c index 715d3c5ce..a79628f1a 100644 --- a/client/Windows/wf_graphics.c +++ b/client/Windows/wf_graphics.c @@ -216,6 +216,16 @@ void wf_Pointer_Set(rdpContext* context, rdpPointer* pointer) } +void wf_Pointer_SetNull(rdpContext* context) +{ + +} + +void wf_Pointer_SetDefault(rdpContext* context) +{ + +} + /* Graphics Module */ void wf_register_graphics(rdpGraphics* graphics) @@ -236,6 +246,8 @@ void wf_register_graphics(rdpGraphics* graphics) pointer.New = wf_Pointer_New; pointer.Free = wf_Pointer_Free; pointer.Set = wf_Pointer_Set; + pointer.SetNull = wf_Pointer_SetNull; + pointer.SetDefault = wf_Pointer_SetDefault; graphics_register_bitmap(graphics, &bitmap); graphics_register_pointer(graphics, &pointer); diff --git a/client/X11/xf_graphics.c b/client/X11/xf_graphics.c index 0f3ab7c79..a761ea65b 100644 --- a/client/X11/xf_graphics.c +++ b/client/X11/xf_graphics.c @@ -191,6 +191,36 @@ void xf_Pointer_Set(rdpContext* context, rdpPointer* pointer) if (xfi->window != NULL) XDefineCursor(xfi->display, xfi->window->handle, ((xfPointer*) pointer)->cursor); } + +void xf_Pointer_SetNull(rdpContext* context) +{ + xfInfo* xfi = ((xfContext*) context)->xfi; + static Cursor nullcursor = None; + + if (nullcursor == None) + { + XcursorImage ci; + XcursorPixel xp = 0; + memset(&ci, 0, sizeof(ci)); + ci.version = XCURSOR_IMAGE_VERSION; + ci.size = sizeof(ci); + ci.width = ci.height = 1; + ci.xhot = ci.yhot = 0; + ci.pixels = &xp; + nullcursor = XcursorImageLoadCursor(xfi->display, &ci); + } + if (xfi->window != NULL && nullcursor != None) + XDefineCursor(xfi->display, xfi->window->handle, nullcursor); +} + +void xf_Pointer_SetDefault(rdpContext* context) +{ + xfInfo* xfi = ((xfContext*) context)->xfi; + + if (xfi->window != NULL) + XUndefineCursor(xfi->display, xfi->window->handle); +} + /* Glyph Class */ void xf_Glyph_New(rdpContext* context, rdpGlyph* glyph) @@ -302,6 +332,8 @@ void xf_register_graphics(rdpGraphics* graphics) pointer->New = xf_Pointer_New; pointer->Free = xf_Pointer_Free; pointer->Set = xf_Pointer_Set; + pointer->SetNull = xf_Pointer_SetNull; + pointer->SetDefault = xf_Pointer_SetDefault; graphics_register_pointer(graphics, pointer); xfree(pointer); diff --git a/include/freerdp/graphics.h b/include/freerdp/graphics.h index ab6c0e844..033ff3a23 100644 --- a/include/freerdp/graphics.h +++ b/include/freerdp/graphics.h @@ -81,6 +81,8 @@ FREERDP_API void Bitmap_SetSurface(rdpContext* context, rdpBitmap* bitmap, boole typedef void (*pPointer_New)(rdpContext* context, rdpPointer* pointer); typedef void (*pPointer_Free)(rdpContext* context, rdpPointer* pointer); typedef void (*pPointer_Set)(rdpContext* context, rdpPointer* pointer); +typedef void (*pPointer_SetNull)(rdpContext* context); +typedef void (*pPointer_SetDefault)(rdpContext* context); struct rdp_pointer { @@ -88,7 +90,9 @@ struct rdp_pointer pPointer_New New; /* 1 */ pPointer_Free Free; /* 2 */ pPointer_Set Set; /* 3 */ - uint32 paddingA[16 - 4]; /* 4 */ + pPointer_SetNull SetNull; /* 4*/ + pPointer_SetDefault SetDefault; /* 5 */ + uint32 paddingA[16 - 6]; /* 6 */ uint32 xPos; /* 16 */ uint32 yPos; /* 17 */ @@ -106,6 +110,8 @@ FREERDP_API rdpPointer* Pointer_Alloc(rdpContext* context); FREERDP_API void Pointer_New(rdpContext* context, rdpPointer* pointer); FREERDP_API void Pointer_Free(rdpContext* context, rdpPointer* pointer); FREERDP_API void Pointer_Set(rdpContext* context, rdpPointer* pointer); +FREERDP_API void Pointer_SetNull(rdpContext* context); +FREERDP_API void Pointer_SetDefault(rdpContext* context); /* Glyph Class */ diff --git a/libfreerdp-cache/pointer.c b/libfreerdp-cache/pointer.c index 86d2f30e6..becee2e25 100644 --- a/libfreerdp-cache/pointer.c +++ b/libfreerdp-cache/pointer.c @@ -29,7 +29,19 @@ void update_pointer_position(rdpContext* context, POINTER_POSITION_UPDATE* point void update_pointer_system(rdpContext* context, POINTER_SYSTEM_UPDATE* pointer_system) { + switch (pointer_system->type) + { + case SYSPTR_NULL: + Pointer_SetNull(context); + break; + case SYSPTR_DEFAULT: + Pointer_SetDefault(context); + break; + + default: + printf("Unknown system pointer type (0x%08X)\n", pointer_system->type); + } } void update_pointer_color(rdpContext* context, POINTER_COLOR_UPDATE* pointer_color) diff --git a/libfreerdp-core/graphics.c b/libfreerdp-core/graphics.c index f6b3bab4e..f62c20682 100644 --- a/libfreerdp-core/graphics.c +++ b/libfreerdp-core/graphics.c @@ -128,6 +128,16 @@ void Pointer_Set(rdpContext* context, rdpPointer* pointer) context->graphics->Pointer_Prototype->Set(context, pointer); } +void Pointer_SetNull(rdpContext* context) +{ + context->graphics->Pointer_Prototype->SetNull(context); +} + +void Pointer_SetDefault(rdpContext* context) +{ + context->graphics->Pointer_Prototype->SetDefault(context); +} + void graphics_register_pointer(rdpGraphics* graphics, rdpPointer* pointer) { memcpy(graphics->Pointer_Prototype, pointer, sizeof(rdpPointer));