44 #include <gdk/gdkkeysyms.h> 45 #ifdef GDK_WINDOWING_X11 46 #include <cairo/cairo-xlib.h> 48 #include <cairo/cairo.h> 50 #include <freerdp/locale/keyboard.h> 65 gdi = ((rdpContext *)rfi)->gdi;
67 REMMINA_PLUGIN_DEBUG(
"Map event received, disabling TS_SUPPRESS_OUTPUT_PDU ");
68 gdi_send_suppress_output(gdi, FALSE);
83 GtkWidget *toplevel = gtk_widget_get_toplevel(GTK_WIDGET(gp));
84 GdkWindow *window = gtk_widget_get_window(toplevel);
86 if (gdk_window_get_fullscreen_mode(window) == GDK_FULLSCREEN_ON_ALL_MONITORS) {
87 REMMINA_PLUGIN_DEBUG(
"Unmap event received, but cannot enable TS_SUPPRESS_OUTPUT_PDU when in fullscreen");
95 gdi = ((rdpContext *)rfi)->gdi;
97 REMMINA_PLUGIN_DEBUG(
"Unmap event received, enabling TS_SUPPRESS_OUTPUT_PDU ");
98 gdi_send_suppress_output(gdi, TRUE);
106 TRACE_CALL(__func__);
110 GdkModifierType state;
112 #if GTK_CHECK_VERSION(3, 20, 0) 115 GdkDeviceManager *manager;
117 GdkDevice *keyboard = NULL;
119 const gchar *wname = gtk_widget_get_name(gtk_widget_get_toplevel(widget));
120 REMMINA_PLUGIN_DEBUG(
"Top level name is: %s", wname);
126 UINT32 toggle_keys_state = 0;
128 #if GTK_CHECK_VERSION(3, 20, 0) 129 seat = gdk_display_get_default_seat(gdk_display_get_default());
130 keyboard = gdk_seat_get_pointer(seat);
132 manager = gdk_display_get_device_manager(gdk_display_get_default());
133 keyboard = gdk_device_manager_get_client_pointer(manager);
135 gdk_window_get_device_position(gdk_get_default_root_window(), keyboard, NULL, NULL, &state);
137 if (state & GDK_LOCK_MASK)
138 toggle_keys_state |= KBD_SYNC_CAPS_LOCK;
139 if (state & GDK_MOD2_MASK)
140 toggle_keys_state |= KBD_SYNC_NUM_LOCK;
141 if (state & GDK_MOD5_MASK)
142 toggle_keys_state |= KBD_SYNC_SCROLL_LOCK;
144 input->SynchronizeEvent(input, toggle_keys_state);
145 input->KeyboardEvent(input, KBD_FLAGS_RELEASE, 0x0F);
152 TRACE_CALL(__func__);
162 #if GLIB_CHECK_VERSION(2,67,3) 176 TRACE_CALL(__func__);
197 TRACE_CALL(__func__);
224 TRACE_CALL(__func__);
239 TRACE_CALL(__func__);
250 if ((width == 0) || (height == 0))
255 *x = MIN(MAX(0, *x), width - 1);
256 *y = MIN(MAX(0, *y), height - 1);
257 *w = MIN(width - *x, *w);
258 *h = MIN(height - *y, *h);
284 TRACE_CALL(__func__);
288 for (i = 0; i < ui->
reg.ninvalid; i++) {
289 x = ui->
reg.ureg[i].x;
290 y = ui->
reg.ureg[i].y;
291 w = ui->
reg.ureg[i].w;
292 h = ui->
reg.ureg[i].h;
297 gtk_widget_queue_draw_area(rfi->
drawing_area, x, y, w, h);
299 g_free(ui->
reg.ureg);
304 TRACE_CALL(__func__);
310 gtk_widget_queue_draw_area(rfi->
drawing_area, x, y, w, h);
315 TRACE_CALL(__func__);
317 gint rdwidth, rdheight;
318 gint gpwidth, gpheight;
321 gtk_widget_get_allocation(GTK_WIDGET(gp), &a);
326 if ((gpwidth > 1) && (gpheight > 1)) {
346 TRACE_CALL(__func__);
350 cairo_text_extents_t extents;
359 width = gtk_widget_get_allocated_width(widget);
360 height = gtk_widget_get_allocated_height(widget);
363 msg = g_strdup_printf(_(
"Reconnection attempt %d of %d…"),
366 cairo_select_font_face(context,
"Sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD);
367 cairo_set_font_size(context, 24);
368 cairo_set_source_rgb(context, 0.9, 0.9, 0.9);
369 cairo_text_extents(context, msg, &extents);
370 cairo_move_to(context, (width - (extents.width + extents.x_bearing)) / 2, (height - (extents.height + extents.y_bearing)) / 2);
371 cairo_show_text(context, msg);
382 cairo_surface_flush(rfi->
surface);
383 cairo_set_source_surface(context, rfi->
surface, 0, 0);
384 cairo_surface_mark_dirty(rfi->
surface);
386 cairo_set_operator(context, CAIRO_OPERATOR_SOURCE);
387 cairo_paint(context);
395 TRACE_CALL(__func__);
400 gint desktopOrientation, desktopScaleFactor, deviceScaleFactor;
413 gint gpwidth, gpheight, prevwidth, prevheight;
415 gchar *monitorids = NULL;
416 guint32 maxwidth = 0;
417 guint32 maxheight = 0;
421 REMMINA_PLUGIN_DEBUG(
"Sending preconfigured monitor layout");
424 gtk_widget_get_allocation(GTK_WIDGET(gp), &a);
430 if ((gpwidth != prevwidth || gpheight != prevheight) && gpwidth >= 200 && gpheight >= 200) {
433 if (gpwidth < AVC_MIN_DESKTOP_WIDTH)
434 gpwidth = AVC_MIN_DESKTOP_WIDTH;
435 if (gpheight < AVC_MIN_DESKTOP_HEIGHT)
436 gpheight = AVC_MIN_DESKTOP_HEIGHT;
440 const rdpMonitor *base = freerdp_settings_get_pointer(rfi->
settings, FreeRDP_MonitorDefArray);
441 for (gint i = 0; i < freerdp_settings_get_uint32(rfi->
settings, FreeRDP_MonitorCount); ++i) {
442 const rdpMonitor *current = &base[i];
443 REMMINA_PLUGIN_DEBUG(
"Sending display layout n° %d", i);
445 REMMINA_PLUGIN_DEBUG(
"EVNT MON LAYOUT - Flags: %i", rdp_event.
monitor_layout.Flags);
447 REMMINA_PLUGIN_DEBUG(
"EVNT MON LAYOUT - Left: %i", rdp_event.
monitor_layout.Left);
449 REMMINA_PLUGIN_DEBUG(
"EVNT MON LAYOUT - Top: %i", rdp_event.
monitor_layout.Top);
451 REMMINA_PLUGIN_DEBUG(
"EVNT MON LAYOUT - width: %i", rdp_event.
monitor_layout.width);
453 REMMINA_PLUGIN_DEBUG(
"EVNT MON LAYOUT - height: %i", rdp_event.
monitor_layout.height);
454 rdp_event.
monitor_layout.physicalWidth = current->attributes.physicalWidth;
455 REMMINA_PLUGIN_DEBUG(
"EVNT MON LAYOUT - physicalWidth: %i", rdp_event.
monitor_layout.physicalWidth);
456 rdp_event.
monitor_layout.physicalHeight = current->attributes.physicalHeight;
457 REMMINA_PLUGIN_DEBUG(
"EVNT MON LAYOUT - PhysicalHeight: %i", rdp_event.
monitor_layout.physicalHeight);
458 if (current->attributes.orientation)
459 rdp_event.
monitor_layout.desktopOrientation = current->attributes.orientation;
462 REMMINA_PLUGIN_DEBUG(
"EVNT MON LAYOUT - desktopOrientation: %i", rdp_event.
monitor_layout.desktopOrientation);
464 REMMINA_PLUGIN_DEBUG(
"EVNT MON LAYOUT - ScaleFactorflag: %i", rdp_event.
monitor_layout.desktopScaleFactor);
486 TRACE_CALL(__func__);
501 TRACE_CALL(__func__);
520 TRACE_CALL(__func__);
542 TRACE_CALL(__func__);
563 TRACE_CALL(__func__);
582 TRACE_CALL(__func__);
608 TRACE_CALL(__func__);
610 gboolean extended = FALSE;
612 gint primary, secondary;
621 if ((event->type != GDK_BUTTON_PRESS) && (
event->type != GDK_BUTTON_RELEASE))
627 primary = PTR_FLAGS_BUTTON2;
628 secondary = PTR_FLAGS_BUTTON1;
630 primary = PTR_FLAGS_BUTTON1;
631 secondary = PTR_FLAGS_BUTTON2;
634 switch (event->button) {
639 flag |= PTR_FLAGS_BUTTON3;
647 flag |= PTR_XFLAGS_BUTTON1;
652 flag |= PTR_XFLAGS_BUTTON2;
658 if (event->type == GDK_BUTTON_PRESS) {
660 flag |= PTR_XFLAGS_DOWN;
662 flag |= PTR_FLAGS_DOWN;
679 TRACE_CALL(__func__);
694 switch (event->direction) {
696 flag = PTR_FLAGS_WHEEL | 0x0078;
699 case GDK_SCROLL_DOWN:
700 flag = PTR_FLAGS_WHEEL | 0x0188;
703 #if GTK_CHECK_VERSION(3, 4, 0) 704 case GDK_SCROLL_SMOOTH:
706 if (event->delta_y == 0.0)
709 windows_delta =
event->delta_y * -120;
711 if (windows_delta > 255)
713 if (windows_delta < -256)
714 windows_delta = -256;
716 flag = PTR_FLAGS_WHEEL | ((short)windows_delta & WheelRotationMask);
740 if (strmap == NULL || strmap[0] == 0) {
747 v1 = strtol(s, &endptr, 10);
748 if (endptr == s)
break;
750 if (*s !=
':')
break;
752 v2 = strtol(s, &endptr, 10);
753 if (endptr == s)
break;
757 g_array_append_val(rfi->
keymap, ke);
758 if (*s !=
',')
break;
761 if (rfi->
keymap->len == 0) {
762 g_array_unref(rfi->
keymap);
769 TRACE_CALL(__func__);
770 guint32 unicode_keyval;
771 guint16 hardware_keycode;
786 #ifdef ENABLE_GTK_INSPECTOR_KEY 789 if ((event->state & GDK_CONTROL_MASK) != 0 && (
event->keyval == GDK_KEY_I ||
event->keyval == GDK_KEY_D))
795 rdp_event.
key_event.up = (
event->type == GDK_KEY_PRESS ? false :
true);
799 switch (event->keyval) {
826 hardware_keycode =
event->hardware_keycode;
828 for (ik = 0; ik < rfi->
keymap->len; ik++) {
836 scancode = freerdp_keyboard_get_rdp_scancode_from_x11_keycode(hardware_keycode);
838 rdp_event.
key_event.key_code = scancode & 0xFF;
839 rdp_event.
key_event.extended = scancode & 0x100;
845 unicode_keyval = gdk_keyval_to_unicode(event->keyval);
854 if (event->keyval >= 0xfe00 ||
855 event->hardware_keycode == 0x41 ||
856 unicode_keyval == 0 ||
857 (event->state & (GDK_MOD1_MASK | GDK_CONTROL_MASK | GDK_SUPER_MASK)) != 0
859 scancode = freerdp_keyboard_get_rdp_scancode_from_x11_keycode(event->hardware_keycode);
860 rdp_event.
key_event.key_code = scancode & 0xFF;
868 rdp_event.
key_event.unicode_code = unicode_keyval;
884 TRACE_CALL(__func__);
886 CLIPRDR_FORMAT_LIST *pFormatList;
894 REMMINA_PLUGIN_DEBUG(
"gp=%p: owner-change event received", gp);
901 new_owner = gtk_clipboard_get_owner(gtkClipboard);
902 if (new_owner != (GObject *)gp) {
905 REMMINA_PLUGIN_DEBUG(
"gp=%p owner-change: new owner is different than me: new=%p me=%p",
908 REMMINA_PLUGIN_DEBUG(
"gp=%p owner-change: new owner is not me: Sending local clipboard format list to server.",
915 REMMINA_PLUGIN_DEBUG(
" ... but I'm the owner!");
922 TRACE_CALL(__func__);
926 GtkClipboard *clipboard;
929 gboolean disable_smooth_scrolling = FALSE;
936 disable_smooth_scrolling = (s && s[0] ==
'1' ? TRUE : FALSE);
941 REMMINA_PLUGIN_DEBUG(
"Disable smooth scrolling is set to %d", disable_smooth_scrolling);
945 gtk_container_add(GTK_CONTAINER(gp), rfi->
drawing_area);
947 gtk_widget_add_events(rfi->
drawing_area, GDK_POINTER_MOTION_MASK
948 | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK
949 | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK
950 | GDK_SCROLL_MASK | GDK_FOCUS_CHANGE_MASK);
952 if (!disable_smooth_scrolling) {
953 REMMINA_PLUGIN_DEBUG(
"Adding GDK_SMOOTH_SCROLL_MASK");
954 gtk_widget_add_events(rfi->
drawing_area, GDK_SMOOTH_SCROLL_MASK);
969 fprintf(stderr,
"RDP profile error: you cannot define both rdp_map_hardware_keycode and have 'Use client keyboard mapping' enabled\n");
973 g_signal_connect(G_OBJECT(rfi->
drawing_area),
"configure-event",
975 g_signal_connect(G_OBJECT(rfi->
drawing_area),
"motion-notify-event",
977 g_signal_connect(G_OBJECT(rfi->
drawing_area),
"button-press-event",
979 g_signal_connect(G_OBJECT(rfi->
drawing_area),
"button-release-event",
981 g_signal_connect(G_OBJECT(rfi->
drawing_area),
"scroll-event",
983 g_signal_connect(G_OBJECT(rfi->
drawing_area),
"key-press-event",
985 g_signal_connect(G_OBJECT(rfi->
drawing_area),
"key-release-event",
987 g_signal_connect(G_OBJECT(rfi->
drawing_area),
"focus-in-event",
1001 clipboard = gtk_widget_get_clipboard(rfi->
drawing_area, GDK_SELECTION_CLIPBOARD);
1006 rfi->
event_queue = g_async_queue_new_full(g_free);
1007 rfi->
ui_queue = g_async_queue_new();
1011 g_print(
"Error creating pipes.\n");
1016 flags = fcntl(rfi->
event_pipe[0], F_GETFL, 0);
1017 fcntl(rfi->
event_pipe[0], F_SETFL, flags | O_NONBLOCK);
1020 g_print(
"CreateFileDescriptorEvent() failed\n");
1023 rfi->
object_table = g_hash_table_new_full(NULL, NULL, NULL, g_free);
1025 rfi->
display = gdk_display_get_default();
1027 #if GTK_CHECK_VERSION(3, 22, 0) 1028 GdkVisual *visual = gdk_screen_get_system_visual(
1029 gdk_display_get_default_screen(rfi->
display));
1030 rfi->
bpp = gdk_visual_get_depth(visual);
1032 rfi->
bpp = gdk_visual_get_best_depth();
1038 TRACE_CALL(__func__);
1040 switch (obj->
type) {
1054 TRACE_CALL(__func__);
1076 cairo_surface_mark_dirty(rfi->
surface);
1077 cairo_surface_destroy(rfi->
surface);
1085 g_array_free(rfi->
keymap, TRUE);
1090 g_async_queue_unref(rfi->
ui_queue);
1111 gdi = ((rdpContext *)rfi)->gdi;
1117 cairo_surface_mark_dirty(rfi->
surface);
1118 cairo_surface_destroy(rfi->
surface);
1121 stride = cairo_format_stride_for_width(rfi->
cairo_format, gdi->width);
1122 rfi->
surface = cairo_image_surface_create_for_data((
unsigned char *)gdi->primary_buffer, rfi->
cairo_format, gdi->width, gdi->height, stride);
1123 cairo_surface_flush(rfi->
surface);
1128 TRACE_CALL(__func__);
1136 gdi = ((rdpContext *)rfi)->gdi;
1143 if (rfi->
surface && (cairo_image_surface_get_width(rfi->
surface) != gdi->width ||
1144 cairo_image_surface_get_height(rfi->
surface) != gdi->height)) {
1146 cairo_surface_mark_dirty(rfi->
surface);
1147 cairo_surface_destroy(rfi->
surface);
1150 }
else if (rfi->
surface == NULL) {
1156 if (width != gdi->width)
1158 if (height != gdi->height)
1165 gtk_widget_set_size_request(rfi->
drawing_area, -1, -1);
1168 gtk_widget_set_size_request(rfi->
drawing_area, width, height);
1174 TRACE_CALL(__func__);
1178 gdi = ((rdpContext *)rfi)->gdi;
1183 gtk_widget_queue_draw_area(rfi->
drawing_area, 0, 0, gdi->width, gdi->height);
1188 const gchar *host = freerdp_settings_get_string (rfi->
settings, FreeRDP_ServerHostname);
1190 REMMINA_PLUGIN_AUDIT(_(
"Connected to %s via RDP"), host);
1195 TRACE_CALL(__func__);
1198 gdk_window_invalidate_rect(gtk_widget_get_window(rfi->
drawing_area), NULL, TRUE);
1203 TRACE_CALL(__func__);
1206 rdpPointer *pointer = (rdpPointer *)ui->
cursor.pointer;
1207 cairo_surface_t *surface;
1208 UINT8 *data = malloc(pointer->width * pointer->height * 4);
1210 if (!freerdp_image_copy_from_pointer_data(
1211 (BYTE *)data, PIXEL_FORMAT_BGRA32,
1212 pointer->width * 4, 0, 0, pointer->width, pointer->height,
1213 pointer->xorMaskData, pointer->lengthXorMask,
1214 pointer->andMaskData, pointer->lengthAndMask,
1215 pointer->xorBpp, &(ui->
cursor.context->gdi->palette))) {
1220 surface = cairo_image_surface_create_for_data(data, CAIRO_FORMAT_ARGB32, pointer->width, pointer->height, cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, pointer->width));
1221 cairo_surface_flush(surface);
1222 pixbuf = gdk_pixbuf_get_from_surface(surface, 0, 0, pointer->width, pointer->height);
1223 cairo_surface_mark_dirty(surface);
1224 cairo_surface_destroy(surface);
1226 ((
rfPointer *)ui->
cursor.pointer)->cursor = gdk_cursor_new_from_pixbuf(rfi->
display, pixbuf, pointer->xPos, pointer->yPos);
1227 g_object_unref(pixbuf);
1234 TRACE_CALL(__func__);
1235 g_object_unref(ui->
cursor.pointer->cursor);
1236 ui->
cursor.pointer->cursor = NULL;
1241 TRACE_CALL(__func__);
1243 gint nx, ny, wx, wy;
1245 #if GTK_CHECK_VERSION(3, 20, 0) 1248 GdkDeviceManager *manager;
1257 #if GTK_CHECK_VERSION(3, 20, 0) 1258 seat = gdk_display_get_default_seat(gdk_display_get_default());
1259 dev = gdk_seat_get_pointer(seat);
1261 manager = gdk_display_get_device_manager(gdk_display_get_default());
1262 dev = gdk_device_manager_get_client_pointer(manager);
1265 nw = gdk_device_get_window_at_position(dev, NULL, NULL);
1271 gdk_window_get_root_coords(w, nx, ny, &wx, &wy);
1272 gdk_device_warp(dev, gdk_window_get_screen(w), wx, wy);
1279 TRACE_CALL(__func__);
1282 switch (ui->
cursor.type) {
1292 gdk_window_set_cursor(gtk_widget_get_window(rfi->
drawing_area), ui->
cursor.pointer->cursor);
1301 gdk_window_set_cursor(gtk_widget_get_window(rfi->
drawing_area),
1302 gdk_cursor_new_for_display(gdk_display_get_default(),
1308 gdk_window_set_cursor(gtk_widget_get_window(rfi->
drawing_area), NULL);
1316 TRACE_CALL(__func__);
1322 TRACE_CALL(__func__);
1332 TRACE_CALL(__func__);
1335 cairo_surface_mark_dirty(rfi->
surface);
1336 cairo_surface_destroy(rfi->
surface);
1342 TRACE_CALL(__func__);
1343 switch (ui->
event.type) {
1355 TRACE_CALL(__func__);
1388 TRACE_CALL(__func__);
1419 TRACE_CALL(__func__);
1421 gboolean ui_sync_save;
1432 pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &oldcanceltype);
1436 ui_sync_save = ui->
sync;
1446 g_async_queue_push(rfi->
ui_queue, ui);
1462 pthread_setcanceltype(oldcanceltype, NULL);
1473 TRACE_CALL(__func__);
1485 TRACE_CALL(__func__);
struct remmina_plugin_rdp_event::@42::@45 mouse_event
gboolean thread_cancelled
static void remmina_rdp_event_free_cursor(RemminaProtocolWidget *gp, RemminaPluginRdpUiObject *ui)
static void remmina_rdp_event_create_cairo_surface(rfContext *rfi)
RemminaScaleMode(* remmina_protocol_widget_get_current_scale_mode)(RemminaProtocolWidget *gp)
static void remmina_rdp_event_process_event(RemminaProtocolWidget *gp, RemminaPluginRdpUiObject *ui)
guint delayed_monitor_layout_handler
struct remmina_plugin_rdp_ui_object::@50::@53 cursor
static void remmina_rdp_event_update_scale_factor(RemminaProtocolWidget *gp)
gboolean remmina_rdp_event_on_unmap(RemminaProtocolWidget *gp)
typedefG_BEGIN_DECLS struct _RemminaFile RemminaFile
cairo_surface_t * surface
struct remmina_plugin_rdp_ui_object::@50::@52 reg
void(* protocol_plugin_set_width)(RemminaProtocolWidget *gp, gint width)
void remmina_rdp_settings_get_orientation_scale_prefs(int *desktopOrientation, int *desktopScaleFactor, int *deviceScaleFactor)
void remmina_rdp_clipboard_abort_client_format_data_request(rfContext *rfi)
void * remmina_rdp_event_queue_ui_sync_retptr(RemminaProtocolWidget *gp, RemminaPluginRdpUiObject *ui)
struct remmina_plugin_rdp_event::@42::@49 monitor_layout
void remmina_rdp_event_update_rect(RemminaProtocolWidget *gp, gint x, gint y, gint w, gint h)
pthread_mutex_t sync_wait_mutex
static gboolean remmina_rdp_event_process_ui_queue(RemminaProtocolWidget *gp)
static BOOL remmina_rdp_event_create_cursor(RemminaProtocolWidget *gp, RemminaPluginRdpUiObject *ui)
static void remmina_rdp_event_release_key(RemminaProtocolWidget *gp, RemminaPluginRdpEvent rdp_event)
static void remmina_rdp_event_queue_ui(RemminaProtocolWidget *gp, RemminaPluginRdpUiObject *ui)
gint(* protocol_plugin_get_width)(RemminaProtocolWidget *gp)
gint(* file_get_int)(RemminaFile *remminafile, const gchar *setting, gint default_value)
static gboolean remmina_rdp_event_on_key(GtkWidget *widget, GdkEventKey *event, RemminaProtocolWidget *gp)
void remmina_rdp_event_free_event(RemminaProtocolWidget *gp, RemminaPluginRdpUiObject *obj)
static gboolean remmina_rdp_event_on_motion(GtkWidget *widget, GdkEventMotion *event, RemminaProtocolWidget *gp)
void(* protocol_plugin_update_align)(RemminaProtocolWidget *gp)
void(* protocol_plugin_signal_connection_opened)(RemminaProtocolWidget *gp)
void remmina_rdp_event_process_clipboard(RemminaProtocolWidget *gp, RemminaPluginRdpUiObject *ui)
int reconnect_maxattempts
static void remmina_rdp_ui_event_update_scale(RemminaProtocolWidget *gp, RemminaPluginRdpUiObject *ui)
static gboolean remmina_rdp_event_on_focus_in(GtkWidget *widget, GdkEventKey *event, RemminaProtocolWidget *gp)
RemminaPluginRdpEventType type
void remmina_rdp_event_update_regions(RemminaProtocolWidget *gp, RemminaPluginRdpUiObject *ui)
static gboolean remmina_rdp_event_delayed_monitor_layout(RemminaProtocolWidget *gp)
static RemminaPluginService * remmina_plugin_service
unsigned translated_keycode
cairo_format_t cairo_format
static gboolean remmina_rdp_event_on_configure(GtkWidget *widget, GdkEventConfigure *event, RemminaProtocolWidget *gp)
int remmina_rdp_event_queue_ui_sync_retint(RemminaProtocolWidget *gp, RemminaPluginRdpUiObject *ui)
void remmina_rdp_event_init(RemminaProtocolWidget *gp)
gboolean use_client_keymap
static gboolean remmina_rdp_event_on_scroll(GtkWidget *widget, GdkEventScroll *event, RemminaProtocolWidget *gp)
gchar *(* pref_get_value)(const gchar *key)
static void remmina_rdp_event_reconnect_progress(RemminaProtocolWidget *gp, RemminaPluginRdpUiObject *ui)
static void remmina_rdp_event_scale_area(RemminaProtocolWidget *gp, gint *x, gint *y, gint *w, gint *h)
void remmina_rdp_event_queue_ui_async(RemminaProtocolWidget *gp, RemminaPluginRdpUiObject *ui)
static gboolean remmina_rdp_event_on_button(GtkWidget *widget, GdkEventButton *event, RemminaProtocolWidget *gp)
struct remmina_plugin_rdp_event::@42::@44 key_event
struct remmina_plugin_rdp_event::@42::@46 clipboard_formatlist
gint(* protocol_plugin_get_height)(RemminaProtocolWidget *gp)
void remmina_rdp_event_send_delayed_monitor_layout(RemminaProtocolWidget *gp)
GAsyncQueue * event_queue
static void remmina_rdp_event_release_all_keys(RemminaProtocolWidget *gp)
CLIPRDR_FORMAT_LIST * remmina_rdp_cliprdr_get_client_format_list(RemminaProtocolWidget *gp)
pthread_cond_t sync_wait_cond
static void remmina_rdp_event_init_keymap(rfContext *rfi, const gchar *strmap)
static void remmina_rdp_event_translate_pos(RemminaProtocolWidget *gp, int ix, int iy, UINT16 *ox, UINT16 *oy)
static void remmina_rdp_ui_event_destroy_cairo_surface(RemminaProtocolWidget *gp, RemminaPluginRdpUiObject *ui)
void remmina_rdp_event_uninit(RemminaProtocolWidget *gp)
void remmina_rdp_mouse_jitter(RemminaProtocolWidget *gp)
RemminaFile *(* protocol_plugin_get_file)(RemminaProtocolWidget *gp)
GHashTable * object_table
gboolean remmina_rdp_event_on_clipboard(GtkClipboard *gtkClipboard, GdkEvent *event, RemminaProtocolWidget *gp)
static void remmina_rdp_event_reverse_translate_pos_reverse(RemminaProtocolWidget *gp, int ix, int iy, int *ox, int *oy)
static void remmina_rdp_event_process_ui_event(RemminaProtocolWidget *gp, RemminaPluginRdpUiObject *ui)
static void keypress_list_add(RemminaProtocolWidget *gp, RemminaPluginRdpEvent rdp_event)
DispClientContext * dispcontext
static BOOL remmina_rdp_event_set_pointer_position(RemminaProtocolWidget *gp, gint x, gint y)
void(* protocol_plugin_register_hostkey)(RemminaProtocolWidget *gp, GtkWidget *widget)
static void remmina_rdp_event_connected(RemminaProtocolWidget *gp, RemminaPluginRdpUiObject *ui)
void remmina_rdp_event_update_scale(RemminaProtocolWidget *gp)
void(* protocol_plugin_set_height)(RemminaProtocolWidget *gp, gint height)
void remmina_rdp_event_unfocus(RemminaProtocolWidget *gp)
struct remmina_plugin_rdp_ui_object::@50::@55 nocodec
struct remmina_plugin_rdp_ui_object::@50::@57 event
void remmina_rdp_monitor_get(rfContext *rfi, gchar **monitorids, guint32 *maxwidth, guint32 *maxheight)
Set the MonitorIDs, the maxwidth and maxheight.
void remmina_rdp_event_event_push(RemminaProtocolWidget *gp, const RemminaPluginRdpEvent *e)
static void remmina_rdp_event_cursor(RemminaProtocolWidget *gp, RemminaPluginRdpUiObject *ui)
gboolean remmina_rdp_event_on_map(RemminaProtocolWidget *gp)
struct remmina_plugin_rdp_ui_object::@50::@58 pos
gboolean(* is_main_thread)(void)
static gboolean remmina_rdp_event_on_draw(GtkWidget *widget, cairo_t *context, RemminaProtocolWidget *gp)
pthread_mutex_t ui_queue_mutex
RemminaPluginRdpUiType type