Commit: patch 9.2.0667: patch 9.2.0590 was wrong

3 views
Skip to first unread message

Christian Brabandt

unread,
Jun 17, 2026, 4:00:14 PM (9 hours ago) Jun 17
to vim...@googlegroups.com
patch 9.2.0667: patch 9.2.0590 was wrong

Commit: https://github.com/vim/vim/commit/2f07128b0be8a07eca1efa19ffbefc1cdd0e5142
Author: Foxe Chen <chen...@gmail.com>
Date: Wed Jun 17 19:42:43 2026 +0000

patch 9.2.0667: patch 9.2.0590 was wrong

Problem: Patch 9.2.0590 was wrong
Solution: Revert it (Foxe Chen).

related: #20291
related: #20415
closes: #20549

Signed-off-by: Foxe Chen <chen...@gmail.com>
Signed-off-by: Christian Brabandt <c...@256bit.org>

diff --git a/src/gui_gtk4.c b/src/gui_gtk4.c
index e87122bad..8a11027b7 100644
--- a/src/gui_gtk4.c
+++ b/src/gui_gtk4.c
@@ -280,6 +280,9 @@ static void enter_notify_event(GtkEventControllerMotion *controller, double x, d
static gboolean scroll_event(GtkEventControllerScroll *controller, double dx, double dy, gpointer data);
static void focus_in_event(GtkEventControllerFocus *controller, gpointer data);
static void focus_out_event(GtkEventControllerFocus *controller, gpointer data);
+#ifdef FEAT_MENU
+static gboolean menubar_popover_closed_hook(GSignalInvocationHint *ihint, guint n_param_values, const GValue *param_values, gpointer data);
+#endif
#ifdef FEAT_DND
static gboolean drop_cb(GtkDropTarget *target, const GValue *value, double x, double y, gpointer data);
#endif
@@ -488,6 +491,20 @@ gui_mch_init(void)
gtk_widget_set_visible(gui.menubar, FALSE);
gtk_box_append(GTK_BOX(vbox), gui.menubar);
}
+ // Return keyboard focus to the drawing area when a menubar popover
+ // closes (issue #20274). GtkPopoverMenuBar owns its popovers
+ // privately, so attach via an emission hook on GtkPopover::closed
+ // and filter for popovers under our menubar inside the callback.
+ {
+ GTypeClass *cls = g_type_class_ref(GTK_TYPE_POPOVER);
+ guint sig_id = g_signal_lookup("closed", GTK_TYPE_POPOVER);
+
+ if (sig_id != 0)
+ g_signal_add_emission_hook(sig_id, 0,
+ menubar_popover_closed_hook, NULL, NULL);
+ if (cls != NULL)
+ g_type_class_unref(cls);
+ }
#endif

#ifdef FEAT_TOOLBAR
@@ -2182,6 +2199,48 @@ focus_out_event(GtkEventControllerFocus *controller UNUSED,
}
}

+#ifdef FEAT_MENU
+ static gboolean
+grab_drawarea_focus_idle(gpointer data UNUSED)
+{
+ if (gui.drawarea != NULL && !gtk_widget_has_focus(gui.drawarea))
+ gtk_widget_grab_focus(gui.drawarea);
+ return G_SOURCE_REMOVE;
+}
+
+ static gboolean
+menubar_popover_closed_hook(GSignalInvocationHint *ihint UNUSED,
+ guint n_param_values, const GValue *param_values,
+ gpointer data UNUSED)
+{
+ GObject *obj;
+ GtkWidget *popover;
+ GtkWidget *parent;
+
+ if (n_param_values < 1 || gui.menubar == NULL || gui.drawarea == NULL)
+ return TRUE;
+ obj = g_value_get_object(&param_values[0]);
+ if (!GTK_IS_POPOVER(obj))
+ return TRUE;
+ popover = GTK_WIDGET(obj);
+
+ // Only react to popovers that descend from the menubar.
+ for (parent = gtk_widget_get_parent(popover);
+ parent != NULL;
+ parent = gtk_widget_get_parent(parent))
+ {
+ if (parent != gui.menubar)
+ continue;
+ // Defer the grab to the next main loop iteration; calling it
+ // synchronously while GTK is still completing the popover close
+ // has no effect (issue #20274).
+ g_idle_add(grab_drawarea_focus_idle, NULL);
+ break;
+ }
+ return TRUE; // keep the emission hook installed
+}
+#endif
+
#ifndef USE_GTK4_SNAPSHOT
static void
drawarea_realize_cb(GtkWidget *widget UNUSED, gpointer data UNUSED)
diff --git a/src/version.c b/src/version.c
index fc9e9efae..2d3e2550e 100644
--- a/src/version.c
+++ b/src/version.c
@@ -759,6 +759,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 667,
/**/
666,
/**/
Reply all
Reply to author
Forward
0 new messages