diff options
author | myheroyuki <myheroyuki@outlook.com> | 2023-08-03 16:09:38 +0300 |
---|---|---|
committer | myheroyuki <myheroyuki@outlook.com> | 2023-08-03 16:09:38 +0300 |
commit | c450cc5982b080dd2086e77cb13b316384ec12f3 (patch) | |
tree | 6359479b841b3f6270c351ee0e74f87bd86ce059 | |
parent | 00aa57e32ca66e65df0434f73eabfc7ee971cf6d (diff) |
Improved scale mode and dynamic resolution for RDP, and fixed some crashes on disconnects
-rw-r--r-- | plugins/rdp/rdp_event.c | 17 | ||||
-rw-r--r-- | plugins/rdp/rdp_monitor.c | 24 | ||||
-rw-r--r-- | src/rcw.c | 41 |
3 files changed, 29 insertions, 53 deletions
diff --git a/plugins/rdp/rdp_event.c b/plugins/rdp/rdp_event.c index 9919831bd..5e385e463 100644 --- a/plugins/rdp/rdp_event.c +++ b/plugins/rdp/rdp_event.c @@ -280,7 +280,6 @@ static void remmina_rdp_event_scale_area(RemminaProtocolWidget *gp, gint *x, gin if ((width == 0) || (height == 0)) return; - remmina_rdp_event_update_scale_factor(gp); if ((rfi->scale_width == width) && (rfi->scale_height == height)) { /* Same size, just copy the pixels */ @@ -498,7 +497,7 @@ void remmina_rdp_event_send_delayed_monitor_layout(RemminaProtocolWidget *gp) rfi->delayed_monitor_layout_handler = g_timeout_add(500, (GSourceFunc)remmina_rdp_event_delayed_monitor_layout, gp); } -static gboolean remmina_rdp_event_on_configure(GtkWidget *widget, RemminaProtocolWidget *gp) +static gboolean remmina_rdp_event_on_resize(GtkWidget *widget, gint width, gint height, RemminaProtocolWidget *gp) { TRACE_CALL(__func__); /* Called when gp changes its size or position */ @@ -1042,12 +1041,9 @@ void remmina_rdp_event_init(RemminaProtocolWidget *gp) gtk_drawing_area_set_draw_func(rfi->drawing_area, remmina_rdp_event_on_draw, gp, NULL); - // g_signal_connect(G_OBJECT(rfi->drawing_area), "configure-event", - // G_CALLBACK(remmina_rdp_event_on_configure), gp); - g_signal_connect(G_OBJECT(rfi->drawing_area), "notify::content-height", - G_CALLBACK(remmina_rdp_event_on_configure), gp); - g_signal_connect(G_OBJECT(rfi->drawing_area), "notify::content-width", - G_CALLBACK(remmina_rdp_event_on_configure), gp); + g_signal_connect(G_OBJECT(rfi->drawing_area), "resize", + G_CALLBACK(remmina_rdp_event_on_resize), gp); + // g_signal_connect(G_OBJECT(rfi->drawing_area), "motion-notify-event", @@ -1178,6 +1174,7 @@ void remmina_rdp_event_uninit(RemminaProtocolWidget *gp) while ((ui = (RemminaPluginRdpUiObject *)g_async_queue_try_pop(rfi->ui_queue)) != NULL) remmina_rdp_event_free_event(gp, ui); if (rfi->surface) { + cairo_surface_flush(rfi->surface); cairo_surface_mark_dirty(rfi->surface); cairo_surface_destroy(rfi->surface); rfi->surface = NULL; @@ -1219,6 +1216,7 @@ static void remmina_rdp_event_create_cairo_surface(rfContext *rfi) return; if (rfi->surface) { + cairo_surface_flush(rfi->surface); cairo_surface_mark_dirty(rfi->surface); cairo_surface_destroy(rfi->surface); rfi->surface = NULL; @@ -1248,6 +1246,7 @@ void remmina_rdp_event_update_scale(RemminaProtocolWidget *gp) if (rfi->surface && (cairo_image_surface_get_width(rfi->surface) != gdi->width || cairo_image_surface_get_height(rfi->surface) != gdi->height)) { /* Destroys and recreate rfi->surface with new width and height */ + cairo_surface_flush(rfi->surface); cairo_surface_mark_dirty(rfi->surface); cairo_surface_destroy(rfi->surface); rfi->surface = NULL; @@ -1435,7 +1434,7 @@ static void remmina_rdp_ui_event_destroy_cairo_surface(RemminaProtocolWidget *gp { TRACE_CALL(__func__); rfContext *rfi = GET_PLUGIN_DATA(gp); - + cairo_surface_flush(rfi->surface); cairo_surface_mark_dirty(rfi->surface); cairo_surface_destroy(rfi->surface); rfi->surface = NULL; diff --git a/plugins/rdp/rdp_monitor.c b/plugins/rdp/rdp_monitor.c index cf64cb437..e2be70b47 100644 --- a/plugins/rdp/rdp_monitor.c +++ b/plugins/rdp/rdp_monitor.c @@ -165,17 +165,17 @@ void remmina_rdp_monitor_get (rfContext *rfi, gchar **monitorids, guint32 *maxwi freerdp_settings_set_uint32(settings, FreeRDP_MonitorLocalShiftX, current->x); freerdp_settings_set_uint32(settings, FreeRDP_MonitorLocalShiftY, current->y); } - if (gdk_monitor_is_primary(monitor)) { - REMMINA_PLUGIN_DEBUG ("Primary monitor found with id: %d", index); - current->is_primary = TRUE; - primary_found = TRUE; - if (current->x != 0 || current->y != 0) - { - REMMINA_PLUGIN_DEBUG ("Primary monitor not at 0,0 coordinates: %d", index); - freerdp_settings_set_uint32(settings, FreeRDP_MonitorLocalShiftX, current->x); - freerdp_settings_set_uint32(settings, FreeRDP_MonitorLocalShiftY, current->y); - } - } else { + // if (gdk_monitor_is_primary(monitor)) { + // REMMINA_PLUGIN_DEBUG ("Primary monitor found with id: %d", index); + // current->is_primary = TRUE; + // primary_found = TRUE; + // if (current->x != 0 || current->y != 0) + // { + // REMMINA_PLUGIN_DEBUG ("Primary monitor not at 0,0 coordinates: %d", index); + // freerdp_settings_set_uint32(settings, FreeRDP_MonitorLocalShiftX, current->x); + // freerdp_settings_set_uint32(settings, FreeRDP_MonitorLocalShiftY, current->y); + // } + // } else { //TODO GTK4 how check if monitor is primary if (!primary_found && current->x == 0 && current->y == 0) { @@ -186,7 +186,7 @@ void remmina_rdp_monitor_get (rfContext *rfi, gchar **monitorids, guint32 *maxwi primary_found = TRUE; REMMINA_PLUGIN_DEBUG ("Primary monitor set to id: %d", index); } - } + // } REMMINA_PLUGIN_DEBUG ("Local X Shift: %d", freerdp_settings_get_uint32(settings, FreeRDP_MonitorLocalShiftX)); REMMINA_PLUGIN_DEBUG ("Local Y Shift: %d", freerdp_settings_get_uint32(settings, FreeRDP_MonitorLocalShiftY)); //current->x = @@ -1066,6 +1066,8 @@ void rco_get_monitor_geometry(RemminaConnectionObject *cnnobj, GdkRectangle *sz) * of the monitor (or workarea) where cnnobj->cnnwin is located */ GdkRectangle monitor_geometry; + GdkDisplay *display; + GdkMonitor *monitor; sz->x = sz->y = sz->width = sz->height = 0; @@ -1076,41 +1078,16 @@ void rco_get_monitor_geometry(RemminaConnectionObject *cnnobj, GdkRectangle *sz) if (!gtk_widget_is_visible(GTK_WIDGET(cnnobj->cnnwin))) return; -#if GTK_CHECK_VERSION(3, 22, 0) - GdkDisplay *display; - GdkMonitor *monitor; display = gtk_widget_get_display(GTK_WIDGET(cnnobj->cnnwin)); GtkNative* native = gtk_widget_get_native((GTK_WIDGET(cnnobj->cnnwin))); - GdkSurface *window = gtk_native_get_surface(native); - //monitor = gdk_display_get_monitor_at_window(display, window); -#else - GdkScreen *screen; - gint monitor; - screen = gtk_window_get_screen(GTK_WINDOW(cnnobj->cnnwin)); - GtkNative* native = gtk_widget_get_native((GTK_WIDGET(cnnobj->cnnwin))); - GdkSurface *window = gtk_native_get_surface(native); - monitor = gdk_screen_get_monitor_at_window(screen, window); -#endif + GdkSurface *surface = gtk_native_get_surface(native); + monitor = gdk_display_get_monitor_at_surface(display, surface); + + int monitor_scale_factor = gdk_monitor_get_scale_factor(monitor); + monitor_geometry.width *= monitor_scale_factor; + monitor_geometry.height *= monitor_scale_factor; + //TODO GTK4 get workarea for various backgrounds -// #if GTK_CHECK_VERSION(3, 22, 0) -// //gdk_monitor_get_workarea(monitor, &monitor_geometry); -// /* Under Wayland, GTK 3.22, all values returned by gdk_monitor_get_geometry() -// * and gdk_monitor_get_workarea() seem to have been divided by the -// * gdk scale factor, so we need to adjust the returned rect -// * undoing the division */ -// #ifdef GDK_WINDOWING_WAYLAND -// if (GDK_IS_WAYLAND_DISPLAY(display)) { -// int monitor_scale_factor = gdk_monitor_get_scale_factor(monitor); -// monitor_geometry.width *= monitor_scale_factor; -// monitor_geometry.height *= monitor_scale_factor; -// } -// #endif -// #elif gdk_screen_get_monitor_workarea -// gdk_screen_get_monitor_workarea(screen, monitor, &monitor_geometry); -// #else -// gdk_screen_get_monitor_geometry(screen, monitor, &monitor_geometry); -// #endif - *sz = monitor_geometry; } static void rco_check_resize(RemminaConnectionObject *cnnobj) |