From 2d5e6a2eb58a0dad2daa2ada4865b1c3dddd81ea Mon Sep 17 00:00:00 2001
From: Olivier Fourdan <fourdan.olivier@wanadoo.fr>
Date: Sat, 3 Mar 2007 21:36:01 +0000
Subject: [PATCH] Add new wm tweak option to instruct xfwm4 not to bring window
 back on current workspace when activated (bug #2961)

(Old svn revision: 25082)
---
 defaults/defaults            |  1 +
 mcs-plugin/wmtweaks_plugin.c |  9 +++++++++
 src/client.c                 | 19 ++++++++++++++-----
 src/events.c                 |  2 +-
 src/settings.c               | 13 +++++++++++++
 src/settings.h               |  1 +
 6 files changed, 39 insertions(+), 6 deletions(-)

diff --git a/defaults/defaults b/defaults/defaults
index 6fa5ed70c..d5d9ccdb7 100644
--- a/defaults/defaults
+++ b/defaults/defaults
@@ -1,6 +1,7 @@
 borderless_maximize=true
 box_move=false
 box_resize=false
+bring_on_activate=true
 button_layout=OT|SHMC
 button_offset=0
 button_spacing=0
diff --git a/mcs-plugin/wmtweaks_plugin.c b/mcs-plugin/wmtweaks_plugin.c
index 2f6bfe63d..afdacd515 100644
--- a/mcs-plugin/wmtweaks_plugin.c
+++ b/mcs-plugin/wmtweaks_plugin.c
@@ -56,6 +56,7 @@ static void run_dialog (McsPlugin * mcs_plugin);
 static gboolean is_running = FALSE;
 
 static gboolean borderless_maximize = TRUE;
+static gboolean bring_on_activate = TRUE;
 static gboolean cycle_minimum = TRUE;
 static gboolean cycle_hidden = TRUE;
 static gboolean cycle_workspaces = FALSE;
@@ -84,6 +85,7 @@ static int frame_opacity = 100;
 static char *easy_click = "Alt";
 /* 
     "Xfwm/BorderlessMaximize"
+    "Xfwm/BringOnActivate"
     "Xfwm/CycleHidden"
     "Xfwm/CycleMinimum"
     "Xfwm/CycleWorkspaces"
@@ -433,6 +435,12 @@ create_dialog (McsPlugin * mcs_plugin)
     gtk_box_pack_start (GTK_BOX (vbox), check_button, FALSE, TRUE, 0);
     gtk_widget_show (check_button);
 
+    check_button =
+        create_gboolean_button (mcs_plugin, _("Bring window back on current workspace when activated"),
+        "Xfwm/BringOnActivate", &bring_on_activate);
+    gtk_box_pack_start (GTK_BOX (vbox), check_button, FALSE, TRUE, 0);
+    gtk_widget_show (check_button);
+
     check_button =
         create_gboolean_button (mcs_plugin, _("Honor the standard ICCCM focus hint"),
         "Xfwm/FocusHint", &focus_hint);
@@ -748,6 +756,7 @@ xfwm4_create_channel (McsPlugin * mcs_plugin)
     g_free (rcfile);
 
     init_gboolean_setting (mcs_plugin, "Xfwm/BorderlessMaximize", &borderless_maximize);
+    init_gboolean_setting (mcs_plugin, "Xfwm/BringOnActivate", &bring_on_activate);
     init_gboolean_setting (mcs_plugin, "Xfwm/CycleMinimum", &cycle_minimum);
     init_gboolean_setting (mcs_plugin, "Xfwm/CycleHidden", &cycle_hidden);
     init_gboolean_setting (mcs_plugin, "Xfwm/CycleWorkspaces", &cycle_workspaces);
diff --git a/src/client.c b/src/client.c
index 688ccfbac..fc347a9d6 100644
--- a/src/client.c
+++ b/src/client.c
@@ -2582,11 +2582,20 @@ clientActivate (Client * c, Time timestamp)
     TRACE ("entering clientActivate \"%s\" (0x%lx)", c->name, c->window);
 
     screen_info = c->screen_info;
-    clientSetWorkspace (c, screen_info->current_ws, TRUE);
-    clientShow (c, TRUE);
-    clientClearAllShowDesktop (screen_info);
-    clientSetFocus (screen_info, c, timestamp, NO_FOCUS_FLAG);
-    clientRaise (c, None);
+    if ((screen_info->current_ws == c->win_workspace) || (screen_info->params->bring_on_activate))
+    {
+        clientSetWorkspace (c, screen_info->current_ws, TRUE);
+        clientShow (c, TRUE);
+        clientClearAllShowDesktop (screen_info);
+        clientSetFocus (screen_info, c, timestamp, NO_FOCUS_FLAG);
+        clientRaise (c, None);
+    }
+    else
+    {
+        TRACE ("Setting WM_STATE_DEMANDS_ATTENTION flag on \"%s\" (0x%lx)", c->name, c->window); 
+        FLAG_SET (c->flags, CLIENT_FLAG_DEMANDS_ATTENTION);
+        clientSetNetState (c);
+    }
 }
 
 void
diff --git a/src/events.c b/src/events.c
index f0b2d7b1d..3368b7d7b 100644
--- a/src/events.c
+++ b/src/events.c
@@ -1444,7 +1444,7 @@ handleConfigureRequest (DisplayInfo *display_info, XConfigureRequestEvent * ev)
             last_raised = clientGetLastRaise (screen_info);
             if (last_raised && (c != last_raised))
             {
-                if (screen_info->params->prevent_focus_stealing)
+                if ((screen_info->params->prevent_focus_stealing) && !(screen_info->params->bring_on_activate))
                 {
                     ev->value_mask &= ~(CWSibling | CWStackMode);
                     TRACE ("Setting WM_STATE_DEMANDS_ATTENTION flag on \"%s\" (0x%lx)", c->name, c->window); 
diff --git a/src/settings.c b/src/settings.c
index aa273ef54..c0a210813 100644
--- a/src/settings.c
+++ b/src/settings.c
@@ -364,6 +364,10 @@ notify_cb (const char *name, const char *channel_name, McsAction action, McsSett
                         screen_info->params->borderless_maximize = setting->data.v_int;
                         reloadScreenSettings (screen_info, UPDATE_MAXIMIZE);
                     }
+                    else if (!strcmp (name, "Xfwm/BringOnActivate"))
+                    {
+                        screen_info->params->bring_on_activate = setting->data.v_int;
+                    }
                     else if (!strcmp (name, "Xfwm/CycleMinimum"))
                     {
                         screen_info->params->cycle_minimum = setting->data.v_int;
@@ -731,6 +735,12 @@ loadMcsData (ScreenInfo *screen_info, Settings *rc)
             setBooleanValueFromInt ("borderless_maximize", setting->data.v_int, rc);
             mcs_setting_free (setting);
         }
+        if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/BringOnActivate", CHANNEL5,
+                &setting) == MCS_SUCCESS)
+        {
+            setBooleanValueFromInt ("bring_on_activate", setting->data.v_int, rc);
+            mcs_setting_free (setting);
+        }
         if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/CycleMinimum", CHANNEL5,
                 &setting) == MCS_SUCCESS)
         {
@@ -1304,6 +1314,7 @@ loadSettings (ScreenInfo *screen_info)
         {"borderless_maximize", NULL, TRUE},
         {"box_move", NULL, TRUE},
         {"box_resize", NULL, TRUE},
+        {"bring_on_activate", NULL, TRUE},
         {"button_layout", NULL, TRUE},
         {"button_offset", NULL, TRUE},
         {"button_spacing", NULL, TRUE},
@@ -1447,6 +1458,8 @@ loadSettings (ScreenInfo *screen_info)
         !g_ascii_strcasecmp ("true", getValue ("box_resize", rc));
     screen_info->params->box_move =
         !g_ascii_strcasecmp ("true", getValue ("box_move", rc));
+    screen_info->params->bring_on_activate =
+        !g_ascii_strcasecmp ("true", getValue ("bring_on_activate", rc));
     screen_info->params->click_to_focus =
         !g_ascii_strcasecmp ("true", getValue ("click_to_focus", rc));
     screen_info->params->cycle_minimum =
diff --git a/src/settings.h b/src/settings.h
index 5ea15296a..357c87358 100644
--- a/src/settings.h
+++ b/src/settings.h
@@ -197,6 +197,7 @@ struct _XfwmParams
     gboolean borderless_maximize;
     gboolean box_move;
     gboolean box_resize;
+    gboolean bring_on_activate;
     gboolean click_to_focus;
     gboolean cycle_hidden;
     gboolean cycle_minimum;
-- 
GitLab