summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--defaults/defaults1
-rw-r--r--mcs-plugin/wmtweaks_plugin.c9
-rw-r--r--src/client.c19
-rw-r--r--src/events.c2
-rw-r--r--src/settings.c13
-rw-r--r--src/settings.h1
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"
@@ -434,6 +436,12 @@ create_dialog (McsPlugin * mcs_plugin)
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);
gtk_box_pack_start (GTK_BOX (vbox), check_button, FALSE, TRUE, 0);
@@ -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;