[gtk3/f16] Try to fix XI2 related crashes

Matthias Clasen mclasen at fedoraproject.org
Wed Nov 30 05:19:30 UTC 2011


commit 6fd0e72b4d7858a35aed8ee6463d505aca578d60
Author: Matthias Clasen <mclasen at redhat.com>
Date:   Wed Nov 30 00:19:03 2011 -0500

    Try to fix XI2 related crashes

 ...sh-error-traps-around-XIQueryDevice-calls.patch |   94 ++++++++++++++++++++
 gtk3.spec                                          |    6 ++
 2 files changed, 100 insertions(+), 0 deletions(-)
---
diff --git a/0001-XI2-Push-error-traps-around-XIQueryDevice-calls.patch b/0001-XI2-Push-error-traps-around-XIQueryDevice-calls.patch
new file mode 100644
index 0000000..fb2f294
--- /dev/null
+++ b/0001-XI2-Push-error-traps-around-XIQueryDevice-calls.patch
@@ -0,0 +1,94 @@
+From 9b967ab8aff46b79494d75a3129fa8780545ecd1 Mon Sep 17 00:00:00 2001
+From: Matthias Clasen <mclasen at redhat.com>
+Date: Wed, 30 Nov 2011 00:16:43 -0500
+Subject: [PATCH] XI2: Push error traps around XIQueryDevice calls
+
+This may help against the crashes at resume time that some
+people have been hitting when input devices mysteriously
+disappear.
+---
+ gdk/x11/gdkdevice-xi2.c        |    7 +++++--
+ gdk/x11/gdkdevicemanager-xi2.c |   30 ++++++++++++++++++++----------
+ 2 files changed, 25 insertions(+), 12 deletions(-)
+
+diff --git a/gdk/x11/gdkdevice-xi2.c b/gdk/x11/gdkdevice-xi2.c
+index b86d802..9eecb3c 100644
+--- a/gdk/x11/gdkdevice-xi2.c
++++ b/gdk/x11/gdkdevice-xi2.c
+@@ -192,10 +192,12 @@ gdk_x11_device_xi2_get_state (GdkDevice       *device,
+ 
+       display = gdk_device_get_display (device);
+ 
++      gdk_x11_display_error_trap_push (display);
+       info = XIQueryDevice (GDK_DISPLAY_XDISPLAY (display),
+                             device_xi2->device_id, &ndevices);
++      gdk_x11_display_error_trap_pop_ignored (display);
+ 
+-      for (i = 0, j = 0; i < info->num_classes; i++)
++      for (i = 0, j = 0; info && i < info->num_classes; i++)
+         {
+           XIAnyClassInfo *class_info = info->classes[i];
+           GdkAxisUse use;
+@@ -234,7 +236,8 @@ gdk_x11_device_xi2_get_state (GdkDevice       *device,
+           j++;
+         }
+ 
+-      XIFreeDeviceInfo (info);
++      if (info)
++        XIFreeDeviceInfo (info);
+     }
+ 
+   if (mask)
+diff --git a/gdk/x11/gdkdevicemanager-xi2.c b/gdk/x11/gdkdevicemanager-xi2.c
+index c921ce0..afa9f54 100644
+--- a/gdk/x11/gdkdevicemanager-xi2.c
++++ b/gdk/x11/gdkdevicemanager-xi2.c
+@@ -586,9 +586,14 @@ handle_hierarchy_changed (GdkX11DeviceManagerXI2 *device_manager,
+     {
+       if (ev->info[i].flags & XIDeviceEnabled)
+         {
++          gdk_x11_display_error_trap_push (display);
+           info = XIQueryDevice (xdisplay, ev->info[i].deviceid, &ndevices);
+-          add_device (device_manager, &info[0], TRUE);
+-          XIFreeDeviceInfo (info);
++          gdk_x11_display_error_trap_pop_ignored (display);
++          if (info)
++            {
++              add_device (device_manager, &info[0], TRUE);
++              XIFreeDeviceInfo (info);
++            }
+         }
+       else if (ev->info[i].flags & XIDeviceDisabled)
+         remove_device (device_manager, ev->info[i].deviceid);
+@@ -614,15 +619,20 @@ handle_hierarchy_changed (GdkX11DeviceManagerXI2 *device_manager,
+           /* Add new master if it's an attachment event */
+           if (ev->info[i].flags & XISlaveAttached)
+             {
++              gdk_x11_display_error_trap_push (display);
+               info = XIQueryDevice (xdisplay, ev->info[i].deviceid, &ndevices);
+-
+-              master = g_hash_table_lookup (device_manager->id_table,
+-                                            GINT_TO_POINTER (info->attachment));
+-
+-              _gdk_device_set_associated_device (slave, master);
+-              _gdk_device_add_slave (master, slave);
+-
+-              g_signal_emit_by_name (device_manager, "device-changed", master);
++              gdk_x11_display_error_trap_pop_ignored (display);
++              if (info)
++                {
++                  master = g_hash_table_lookup (device_manager->id_table,
++                                                GINT_TO_POINTER (info->attachment));
++                  XIFreeDeviceInfo (info);
++
++                  _gdk_device_set_associated_device (slave, master);
++                  _gdk_device_add_slave (master, slave);
++
++                  g_signal_emit_by_name (device_manager, "device-changed", master);
++                }
+             }
+ 
+           g_signal_emit_by_name (device_manager, "device-changed", slave);
+-- 
+1.7.7.3
+
diff --git a/gtk3.spec b/gtk3.spec
index a775307..e02119d 100644
--- a/gtk3.spec
+++ b/gtk3.spec
@@ -17,6 +17,8 @@ URL: http://www.gtk.org
 Source: http://download.gnome.org/sources/gtk+/3.2/gtk+-%{version}.tar.xz
 Source1: im-cedilla.conf
 
+Patch0: 0001-XI2-Push-error-traps-around-XIQueryDevice-calls.patch
+
 BuildRequires: gnome-common autoconf automake intltool gettext
 BuildRequires: atk-devel >= %{atk_version}
 BuildRequires: glib2-devel >= %{glib2_version}
@@ -109,6 +111,7 @@ widget toolkit.
 
 %prep
 %setup -q -n gtk+-%{version}
+%patch0 -p1
 
 %build
 
@@ -233,6 +236,9 @@ gtk-query-immodules-3.0-%{__isa_bits} --update-cache
 %{_datadir}/gtk-doc
 
 %changelog
+* Wed Nov 30 2011 Matthias Clasen <mclasen at redhat.com> - 3.2.2-2
+- Try to fix XI2 related crashes
+
 * Thu Nov 24 2011 Matthias Clasen <mclasen at redhat.com> - 3.2.2-1
 - Update to 3.2.2
 


More information about the scm-commits mailing list