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__);
223 TRACE_CALL(__func__);
238 TRACE_CALL(__func__);
249 if ((width == 0) || (height == 0))
254 *x = MIN(MAX(0, *x), width - 1);
255 *y = MIN(MAX(0, *y), height - 1);
256 *w = MIN(width - *x, *w);
257 *h = MIN(height - *y, *h);
283 TRACE_CALL(__func__);
287 for (i = 0; i < ui->
reg.ninvalid; i++) {
288 x = ui->
reg.ureg[i].x;
289 y = ui->
reg.ureg[i].y;
290 w = ui->
reg.ureg[i].w;
291 h = ui->
reg.ureg[i].h;
296 gtk_widget_queue_draw_area(rfi->
drawing_area, x, y, w, h);
298 g_free(ui->
reg.ureg);
303 TRACE_CALL(__func__);
309 gtk_widget_queue_draw_area(rfi->
drawing_area, x, y, w, h);
314 TRACE_CALL(__func__);
316 gint rdwidth, rdheight;
317 gint gpwidth, gpheight;
320 gtk_widget_get_allocation(GTK_WIDGET(gp), &a);
325 if ((gpwidth > 1) && (gpheight > 1)) {
345 TRACE_CALL(__func__);
349 cairo_text_extents_t extents;
358 width = gtk_widget_get_allocated_width(widget);
359 height = gtk_widget_get_allocated_height(widget);
362 msg = g_strdup_printf(_(
"Reconnection attempt %d of %d…"),
365 cairo_select_font_face(context,
"Sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD);
366 cairo_set_font_size(context, 24);
367 cairo_set_source_rgb(context, 0.9, 0.9, 0.9);
368 cairo_text_extents(context, msg, &extents);
369 cairo_move_to(context, (width - (extents.width + extents.x_bearing)) / 2, (height - (extents.height + extents.y_bearing)) / 2);
370 cairo_show_text(context, msg);
381 cairo_surface_flush(rfi->
surface);
382 cairo_set_source_surface(context, rfi->
surface, 0, 0);
383 cairo_surface_mark_dirty(rfi->
surface);
385 cairo_set_operator(context, CAIRO_OPERATOR_SOURCE);
386 cairo_paint(context);
394 TRACE_CALL(__func__);
399 gint desktopOrientation, desktopScaleFactor, deviceScaleFactor;
412 gint gpwidth, gpheight, prevwidth, prevheight;
414 gchar *monitorids = NULL;
415 guint32 maxwidth = 0;
416 guint32 maxheight = 0;
420 REMMINA_PLUGIN_DEBUG(
"Sending preconfigured monitor layout");
423 gtk_widget_get_allocation(GTK_WIDGET(gp), &a);
429 if ((gpwidth != prevwidth || gpheight != prevheight) && gpwidth >= 200 && gpheight >= 200) {
432 if (gpwidth < AVC_MIN_DESKTOP_WIDTH)
433 gpwidth = AVC_MIN_DESKTOP_WIDTH;
434 if (gpheight < AVC_MIN_DESKTOP_HEIGHT)
435 gpheight = AVC_MIN_DESKTOP_HEIGHT;
439 const rdpMonitor *base = freerdp_settings_get_pointer(rfi->
settings, FreeRDP_MonitorDefArray);
440 for (gint i = 0; i < freerdp_settings_get_uint32(rfi->
settings, FreeRDP_MonitorCount); ++i) {
441 const rdpMonitor *current = &base[i];
442 REMMINA_PLUGIN_DEBUG(
"Sending display layout n° %d", i);
444 REMMINA_PLUGIN_DEBUG(
"EVNT MON LAYOUT - Flags: %i", rdp_event.
monitor_layout.Flags);
446 REMMINA_PLUGIN_DEBUG(
"EVNT MON LAYOUT - Left: %i", rdp_event.
monitor_layout.Left);
448 REMMINA_PLUGIN_DEBUG(
"EVNT MON LAYOUT - Top: %i", rdp_event.
monitor_layout.Top);
450 REMMINA_PLUGIN_DEBUG(
"EVNT MON LAYOUT - width: %i", rdp_event.
monitor_layout.width);
452 REMMINA_PLUGIN_DEBUG(
"EVNT MON LAYOUT - height: %i", rdp_event.
monitor_layout.height);
453 rdp_event.
monitor_layout.physicalWidth = current->attributes.physicalWidth;
454 REMMINA_PLUGIN_DEBUG(
"EVNT MON LAYOUT - physicalWidth: %i", rdp_event.
monitor_layout.physicalWidth);
455 rdp_event.
monitor_layout.physicalHeight = current->attributes.physicalHeight;
456 REMMINA_PLUGIN_DEBUG(
"EVNT MON LAYOUT - PhysicalHeight: %i", rdp_event.
monitor_layout.physicalHeight);
457 if (current->attributes.orientation)
458 rdp_event.
monitor_layout.desktopOrientation = current->attributes.orientation;
461 REMMINA_PLUGIN_DEBUG(
"EVNT MON LAYOUT - desktopOrientation: %i", rdp_event.
monitor_layout.desktopOrientation);
463 REMMINA_PLUGIN_DEBUG(
"EVNT MON LAYOUT - ScaleFactorflag: %i", rdp_event.
monitor_layout.desktopScaleFactor);
485 TRACE_CALL(__func__);
500 TRACE_CALL(__func__);
519 TRACE_CALL(__func__);
541 TRACE_CALL(__func__);
563 TRACE_CALL(__func__);
583 TRACE_CALL(__func__);
585 gboolean extended = FALSE;
587 gint primary, secondary;
596 if ((event->type != GDK_BUTTON_PRESS) && (
event->type != GDK_BUTTON_RELEASE))
602 primary = PTR_FLAGS_BUTTON2;
603 secondary = PTR_FLAGS_BUTTON1;
605 primary = PTR_FLAGS_BUTTON1;
606 secondary = PTR_FLAGS_BUTTON2;
609 switch (event->button) {
614 flag |= PTR_FLAGS_BUTTON3;
622 flag |= PTR_XFLAGS_BUTTON1;
627 flag |= PTR_XFLAGS_BUTTON2;
633 if (event->type == GDK_BUTTON_PRESS) {
635 flag |= PTR_XFLAGS_DOWN;
637 flag |= PTR_FLAGS_DOWN;
654 TRACE_CALL(__func__);
669 switch (event->direction) {
671 flag = PTR_FLAGS_WHEEL | 0x0078;
674 case GDK_SCROLL_DOWN:
675 flag = PTR_FLAGS_WHEEL | 0x0188;
678 #if GTK_CHECK_VERSION(3, 4, 0) 679 case GDK_SCROLL_SMOOTH:
681 if (event->delta_y == 0.0)
684 windows_delta =
event->delta_y * -120;
686 if (windows_delta > 255)
688 if (windows_delta < -256)
689 windows_delta = -256;
691 flag = PTR_FLAGS_WHEEL | ((short)windows_delta & WheelRotationMask);
715 if (strmap == NULL || strmap[0] == 0) {
722 v1 = strtol(s, &endptr, 10);
723 if (endptr == s)
break;
725 if (*s !=
':')
break;
727 v2 = strtol(s, &endptr, 10);
728 if (endptr == s)
break;
732 g_array_append_val(rfi->
keymap, ke);
733 if (*s !=
',')
break;
736 if (rfi->
keymap->len == 0) {
737 g_array_unref(rfi->
keymap);
744 TRACE_CALL(__func__);
745 guint32 unicode_keyval;
746 guint16 hardware_keycode;
761 #ifdef ENABLE_GTK_INSPECTOR_KEY 764 if ((event->state & GDK_CONTROL_MASK) != 0 && (
event->keyval == GDK_KEY_I ||
event->keyval == GDK_KEY_D))
770 rdp_event.
key_event.up = (
event->type == GDK_KEY_PRESS ? false :
true);
773 switch (event->keyval) {
796 hardware_keycode =
event->hardware_keycode;
798 for (ik = 0; ik < rfi->
keymap->len; ik++) {
806 scancode = freerdp_keyboard_get_rdp_scancode_from_x11_keycode(hardware_keycode);
808 rdp_event.
key_event.key_code = scancode & 0xFF;
809 rdp_event.
key_event.extended = scancode & 0x100;
814 unicode_keyval = gdk_keyval_to_unicode(event->keyval);
823 if (event->keyval >= 0xfe00 ||
824 event->hardware_keycode == 0x41 ||
825 unicode_keyval == 0 ||
826 (event->state & (GDK_MOD1_MASK | GDK_CONTROL_MASK | GDK_SUPER_MASK)) != 0
828 scancode = freerdp_keyboard_get_rdp_scancode_from_x11_keycode(event->hardware_keycode);
829 rdp_event.
key_event.key_code = scancode & 0xFF;
830 rdp_event.
key_event.extended = scancode & 0x100;
837 rdp_event.
key_event.unicode_code = unicode_keyval;
852 TRACE_CALL(__func__);
854 CLIPRDR_FORMAT_LIST *pFormatList;
862 REMMINA_PLUGIN_DEBUG(
"gp=%p: owner-change event received", gp);
869 new_owner = gtk_clipboard_get_owner(gtkClipboard);
870 if (new_owner != (GObject *)gp) {
873 REMMINA_PLUGIN_DEBUG(
"gp=%p owner-change: new owner is different than me: new=%p me=%p",
876 REMMINA_PLUGIN_DEBUG(
"gp=%p owner-change: new owner is not me: Sending local clipboard format list to server.",
883 REMMINA_PLUGIN_DEBUG(
" ... but I'm the owner!");
890 TRACE_CALL(__func__);
894 GtkClipboard *clipboard;
897 gboolean disable_smooth_scrolling = FALSE;
904 disable_smooth_scrolling = (s && s[0] ==
'1' ? TRUE : FALSE);
909 REMMINA_PLUGIN_DEBUG(
"Disable smooth scrolling is set to %d", disable_smooth_scrolling);
913 gtk_container_add(GTK_CONTAINER(gp), rfi->
drawing_area);
915 gtk_widget_add_events(rfi->
drawing_area, GDK_POINTER_MOTION_MASK
916 | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK
917 | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK
918 | GDK_SCROLL_MASK | GDK_FOCUS_CHANGE_MASK);
920 if (!disable_smooth_scrolling) {
921 REMMINA_PLUGIN_DEBUG(
"Adding GDK_SMOOTH_SCROLL_MASK");
922 gtk_widget_add_events(rfi->
drawing_area, GDK_SMOOTH_SCROLL_MASK);
937 fprintf(stderr,
"RDP profile error: you cannot define both rdp_map_hardware_keycode and have 'Use client keyboard mapping' enabled\n");
941 g_signal_connect(G_OBJECT(rfi->
drawing_area),
"configure-event",
943 g_signal_connect(G_OBJECT(rfi->
drawing_area),
"motion-notify-event",
945 g_signal_connect(G_OBJECT(rfi->
drawing_area),
"button-press-event",
947 g_signal_connect(G_OBJECT(rfi->
drawing_area),
"button-release-event",
949 g_signal_connect(G_OBJECT(rfi->
drawing_area),
"scroll-event",
951 g_signal_connect(G_OBJECT(rfi->
drawing_area),
"key-press-event",
953 g_signal_connect(G_OBJECT(rfi->
drawing_area),
"key-release-event",
955 g_signal_connect(G_OBJECT(rfi->
drawing_area),
"focus-in-event",
969 clipboard = gtk_widget_get_clipboard(rfi->
drawing_area, GDK_SELECTION_CLIPBOARD);
975 rfi->
ui_queue = g_async_queue_new();
979 g_print(
"Error creating pipes.\n");
984 flags = fcntl(rfi->
event_pipe[0], F_GETFL, 0);
985 fcntl(rfi->
event_pipe[0], F_SETFL, flags | O_NONBLOCK);
988 g_print(
"CreateFileDescriptorEvent() failed\n");
991 rfi->
object_table = g_hash_table_new_full(NULL, NULL, NULL, g_free);
993 rfi->
display = gdk_display_get_default();
995 #if GTK_CHECK_VERSION(3, 22, 0) 996 GdkVisual *visual = gdk_screen_get_system_visual(
997 gdk_display_get_default_screen(rfi->
display));
998 rfi->
bpp = gdk_visual_get_depth(visual);
1000 rfi->
bpp = gdk_visual_get_best_depth();
1006 TRACE_CALL(__func__);
1008 switch (obj->
type) {
1022 TRACE_CALL(__func__);
1044 cairo_surface_mark_dirty(rfi->
surface);
1045 cairo_surface_destroy(rfi->
surface);
1053 g_array_free(rfi->
keymap, TRUE);
1058 g_async_queue_unref(rfi->
ui_queue);
1079 gdi = ((rdpContext *)rfi)->gdi;
1085 cairo_surface_mark_dirty(rfi->
surface);
1086 cairo_surface_destroy(rfi->
surface);
1089 stride = cairo_format_stride_for_width(rfi->
cairo_format, gdi->width);
1090 rfi->
surface = cairo_image_surface_create_for_data((
unsigned char *)gdi->primary_buffer, rfi->
cairo_format, gdi->width, gdi->height, stride);
1091 cairo_surface_flush(rfi->
surface);
1096 TRACE_CALL(__func__);
1104 gdi = ((rdpContext *)rfi)->gdi;
1111 if (rfi->
surface && (cairo_image_surface_get_width(rfi->
surface) != gdi->width ||
1112 cairo_image_surface_get_height(rfi->
surface) != gdi->height)) {
1114 cairo_surface_mark_dirty(rfi->
surface);
1115 cairo_surface_destroy(rfi->
surface);
1118 }
else if (rfi->
surface == NULL) {
1124 if (width != gdi->width)
1126 if (height != gdi->height)
1133 gtk_widget_set_size_request(rfi->
drawing_area, -1, -1);
1136 gtk_widget_set_size_request(rfi->
drawing_area, width, height);
1142 TRACE_CALL(__func__);
1146 gdi = ((rdpContext *)rfi)->gdi;
1151 gtk_widget_queue_draw_area(rfi->
drawing_area, 0, 0, gdi->width, gdi->height);
1156 const gchar *host = freerdp_settings_get_string (rfi->
settings, FreeRDP_ServerHostname);
1158 REMMINA_PLUGIN_AUDIT(_(
"Connected to %s via RDP"), host);
1163 TRACE_CALL(__func__);
1166 gdk_window_invalidate_rect(gtk_widget_get_window(rfi->
drawing_area), NULL, TRUE);
1171 TRACE_CALL(__func__);
1174 rdpPointer *pointer = (rdpPointer *)ui->
cursor.pointer;
1175 cairo_surface_t *surface;
1176 UINT8 *data = malloc(pointer->width * pointer->height * 4);
1178 if (!freerdp_image_copy_from_pointer_data(
1179 (BYTE *)data, PIXEL_FORMAT_BGRA32,
1180 pointer->width * 4, 0, 0, pointer->width, pointer->height,
1181 pointer->xorMaskData, pointer->lengthXorMask,
1182 pointer->andMaskData, pointer->lengthAndMask,
1183 pointer->xorBpp, &(ui->
cursor.context->gdi->palette))) {
1188 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));
1189 cairo_surface_flush(surface);
1190 pixbuf = gdk_pixbuf_get_from_surface(surface, 0, 0, pointer->width, pointer->height);
1191 cairo_surface_mark_dirty(surface);
1192 cairo_surface_destroy(surface);
1194 ((
rfPointer *)ui->
cursor.pointer)->cursor = gdk_cursor_new_from_pixbuf(rfi->
display, pixbuf, pointer->xPos, pointer->yPos);
1195 g_object_unref(pixbuf);
1202 TRACE_CALL(__func__);
1203 g_object_unref(ui->
cursor.pointer->cursor);
1204 ui->
cursor.pointer->cursor = NULL;
1209 TRACE_CALL(__func__);
1211 gint nx, ny, wx, wy;
1213 #if GTK_CHECK_VERSION(3, 20, 0) 1216 GdkDeviceManager *manager;
1225 #if GTK_CHECK_VERSION(3, 20, 0) 1226 seat = gdk_display_get_default_seat(gdk_display_get_default());
1227 dev = gdk_seat_get_pointer(seat);
1229 manager = gdk_display_get_device_manager(gdk_display_get_default());
1230 dev = gdk_device_manager_get_client_pointer(manager);
1233 nw = gdk_device_get_window_at_position(dev, NULL, NULL);
1239 gdk_window_get_root_coords(w, nx, ny, &wx, &wy);
1240 gdk_device_warp(dev, gdk_window_get_screen(w), wx, wy);
1247 TRACE_CALL(__func__);
1250 switch (ui->
cursor.type) {
1260 gdk_window_set_cursor(gtk_widget_get_window(rfi->
drawing_area), ui->
cursor.pointer->cursor);
1269 gdk_window_set_cursor(gtk_widget_get_window(rfi->
drawing_area),
1270 gdk_cursor_new_for_display(gdk_display_get_default(),
1276 gdk_window_set_cursor(gtk_widget_get_window(rfi->
drawing_area), NULL);
1284 TRACE_CALL(__func__);
1290 TRACE_CALL(__func__);
1300 TRACE_CALL(__func__);
1303 cairo_surface_mark_dirty(rfi->
surface);
1304 cairo_surface_destroy(rfi->
surface);
1310 TRACE_CALL(__func__);
1311 switch (ui->
event.type) {
1323 TRACE_CALL(__func__);
1356 TRACE_CALL(__func__);
1387 TRACE_CALL(__func__);
1389 gboolean ui_sync_save;
1400 pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &oldcanceltype);
1404 ui_sync_save = ui->
sync;
1414 g_async_queue_push(rfi->
ui_queue, ui);
1430 pthread_setcanceltype(oldcanceltype, NULL);
1441 TRACE_CALL(__func__);
1453 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)
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