[gtk-vnc] src: implement preferred width/height helpers



commit c237d55b271b203c289a7fd863ac2ec170358a8d
Author: Daniel P. Berrangé <dan berrange com>
Date:   Thu Apr 1 18:36:05 2021 +0100

    src: implement preferred width/height helpers
    
    This is the more modern approach to layout sizing in GTK, compared to
    setting an explicit size request. The main benefit is that we can
    force a resize to match the remote desktop size, while still allowing
    the user to resize the window smaller. This is useful when either
    scaling, or client initiated framebuffer resizes are enabled.
    
    Signed-off-by: Daniel P. Berrangé <berrange redhat com>

 src/vncdisplay.c | 60 ++++++++++++++++++++++++++++++++++++++++----------------
 1 file changed, 43 insertions(+), 17 deletions(-)
---
diff --git a/src/vncdisplay.c b/src/vncdisplay.c
index 8cfb70a..d9437e9 100644
--- a/src/vncdisplay.c
+++ b/src/vncdisplay.c
@@ -1245,6 +1245,43 @@ static void realize_event(GtkWidget *widget)
                           priv->remote_cursor ? priv->remote_cursor : priv->null_cursor);
 }
 
+static void get_preferred_width(GtkWidget *widget,
+                                int *minwidth,
+                                int *defwidth)
+{
+    VncDisplay *obj = VNC_DISPLAY(widget);
+    VncDisplayPrivate *priv = obj->priv;
+
+    if (priv->conn != NULL &&
+        vnc_connection_is_initialized(priv->conn) &&
+        priv->fb &&
+        priv->force_size)
+        *defwidth = vnc_framebuffer_get_width(VNC_FRAMEBUFFER(priv->fb));
+    else
+        *defwidth = 0;
+
+    if (priv->force_size && !priv->allow_scaling)
+        *minwidth = *defwidth;
+}
+
+static void get_preferred_height(GtkWidget *widget,
+                                int *minheight,
+                                int *defheight)
+{
+    VncDisplay *obj = VNC_DISPLAY(widget);
+    VncDisplayPrivate *priv = obj->priv;
+
+    if (priv->conn != NULL &&
+        vnc_connection_is_initialized(priv->conn) &&
+        priv->fb &&
+        priv->force_size)
+        *defheight = vnc_framebuffer_get_height(VNC_FRAMEBUFFER(priv->fb));
+    else
+        *defheight = 0;
+
+    if (priv->force_size && !priv->allow_scaling)
+        *minheight = *defheight;
+}
 
 static void on_framebuffer_update(VncConnection *conn G_GNUC_UNUSED,
                                   int x, int y, int w, int h,
@@ -1309,19 +1346,6 @@ static void on_framebuffer_update(VncConnection *conn G_GNUC_UNUSED,
 }
 
 
-static void do_size_request(VncDisplay *obj)
-{
-    VncDisplayPrivate *priv = obj->priv;
-
-    if (priv->force_size) {
-        int width = vnc_framebuffer_get_width(VNC_FRAMEBUFFER(priv->fb));
-        int height = vnc_framebuffer_get_height(VNC_FRAMEBUFFER(priv->fb));
-        gtk_widget_set_size_request(GTK_WIDGET(obj), width, height);
-    } else {
-        gtk_widget_set_size_request(GTK_WIDGET(obj), -1, -1);
-    }
-}
-
 static void do_framebuffer_init(VncDisplay *obj,
                                 const VncPixelFormat *remoteFormat,
                                 int width, int height, gboolean quiet)
@@ -1367,7 +1391,7 @@ static void do_framebuffer_init(VncDisplay *obj,
     priv->fb = vnc_cairo_framebuffer_new(width, height, remoteFormat);
     vnc_connection_set_framebuffer(priv->conn, VNC_FRAMEBUFFER(priv->fb));
 
-    do_size_request(obj);
+    gtk_widget_queue_resize(GTK_WIDGET(obj));
 
     if (!quiet) {
         g_signal_emit(G_OBJECT(obj),
@@ -2264,6 +2288,8 @@ static void vnc_display_class_init(VncDisplayClass *klass)
     gtkwidget_class->realize = realize_event;
     gtkwidget_class->destroy = vnc_display_destroy;
     gtkwidget_class->configure_event = configure_event;
+    gtkwidget_class->get_preferred_width = get_preferred_width;
+    gtkwidget_class->get_preferred_height = get_preferred_height;
 
     object_class->finalize = vnc_display_finalize;
     object_class->get_property = vnc_display_get_property;
@@ -3124,7 +3150,7 @@ gboolean vnc_display_set_scaling(VncDisplay *obj,
             gtk_widget_queue_draw_area(GTK_WIDGET(obj), 0, 0, ww, wh);
         }
 
-        do_size_request(obj);
+        gtk_widget_queue_resize(GTK_WIDGET(obj));
     }
 
     return TRUE;
@@ -3148,7 +3174,7 @@ void vnc_display_set_force_size(VncDisplay *obj, gboolean enabled)
     obj->priv->force_size = enabled;
 
     if (obj->priv->fb != NULL) {
-        do_size_request(obj);
+        gtk_widget_queue_resize(GTK_WIDGET(obj));
     }
 }
 
@@ -3170,7 +3196,7 @@ void vnc_display_set_allow_resize(VncDisplay *obj, gboolean enabled)
     obj->priv->allow_resize = enabled;
 
     if (obj->priv->fb != NULL && enabled) {
-        do_size_request(obj);
+        gtk_widget_queue_resize(GTK_WIDGET(obj));
     }
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]