summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--defaults/defaults2
-rw-r--r--mcs-plugin/wmtweaks_plugin.c123
-rw-r--r--src/client.c14
-rw-r--r--src/events.c8
-rw-r--r--src/settings.c59
-rw-r--r--src/settings.h17
6 files changed, 177 insertions, 46 deletions
diff --git a/defaults/defaults b/defaults/defaults
index d5d9ccdb7..4737a9698 100644
--- a/defaults/defaults
+++ b/defaults/defaults
@@ -1,7 +1,7 @@
+activate_action=bring
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 25f408d3a..3cce70b2d 100644
--- a/mcs-plugin/wmtweaks_plugin.c
+++ b/mcs-plugin/wmtweaks_plugin.c
@@ -50,13 +50,19 @@
#define PLUGIN_NAME "wmtweaks"
#define BORDER 5
+typedef struct _ValuePair ValuePair;
+struct _ValuePair
+{
+ gchar *label;
+ gchar *value;
+};
+
static void xfwm4_create_channel (McsPlugin * mcs_plugin);
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;
@@ -83,9 +89,10 @@ static int popup_opacity = 100;
static int frame_opacity = 100;
static char *easy_click = "Alt";
+static char *activate_action = "bring";
/*
+ "Xfwm/ActivateAction"
"Xfwm/BorderlessMaximize"
- "Xfwm/BringOnActivate"
"Xfwm/CycleHidden"
"Xfwm/CycleMinimum"
"Xfwm/CycleWorkspaces"
@@ -176,6 +183,24 @@ cb_gint_changed (GtkWidget * widget, gpointer user_data)
}
static void
+cb_string_changed (GtkWidget * widget, gpointer user_data)
+{
+ gchar *value = (gchar *) user_data;
+ gchar *setting_name = NULL;
+ McsPlugin *mcs_plugin = NULL;
+
+ setting_name = (gchar *) g_object_get_data (G_OBJECT (widget), "setting-name");
+ mcs_plugin = (McsPlugin *) g_object_get_data (G_OBJECT (widget), "mcs-plugin");
+
+ g_assert (setting_name);
+ g_assert (mcs_plugin);
+
+ mcs_manager_set_string (mcs_plugin->manager, setting_name, CHANNEL, value);
+ mcs_manager_notify (mcs_plugin->manager, CHANNEL);
+ write_options (mcs_plugin);
+}
+
+static void
cb_menuitem_changed (GtkWidget * widget, gpointer user_data)
{
const gchar **value = user_data;
@@ -200,7 +225,7 @@ cb_menuitem_changed (GtkWidget * widget, gpointer user_data)
static GtkWidget *
create_gboolean_button (McsPlugin * mcs_plugin, const gchar * label, gchar * setting_name,
- gboolean * value)
+ gboolean * value)
{
GtkWidget *check_button;
GtkWidget *label_widget;
@@ -222,7 +247,7 @@ create_gboolean_button (McsPlugin * mcs_plugin, const gchar * label, gchar * set
static GtkWidget *
create_int_range (McsPlugin * mcs_plugin, gchar * label, const gchar * min_label, const gchar * max_label,
- gchar * setting_name, gint min, gint max, gint step, int *value)
+ gchar * setting_name, gint min, gint max, gint step, int *value)
{
GtkObject *adjustment;
GtkWidget *scale;
@@ -275,7 +300,7 @@ create_int_range (McsPlugin * mcs_plugin, gchar * label, const gchar * min_label
static GtkWidget *
create_option_menu (McsPlugin * mcs_plugin, const gchar *const values[],
- const gchar * label, gchar * setting_name, gchar ** value)
+ const gchar * label, gchar * setting_name, gchar ** value)
{
GtkWidget *hbox;
GtkWidget *label_widget;
@@ -296,13 +321,14 @@ create_option_menu (McsPlugin * mcs_plugin, const gchar *const values[],
gtk_box_pack_start (GTK_BOX (hbox), omenu, FALSE, TRUE, 2);
gtk_widget_show (omenu);
- for (n = 0; n < 12; n++)
+ n = 0;
+ while (values[n])
{
- gtk_combo_box_append_text (GTK_COMBO_BOX (omenu),
- (n == 11) ? gettext (values[n]) : values[n]);
+ gtk_combo_box_append_text (GTK_COMBO_BOX (omenu), gettext (values[n]));
if (!g_ascii_strcasecmp (*value, values[n]))
gtk_combo_box_set_active (GTK_COMBO_BOX (omenu), n);
+ n++;
}
g_object_set_data (G_OBJECT (omenu), "mcs-plugin", mcs_plugin);
@@ -313,6 +339,62 @@ create_option_menu (McsPlugin * mcs_plugin, const gchar *const values[],
return (hbox);
}
+static GtkWidget *
+create_string_radio_button (McsPlugin * mcs_plugin, const ValuePair const values[],
+ const gchar * label, gchar * setting_name, gchar ** value)
+{
+ GtkWidget *vbox1, *vbox2;
+ GtkWidget *frame;
+ GtkWidget *radio_button;
+ GtkWidget *label_widget;
+ GSList *group;
+ guint n;
+
+ vbox1 = gtk_vbox_new (FALSE, 0);
+ gtk_widget_show (vbox1);
+
+ label_widget = gtk_label_new (label);
+ gtk_label_set_justify (GTK_LABEL (label_widget), GTK_JUSTIFY_LEFT);
+ gtk_misc_set_alignment (GTK_MISC (label_widget), 0, 0.5);
+ gtk_label_set_line_wrap (GTK_LABEL (label_widget), TRUE);
+ gtk_box_pack_start (GTK_BOX (vbox1), label_widget, FALSE, TRUE, 2);
+ gtk_widget_show (label_widget);
+
+ vbox2 = gtk_vbox_new (FALSE, 0);
+ gtk_widget_show (vbox2);
+
+ frame = xfce_create_framebox_with_content (NULL, vbox2);
+ gtk_box_pack_start (GTK_BOX (vbox1), frame, FALSE, TRUE, 0);
+ gtk_widget_show (frame);
+
+ group = NULL;
+ n = 0;
+ while (values[n].label)
+ {
+ label_widget = gtk_label_new_with_mnemonic (values[n].label);
+ gtk_label_set_line_wrap (GTK_LABEL (label_widget), TRUE);
+ gtk_widget_show (label_widget);
+
+ radio_button = gtk_radio_button_new (group);
+ gtk_widget_show (radio_button);
+ group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_button));
+ gtk_container_add (GTK_CONTAINER (radio_button), label_widget);
+
+ if (!g_ascii_strcasecmp (*value, values[n].value))
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio_button), TRUE);
+
+ gtk_box_pack_start (GTK_BOX (vbox2), radio_button, FALSE, TRUE, 0);
+
+ g_object_set_data (G_OBJECT (radio_button), "setting-name", setting_name);
+ g_object_set_data (G_OBJECT (radio_button), "mcs-plugin", mcs_plugin);
+ g_signal_connect (G_OBJECT (radio_button), "toggled", G_CALLBACK (cb_string_changed), values[n].value);
+
+ n++;
+ }
+
+ return (vbox1);
+}
+
#ifdef HAVE_COMPOSITOR
static void
cb_compositor_changed (GtkWidget * widget, gpointer user_data)
@@ -356,6 +438,7 @@ create_dialog (McsPlugin * mcs_plugin)
GtkWidget *label;
GtkWidget *vbox;
GtkWidget *check_button;
+ GtkWidget *radio_buttons;
GtkWidget *option_menu;
GtkWidget *range;
GtkWidget *action_area;
@@ -374,7 +457,15 @@ create_dialog (McsPlugin * mcs_plugin)
"Mod3",
"Mod4",
"Mod5",
- N_("None")
+ N_("None"),
+ NULL
+ };
+
+ static const ValuePair activate_list[] = {
+ {N_("Bring window on current workspace"), "bring"},
+ {N_("Switch to window's workspace"), "switch"},
+ {N_("Do nothing"), "none"},
+ {NULL, NULL}
};
dialog = g_new (Itf, 1);
@@ -436,17 +527,17 @@ 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);
gtk_widget_show (check_button);
+ radio_buttons =
+ create_string_radio_button (mcs_plugin, activate_list, _("When a window raises itself:"),
+ "Xfwm/ActivateAction", &activate_action);
+ gtk_box_pack_start (GTK_BOX (vbox), radio_buttons, FALSE, TRUE, 0);
+ gtk_widget_show (radio_buttons);
+
label = gtk_label_new (_("Focus"));
gtk_widget_show (label);
gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook),
@@ -756,7 +847,6 @@ 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);
@@ -782,6 +872,7 @@ xfwm4_create_channel (McsPlugin * mcs_plugin)
init_int_setting (mcs_plugin, "Xfwm/ResizeOpacity", &resize_opacity);
init_int_setting (mcs_plugin, "Xfwm/PopupOpacity", &popup_opacity);
+ init_string_setting (mcs_plugin, "Xfwm/ActivateAction", &activate_action);
init_string_setting (mcs_plugin, "Xfwm/EasyClick", &easy_click);
}
diff --git a/src/client.c b/src/client.c
index d04cce7c9..314ac7b0f 100644
--- a/src/client.c
+++ b/src/client.c
@@ -2607,9 +2607,19 @@ clientActivate (Client * c, Time timestamp)
TRACE ("entering clientActivate \"%s\" (0x%lx)", c->name, c->window);
screen_info = c->screen_info;
- if ((screen_info->current_ws == c->win_workspace) || (screen_info->params->bring_on_activate))
+ if ((screen_info->current_ws == c->win_workspace) || (screen_info->params->activate_action != ACTIVATE_ACTION_NONE))
{
- clientSetWorkspace (c, screen_info->current_ws, TRUE);
+ if (screen_info->current_ws != c->win_workspace)
+ {
+ if (screen_info->params->activate_action == ACTIVATE_ACTION_BRING)
+ {
+ clientSetWorkspace (c, screen_info->current_ws, TRUE);
+ }
+ else
+ {
+ workspaceSwitch (screen_info, c->win_workspace, NULL, FALSE, timestamp);
+ }
+ }
clientShow (c, TRUE);
clientClearAllShowDesktop (screen_info);
clientSetFocus (screen_info, c, timestamp, NO_FOCUS_FLAG);
diff --git a/src/events.c b/src/events.c
index 5af70a7dc..5b34e66fc 100644
--- a/src/events.c
+++ b/src/events.c
@@ -684,13 +684,13 @@ button1Action (Client * c, XButtonEvent * ev)
{
switch (screen_info->params->double_click_action)
{
- case ACTION_MAXIMIZE:
+ case DBL_CLICK_ACTION_MAXIMIZE:
clientToggleMaximized (c, WIN_STATE_MAXIMIZED, TRUE);
break;
- case ACTION_SHADE:
+ case DBL_CLICK_ACTION_SHADE:
clientToggleShaded (c);
break;
- case ACTION_HIDE:
+ case DBL_CLICK_ACTION_HIDE:
if (CLIENT_CAN_HIDE_WINDOW (c))
{
clientHide (c, c->win_workspace, TRUE);
@@ -1400,7 +1400,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) && !(screen_info->params->bring_on_activate))
+ if ((screen_info->params->prevent_focus_stealing) && (screen_info->params->activate_action == ACTIVATE_ACTION_NONE))
{
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 f75a24f9d..3eb89f707 100644
--- a/src/settings.c
+++ b/src/settings.c
@@ -157,6 +157,26 @@ set_easy_click (ScreenInfo *screen_info, char *modifier)
}
static void
+set_activate_action (ScreenInfo *screen_info, const char *value)
+{
+ g_return_if_fail (screen_info != NULL);
+ g_return_if_fail (value != NULL);
+
+ if (!g_ascii_strcasecmp ("bring", value))
+ {
+ screen_info->params->activate_action = ACTIVATE_ACTION_BRING;
+ }
+ else if (!g_ascii_strcasecmp ("switch", value))
+ {
+ screen_info->params->activate_action = ACTIVATE_ACTION_SWITCH;
+ }
+ else
+ {
+ screen_info->params->activate_action = ACTIVATE_ACTION_NONE;
+ }
+}
+
+static void
notify_cb (const char *name, const char *channel_name, McsAction action, McsSetting * setting, void *data)
{
ScreenInfo *screen_info;
@@ -368,10 +388,6 @@ 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;
@@ -482,6 +498,10 @@ notify_cb (const char *name, const char *channel_name, McsAction action, McsSett
{
reloadScreenSettings (screen_info, UPDATE_BUTTON_GRABS);
}
+ else if (!strcmp (name, "Xfwm/ActivateAction"))
+ {
+ set_activate_action (screen_info, setting->data.v_string);
+ }
}
break;
case MCS_ACTION_DELETED:
@@ -739,16 +759,16 @@ loadMcsData (ScreenInfo *screen_info, Settings *rc)
}
/* Tweaks channel */
- if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/BorderlessMaximize", CHANNEL5,
+ if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/ActivateAction", CHANNEL5,
&setting) == MCS_SUCCESS)
{
- setBooleanValueFromInt ("borderless_maximize", setting->data.v_int, rc);
+ setValue ("activate_action", setting->data.v_string, rc);
mcs_setting_free (setting);
}
- if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/BringOnActivate", CHANNEL5,
+ if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/BorderlessMaximize", CHANNEL5,
&setting) == MCS_SUCCESS)
{
- setBooleanValueFromInt ("bring_on_activate", setting->data.v_int, rc);
+ setBooleanValueFromInt ("borderless_maximize", setting->data.v_int, rc);
mcs_setting_free (setting);
}
if (mcs_client_get_setting (screen_info->mcs_client, "Xfwm/CycleMinimum", CHANNEL5,
@@ -1296,6 +1316,7 @@ loadKeyBindings (ScreenInfo *screen_info, Settings *rc)
gboolean
loadSettings (ScreenInfo *screen_info)
{
+ const gchar *value;
Settings rc[] = {
/* Do not change the order of the following parameters */
{"active_text_color", NULL, FALSE},
@@ -1321,10 +1342,10 @@ loadSettings (ScreenInfo *screen_info)
{"inactive_shadow_2", NULL, FALSE},
{"inactive_mid_2", NULL, FALSE},
/* You can change the order of the following parameters */
+ {"activate_action", NULL, TRUE},
{"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},
@@ -1469,8 +1490,6 @@ 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 =
@@ -1532,22 +1551,26 @@ loadSettings (ScreenInfo *screen_info)
set_settings_margin (screen_info, STRUTS_TOP, TOINT (getValue ("margin_top", rc)));
set_easy_click (screen_info, getValue ("easy_click", rc));
+
+ value = getValue ("activate_action", rc);
+ set_activate_action (screen_info, value);
- if (!g_ascii_strcasecmp ("shade", getValue ("double_click_action", rc)))
+ value = getValue ("double_click_action", rc);
+ if (!g_ascii_strcasecmp ("shade", value))
{
- screen_info->params->double_click_action = ACTION_SHADE;
+ screen_info->params->double_click_action = DBL_CLICK_ACTION_SHADE;
}
- else if (!g_ascii_strcasecmp ("hide", getValue ("double_click_action", rc)))
+ else if (!g_ascii_strcasecmp ("hide", value))
{
- screen_info->params->double_click_action = ACTION_HIDE;
+ screen_info->params->double_click_action = DBL_CLICK_ACTION_HIDE;
}
- else if (!g_ascii_strcasecmp ("maximize", getValue ("double_click_action", rc)))
+ else if (!g_ascii_strcasecmp ("maximize", value))
{
- screen_info->params->double_click_action = ACTION_MAXIMIZE;
+ screen_info->params->double_click_action = DBL_CLICK_ACTION_MAXIMIZE;
}
else
{
- screen_info->params->double_click_action = ACTION_NONE;
+ screen_info->params->double_click_action = DBL_CLICK_ACTION_NONE;
}
if (screen_info->workspace_count < 0)
diff --git a/src/settings.h b/src/settings.h
index 3ce6ea0de..1a2479885 100644
--- a/src/settings.h
+++ b/src/settings.h
@@ -147,10 +147,17 @@ enum
enum
{
- ACTION_NONE,
- ACTION_MAXIMIZE,
- ACTION_SHADE,
- ACTION_HIDE
+ ACTIVATE_ACTION_NONE,
+ ACTIVATE_ACTION_BRING,
+ ACTIVATE_ACTION_SWITCH
+};
+
+enum
+{
+ DBL_CLICK_ACTION_NONE,
+ DBL_CLICK_ACTION_MAXIMIZE,
+ DBL_CLICK_ACTION_SHADE,
+ DBL_CLICK_ACTION_HIDE
};
struct _XfwmColor
@@ -172,6 +179,7 @@ struct _XfwmParams
MyKey keys[KEY_COUNT];
gchar button_layout[BUTTON_COUNT + 1];
unsigned int xfwm_margins[4];
+ int activate_action;
int button_offset;
int button_spacing;
int double_click_action;
@@ -198,7 +206,6 @@ 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;