[clutter] Fix clutter #2366 (mutter hang when gnome-settings-daemon restarts)

Daniel Williams dcbw at fedoraproject.org
Tue Nov 23 03:54:37 UTC 2010


commit 23bb0d6136a42bbc71fcb4b44985d18d01ef950b
Author: Dan Williams <dcbw at redhat.com>
Date:   Mon Nov 22 21:53:36 2010 -0600

    Fix clutter #2366 (mutter hang when gnome-settings-daemon restarts)

 clutter.spec                                       |   10 ++-
 ...-dont-use-the-xsettings-watch-function-fu.patch |   86 ++++++++++++++++++++
 2 files changed, 95 insertions(+), 1 deletions(-)
---
diff --git a/clutter.spec b/clutter.spec
index 22e48cf..733d3cb 100644
--- a/clutter.spec
+++ b/clutter.spec
@@ -1,6 +1,6 @@
 Name:           clutter
 Version:        1.4.0
-Release:        3%{?dist}
+Release:        4%{?dist}
 Summary:        Open Source software library for creating rich graphical user interfaces
 
 Group:          Development/Libraries
@@ -13,6 +13,8 @@ Source0:        http://www.clutter-project.org/sources/%{name}/1.4/%{name}-%{ver
 Patch0:         Use-a-native-format-for-atlas-textures.patch
 # http://bugzilla.clutter-project.org/show_bug.cgi?id=2324
 Patch1:         cogl-x11-Trap-glXDestroyPixmap.patch
+# http://bugzilla.clutter-project.org/attachment.cgi?id=2366
+Patch2:         xsettings-dont-use-the-xsettings-watch-function-fu.patch
 
 BuildRequires:  glib2-devel mesa-libGL-devel gtk2-devel pkgconfig pango-devel
 BuildRequires:  gobject-introspection-devel >= 0.9.6
@@ -60,6 +62,7 @@ This package contains documentation for clutter.
 
 %patch0 -p0 -b .atlas-textures
 %patch1 -p1 -b .glXDestroyPixmap
+%patch2 -p1 -b .xsettings
 
 %build
 (if ! test -x configure; then NOCONFIGURE=1 ./autogen.sh; CONFIGFLAGS=--enable-gtk-doc; fi;
@@ -112,6 +115,11 @@ rm -rf %{buildroot}
 %{_datadir}/gtk-doc/html/cally
 
 %changelog
+* Mon Nov 22 2010 Dan Williams <dcbw at redhat.com> - 1.4.0-4
+- Add a patch cherry-picked from upstream for
+  http://bugzilla.clutter-project.org/attachment.cgi?id=2366
+  (gnome-shell/mutter hang when gnome-settings-daemon restarts)
+
 * Tue Oct  5 2010 Owen Taylor <otaylor at redhat.com> - 1.4.0-3
 - Add a patch cherry-picked from upstream for
   http://bugzilla.clutter-project.org/show_bug.cgi?id=2324
diff --git a/xsettings-dont-use-the-xsettings-watch-function-fu.patch b/xsettings-dont-use-the-xsettings-watch-function-fu.patch
new file mode 100644
index 0000000..3765c8b
--- /dev/null
+++ b/xsettings-dont-use-the-xsettings-watch-function-fu.patch
@@ -0,0 +1,86 @@
+From c7d388e987063612d178b2412559b463b5e56f7a Mon Sep 17 00:00:00 2001
+From: Owen W. Taylor <otaylor at fishsoup.net>
+Date: Fri, 12 Nov 2010 18:53:51 -0500
+Subject: [PATCH] xsettings: don't use the xsettings watch function functionality
+
+The "watch" function functionality in xsettings-client.c is designed
+for setups like GDK where filters are per-window. If we are going
+to pass all events to _clutter_xsettings_client_process_event()
+anyways, we can just pass in NULL for watch.
+
+This avoids a nasty infinite loop where an event would get processed
+triggering removing a filter and adding a new filter, which would
+immediately run and remove a filter and add another and so on
+ad-infinitum.
+
+http://bugzilla.clutter-project.org/show_bug.cgi?id=2415
+---
+ clutter/x11/clutter-backend-x11.c |   37 ++++---------------------------------
+ 1 files changed, 4 insertions(+), 33 deletions(-)
+
+diff --git a/clutter/x11/clutter-backend-x11.c b/clutter/x11/clutter-backend-x11.c
+index 8a61741..3b7b579 100644
+--- a/clutter/x11/clutter-backend-x11.c
++++ b/clutter/x11/clutter-backend-x11.c
+@@ -120,38 +120,6 @@ xsettings_filter (XEvent       *xevent,
+   return CLUTTER_X11_FILTER_CONTINUE;
+ }
+ 
+-static Bool
+-clutter_backend_x11_xsettings_watch (Window  window,
+-                                     Bool    is_start,
+-                                     long    mask,
+-                                     void   *cb_data)
+-{
+-  ClutterBackendX11 *backend_x11 = cb_data;
+-
+-  if (is_start)
+-    {
+-      backend_x11->xsettings_xwin = window;
+-      if (!backend_x11->xsettings_xwin)
+-        return False;
+-
+-      clutter_x11_add_filter (xsettings_filter, backend_x11);
+-
+-      CLUTTER_NOTE (BACKEND, "Added filter on XSettings manager window 0x%x",
+-                    (unsigned int) backend_x11->xsettings_xwin);
+-    }
+-  else
+-    {
+-      CLUTTER_NOTE (BACKEND, "Removed filter on XSettings manager window 0x%x",
+-                    (unsigned int) backend_x11->xsettings_xwin);
+-
+-      clutter_x11_remove_filter (xsettings_filter, backend_x11);
+-
+-      backend_x11->xsettings_xwin = None;
+-    }
+-
+-  return True;
+-}
+-
+ static void
+ clutter_backend_x11_xsettings_notify (const char       *name,
+                                       XSettingsAction   action,
+@@ -336,9 +304,11 @@ clutter_backend_x11_post_parse (ClutterBackend  *backend,
+         _clutter_xsettings_client_new (backend_x11->xdpy,
+                                        backend_x11->xscreen_num,
+                                        clutter_backend_x11_xsettings_notify,
+-                                       clutter_backend_x11_xsettings_watch,
++                                       NULL,
+                                        backend_x11);
+ 
++      clutter_x11_add_filter (xsettings_filter, backend_x11);
++
+       if (clutter_synchronise)
+         XSynchronize (backend_x11->xdpy, True);
+ 
+@@ -426,6 +396,7 @@ clutter_backend_x11_finalize (GObject *gobject)
+ 
+   g_free (backend_x11->display_name);
+ 
++  clutter_x11_remove_filter (xsettings_filter, backend_x11);
+   _clutter_xsettings_client_destroy (backend_x11->xsettings);
+ 
+   XCloseDisplay (backend_x11->xdpy);
+-- 
+1.7.3.2
\ No newline at end of file


More information about the scm-commits mailing list