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:
authormyheroyuki <myheroyuki@outlook.com>2023-08-03 16:09:38 +0300
committermyheroyuki <myheroyuki@outlook.com>2023-08-03 16:09:38 +0300
commitc450cc5982b080dd2086e77cb13b316384ec12f3 (patch)
tree6359479b841b3f6270c351ee0e74f87bd86ce059
parent00aa57e32ca66e65df0434f73eabfc7ee971cf6d (diff)
Improved scale mode and dynamic resolution for RDP, and fixed some crashes on disconnects
-rw-r--r--plugins/rdp/rdp_event.c17
-rw-r--r--plugins/rdp/rdp_monitor.c24
-rw-r--r--src/rcw.c41
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 =
diff --git a/src/rcw.c b/src/rcw.c
index 4bd990050..b15ff696b 100644
--- a/src/rcw.c
+++ b/src/rcw.c
@@ -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)