@@ -37,7 +37,13 @@ namespace Gala {
3737 */
3838 public Clutter . Actor top_window_group { get ; protected set ; }
3939
40- public Clutter . Actor notification_group { get ; protected set ; }
40+ /**
41+ * The group that contains all WindowActors that make shell elements, that is all windows reported as
42+ * ShellClientsManager.is_positioned_window.
43+ * It will (eventually) never be hidden by other components and is always on top of everything. Therefore elements are
44+ * responsible themselves for hiding depending on the state we are currently in (e.g. normal desktop, open multitasking view, fullscreen, etc.).
45+ */
46+ public Clutter . Actor shell_group { get ; private set ; }
4147
4248 /**
4349 * {@inheritDoc }
@@ -104,8 +110,6 @@ namespace Gala {
104110 private bool animating_switch_workspace = false ;
105111 private bool switch_workspace_with_gesture = false ;
106112
107- private signal void window_created (Meta .Window window );
108-
109113 /**
110114 * Amount of pixels to move on the nudge animation.
111115 */
@@ -253,14 +257,6 @@ namespace Gala {
253257 stage. remove_child (top_window_group);
254258 ui_group. add_child (top_window_group);
255259
256- #if HAS_MUTTER44
257- var feedback_group = display. get_compositor (). get_feedback_group ();
258- #else
259- var feedback_group = display. get_feedback_group ();
260- #endif
261- stage. remove_child (feedback_group);
262- ui_group. add_child (feedback_group);
263-
264260 // Initialize plugins and add default components if no plugin overrides them
265261 unowned var plugin_manager = PluginManager . get_default ();
266262 plugin_manager. initialize (this );
@@ -293,8 +289,16 @@ namespace Gala {
293289 }
294290
295291 // Add the remaining components that should be on top
296- notification_group = new Clutter .Actor ();
297- ui_group. add_child (notification_group);
292+ shell_group = new Clutter .Actor ();
293+ ui_group. add_child (shell_group);
294+
295+ #if HAS_MUTTER44
296+ var feedback_group = display. get_compositor (). get_feedback_group ();
297+ #else
298+ var feedback_group = display. get_feedback_group ();
299+ #endif
300+ stage. remove_child (feedback_group);
301+ ui_group. add_child (feedback_group);
298302
299303 pointer_locator = new PointerLocator (display);
300304 ui_group. add_child (pointer_locator);
@@ -381,12 +385,14 @@ namespace Gala {
381385
382386 update_input_area ();
383387
384- display. window_created. connect ((window) = > window_created (window));
385-
386388 var scroll_action = new SuperScrollAction (display);
387389 scroll_action. triggered. connect (handle_super_scroll);
388390 stage. add_action_full (" wm-super-scroll-action" , CAPTURE , scroll_action);
389391
392+ display. window_created. connect ((window) = >
393+ InternalUtils . wait_for_window_actor_visible (window, check_shell_window)
394+ );
395+
390396 stage. show ();
391397
392398 plugin_manager. load_waiting_plugins ();
@@ -1164,6 +1170,17 @@ namespace Gala {
11641170 show_window_menu (window, menu, rect. x, rect. y);
11651171 }
11661172
1173+ private void check_shell_window (Meta . WindowActor actor) {
1174+ unowned var window = actor. get_meta_window ();
1175+ if (ShellClientsManager . get_instance (). is_positioned_window (window)) {
1176+ InternalUtils . clutter_actor_reparent (actor, shell_group);
1177+ }
1178+
1179+ if (NotificationStack . is_notification (window)) {
1180+ notification_stack. show_notification (actor);
1181+ }
1182+ }
1183+
11671184 /*
11681185 * effects
11691186 */
@@ -1438,12 +1455,8 @@ namespace Gala {
14381455 actor. remove_all_transitions ();
14391456 actor. show ();
14401457
1441- // Notifications are a special case and have to be always be handled
1442- // (also regardless of the animation setting)
1458+ // Notifications initial animation is handled by the notification stack
14431459 if (NotificationStack . is_notification (window)) {
1444- InternalUtils . clutter_actor_reparent (actor, notification_group);
1445- notification_stack. show_notification (actor);
1446-
14471460 map_completed (actor);
14481461 return ;
14491462 }
@@ -1845,7 +1858,6 @@ namespace Gala {
18451858 private List<Clutter . Actor > ? windows;
18461859 private List<Clutter . Actor > ? parents;
18471860 private List<Clutter . Actor > ? tmp_actors;
1848- private ulong switch_workspace_window_created_id = 0 ;
18491861 private Clutter . Actor ? out_group;
18501862 private Clutter . Actor ? in_group;
18511863 private Clutter . Actor ? wallpaper;
@@ -1934,7 +1946,10 @@ namespace Gala {
19341946 continue ;
19351947 }
19361948
1937- if (! window. showing_on_its_workspace () || move_primary_only && ! window. is_on_primary_monitor ()) {
1949+ if (! window. showing_on_its_workspace () ||
1950+ move_primary_only && ! window. is_on_primary_monitor () ||
1951+ actor. get_parent () == shell_group
1952+ ) {
19381953 continue ;
19391954 }
19401955
@@ -2047,17 +2062,6 @@ namespace Gala {
20472062
20482063 prepare_workspace_switch (from, to, direction);
20492064
2050- // while a workspace is being switched mutter doesn't map windows
2051- // TODO: currently only notifications are handled here, other windows should be too
2052- switch_workspace_window_created_id = window_created. connect ((window) = > {
2053- if (NotificationStack . is_notification (window)) {
2054- InternalUtils . wait_for_window_actor_visible (window, (actor) = > {
2055- InternalUtils . clutter_actor_reparent (actor, notification_group);
2056- notification_stack. show_notification (actor);
2057- });
2058- }
2059- });
2060-
20612065 var animation_mode = Clutter . AnimationMode . EASE_OUT_CUBIC ;
20622066
20632067 var x2 = - in_group. x;
@@ -2129,11 +2133,8 @@ namespace Gala {
21292133 return ;
21302134 }
21312135
2132- if (switch_workspace_window_created_id > 0 ) {
2133- disconnect (switch_workspace_window_created_id);
2134- switch_workspace_window_created_id = 0 ;
2135- }
21362136 end_switch_workspace ();
2137+
21372138 if (! is_nudge_animation) {
21382139 switch_workspace_completed ();
21392140 }
@@ -2159,7 +2160,7 @@ namespace Gala {
21592160 }
21602161
21612162 private void end_switch_workspace () {
2162- if (windows == null || parents == null )
2163+ if (( windows == null || parents == null ) && tmp_actors == null )
21632164 return ;
21642165
21652166 unowned var display = get_display ();
0 commit comments