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