1
diff -rup mutter-original/src/compositor/mutter-plugin.c mutter-mod/src/compositor/mutter-plugin.c
2
--- mutter-original/src/compositor/mutter-plugin.c 2009-10-02 15:50:14.000000000 -0400
3
+++ mutter-mod/src/compositor/mutter-plugin.c 2010-01-21 11:01:59.780585475 -0500
6
#include "compositor-private.h"
7
#include "mutter-window-private.h"
8
+#include "mutter-window-group.h"
10
G_DEFINE_ABSTRACT_TYPE (MutterPlugin, mutter_plugin, G_TYPE_OBJECT);
12
@@ -352,6 +353,48 @@ mutter_plugin_get_window_group (MutterPl
13
return mutter_get_window_group_for_screen (priv->screen);
17
+mutter_plugin_get_below_window_group (MutterPlugin *plugin)
19
+ ClutterActor *actor;
20
+ MutterWindowGroup *group;
21
+ MutterPluginPrivate *priv = MUTTER_PLUGIN (plugin)->priv;
24
+ actor = mutter_get_window_group_for_screen (priv->screen);
25
+ group = MUTTER_WINDOW_GROUP (actor);
27
+ return mutter_window_group_get_below (group);
31
+mutter_plugin_get_normal_window_group (MutterPlugin *plugin)
33
+ ClutterActor *actor;
34
+ MutterWindowGroup *group;
35
+ MutterPluginPrivate *priv = MUTTER_PLUGIN (plugin)->priv;
38
+ actor = mutter_get_window_group_for_screen (priv->screen);
39
+ group = MUTTER_WINDOW_GROUP (actor);
41
+ return mutter_window_group_get_normal (group);
45
+mutter_plugin_get_above_window_group (MutterPlugin *plugin)
47
+ ClutterActor *actor;
48
+ MutterWindowGroup *group;
49
+ MutterPluginPrivate *priv = MUTTER_PLUGIN (plugin)->priv;
52
+ actor = mutter_get_window_group_for_screen (priv->screen);
53
+ group = MUTTER_WINDOW_GROUP (actor);
55
+ return mutter_window_group_get_above (group);
59
* _mutter_plugin_effect_started:
61
diff -rup mutter-original/src/compositor/mutter-window.c mutter-mod/src/compositor/mutter-window.c
62
--- mutter-original/src/compositor/mutter-window.c 2009-08-24 14:28:39.000000000 -0400
63
+++ mutter-mod/src/compositor/mutter-window.c 2010-01-19 13:04:47.469591342 -0500
65
#include "compositor-private.h"
66
#include "mutter-shaped-texture.h"
67
#include "mutter-window-private.h"
68
+#include "mutter-window-group.h"
70
#include "tidy/tidy-texture-frame.h"
72
@@ -1201,8 +1202,7 @@ mutter_window_new (MetaWindow *window)
73
/* Hang our compositor window state off the MetaWindow for fast retrieval */
74
meta_window_set_compositor_private (window, G_OBJECT (self));
76
- clutter_container_add_actor (CLUTTER_CONTAINER (info->window_group),
77
- CLUTTER_ACTOR (self));
78
+ mutter_window_group_pack_window (MUTTER_WINDOW_GROUP (info->window_group), self);
79
clutter_actor_hide (CLUTTER_ACTOR (self));
81
/* Initial position in the stack is arbitrary; stacking will be synced
82
diff -rup mutter-original/src/compositor/mutter-window-group.c mutter-mod/src/compositor/mutter-window-group.c
83
--- mutter-original/src/compositor/mutter-window-group.c 2009-08-19 10:46:43.000000000 -0400
84
+++ mutter-mod/src/compositor/mutter-window-group.c 2010-01-19 21:34:45.310788603 -0500
85
@@ -15,11 +15,72 @@ struct _MutterWindowGroup
91
+ ClutterActor *above;
92
+ ClutterActor *normal;
93
+ ClutterActor *below;
96
G_DEFINE_TYPE (MutterWindowGroup, mutter_window_group, CLUTTER_TYPE_GROUP);
99
+mutter_window_group_get_above (MutterWindowGroup *group)
101
+ g_return_val_if_fail (MUTTER_IS_WINDOW_GROUP (group), NULL);
103
+ return group->above;
107
+mutter_window_group_get_normal (MutterWindowGroup *group)
109
+ g_return_val_if_fail (MUTTER_IS_WINDOW_GROUP (group), NULL);
111
+ return group->normal;
115
+mutter_window_group_get_below (MutterWindowGroup *group)
117
+ g_return_val_if_fail (MUTTER_IS_WINDOW_GROUP (group), NULL);
119
+ return group->below;
123
+mutter_window_group_pack_window (MutterWindowGroup *group,
124
+ MutterWindow *window)
126
+ MetaCompWindowType type;
127
+ ClutterContainer *container;
129
+ g_return_if_fail (MUTTER_IS_WINDOW_GROUP (group));
130
+ g_return_if_fail (MUTTER_IS_WINDOW (window));
132
+ type = mutter_window_get_window_type (window);
134
+ if (type == META_COMP_WINDOW_DROPDOWN_MENU ||
135
+ type == META_COMP_WINDOW_POPUP_MENU ||
136
+ type == META_COMP_WINDOW_TOOLTIP ||
137
+ type == META_COMP_WINDOW_NOTIFICATION ||
138
+ type == META_COMP_WINDOW_COMBO ||
139
+ type == META_COMP_WINDOW_DND ||
140
+ type == META_COMP_WINDOW_OVERRIDE_OTHER)
142
+ container = CLUTTER_CONTAINER (group->above);
144
+ /*else if (type == META_COMP_WINDOW_DESKTOP)
146
+ container = CLUTTER_CONTAINER (group->below);
150
+ container = CLUTTER_CONTAINER (group->normal);
153
+ clutter_container_add_actor (container, CLUTTER_ACTOR (window));
156
/* We want to find out if the window is "close enough" to
157
* 1:1 transform. We do that by converting the transformed coordinates
158
* to 24.8 fixed-point before checking if they look right.
159
@@ -95,6 +156,22 @@ actor_is_untransformed (ClutterActor *ac
164
+mutter_window_group_get_windows (MutterWindowGroup *window_group)
166
+ GList *children, *other;
168
+ children = clutter_container_get_children (CLUTTER_CONTAINER (window_group->below));
170
+ other = clutter_container_get_children (CLUTTER_CONTAINER (window_group->normal));
171
+ children = g_list_concat (children, other);
173
+ other = clutter_container_get_children (CLUTTER_CONTAINER (window_group->above));
174
+ children = g_list_concat (children, other);
180
mutter_window_group_paint (ClutterActor *actor)
182
@@ -107,7 +184,7 @@ mutter_window_group_paint (ClutterActor
183
* and subtract the opaque area of each window out of the visible
184
* region that we pass to the windows below.
186
- children = clutter_container_get_children (CLUTTER_CONTAINER (actor));
187
+ children = mutter_window_group_get_windows (window_group);
188
children = g_list_reverse (children);
190
/* Start off with the full screen area (for a multihead setup, we
191
@@ -179,6 +256,17 @@ mutter_window_group_class_init (MutterWi
193
mutter_window_group_init (MutterWindowGroup *window_group)
195
+ window_group->below = clutter_group_new ();
196
+ clutter_container_add_actor (CLUTTER_CONTAINER (window_group), window_group->below);
198
+ window_group->normal = clutter_group_new ();
199
+ clutter_container_add_actor (CLUTTER_CONTAINER (window_group), window_group->normal);
201
+ window_group->above = clutter_group_new ();
202
+ clutter_container_add_actor (CLUTTER_CONTAINER (window_group), window_group->above);
204
+ clutter_container_raise_child (CLUTTER_CONTAINER (window_group), window_group->normal, NULL);
205
+ clutter_container_raise_child (CLUTTER_CONTAINER (window_group), window_group->above, NULL);
209
diff -rup mutter-original/src/compositor/mutter-window-group.h mutter-mod/src/compositor/mutter-window-group.h
210
--- mutter-original/src/compositor/mutter-window-group.h 2009-08-05 17:53:31.000000000 -0400
211
+++ mutter-mod/src/compositor/mutter-window-group.h 2010-01-19 11:34:26.599587232 -0500
212
@@ -45,8 +45,16 @@ typedef struct _MutterWindowGroup
213
typedef struct _MutterWindowGroupClass MutterWindowGroupClass;
214
typedef struct _MutterWindowGroupPrivate MutterWindowGroupPrivate;
216
-GType mutter_window_group_get_type (void);
217
+GType mutter_window_group_get_type (void);
219
-ClutterActor *mutter_window_group_new (MetaScreen *screen);
220
+void mutter_window_group_pack_window (MutterWindowGroup *group, MutterWindow *window);
222
+ClutterActor *mutter_window_group_get_above (MutterWindowGroup *group);
224
+ClutterActor *mutter_window_group_get_normal (MutterWindowGroup *group);
226
+ClutterActor *mutter_window_group_get_below (MutterWindowGroup *group);
228
+ClutterActor *mutter_window_group_new (MetaScreen *screen);
230
#endif /* MUTTER_WINDOW_GROUP_H */
231
diff -rup mutter-original/src/include/mutter-plugin.h mutter-mod/src/include/mutter-plugin.h
232
--- mutter-original/src/include/mutter-plugin.h 2009-08-28 12:27:29.000000000 -0400
233
+++ mutter-mod/src/include/mutter-plugin.h 2010-01-21 10:59:49.481835295 -0500
234
@@ -236,6 +236,15 @@ ClutterActor *
235
mutter_plugin_get_window_group (MutterPlugin *plugin);
238
+mutter_plugin_get_above_window_group (MutterPlugin *plugin);
241
+mutter_plugin_get_normal_window_group (MutterPlugin *plugin);
244
+mutter_plugin_get_below_window_group (MutterPlugin *plugin);
247
mutter_plugin_get_stage (MutterPlugin *plugin);