mutter/mutter-pluginmanager.patch
2009-07-29 11:33:00 +00:00

79 lines
2.7 KiB
Diff

From d91d503eb25412432e8aa9b4863d469d5828a4b7 Mon Sep 17 00:00:00 2001
From: Owen W. Taylor <otaylor@fishsoup.net>
Date: Wed, 22 Jul 2009 18:37:43 +0000
Subject: Pass event to clutter when the plugin doesn't have xevent_filter
With recent changes, Clutter no longer sets up the viewport correctly,
unless it receives ConfigureNotify events. If there is a plugin with
an xevent_filter function, then it's that plugins responsibility to pass
the event to Clutter if it doesn't want it. If there is no plugin,
or the plugin doesn't have an xevent_filter function, then we should
call clutter_x11_handle_event() ourselves.
http://bugzilla.gnome.org/show_bug.cgi?id=589419
---
diff --git a/src/compositor/mutter-plugin-manager.c b/src/compositor/mutter-plugin-manager.c
index 98d3f19..9d8ae74 100644
--- a/src/compositor/mutter-plugin-manager.c
+++ b/src/compositor/mutter-plugin-manager.c
@@ -30,6 +30,8 @@
#include <string.h>
+#include <clutter/x11/clutter-x11.h>
+
/*
* There is only one instace of each module per the process.
*/
@@ -585,12 +587,31 @@ mutter_plugin_manager_xevent_filter (MutterPluginManager *plugin_mgr,
XEvent *xev)
{
GList *l;
+ gboolean have_plugin_xevent_func;
if (!plugin_mgr)
return FALSE;
l = plugin_mgr->plugins;
+ /* We need to make sure that clutter gets certain events, like
+ * ConfigureNotify on the stage window. If there is a plugin that
+ * provides an xevent_filter function, then it's the responsibility
+ * of that plugin to pass events to Clutter. Otherwise, we send the
+ * event directly to Clutter ourselves.
+ *
+ * What happens if there are two plugins with xevent_filter functions
+ * is undefined; in general, multiple competing plugins are something
+ * we don't support well or care much about.
+ *
+ * FIXME: Really, we should just always handle sending the event to
+ * clutter if a plugin doesn't report the event as handled by
+ * returning TRUE, but it doesn't seem worth breaking compatibility
+ * of the plugin interface right now to achieve this; the way it is
+ * now works fine in practice.
+ */
+ have_plugin_xevent_func = FALSE;
+
while (l)
{
MutterPlugin *plugin = l->data;
@@ -598,6 +619,7 @@ mutter_plugin_manager_xevent_filter (MutterPluginManager *plugin_mgr,
if (klass->xevent_filter)
{
+ have_plugin_xevent_func = TRUE;
if (klass->xevent_filter (plugin, xev) == TRUE)
return TRUE;
}
@@ -605,5 +627,8 @@ mutter_plugin_manager_xevent_filter (MutterPluginManager *plugin_mgr,
l = l->next;
}
+ if (!have_plugin_xevent_func)
+ return clutter_x11_handle_event (xev) != CLUTTER_X11_FILTER_CONTINUE;
+
return FALSE;
}
--
cgit v0.8.2