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:
authorJean-Louis Dupond <jean-louis@dupond.be>2012-05-29 17:38:28 +0400
committerJean-Louis Dupond <jean-louis@dupond.be>2012-05-29 17:38:28 +0400
commit9cf9302a9d7c4869e690e96a2935893b9d8389cf (patch)
treeece890002a6b5327e52659a1ee35f831ebea98bf /remmina-plugins/rdp
parent46814a0d90dace85fa127c2d2b623d6c02a654c0 (diff)
Add cursor support
Diffstat (limited to 'remmina-plugins/rdp')
-rw-r--r--remmina-plugins/rdp/rdp_event.c13
-rw-r--r--remmina-plugins/rdp/rdp_graphics.c39
-rw-r--r--remmina-plugins/rdp/rdp_plugin.h7
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;