Package: libgtk2.0-0
Version: 2.24.25-3+deb8u1
Severity: normal
Tags: upstream patch

Dear Maintainer,

In some cases, GTK will not release the keyboard grab after interacting with
menus, leading to the keyboard being unusable in any other app/widget (not
even WM/desktop shortcuts).  The grab can be force-released only by a mouse
interaction, rendering keyboard-only navigation impossible.  This is
especially problematic for people relying on accessibility features, but it
affects eveyone falling in the issue as normal input doesn't work anymore.

This issue is for example visible in mate-panel's main menu.

Upstream GTK report: https://bugzilla.gnome.org/show_bug.cgi?id=554057
It was against GTK3 in its early days, but affects GTK2 just the same.
Patch backporting the changs to GTK2 is available in comment #18:
https://bugzilla.gnome.org/show_bug.cgi?id=554057#c18
This report includes a simple test application that reproduces the issue.

Report on mate-panel: https://github.com/mate-desktop/mate-panel/issues/505

Please consider including this patch in order to fix keyboard grab lockup
at least when navigating mate-panel with the keyboard.

Regards,
Colomban


-- System Information:
Debian Release: 8.6
  APT prefers stable-updates
  APT policy: (500, 'stable-updates'), (500, 'stable')
Architecture: amd64 (x86_64)

Kernel: Linux 3.16.0-4-amd64 (SMP w/2 CPU cores)
Locale: LANG=fr_FR.UTF-8, LC_CTYPE=fr_FR.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Init: systemd (via /run/systemd/system)

Versions of packages libgtk2.0-0 depends on:
ii  libatk1.0-0          2.14.0-1
ii  libc6                2.19-18+deb8u6
ii  libcairo2            1.14.0-2.1+deb8u1
ii  libcups2             1.7.5-11+deb8u1
ii  libfontconfig1       2.11.0-6.3+deb8u1
ii  libfreetype6         2.5.2-3+deb8u1
ii  libgdk-pixbuf2.0-0   2.31.1-2+deb8u5
ii  libglib2.0-0         2.42.1-1+b1
ii  libgtk2.0-common     2.24.25-3+deb8u1
ii  libpango-1.0-0       1.36.8-3
ii  libpangocairo-1.0-0  1.36.8-3
ii  libpangoft2-1.0-0    1.36.8-3
ii  libx11-6             2:1.6.2-3
ii  libxcomposite1       1:0.4.4-1
ii  libxcursor1          1:1.1.14-1+b1
ii  libxdamage1          1:1.1.4-2+b1
ii  libxext6             2:1.3.3-1
ii  libxfixes3           1:5.0.1-2+b2
ii  libxi6               2:1.7.4-1+b2
ii  libxinerama1         2:1.1.3-1+b1
ii  libxrandr2           2:1.4.2-1+b1
ii  libxrender1          1:0.9.8-1+b1
ii  multiarch-support    2.19-18+deb8u6
ii  shared-mime-info     1.3-1

Versions of packages libgtk2.0-0 recommends:
ii  hicolor-icon-theme  0.13-1
ii  libgtk2.0-bin       2.24.25-3+deb8u1

Versions of packages libgtk2.0-0 suggests:
ii  gvfs             1.22.2-1
ii  librsvg2-common  2.40.5-1+deb8u2

-- no debconf information
>From 34caf388443c7b77b33bdb2c8bbc59faf9affa82 Mon Sep 17 00:00:00 2001
From: Colomban Wendling <cwendl...@hypra.fr>
Date: Wed, 7 Dec 2016 15:49:03 +0100
Subject: [PATCH] GtkMenuShell: always 'activate' menu shells

Failing to do so can leave us with a stuck grab in some cases.
https://bugzilla.gnome.org/show_bug.cgi?id=554057

Cherry-picks f5eee56b56e2f371a0dc659f2d402b0cfc1c42c2,
9833fbd77a63ee5dd8f6b5519831db2a4b29ebb9 and
4eac7f24177d947852574f11ef483b1c43fd17e5 from GTK3.
---
 gtk/gtkmenubar.c   | 1 -
 gtk/gtkmenuitem.c  | 2 --
 gtk/gtkmenushell.c | 8 +++++---
 gtk/gtkmenushell.h | 1 -
 4 files changed, 5 insertions(+), 7 deletions(-)

diff --git a/gtk/gtkmenubar.c b/gtk/gtkmenubar.c
index 05de45c..e3b9554 100644
--- a/gtk/gtkmenubar.c
+++ b/gtk/gtkmenubar.c
@@ -618,7 +618,6 @@ window_key_press_handler (GtkWidget   *widget,
 	      GtkMenuShell *menu_shell = GTK_MENU_SHELL (menubars->data);
 
               _gtk_menu_shell_set_keyboard_mode (menu_shell, TRUE);
-	      _gtk_menu_shell_activate (menu_shell);
 	      gtk_menu_shell_select_first (menu_shell, FALSE);
 	      
 	      g_list_free (menubars);
diff --git a/gtk/gtkmenuitem.c b/gtk/gtkmenuitem.c
index 8f23b75..b706c7d 100644
--- a/gtk/gtkmenuitem.c
+++ b/gtk/gtkmenuitem.c
@@ -1433,8 +1433,6 @@ gtk_real_menu_item_activate_item (GtkMenuItem *menu_item)
 	{
 	  GtkMenuShell *menu_shell = GTK_MENU_SHELL (widget->parent);
 
-	  _gtk_menu_shell_activate (menu_shell);
-
 	  gtk_menu_shell_select_item (GTK_MENU_SHELL (widget->parent), widget);
 	  _gtk_menu_item_popup_submenu (widget, FALSE);
 
diff --git a/gtk/gtkmenushell.c b/gtk/gtkmenushell.c
index a7ad7b5..48de6a8 100644
--- a/gtk/gtkmenushell.c
+++ b/gtk/gtkmenushell.c
@@ -563,8 +563,8 @@ gtk_menu_shell_realize (GtkWidget *widget)
   gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL);
 }
 
-void
-_gtk_menu_shell_activate (GtkMenuShell *menu_shell)
+static void
+gtk_menu_shell_activate (GtkMenuShell *menu_shell)
 {
   if (!menu_shell->active)
     {
@@ -609,7 +609,7 @@ gtk_menu_shell_button_press (GtkWidget      *widget,
 
   if (!menu_shell->active || !menu_shell->button)
     {
-      _gtk_menu_shell_activate (menu_shell);
+      gtk_menu_shell_activate (menu_shell);
 
       menu_shell->button = event->button;
 
@@ -1204,6 +1204,8 @@ gtk_menu_shell_real_select_item (GtkMenuShell *menu_shell,
       return;
     }
 
+  gtk_menu_shell_activate (menu_shell);
+
   menu_shell->active_menu_item = menu_item;
   if (pack_dir == GTK_PACK_DIRECTION_TTB || pack_dir == GTK_PACK_DIRECTION_BTT)
     _gtk_menu_item_set_placement (GTK_MENU_ITEM (menu_shell->active_menu_item),
diff --git a/gtk/gtkmenushell.h b/gtk/gtkmenushell.h
index 7672a2b..2d90c33 100644
--- a/gtk/gtkmenushell.h
+++ b/gtk/gtkmenushell.h
@@ -116,7 +116,6 @@ void  gtk_menu_shell_select_first      (GtkMenuShell *menu_shell,
 					gboolean      search_sensitive);
 void _gtk_menu_shell_select_last       (GtkMenuShell *menu_shell,
 					gboolean      search_sensitive);
-void  _gtk_menu_shell_activate         (GtkMenuShell *menu_shell);
 gint  _gtk_menu_shell_get_popup_delay  (GtkMenuShell *menu_shell);
 void  gtk_menu_shell_cancel            (GtkMenuShell *menu_shell);
 
-- 
2.1.4


Reply via email to