]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.2.0556: GTK4: scrollbars not shown and do not respond to clicks v9.2.0556
authorYasuhiro Matsumoto <mattn.jp@gmail.com>
Thu, 28 May 2026 21:39:54 +0000 (21:39 +0000)
committerChristian Brabandt <cb@256bit.org>
Thu, 28 May 2026 21:45:05 +0000 (21:45 +0000)
Problem:  GTK4: scrollbars not shown and do not respond to clicks
          (Steven A. Falco)
Solution: Use GTK_IS_SCROLLBAR and gtk_scrollbar_get_adjustment()
          instead of the GtkRange equivalents, override GtkForm's
          contains() to return FALSE (Yasuhiro Matsumoto).

fixes:  #20307
closes: #20326

Co-Authored-by: Claude <noreply@anthropic.com>
Signed-off-by: Yasuhiro Matsumoto <mattn.jp@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
src/gui_gtk4.c
src/gui_gtk4_f.c
src/version.c

index b8f3c53c3e79e30a1379a7c44d56d493bd117a68..dace72ae4d5422ac67e60f93f46cafb16d5f2e62 100644 (file)
@@ -494,8 +494,8 @@ gui_mch_init(void)
     gui.formwin = gui_gtk_form_new();
     gtk_widget_set_name(gui.formwin, "vim-gtk-form");
     // formwin is overlaid on top of drawarea for scrollbar positioning.
-    // Disable input targeting so mouse events pass through to drawarea.
-    gtk_widget_set_can_target(gui.formwin, FALSE);
+    // GtkForm's contains() returns FALSE so empty-area clicks fall through
+    // to the drawarea, while the scrollbar children still receive events.
 
     // The drawing area for the editor content.
     // Placed in an overlay so it fills the formwin, with scrollbars on top.
@@ -4028,10 +4028,10 @@ gui_mch_set_scrollbar_thumb(scrollbar_T *sb, long val, long size, long max)
 
     if (sb->id == NULL)
        return;
-    if (!GTK_IS_WIDGET(sb->id) || !GTK_IS_RANGE(sb->id))
+    if (!GTK_IS_WIDGET(sb->id) || !GTK_IS_SCROLLBAR(sb->id))
        return;
 
-    adj = gtk_range_get_adjustment(GTK_RANGE(sb->id));
+    adj = gtk_scrollbar_get_adjustment(GTK_SCROLLBAR(sb->id));
     gtk_adjustment_set_lower(adj, 0.0);
     gtk_adjustment_set_upper(adj, (gdouble)max + 1);
     gtk_adjustment_set_value(adj, (gdouble)val);
@@ -4097,9 +4097,9 @@ gui_mch_create_scrollbar(scrollbar_T *sb, int orient)
     else
        sb->id = gtk_scrollbar_new(GTK_ORIENTATION_VERTICAL, NULL);
 
-    if (sb->id != NULL && GTK_IS_RANGE(sb->id))
+    if (sb->id != NULL && GTK_IS_SCROLLBAR(sb->id))
     {
-       GtkAdjustment *adj = gtk_range_get_adjustment(GTK_RANGE(sb->id));
+       GtkAdjustment *adj = gtk_scrollbar_get_adjustment(GTK_SCROLLBAR(sb->id));
 
        gtk_widget_set_visible(sb->id, FALSE);
        gui_gtk_form_put(GTK_FORM(gui.formwin), sb->id, 0, 0);
index 759f1065b966e2110dd72d7e13774036021bd9cc..80aa7a48d005709433661c7da515b99772d3e72c 100644 (file)
@@ -36,6 +36,7 @@ static void form_measure(GtkWidget *widget, GtkOrientation orientation,
 static void form_size_allocate(GtkWidget *widget, int width, int height,
        int baseline);
 static void form_snapshot(GtkWidget *widget, GtkSnapshot *snapshot);
+static gboolean form_contains(GtkWidget *widget, double x, double y);
 static void form_dispose(GObject *object);
 static void form_position_child(GtkForm *form, GtkFormChild *child,
        gboolean force_allocate);
@@ -173,6 +174,7 @@ gui_gtk_form_class_init(GtkFormClass *klass)
     widget_class->measure = form_measure;
     widget_class->size_allocate = form_size_allocate;
     widget_class->snapshot = form_snapshot;
+    widget_class->contains = form_contains;
 }
 
     static void
@@ -265,6 +267,14 @@ form_snapshot(GtkWidget *widget, GtkSnapshot *snapshot)
     }
 }
 
+// Make the form itself input-transparent so clicks on its empty area fall
+// through to the drawarea below, while the scrollbar children stay pickable.
+    static gboolean
+form_contains(GtkWidget *widget UNUSED, double x UNUSED, double y UNUSED)
+{
+    return FALSE;
+}
+
     static void
 form_dispose(GObject *object)
 {
index 2a6eb7972ced94d7ada24e0bf89a495dc3f5e883..d17b4d586871e8c93b833509f2f5277ffd5f3ab3 100644 (file)
@@ -729,6 +729,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    556,
 /**/
     555,
 /**/