[Xfce4-commits] r25352 - in xfwm4/trunk: defaults mcs-plugin src

Olivier Fourdan olivier at xfce.org
Sun Apr 1 16:22:19 CEST 2007


Author: olivier
Date: 2007-04-01 14:22:19 +0000 (Sun, 01 Apr 2007)
New Revision: 25352

Modified:
   xfwm4/trunk/defaults/defaults
   xfwm4/trunk/mcs-plugin/wmtweaks_plugin.c
   xfwm4/trunk/src/client.c
   xfwm4/trunk/src/events.c
   xfwm4/trunk/src/settings.c
   xfwm4/trunk/src/settings.h
Log:
Implement a better (usability) fix for windows that raise themselves (Bug #2961)

Modified: xfwm4/trunk/defaults/defaults
===================================================================
--- xfwm4/trunk/defaults/defaults	2007-04-01 09:15:29 UTC (rev 25351)
+++ xfwm4/trunk/defaults/defaults	2007-04-01 14:22:19 UTC (rev 25352)
@@ -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

Modified: xfwm4/trunk/mcs-plugin/wmtweaks_plugin.c
===================================================================
--- xfwm4/trunk/mcs-plugin/wmtweaks_plugin.c	2007-04-01 09:15:29 UTC (rev 25351)
+++ xfwm4/trunk/mcs-plugin/wmtweaks_plugin.c	2007-04-01 14:22:19 UTC (rev 25352)
@@ -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 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 @@
 }
 
 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 @@
 
 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 @@
 
 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 @@
 
 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 @@
     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 @@
     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 @@
     GtkWidget *label;
     GtkWidget *vbox;
     GtkWidget *check_button;
+    GtkWidget *radio_buttons;
     GtkWidget *option_menu;
     GtkWidget *range;
     GtkWidget *action_area;
@@ -374,9 +457,17 @@
         "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);
 
     dialog->mcs_plugin = mcs_plugin;
@@ -436,17 +527,17 @@
     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 @@
     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 @@
     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);
 }
 

Modified: xfwm4/trunk/src/client.c
===================================================================
--- xfwm4/trunk/src/client.c	2007-04-01 09:15:29 UTC (rev 25351)
+++ xfwm4/trunk/src/client.c	2007-04-01 14:22:19 UTC (rev 25352)
@@ -2607,9 +2607,19 @@
     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);

Modified: xfwm4/trunk/src/events.c
===================================================================
--- xfwm4/trunk/src/events.c	2007-04-01 09:15:29 UTC (rev 25351)
+++ xfwm4/trunk/src/events.c	2007-04-01 14:22:19 UTC (rev 25352)
@@ -684,13 +684,13 @@
     {
         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 @@
             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); 

Modified: xfwm4/trunk/src/settings.c
===================================================================
--- xfwm4/trunk/src/settings.c	2007-04-01 09:15:29 UTC (rev 25351)
+++ xfwm4/trunk/src/settings.c	2007-04-01 14:22:19 UTC (rev 25352)
@@ -157,6 +157,26 @@
 }
 
 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 @@
                         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 @@
                     {
                         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 @@
         }
 
         /* 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 @@
 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 @@
         {"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 @@
         !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 @@
     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)

Modified: xfwm4/trunk/src/settings.h
===================================================================
--- xfwm4/trunk/src/settings.h	2007-04-01 09:15:29 UTC (rev 25351)
+++ xfwm4/trunk/src/settings.h	2007-04-01 14:22:19 UTC (rev 25352)
@@ -147,12 +147,19 @@
 
 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
 {
     GdkColor col;
@@ -172,6 +179,7 @@
     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 @@
     gboolean borderless_maximize;
     gboolean box_move;
     gboolean box_resize;
-    gboolean bring_on_activate;
     gboolean click_to_focus;
     gboolean cycle_hidden;
     gboolean cycle_minimum;



More information about the Xfce4-commits mailing list