Date: Monday, June 29, 2015 @ 19:06:13
  Author: bgyorgy
Revision: 136122

upgpkg: mate-panel-gtk3 1.10.0-4

Fix Force-Quit panel applet to avoid hang with GTK3

Added:
  mate-panel-gtk3/trunk/fix-force-quit.patch
Modified:
  mate-panel-gtk3/trunk/PKGBUILD

----------------------+
 PKGBUILD             |   16 +++++--
 fix-force-quit.patch |  108 +++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 121 insertions(+), 3 deletions(-)

Modified: PKGBUILD
===================================================================
--- PKGBUILD    2015-06-29 13:48:26 UTC (rev 136121)
+++ PKGBUILD    2015-06-29 17:06:13 UTC (rev 136122)
@@ -4,7 +4,7 @@
 _pkgbase=mate-panel
 pkgname=${_pkgbase}-gtk3
 pkgver=${_ver}.0
-pkgrel=3
+pkgrel=4
 pkgdesc="The MATE Panel (GTK3 version [EXPERIMENTAL])"
 url="http://mate-desktop.org";
 arch=('i686' 'x86_64')
@@ -14,12 +14,22 @@
          'mate-menus>=1.10' 'mate-desktop-gtk3>=1.10')
 makedepends=('gobject-introspection' 'mate-common' 'yelp-tools')
 optdepends=('yelp: for reading MATE help documents')
-source=("http://pub.mate-desktop.org/releases/${_ver}/${_pkgbase}-${pkgver}.tar.xz";)
+source=("http://pub.mate-desktop.org/releases/${_ver}/${_pkgbase}-${pkgver}.tar.xz";
+        fix-force-quit.patch)
 groups=('mate-gtk3')
 conflicts=("${_pkgbase}")
-sha1sums=('632d7127fba8c5fa76f5dd951db89325c6ca3f89')
+sha1sums=('632d7127fba8c5fa76f5dd951db89325c6ca3f89'
+          '4c89df9a32decc1be4181154a1fa8ba6282abd86')
 install=${_pkgbase}.install
 
+prepare() {
+    cd "${srcdir}/${_pkgbase}-${pkgver}"
+
+    # Fix Force-Quit panel applet to avoid hang with GTK3
+    # https://github.com/mate-desktop/mate-panel/pull/318
+    patch -Np1 -i ../fix-force-quit.patch
+}
+
 build() {
     cd "${srcdir}/${_pkgbase}-${pkgver}"
     ./configure \

Added: fix-force-quit.patch
===================================================================
--- fix-force-quit.patch                                (rev 0)
+++ fix-force-quit.patch        2015-06-29 17:06:13 UTC (rev 136122)
@@ -0,0 +1,108 @@
+From 2b8df1cf67516a9df1fb8931e88a06b452e890b5 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Ball=C3=B3=20Gy=C3=B6rgy?= <[email protected]>
+Date: Mon, 29 Jun 2015 11:50:20 +0200
+Subject: [PATCH] Fix Force-Quit panel applet
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+This patch implements handling of XInput2 extension events in the applet.
+Without this patch, the applet fails to recognize such events (either mouse
+click for killing application, or escape key for exiting), hence freezing the
+desktop.
+
+Also fix the event mask in call of gdk_device_grab() for keyboard.
+
+Author: Sébastien Villemot <[email protected]>
+http://bugs.debian.org/698740
+---
+ mate-panel/panel-force-quit.c | 34 +++++++++++++++++++++++++++-------
+ 1 file changed, 27 insertions(+), 7 deletions(-)
+
+diff --git a/mate-panel/panel-force-quit.c b/mate-panel/panel-force-quit.c
+index 8231b8f..f0374e2 100644
+--- a/mate-panel/panel-force-quit.c
++++ b/mate-panel/panel-force-quit.c
+@@ -32,6 +32,8 @@
+ #include <X11/Xlib.h>
+ #include <X11/keysym.h>
+ 
++#include <X11/extensions/XInput2.h>
++
+ #include "panel-icon-names.h"
+ #include "panel-stock-icons.h"
+ 
+@@ -261,22 +263,23 @@ kill_window_question (gpointer window)
+ 
+ static void 
+ handle_button_press_event (GtkWidget *popup,
+-                         XKeyEvent *event)
++                         Display *display,
++                         Window subwindow)
+ {
+       Window window;
+ 
+       remove_popup (popup);
+ 
+-      if (event->subwindow == None)
++      if (subwindow == None)
+               return;
+ 
+       if (wm_state_atom == None)
+-              wm_state_atom = XInternAtom (event->display, "WM_STATE", FALSE);
++              wm_state_atom = XInternAtom (display, "WM_STATE", FALSE);
+ 
+-      window = find_managed_window (event->display, event->subwindow);
++      window = find_managed_window (display, subwindow);
+ 
+       if (window != None) {
+-              if (!gdk_x11_window_lookup_for_display (gdk_x11_lookup_xdisplay 
(event->display), window))
++              if (!gdk_x11_window_lookup_for_display (gdk_x11_lookup_xdisplay 
(display), window))
+                       kill_window_question ((gpointer) window);
+       }
+ }
+@@ -287,10 +290,12 @@ popup_filter (GdkXEvent *gdk_xevent,
+             GtkWidget *popup)
+ {
+       XEvent *xevent = (XEvent *) gdk_xevent;
++      XIEvent *xiev;
++      XIDeviceEvent *xidev;
+ 
+       switch (xevent->type) {
+       case ButtonPress:
+-              handle_button_press_event (popup, &xevent->xkey);
++              handle_button_press_event (popup, xevent->xbutton.display, 
xevent->xbutton.subwindow);
+               return GDK_FILTER_REMOVE;
+       case KeyPress:
+               if (xevent->xkey.keycode == XKeysymToKeycode 
(xevent->xany.display, XK_Escape)) {
+@@ -298,6 +303,21 @@ popup_filter (GdkXEvent *gdk_xevent,
+                       return GDK_FILTER_REMOVE;
+               }
+               break;
++      case GenericEvent:
++              xiev = (XIEvent *) xevent->xcookie.data;
++              xidev = (XIDeviceEvent *) xiev;
++              switch (xiev->evtype) {
++              case XI_KeyPress:
++                      if (xidev->detail == XKeysymToKeycode 
(xevent->xany.display, XK_Escape)) {
++                              remove_popup (popup);
++                              return GDK_FILTER_REMOVE;
++                      }
++                      break;
++              case XI_ButtonPress:
++                      handle_button_press_event (popup, xidev->display, 
xidev->child);
++                      return GDK_FILTER_REMOVE;
++              }
++              break;
+       default:
+               break;
+       }
+@@ -342,7 +362,7 @@ panel_force_quit (GdkScreen *screen,
+ 
+       status = gdk_device_grab (keyboard, root,
+                                 GDK_OWNERSHIP_NONE, FALSE,
+-                                GDK_KEY_PRESS | GDK_KEY_RELEASE,
++                                GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK,
+                                 NULL, time);
+ 
+       if (status != GDK_GRAB_SUCCESS) {

Reply via email to