diff options
author | Jean-Louis Dupond <jean-louis@dupond.be> | 2012-05-29 17:38:28 +0400 |
---|---|---|
committer | Jean-Louis Dupond <jean-louis@dupond.be> | 2012-05-29 17:38:28 +0400 |
commit | 9cf9302a9d7c4869e690e96a2935893b9d8389cf (patch) | |
tree | ece890002a6b5327e52659a1ee35f831ebea98bf /remmina-plugins/rdp | |
parent | 46814a0d90dace85fa127c2d2b623d6c02a654c0 (diff) |
Add cursor support
Diffstat (limited to 'remmina-plugins/rdp')
-rw-r--r-- | remmina-plugins/rdp/rdp_event.c | 13 | ||||
-rw-r--r-- | remmina-plugins/rdp/rdp_graphics.c | 39 | ||||
-rw-r--r-- | remmina-plugins/rdp/rdp_plugin.h | 7 |
3 files changed, 57 insertions, 2 deletions
diff --git a/remmina-plugins/rdp/rdp_event.c b/remmina-plugins/rdp/rdp_event.c index 761be0c1c..276e6a3fc 100644 --- a/remmina-plugins/rdp/rdp_event.c +++ b/remmina-plugins/rdp/rdp_event.c @@ -663,6 +663,15 @@ static void remmina_rdp_event_connected(RemminaProtocolWidget* gp, RemminaPlugin remmina_rdp_event_update_scale(gp); } +static void remmina_rdp_event_update_cursor(RemminaProtocolWidget* gp, RemminaPluginRdpUiObject* ui) +{ + rfContext* rfi; + + rfi = GET_DATA(gp); + + gdk_window_set_cursor(gtk_widget_get_window(rfi->drawing_area), ui->cursor.cursor); +} + gboolean remmina_rdp_event_queue_ui(RemminaProtocolWidget* gp) { rfContext* rfi; @@ -684,6 +693,10 @@ gboolean remmina_rdp_event_queue_ui(RemminaProtocolWidget* gp) remmina_rdp_event_connected(gp, ui); break; + case REMMINA_RDP_UI_UPDATE_CURSOR: + remmina_rdp_event_update_cursor(gp, ui); + break; + default: break; } diff --git a/remmina-plugins/rdp/rdp_graphics.c b/remmina-plugins/rdp/rdp_graphics.c index 6a12d342d..4050f59c0 100644 --- a/remmina-plugins/rdp/rdp_graphics.c +++ b/remmina-plugins/rdp/rdp_graphics.c @@ -167,25 +167,62 @@ void rf_Bitmap_SetSurface(rdpContext* context, rdpBitmap* bitmap, boolean primar void rf_Pointer_New(rdpContext* context, rdpPointer* pointer) { + rfContext* rfi = (rfContext*) context; + GdkPixbuf *pixbuf; + guchar* pixbuf_data; + pixbuf_data = g_malloc(pointer->width * pointer->height * 4); + if ((pointer->andMaskData != 0) && (pointer->xorMaskData != 0)) + { + freerdp_alpha_cursor_convert(pixbuf_data, pointer->xorMaskData, pointer->andMaskData, pointer->width, pointer->height, pointer->xorBpp, rfi->clrconv); + } + pixbuf = gdk_pixbuf_new_from_data(pixbuf_data, GDK_COLORSPACE_RGB, TRUE, 8, pointer->width, pointer->height, (pointer->width * 4), (GdkPixbufDestroyNotify) g_free, NULL); + ((rfPointer*) pointer)->cursor = gdk_cursor_new_from_pixbuf(rfi->display, pixbuf, pointer->xPos, pointer->yPos); } void rf_Pointer_Free(rdpContext* context, rdpPointer* pointer) { - + if (((rfPointer*) pointer)->cursor != 0) + g_object_unref(((rfPointer*) pointer)->cursor); } void rf_Pointer_Set(rdpContext* context, rdpPointer* pointer) { + rfContext* rfi = (rfContext*) context; + RemminaPluginRdpUiObject* ui; + + ui = g_new0(RemminaPluginRdpUiObject, 1); + ui->type = REMMINA_RDP_UI_UPDATE_CURSOR; + ui->cursor.cursor = ((rfPointer*) pointer)->cursor; + rf_queue_ui(rfi->protocol_widget, ui); } void rf_Pointer_SetNull(rdpContext* context) { + rfContext* rfi = (rfContext*) context; + GdkCursor* nullcursor = NULL; + RemminaPluginRdpUiObject* ui; + + nullcursor = gdk_cursor_new(GDK_BLANK_CURSOR); + + ui = g_new0(RemminaPluginRdpUiObject, 1); + ui->type = REMMINA_RDP_UI_UPDATE_CURSOR; + ui->cursor.cursor = nullcursor; + + rf_queue_ui(rfi->protocol_widget, ui); } void rf_Pointer_SetDefault(rdpContext* context) { + rfContext* rfi = (rfContext*) context; + RemminaPluginRdpUiObject* ui; + + ui = g_new0(RemminaPluginRdpUiObject, 1); + ui->type = REMMINA_RDP_UI_UPDATE_CURSOR; + ui->cursor.cursor = NULL; + + rf_queue_ui(rfi->protocol_widget, ui); } /* Glyph Class */ diff --git a/remmina-plugins/rdp/rdp_plugin.h b/remmina-plugins/rdp/rdp_plugin.h index 00e188bdb..cb6f426c3 100644 --- a/remmina-plugins/rdp/rdp_plugin.h +++ b/remmina-plugins/rdp/rdp_plugin.h @@ -48,7 +48,7 @@ extern RemminaPluginService* remmina_plugin_service; struct rf_pointer { rdpPointer pointer; - Cursor cursor; + GdkCursor* cursor; }; typedef struct rf_pointer rfPointer; @@ -160,6 +160,7 @@ typedef enum { REMMINA_RDP_UI_UPDATE_REGION = 0, REMMINA_RDP_UI_CONNECTED, + REMMINA_RDP_UI_UPDATE_CURSOR, REMMINA_RDP_UI_RFX, REMMINA_RDP_UI_NOCODEC } RemminaPluginRdpUiType; @@ -178,6 +179,10 @@ struct remmina_plugin_rdp_ui_object } region; struct { + GdkCursor* cursor; + } cursor; + struct + { gint left; gint top; RFX_MESSAGE* message; |