Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/Remmina/Remmina.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorllyzs <llyzs.vic@gmail.com>2011-01-31 10:30:28 +0300
committerVic Lee (llyzs) <llyzs@b6cfa94a-2857-405c-b0d6-536ef9fc39e1>2011-01-31 10:30:28 +0300
commitbc87b2bccb98cb9db9a9969519f8c308ec24c9e9 (patch)
treebb5286b9d2f766dd9a10cb101fd6f2ca3db92409 /remmina-plugins
parentdd038c5b1795178dc245fa1ca7d75b6b3bbab666 (diff)
RDP: cursor handling
Diffstat (limited to 'remmina-plugins')
-rw-r--r--remmina-plugins/rdp/remminapluginrdp.h1
-rw-r--r--remmina-plugins/rdp/remminapluginrdpev.c37
-rw-r--r--remmina-plugins/rdp/remminapluginrdpui.c43
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);
}