summaryrefslogtreecommitdiffstats
path: root/Apply-new_windows_always_on_top-to-newly-raised-acti.patch
blob: 7df74fb7fbf37638bb1874215e333b0f1f01739f (plain)
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
From c093802679a2232a115da35e8d3a3cfefef0e6dd Mon Sep 17 00:00:00 2001
From: Owen W. Taylor <otaylor@fishsoup.net>
Date: Wed, 23 Jun 2010 19:45:05 -0400
Subject: [PATCH 2/2] Apply new_windows_always_on_top to newly raised/activated windows

A window that raises itself or activates itself is in many ways
like a completely new window. (Once a window is out of the user's
site, they really have no idea if it's mapped or has been withdrawn
by the user.)

If the user has set the new_windows_always_on_top key to make the
behavior for a focus-stealing-prevented *new* window "raise but not
focus", then they'll want the same behavior in the case of
windows that attempt to raise or activate themselves as well.

https://bugzilla.gnome.org/show_bug.cgi?id=599261
---
 src/core/window.c          |   35 +++++++++++++++++++++++++++++++----
 src/metacity.schemas.in.in |    6 ++++++
 2 files changed, 37 insertions(+), 4 deletions(-)

diff --git a/src/core/window.c b/src/core/window.c
index 399bb42..c51cdec 100644
--- a/src/core/window.c
+++ b/src/core/window.c
@@ -3000,6 +3000,8 @@ window_activate (MetaWindow     *window,
                  MetaWorkspace  *workspace)
 {
   gboolean can_ignore_outdated_timestamps;
+  gboolean only_raise = FALSE;
+
   meta_topic (META_DEBUG_FOCUS,
               "_NET_ACTIVE_WINDOW message sent for %s at time %u "
               "by client type %u.\n",
@@ -3021,8 +3023,28 @@ window_activate (MetaWindow     *window,
                   "last_user_time (%u) is more recent; ignoring "
                   " _NET_ACTIVE_WINDOW message.\n",
                   window->display->last_user_time);
-      meta_window_set_demands_attention(window);
-      return;
+      if (meta_prefs_get_new_windows_always_on_top () &&
+          meta_prefs_get_raise_on_click ())
+        {
+          /* The new_windows_only_on_top preference causes new
+           * focus-denied windows to get raised but not focused
+           * instead of set to demands attention. For consistency, we
+           * do the same here with windows that are "new to the user"
+           * - that self activate and are focus-stealing prevented. We
+           * can't just raise the window and return here because the
+           * window might be on a different workspace, so we need the
+           * handling below. The check for meta_prefs_get_raise_on_click ()
+           * is because that preference, if off, somewhat unexpectedl
+           * akes windows not raise on self-activation.  If that is changed
+           * than the test should be removed here.
+           */
+          only_raise = TRUE;
+        }
+      else
+        {
+          meta_window_set_demands_attention (window);
+          return;
+        }
     }
 
   /* For those stupid pagers, get a valid timestamp and show a warning */  
@@ -3071,7 +3093,8 @@ window_activate (MetaWindow     *window,
   meta_topic (META_DEBUG_FOCUS,
               "Focusing window %s due to activation\n",
               window->desc);
-  meta_window_focus (window, timestamp);
+  if (!only_raise)
+    meta_window_focus (window, timestamp);
 }
 
 /* This function exists since most of the functionality in window_activate
@@ -4796,11 +4819,15 @@ meta_window_configure_request (MetaWindow *window,
                       "broken behavior and the request is being ignored.\n",
                       window->desc);
         }
+      /* the new_windows_always_on_top check is because a window that
+       * spontaneously restacks itself to the top is a lot like a new
+       * window that doesn't get focus */
       else if (active_window &&
                !meta_window_same_application (window, active_window) &&
                !meta_window_same_client (window, active_window) &&
                XSERVER_TIME_IS_BEFORE (window->net_wm_user_time,
-                                       active_window->net_wm_user_time))
+                                       active_window->net_wm_user_time) &&
+               !meta_prefs_get_new_windows_always_on_top ())
         {
           meta_topic (META_DEBUG_STACK,
                       "Ignoring xconfigure stacking request from %s (with "
diff --git a/src/metacity.schemas.in.in b/src/metacity.schemas.in.in
index e0dec3d..b8257c4 100644
--- a/src/metacity.schemas.in.in
+++ b/src/metacity.schemas.in.in
@@ -193,6 +193,12 @@
 	   invariant in the 'click' focus mode that the topmost window always
 	   has focus, so its most suitable for use with the 'mouse' and
 	   'sloppy' focus modes.
+
+	   This key also affects windows that try to activate or raise themselves
+	   themselves but don't succeed in getting the the focus. Without
+	   this key being set, such windows are flashed in the taskbar. With
+	   this key set they, like entirely new windows, are raised but not
+	   focused.
          </long>
       </locale>
     </schema>
-- 
1.7.0.1