diff options
-rw-r--r-- | defaults/defaults | 2 | ||||
-rw-r--r-- | mcs-plugin/wmtweaks_plugin.c | 123 | ||||
-rw-r--r-- | src/client.c | 14 | ||||
-rw-r--r-- | src/events.c | 8 | ||||
-rw-r--r-- | src/settings.c | 59 | ||||
-rw-r--r-- | src/settings.h | 17 |
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; |