Package: metacity / 1:2.34.3-4

01_focus_new_window.patch Patch series | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
Debian #515577
GNOME #534752

--- a/src/core/window.c
+++ b/src/core/window.c
@@ -2045,6 +2045,10 @@
 windows_overlap (const MetaWindow *w1, const MetaWindow *w2)
 {
   MetaRectangle w1rect, w2rect;
+
+  if (w1->minimized || w2->minimized)
+    return FALSE;
+
   meta_window_get_outer_rect (w1, &w1rect);
   meta_window_get_outer_rect (w2, &w2rect);
   return meta_rectangle_overlap (&w1rect, &w2rect);
@@ -2099,6 +2103,7 @@
   gboolean takes_focus_on_map;
   gboolean place_on_top_on_map;
   gboolean needs_stacking_adjustment;
+  gboolean will_be_covered;
   MetaWindow *focus_window;
   guint32     timestamp;
 
@@ -2116,6 +2121,7 @@
   did_show = FALSE;
   window_state_on_map (window, &takes_focus_on_map, &place_on_top_on_map);
   needs_stacking_adjustment = FALSE;
+  will_be_covered = window_would_be_covered (window);
 
   meta_topic (META_DEBUG_WINDOW_STATE,
               "Window %s %s focus on map, and %s place on top on map.\n",
@@ -2136,7 +2142,7 @@
 
   if ( focus_window != NULL && window->showing_for_first_time &&
       ( (!place_on_top_on_map && !takes_focus_on_map) ||
-      window_would_be_covered (window) )
+      will_be_covered )
     ) {
       if (meta_window_is_ancestor_of_transient (focus_window, window))
         {
@@ -2220,21 +2226,21 @@
        * in the stack when it doesn't overlap it confusingly places
        * that new window below a lot of other windows.
        */
-      if (overlap || 
+      if (!will_be_covered && (overlap || 
           (meta_prefs_get_focus_mode () == G_DESKTOP_FOCUS_MODE_CLICK &&
-           meta_prefs_get_raise_on_click ()))
+           meta_prefs_get_raise_on_click ())))
         meta_window_stack_just_below (window, focus_window);
 
-      /* If the window will be obscured by the focus window, then the
-       * user might not notice the window appearing so set the
-       * demands attention hint.
+      /* If the window will be obscured by the focus window or a window set to
+       * always on top, then the user might not notice the window appearing so 
+       * set the demands attention hint.
        *
        * We set the hint ourselves rather than calling 
        * meta_window_set_demands_attention() because that would cause
        * a recalculation of overlap, and a call to set_net_wm_state()
        * which we are going to call ourselves here a few lines down.
        */
-      if (overlap)
+      if (overlap || will_be_covered)
         window->wm_state_demands_attention = TRUE;
     }