From c4fba8198bacc8ecf911cb15c9cd9314f3204a85 Mon Sep 17 00:00:00 2001
From: Owen W. Taylor <otaylor@fishsoup.net>
Date: Wed, 21 Oct 2009 19:22:35 -0400
Subject: [PATCH] Add a new_windows_always_on_top preference

Add a /apps/metacity/general/new_windows_always_on_top preference.
When set, new windows are always placed on top, even if they are
denied focus.

This is useful on large screens and multihead setups where the
tasklist can be hard to notice and difficult to mouse to, so the
normal behavior of flashing in the tasklist is less effective.

Index: metacity-2.28.1/src/core/prefs.c
===================================================================
--- metacity-2.28.1.orig/src/core/prefs.c
+++ metacity-2.28.1/src/core/prefs.c
@@ -79,6 +79,7 @@ static MetaVirtualModifier mouse_button_
 static MetaFocusMode focus_mode = META_FOCUS_MODE_CLICK;
 static MetaFocusNewWindows focus_new_windows = META_FOCUS_NEW_WINDOWS_SMART;
 static gboolean raise_on_click = TRUE;
+static gboolean new_windows_always_on_top = TRUE;
 static char* current_theme = NULL;
 static int num_workspaces = 4;
 static MetaActionTitlebar action_double_click_titlebar = META_ACTION_TITLEBAR_TOGGLE_MAXIMIZE;
@@ -357,6 +358,11 @@ static MetaBoolPreference preferences_bo
       &raise_on_click,
       TRUE,
     },
+    { "/apps/metacity/general/new_windows_always_on_top",
+      META_PREF_NEW_WINDOWS_ALWAYS_ON_TOP,
+      &new_windows_always_on_top,
+      TRUE,
+    },
     { "/apps/metacity/general/titlebar_uses_system_font",
       META_PREF_TITLEBAR_FONT, /* note! shares a pref */
       &use_system_font,
@@ -1265,6 +1271,12 @@ meta_prefs_get_raise_on_click (void)
   return raise_on_click || focus_mode == META_FOCUS_MODE_CLICK;
 }
 
+gboolean
+meta_prefs_get_new_windows_always_on_top (void)
+{
+  return new_windows_always_on_top;
+}
+
 const char*
 meta_prefs_get_theme (void)
 {
@@ -1680,6 +1692,9 @@ meta_preference_to_string (MetaPreferenc
     case META_PREF_RAISE_ON_CLICK:
       return "RAISE_ON_CLICK";
       
+    case META_PREF_NEW_WINDOWS_ALWAYS_ON_TOP:
+      return "NEW_WINDOWS_ALWAYS_ON_TOP";
+
     case META_PREF_THEME:
       return "THEME";
 
Index: metacity-2.28.1/src/metacity.schemas.in.in
===================================================================
--- metacity-2.28.1.orig/src/metacity.schemas.in.in
+++ metacity-2.28.1/src/metacity.schemas.in.in
@@ -138,6 +138,35 @@
     </schema>
 
     <schema>
+      <key>/schemas/apps/metacity/general/new_windows_always_on_top</key>
+      <applyto>/apps/metacity/general/new_windows_always_on_top</applyto>
+      <owner>metacity</owner>
+      <type>bool</type>
+      <default>false</default>
+      <locale name="C">
+         <short>Whether new windows should always be placed on top</short>
+         <long>
+           The normal behavior is that if a new window is not given the
+      focus (since, for example, the user has interacted with another
+      window after launching an application), then if the window would
+      be stacked on top of the focus window, the window is instead
+      stacked beneath and flashed in the taskbar. This behavior can
+      be annoying on large screens and multihead setups where the
+      taskbar is hard to notice and difficult to get to, so this option,
+      if set, disables this behavior, and new windows are always placed
+      on top, whether or not they get focus.
+
+           Note that if this option is set, a new window may completely hide
+      the focus window but not get focus itself, which can be quite confusing
+      to users. Also, note that setting this option breaks the normal
+      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.
+         </long>
+      </locale>
+    </schema>
+
+    <schema>
       <key>/schemas/apps/metacity/general/action_double_click_titlebar</key>
       <applyto>/apps/metacity/general/action_double_click_titlebar</applyto>
       <owner>metacity</owner>
Index: metacity-2.28.1/src/core/window.c
===================================================================
--- metacity-2.28.1.orig/src/core/window.c
+++ metacity-2.28.1/src/core/window.c
@@ -1976,7 +1976,7 @@ window_state_on_map (MetaWindow *window,
   if (!(window->input || window->take_focus))
     {
       *takes_focus = FALSE;
-      return;
+      goto out;
     }
 
   /* Terminal usage may be different; some users intend to launch
@@ -2023,6 +2023,10 @@ window_state_on_map (MetaWindow *window,
       /* The default is correct for these */
       break;
     }
+
+ out:
+  if (meta_prefs_get_new_windows_always_on_top ())
+    *places_on_top = TRUE;
 }
 
 static gboolean
Index: metacity-2.28.1/src/include/prefs.h
===================================================================
--- metacity-2.28.1.orig/src/include/prefs.h
+++ metacity-2.28.1/src/include/prefs.h
@@ -35,6 +35,7 @@ typedef enum
   META_PREF_FOCUS_MODE,
   META_PREF_FOCUS_NEW_WINDOWS,
   META_PREF_RAISE_ON_CLICK,
+  META_PREF_NEW_WINDOWS_ALWAYS_ON_TOP,
   META_PREF_ACTION_DOUBLE_CLICK_TITLEBAR,
   META_PREF_ACTION_MIDDLE_CLICK_TITLEBAR,
   META_PREF_ACTION_RIGHT_CLICK_TITLEBAR,
@@ -80,6 +81,7 @@ guint                       meta_prefs_g
 MetaFocusMode               meta_prefs_get_focus_mode         (void);
 MetaFocusNewWindows         meta_prefs_get_focus_new_windows  (void);
 gboolean                    meta_prefs_get_raise_on_click     (void);
+gboolean                    meta_prefs_get_new_windows_always_on_top (void);
 const char*                 meta_prefs_get_theme              (void);
 /* returns NULL if GTK default should be used */
 const PangoFontDescription* meta_prefs_get_titlebar_font      (void);
