[mutter] Remove compositor-internal window lookup code
- From: Owen Taylor <otaylor src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] Remove compositor-internal window lookup code
- Date: Wed, 7 Apr 2010 14:22:50 +0000 (UTC)
commit ee35540b6ef56c9efde7399493ef5fd7cb7f7de0
Author: Owen W. Taylor <otaylor fishsoup net>
Date: Tue Apr 6 14:10:44 2010 -0400
Remove compositor-internal window lookup code
Since all windows are now MetaWindows as well as compositor
windows, there's no reason to keep a compositor-specific hash table
mapping from XID to MutterWindow.
This reduces complexity and removes a call to XQueryTree that could
potentially produce a BadWindow error if not error-trapped.
https://bugzilla.gnome.org/show_bug.cgi?id=613398
src/compositor/compositor.c | 128 ++++++++++++---------------------------
src/compositor/mutter-window.c | 6 --
2 files changed, 40 insertions(+), 94 deletions(-)
---
diff --git a/src/compositor/compositor.c b/src/compositor/compositor.c
index 15e170a..af75e1a 100644
--- a/src/compositor/compositor.c
+++ b/src/compositor/compositor.c
@@ -33,59 +33,6 @@ composite_at_least_version (MetaDisplay *display, int maj, int min)
return (major > maj || (major == maj && minor >= min));
}
-static MutterWindow*
-find_window_for_screen (MetaScreen *screen, Window xwindow)
-{
- MetaCompScreen *info = meta_screen_get_compositor_data (screen);
-
- if (info == NULL)
- return NULL;
-
- return g_hash_table_lookup (info->windows_by_xid,
- (gpointer) xwindow);
-}
-
-static MutterWindow *
-find_window_in_display (MetaDisplay *display, Window xwindow)
-{
- GSList *index;
- MetaWindow *window = meta_display_lookup_x_window (display, xwindow);
-
- if (window)
- {
- void *priv = meta_window_get_compositor_private (window);
- if (priv)
- return priv;
- }
-
- for (index = meta_display_get_screens (display);
- index;
- index = index->next)
- {
- MutterWindow *cw = find_window_for_screen (index->data, xwindow);
-
- if (cw != NULL)
- return cw;
- }
-
- return NULL;
-}
-
-static MutterWindow *
-find_window_for_child_window_in_display (MetaDisplay *display, Window xwindow)
-{
- Window ignored1, *ignored2, parent;
- guint ignored_children;
-
- XQueryTree (meta_display_get_xdisplay (display), xwindow, &ignored1,
- &parent, &ignored2, &ignored_children);
-
- if (parent != None)
- return find_window_in_display (display, parent);
-
- return NULL;
-}
-
static void sync_actor_stacking (GList *windows);
static void
@@ -144,9 +91,15 @@ add_win (MetaWindow *window)
static void
process_damage (MetaCompositor *compositor,
- XDamageNotifyEvent *event)
+ XDamageNotifyEvent *event,
+ MetaWindow *window)
{
- MutterWindow *cw = find_window_in_display (compositor->display, event->drawable);
+ MutterWindow *cw;
+
+ if (window == NULL)
+ return;
+
+ cw = MUTTER_WINDOW (meta_window_get_compositor_private (window));
if (cw == NULL)
return;
@@ -156,10 +109,15 @@ process_damage (MetaCompositor *compositor,
#ifdef HAVE_SHAPE
static void
process_shape (MetaCompositor *compositor,
- XShapeEvent *event)
+ XShapeEvent *event,
+ MetaWindow *window)
{
- MutterWindow *cw = find_window_in_display (compositor->display,
- event->window);
+ MutterWindow *cw;
+
+ if (window == NULL)
+ return;
+
+ cw = MUTTER_WINDOW (meta_window_get_compositor_private (window));
if (cw == NULL)
return;
@@ -172,43 +130,29 @@ process_shape (MetaCompositor *compositor,
static void
process_property_notify (MetaCompositor *compositor,
- XPropertyEvent *event)
+ XPropertyEvent *event,
+ MetaWindow *window)
{
MetaDisplay *display = compositor->display;
+ MutterWindow *cw;
+
+ if (window == NULL)
+ return;
+
+ cw = MUTTER_WINDOW (meta_window_get_compositor_private (window));
+ if (cw == NULL)
+ return;
/* Check for the opacity changing */
if (event->atom == compositor->atom_net_wm_window_opacity)
{
- MutterWindow *cw = find_window_in_display (display, event->window);
-
- if (!cw)
- {
- /* Applications can set this for their toplevel windows, so
- * this must be propagated to the window managed by the compositor
- */
- cw = find_window_for_child_window_in_display (display,
- event->window);
- }
-
- if (!cw)
- {
- DEBUG_TRACE ("process_property_notify: opacity, early exit\n");
- return;
- }
-
mutter_window_update_opacity (cw);
+ DEBUG_TRACE ("process_property_notify: net_wm_window_opacity\n");
+ return;
}
else if (event->atom == meta_display_get_atom (display,
META_ATOM__NET_WM_WINDOW_TYPE))
{
- MutterWindow *cw = find_window_in_display (display, event->window);
-
- if (!cw)
- {
- DEBUG_TRACE ("process_property_notify: net_wm_type, early exit\n");
- return;
- }
-
mutter_window_update_window_type (cw);
DEBUG_TRACE ("process_property_notify: net_wm_type\n");
return;
@@ -505,7 +449,6 @@ meta_compositor_manage_screen (MetaCompositor *compositor,
info->output = None;
info->windows = NULL;
- info->windows_by_xid = g_hash_table_new (g_direct_hash, g_direct_equal);
meta_screen_set_cm_selection (screen);
@@ -699,20 +642,29 @@ meta_compositor_process_event (MetaCompositor *compositor,
switch (event->type)
{
case PropertyNotify:
- process_property_notify (compositor, (XPropertyEvent *) event);
+ process_property_notify (compositor, (XPropertyEvent *) event, window);
break;
default:
if (event->type == meta_display_get_damage_event_base (compositor->display) + XDamageNotify)
{
+ /* Core code doesn't handle damage events, so we need to extract the MetaWindow
+ * ourselves
+ */
+ if (window == NULL)
+ {
+ Window xwin = ((XDamageNotifyEvent *) event)->drawable;
+ window = meta_display_lookup_x_window (compositor->display, xwin);
+ }
+
DEBUG_TRACE ("meta_compositor_process_event (process_damage)\n");
- process_damage (compositor, (XDamageNotifyEvent *) event);
+ process_damage (compositor, (XDamageNotifyEvent *) event, window);
}
#ifdef HAVE_SHAPE
else if (event->type == meta_display_get_shape_event_base (compositor->display) + ShapeNotify)
{
DEBUG_TRACE ("meta_compositor_process_event (process_shape)\n");
- process_shape (compositor, (XShapeEvent *) event);
+ process_shape (compositor, (XShapeEvent *) event, window);
}
#endif /* HAVE_SHAPE */
break;
diff --git a/src/compositor/mutter-window.c b/src/compositor/mutter-window.c
index 18b815d..3016e96 100644
--- a/src/compositor/mutter-window.c
+++ b/src/compositor/mutter-window.c
@@ -272,9 +272,6 @@ mutter_meta_window_decorated_notify (MetaWindow *mw,
priv->damage = None;
}
- g_hash_table_remove (info->windows_by_xid, (gpointer) priv->xwindow);
- g_hash_table_insert (info->windows_by_xid, (gpointer) new_xwindow, self);
-
g_free (priv->desc);
priv->desc = NULL;
@@ -421,7 +418,6 @@ mutter_window_dispose (GObject *object)
}
info->windows = g_list_remove (info->windows, (gconstpointer) self);
- g_hash_table_remove (info->windows_by_xid, (gpointer) priv->xwindow);
/*
* Release the extra reference we took on the actor.
@@ -976,7 +972,6 @@ mutter_window_destroy (MutterWindow *self)
*/
info = meta_screen_get_compositor_data (priv->screen);
info->windows = g_list_remove (info->windows, (gconstpointer) self);
- g_hash_table_remove (info->windows_by_xid, (gpointer)priv->xwindow);
if (priv->type == META_COMP_WINDOW_DROPDOWN_MENU ||
priv->type == META_COMP_WINDOW_POPUP_MENU ||
@@ -1224,7 +1219,6 @@ mutter_window_new (MetaWindow *window)
* before we first paint.
*/
info->windows = g_list_append (info->windows, self);
- g_hash_table_insert (info->windows_by_xid, (gpointer) top_window, self);
return self;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]