Index: Makefile =================================================================== --- Makefile (revision 565330) +++ Makefile (working copy) @@ -3,7 +3,7 @@ PORTNAME= libxfce4menu PORTVERSION= 4.16.0 -PORTREVISION= 1 +PORTREVISION= 2 CATEGORIES= x11 xfce MASTER_SITES= XFCE DISTNAME= libxfce4ui-${DISTVERSIONFULL} Index: files/patch-libxfce4kbd-private_xfce-shortcuts-grabber.c =================================================================== --- files/patch-libxfce4kbd-private_xfce-shortcuts-grabber.c (revision 565330) +++ files/patch-libxfce4kbd-private_xfce-shortcuts-grabber.c (working copy) @@ -1,21 +1,96 @@ ---- libxfce4kbd-private/xfce-shortcuts-grabber.c.orig 2020-11-23 10:16:17 UTC +diff --git a/libxfce4kbd-private/xfce-shortcuts-grabber.c b/libxfce4kbd-private/xfce-shortcuts-grabber.c +index 60ddfd71bf1a4f23656e89db834aa2aeb217852a..9df45c3eeb33280f13a8d0d51cda03c1f5dce941 100644 +--- libxfce4kbd-private/xfce-shortcuts-grabber.c +++ libxfce4kbd-private/xfce-shortcuts-grabber.c -@@ -22,6 +22,8 @@ - #include - #endif +@@ -61,13 +61,14 @@ static void xfce_shortcuts_grabber_grab (XfceShortcutsGra + gboolean grab); + static GdkFilterReturn xfce_shortcuts_grabber_event_filter (GdkXEvent *gdk_xevent, + GdkEvent *event, +- XfceShortcutsGrabber *grabber); ++ gpointer data); -+#include -+ - #include - #include -@@ -180,6 +182,9 @@ xfce_shortcuts_grabber_keys_changed (GdkKeymap - TRACE ("Keys changed, regrabbing"); + struct _XfceShortcutsGrabberPrivate + { + GHashTable *keys; ++ gint xkbEventType, xkbStateGroup; + }; -+#ifdef __FreeBSD__ -+ xfce_shortcuts_grabber_ungrab_all (grabber); -+#endif - xfce_shortcuts_grabber_grab_all (grabber); + typedef enum +@@ -141,20 +142,26 @@ static void + xfce_shortcuts_grabber_constructed (GObject *object) + { + GdkDisplay *display; ++ Display *xdisplay; + GdkKeymap *keymap; + + XfceShortcutsGrabber *grabber = XFCE_SHORTCUTS_GRABBER (object); + + display = gdk_display_get_default (); ++ xdisplay = GDK_DISPLAY_XDISPLAY (display); + keymap = gdk_keymap_get_for_display (display); + g_signal_connect (keymap, "keys-changed", G_CALLBACK (xfce_shortcuts_grabber_keys_changed), + grabber); + ++ if (G_UNLIKELY (!XkbQueryExtension (xdisplay, 0, &grabber->priv->xkbEventType, 0, 0, 0))) ++ grabber->priv->xkbEventType = -1; ++ grabber->priv->xkbStateGroup = -1; ++ + /* Flush events before adding the event filter */ +- XAllowEvents (GDK_DISPLAY_XDISPLAY (display), AsyncBoth, CurrentTime); ++ XAllowEvents (xdisplay, AsyncBoth, CurrentTime); + + /* Add event filter */ +- gdk_window_add_filter (NULL, (GdkFilterFunc) xfce_shortcuts_grabber_event_filter, grabber); ++ gdk_window_add_filter (NULL, xfce_shortcuts_grabber_event_filter, grabber); } + +@@ -417,10 +424,11 @@ find_event_key (const gchar *shortcut, + + + static GdkFilterReturn +-xfce_shortcuts_grabber_event_filter (GdkXEvent *gdk_xevent, +- GdkEvent *event, +- XfceShortcutsGrabber *grabber) ++xfce_shortcuts_grabber_event_filter (GdkXEvent *gdk_xevent, ++ GdkEvent *event, ++ gpointer data) + { ++ XfceShortcutsGrabber *const grabber = data; + struct EventKeyFindContext context; + GdkKeymap *keymap; + GdkModifierType consumed, modifiers; +@@ -434,6 +442,22 @@ xfce_shortcuts_grabber_event_filter (GdkXEvent *gdk_xevent, + + xevent = (XEvent *) gdk_xevent; + ++ if (xevent->type == grabber->priv->xkbEventType) ++ { ++ const XkbEvent *e = (const XkbEvent*) xevent; ++ TRACE ("xkb event: any.xkb_type=%d", e->any.xkb_type); ++ if (e->any.xkb_type == XkbStateNotify) ++ { ++ TRACE ("xkb event: any.xkb_type=XkbStateNotify, state.group=%d", e->state.group); ++ if (grabber->priv->xkbStateGroup != e->state.group) ++ { ++ grabber->priv->xkbStateGroup = e->state.group; ++ xfce_shortcuts_grabber_ungrab_all (grabber); ++ xfce_shortcuts_grabber_grab_all (grabber); ++ } ++ } ++ } ++ + if (xevent->type != KeyPress) + return GDK_FILTER_CONTINUE; + +@@ -450,7 +474,7 @@ xfce_shortcuts_grabber_event_filter (GdkXEvent *gdk_xevent, + + gdk_keymap_translate_keyboard_state (keymap, xevent->xkey.keycode, + modifiers, +- XkbGroupForCoreState (xevent->xkey.state), ++ grabber->priv->xkbStateGroup, + &keyval, NULL, NULL, &consumed); + + /* We want Alt + Print to be Alt + Print not SysReq. See bug #7897 */