diff options
author | llyzs <llyzs.vic@gmail.com> | 2011-01-31 10:30:28 +0300 |
---|---|---|
committer | Vic Lee (llyzs) <llyzs@b6cfa94a-2857-405c-b0d6-536ef9fc39e1> | 2011-01-31 10:30:28 +0300 |
commit | bc87b2bccb98cb9db9a9969519f8c308ec24c9e9 (patch) | |
tree | bb5286b9d2f766dd9a10cb101fd6f2ca3db92409 /remmina-plugins | |
parent | dd038c5b1795178dc245fa1ca7d75b6b3bbab666 (diff) |
RDP: cursor handling
Diffstat (limited to 'remmina-plugins')
-rw-r--r-- | remmina-plugins/rdp/remminapluginrdp.h | 1 | ||||
-rw-r--r-- | remmina-plugins/rdp/remminapluginrdpev.c | 37 | ||||
-rw-r--r-- | remmina-plugins/rdp/remminapluginrdpui.c | 43 |
3 files changed, 69 insertions, 12 deletions
diff --git a/remmina-plugins/rdp/remminapluginrdp.h b/remmina-plugins/rdp/remminapluginrdp.h index d9f65a3f9..34ea0cc9a 100644 --- a/remmina-plugins/rdp/remminapluginrdp.h +++ b/remmina-plugins/rdp/remminapluginrdp.h @@ -141,6 +141,7 @@ typedef struct _RemminaPluginRdpUiObject gint fgcolor; gint opcode; guchar *data; + GdkPixbuf *pixbuf; } RemminaPluginRdpUiObject; #endif diff --git a/remmina-plugins/rdp/remminapluginrdpev.c b/remmina-plugins/rdp/remminapluginrdpev.c index 2d83ec565..4ce9c9533 100644 --- a/remmina-plugins/rdp/remminapluginrdpev.c +++ b/remmina-plugins/rdp/remminapluginrdpev.c @@ -1119,6 +1119,37 @@ remmina_plugin_rdpev_patblt_bitmap (RemminaProtocolWidget *gp, RemminaPluginRdpU } } +static void +remmina_plugin_rdpev_set_cursor (RemminaProtocolWidget *gp, RemminaPluginRdpUiObject *ui) +{ + RemminaPluginRdpData *gpdata; + GdkCursor *cur; + + gpdata = GET_DATA (gp); + if (ui->pixbuf) + { + cur = gdk_cursor_new_from_pixbuf (gdk_display_get_default (), + ui->pixbuf, ui->x, ui->y); + gdk_window_set_cursor (gtk_widget_get_window (gpdata->drawing_area), cur); + gdk_cursor_unref (cur); + } + else + { + cur = gdk_cursor_new (GDK_BLANK_CURSOR); + gdk_window_set_cursor (gtk_widget_get_window (gpdata->drawing_area), cur); + gdk_cursor_unref (cur); + } +} + +static void +remmina_plugin_rdpev_set_default_cursor (RemminaProtocolWidget *gp, RemminaPluginRdpUiObject *ui) +{ + RemminaPluginRdpData *gpdata; + + gpdata = GET_DATA (gp); + gdk_window_set_cursor (gtk_widget_get_window (gpdata->drawing_area), NULL); +} + gboolean remmina_plugin_rdpev_queue_ui (RemminaProtocolWidget *gp) { @@ -1198,6 +1229,12 @@ remmina_plugin_rdpev_queue_ui (RemminaProtocolWidget *gp) case REMMINA_PLUGIN_RDP_UI_PATBLT_BITMAP: remmina_plugin_rdpev_patblt_bitmap (gp, ui); break; + case REMMINA_PLUGIN_RDP_UI_SET_CURSOR: + remmina_plugin_rdpev_set_cursor (gp, ui); + break; + case REMMINA_PLUGIN_RDP_UI_SET_DEFAULT_CURSOR: + remmina_plugin_rdpev_set_default_cursor (gp, ui); + break; default: break; } diff --git a/remmina-plugins/rdp/remminapluginrdpui.c b/remmina-plugins/rdp/remminapluginrdpui.c index 0fba902c5..7ed27668d 100644 --- a/remmina-plugins/rdp/remminapluginrdpui.c +++ b/remmina-plugins/rdp/remminapluginrdpui.c @@ -958,20 +958,21 @@ static void remmina_plugin_rdpui_set_cursor (rdpInst *inst, RD_HCURSOR cursor) { RemminaProtocolWidget *gp; - RemminaPluginRdpData *gpdata; + RemminaPluginRdpUiObject *ui; gp = GET_WIDGET (inst); - gpdata = GET_DATA (gp); + ui = g_new0 (RemminaPluginRdpUiObject, 1); + ui->type = REMMINA_PLUGIN_RDP_UI_SET_CURSOR; + ui->pixbuf = gdk_pixbuf_copy (GDK_PIXBUF (cursor)); + ui->x = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (cursor), "x")); + ui->y = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (cursor), "y")); + remmina_plugin_rdpui_queue_ui (gp, ui); } static void remmina_plugin_rdpui_destroy_cursor (rdpInst *inst, RD_HCURSOR cursor) { - RemminaProtocolWidget *gp; - RemminaPluginRdpData *gpdata; - - gp = GET_WIDGET (inst); - gpdata = GET_DATA (gp); + g_object_unref (GDK_PIXBUF (cursor)); } static RD_HCURSOR @@ -980,31 +981,45 @@ remmina_plugin_rdpui_create_cursor (rdpInst *inst, uint32 x, uint32 y, { RemminaProtocolWidget *gp; RemminaPluginRdpData *gpdata; + GdkPixbuf *pixbuf; gp = GET_WIDGET (inst); gpdata = GET_DATA (gp); - return NULL; + /*g_print ("create_cursor %i %i %i %i %i\n", x, y, width, height, bpp);*/ + pixbuf = remmina_plugin_rdpui_bitmap_convert (gpdata, width, height, bpp, TRUE, xormask); + remmina_plugin_rdpui_bitmap_apply_mask (pixbuf, andmask); + if (bpp > 1) + { + remmina_plugin_rdpui_bitmap_flip (pixbuf); + } + g_object_set_data (G_OBJECT (pixbuf), "x", GINT_TO_POINTER (x)); + g_object_set_data (G_OBJECT (pixbuf), "y", GINT_TO_POINTER (y)); + return (RD_HCURSOR) pixbuf; } static void remmina_plugin_rdpui_set_null_cursor (rdpInst *inst) { RemminaProtocolWidget *gp; - RemminaPluginRdpData *gpdata; + RemminaPluginRdpUiObject *ui; gp = GET_WIDGET (inst); - gpdata = GET_DATA (gp); + ui = g_new0 (RemminaPluginRdpUiObject, 1); + ui->type = REMMINA_PLUGIN_RDP_UI_SET_CURSOR; + remmina_plugin_rdpui_queue_ui (gp, ui); } static void remmina_plugin_rdpui_set_default_cursor (rdpInst *inst) { RemminaProtocolWidget *gp; - RemminaPluginRdpData *gpdata; + RemminaPluginRdpUiObject *ui; gp = GET_WIDGET (inst); - gpdata = GET_DATA (gp); + ui = g_new0 (RemminaPluginRdpUiObject, 1); + ui->type = REMMINA_PLUGIN_RDP_UI_SET_DEFAULT_CURSOR; + remmina_plugin_rdpui_queue_ui (gp, ui); } static RD_HPALETTE @@ -1272,6 +1287,10 @@ remmina_plugin_rdpui_object_free (gpointer p) { RemminaPluginRdpUiObject *obj = (RemminaPluginRdpUiObject *) p; g_free (obj->data); + if (obj->pixbuf) + { + g_object_unref (obj->pixbuf); + } g_free (obj); } |