diff options
Diffstat (limited to 'capplets/windows/mate-window-properties.c')
-rw-r--r-- | capplets/windows/mate-window-properties.c | 895 |
1 files changed, 357 insertions, 538 deletions
diff --git a/capplets/windows/mate-window-properties.c b/capplets/windows/mate-window-properties.c index d51895b7..b2697bd6 100644 --- a/capplets/windows/mate-window-properties.c +++ b/capplets/windows/mate-window-properties.c @@ -6,6 +6,7 @@ * * Written by: Seth Nickell <[email protected]> * Havoc Pennington <[email protected]> + * Stefano Karapetsas <[email protected]> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -30,7 +31,6 @@ #include <stdlib.h> #include <glib/gi18n.h> #include <string.h> -#include <mate-wm-manager.h> #include <gdk/gdkx.h> @@ -38,18 +38,50 @@ #include "wm-common.h" #include "capplet-util.h" +#define MARCO_SCHEMA "org.mate.Marco.general" +#define MARCO_THEME_KEY "theme" +#define MARCO_FONT_KEY "titlebar-font" +#define MARCO_FOCUS_KEY "focus-mode" +#define MARCO_USE_SYSTEM_FONT_KEY "titlebar-uses-system-font" +#define MARCO_AUTORAISE_KEY "auto-raise" +#define MARCO_AUTORAISE_DELAY_KEY "auto-raise-delay" +#define MARCO_MOUSE_MODIFIER_KEY "mouse-button-modifier" +#define MARCO_DOUBLE_CLICK_TITLEBAR_KEY "action-double-click-titlebar" +#define MARCO_COMPOSITING_MANAGER_KEY "compositing-manager" +#define MARCO_COMPOSITING_FAST_ALT_TAB_KEY "compositing-fast-alt-tab" +#define MARCO_SIDE_BY_SIDE_TILING_KEY "side-by-side-tiling" + +/* keep following enums in sync with marco */ +enum +{ + ACTION_TITLEBAR_TOGGLE_SHADE, + ACTION_TITLEBAR_TOGGLE_MAXIMIZE, + ACTION_TITLEBAR_TOGGLE_MAXIMIZE_HORIZONTALLY, + ACTION_TITLEBAR_TOGGLE_MAXIMIZE_VERTICALLY, + ACTION_TITLEBAR_MINIMIZE, + ACTION_TITLEBAR_NONE, + ACTION_TITLEBAR_LOWER, + ACTION_TITLEBAR_MENU +}; +enum +{ + FOCUS_MODE_CLICK, + FOCUS_MODE_SLOPPY, + FOCUS_MODE_MOUSE +}; + typedef struct { - int number; - char *name; - const char *value; /* machine-readable name for storing config */ - GtkWidget *radio; + int number; + char *name; + const char *value; /* machine-readable name for storing config */ + GtkWidget *radio; } MouseClickModifier; -static MateWindowManager *current_wm; /* may be NULL */ static GtkWidget *dialog_win; static GObject *compositing_checkbutton; static GObject *compositing_fast_alt_tab_checkbutton; +static GObject *side_by_side_tiling_checkbutton; static GObject *focus_mode_checkbutton; static GObject *autoraise_checkbutton; static GObject *autoraise_delay_slider; @@ -57,9 +89,7 @@ static GtkWidget *autoraise_delay_hbox; static GObject *double_click_titlebar_optionmenu; static GObject *alt_click_hbox; -static MateWMSettings *settings; -static const MateWMDoubleClickAction *double_click_actions = NULL; -static int n_double_click_actions = 0; +static GSettings *marco_settings; static MouseClickModifier *mouse_modifiers = NULL; static int n_mouse_modifiers = 0; @@ -67,492 +97,291 @@ static int n_mouse_modifiers = 0; static void reload_mouse_modifiers (void); static void -compositing_manager_toggled_callback (GtkWidget *button, - void *data) +update_sensitivity () { - MateWMSettings new_settings; - - new_settings.flags = MATE_WM_SETTING_COMPOSITING_MANAGER; - new_settings.compositing_manager = - gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)); - - if (current_wm != NULL && new_settings.compositing_manager != settings->compositing_manager) - mate_window_manager_change_settings (current_wm, &new_settings); + gtk_widget_set_sensitive (GTK_WIDGET (compositing_fast_alt_tab_checkbutton), + g_settings_get_boolean (marco_settings, MARCO_COMPOSITING_MANAGER_KEY)); + gtk_widget_set_sensitive (GTK_WIDGET (autoraise_checkbutton), + g_settings_get_enum (marco_settings, MARCO_FOCUS_KEY) != FOCUS_MODE_CLICK); + gtk_widget_set_sensitive (GTK_WIDGET (autoraise_delay_hbox), + g_settings_get_enum (marco_settings, MARCO_FOCUS_KEY) != FOCUS_MODE_CLICK && + g_settings_get_boolean (marco_settings, MARCO_AUTORAISE_KEY)); } static void -compositing_fast_alt_tab_toggled_callback (GtkWidget *button, - void *data) +marco_settings_changed_callback (GSettings *settings, + const gchar *key, + gpointer user_data) { - MateWMSettings new_settings; - - new_settings.flags = MATE_WM_SETTING_COMPOSITING_ALTTAB; - new_settings.compositing_fast_alt_tab = - gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)); - - if (current_wm != NULL && new_settings.compositing_fast_alt_tab != settings->compositing_fast_alt_tab) - mate_window_manager_change_settings (current_wm, &new_settings); + update_sensitivity (); } static void mouse_focus_toggled_callback (GtkWidget *button, void *data) { - MateWMSettings new_settings; - - new_settings.flags = MATE_WM_SETTING_MOUSE_FOCUS; - new_settings.focus_follows_mouse = - gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)); - - if (current_wm != NULL && new_settings.focus_follows_mouse != settings->focus_follows_mouse) - mate_window_manager_change_settings (current_wm, &new_settings); + g_settings_set_enum (marco_settings, + MARCO_FOCUS_KEY, + gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)) ? + FOCUS_MODE_SLOPPY : FOCUS_MODE_CLICK); } static void -autoraise_toggled_callback (GtkWidget *button, - void *data) +mouse_focus_changed_callback (GSettings *settings, + const gchar *key, + gpointer user_data) { - MateWMSettings new_settings; - - new_settings.flags = MATE_WM_SETTING_AUTORAISE; - new_settings.autoraise = - gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)); - - if (current_wm != NULL && new_settings.autoraise != settings->autoraise) - mate_window_manager_change_settings (current_wm, &new_settings); - + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (focus_mode_checkbutton), + g_settings_get_enum (settings, key) == FOCUS_MODE_SLOPPY); } static void autoraise_delay_value_changed_callback (GtkWidget *slider, void *data) { - MateWMSettings new_settings; - - new_settings.flags = MATE_WM_SETTING_AUTORAISE_DELAY; - new_settings.autoraise_delay = - gtk_range_get_value (GTK_RANGE (slider)) * 1000; - - if (current_wm != NULL && new_settings.autoraise_delay != settings->autoraise_delay) - mate_window_manager_change_settings (current_wm, &new_settings); + g_settings_set_int (marco_settings, + MARCO_AUTORAISE_DELAY_KEY, + gtk_range_get_value (GTK_RANGE (slider)) * 1000); } static void double_click_titlebar_changed_callback (GtkWidget *optionmenu, void *data) { - MateWMSettings new_settings; - - new_settings.flags = MATE_WM_SETTING_DOUBLE_CLICK_ACTION; - new_settings.double_click_action = - gtk_combo_box_get_active (GTK_COMBO_BOX (optionmenu)); - - if (current_wm != NULL && new_settings.double_click_action != settings->double_click_action) - mate_window_manager_change_settings (current_wm, &new_settings); + g_settings_set_enum (marco_settings, MARCO_DOUBLE_CLICK_TITLEBAR_KEY, + gtk_combo_box_get_active (GTK_COMBO_BOX (optionmenu))); } static void alt_click_radio_toggled_callback (GtkWidget *radio, void *data) { - MateWMSettings new_settings; - gboolean active; - MouseClickModifier *modifier = data; - - new_settings.flags = MATE_WM_SETTING_MOUSE_MOVE_MODIFIER; - active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (radio)); + MouseClickModifier *modifier = data; + gboolean active; + gchar *value; - if (active && current_wm != NULL) { - new_settings.mouse_move_modifier = modifier->value; + active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (radio)); - if ((settings->mouse_move_modifier == NULL) || - (strcmp (new_settings.mouse_move_modifier, - settings->mouse_move_modifier) != 0)) - mate_window_manager_change_settings (current_wm, &new_settings); - } + if (active) { + value = g_strdup_printf ("<%s>", modifier->value); + g_settings_set_string (marco_settings, MARCO_MOUSE_MODIFIER_KEY, value); + g_free (value); + } } static void -update_sensitivity (void) +set_alt_click_value () { - gtk_widget_set_sensitive (GTK_WIDGET (autoraise_checkbutton), - settings->focus_follows_mouse); - - gtk_widget_set_sensitive (autoraise_delay_hbox, - settings->focus_follows_mouse && settings->autoraise); - - gtk_widget_set_sensitive (GTK_WIDGET (double_click_titlebar_optionmenu), - n_double_click_actions > 1); - - gtk_widget_set_sensitive (GTK_WIDGET (compositing_fast_alt_tab_checkbutton), - settings->compositing_manager); - - /* disable the whole dialog while no WM is running, or - * a WM we don't understand is running. We should probably do - * something better. I don't want to just launch the config tool - * as we would on startup though, because then you'd get weirdness - * in the gap time between old and new WM. - */ - gtk_widget_set_sensitive (dialog_win, current_wm != NULL); -} - -static void -init_settings_struct (MateWMSettings *settings) -{ - /* Init fields that weren't initialized */ - if ((settings->flags & MATE_WM_SETTING_COMPOSITING_MANAGER) == 0) - settings->compositing_manager = FALSE; - - if ((settings->flags & MATE_WM_SETTING_COMPOSITING_ALTTAB) == 0) - settings->compositing_fast_alt_tab = FALSE; - - if ((settings->flags & MATE_WM_SETTING_MOUSE_FOCUS) == 0) - settings->focus_follows_mouse = FALSE; - - if ((settings->flags & MATE_WM_SETTING_AUTORAISE) == 0) - settings->autoraise = FALSE; - - if ((settings->flags & MATE_WM_SETTING_AUTORAISE_DELAY) == 0) - settings->autoraise_delay = 1000; - - if ((settings->flags & MATE_WM_SETTING_MOUSE_MOVE_MODIFIER) == 0) - settings->mouse_move_modifier = "Super"; - - if ((settings->flags & MATE_WM_SETTING_DOUBLE_CLICK_ACTION) == 0) - settings->double_click_action = 0; -} - -static void -set_alt_click_value (const MateWMSettings *settings) -{ - gboolean match_found = FALSE; - int i; - - /* We look for a matching modifier and set it. */ - if (settings->mouse_move_modifier != NULL) { - for (i = 0; i < n_mouse_modifiers; i ++) - if (strcmp (mouse_modifiers[i].value, - settings->mouse_move_modifier) == 0) { - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (mouse_modifiers[i].radio), - TRUE); - match_found = TRUE; - break; - } - } - - /* No matching modifier was found; we set all the toggle buttons to be - * insensitive. */ - for (i = 0; i < n_mouse_modifiers; i++) { - gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (mouse_modifiers[i].radio), - ! match_found); - } -} - -static void -reload_settings (void) -{ - MateWMSettings new_settings; - - g_assert (n_mouse_modifiers > 0); - - if (current_wm != NULL) { - new_settings.flags = - MATE_WM_SETTING_COMPOSITING_MANAGER | - MATE_WM_SETTING_COMPOSITING_ALTTAB | - MATE_WM_SETTING_MOUSE_FOCUS | - MATE_WM_SETTING_AUTORAISE | - MATE_WM_SETTING_AUTORAISE_DELAY | - MATE_WM_SETTING_MOUSE_MOVE_MODIFIER | - MATE_WM_SETTING_DOUBLE_CLICK_ACTION; - - /* this will clear any flags that don't get filled in */ - mate_window_manager_get_settings (current_wm, &new_settings); - } else { - new_settings.flags = 0; + gboolean match_found = FALSE; + gchar *mouse_move_modifier; + gchar *value; + int i; + + mouse_move_modifier = g_settings_get_string (marco_settings, MARCO_MOUSE_MODIFIER_KEY); + + /* We look for a matching modifier and set it. */ + if (mouse_move_modifier != NULL) { + for (i = 0; i < n_mouse_modifiers; i ++) { + value = g_strdup_printf ("<%s>", mouse_modifiers[i].value); + if (strcmp (value, mouse_move_modifier) == 0) { + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (mouse_modifiers[i].radio), TRUE); + match_found = TRUE; + break; + } + g_free (value); } - - init_settings_struct (&new_settings); - - if (new_settings.compositing_manager != settings->compositing_manager) - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (compositing_checkbutton), - new_settings.compositing_manager); - - if (new_settings.compositing_fast_alt_tab != settings->compositing_fast_alt_tab) - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (compositing_fast_alt_tab_checkbutton), - new_settings.compositing_fast_alt_tab); - - if (new_settings.focus_follows_mouse != settings->focus_follows_mouse) - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (focus_mode_checkbutton), - new_settings.focus_follows_mouse); - - if (new_settings.autoraise != settings->autoraise) - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (autoraise_checkbutton), - new_settings.autoraise); - - if (new_settings.autoraise_delay != settings->autoraise_delay) - gtk_range_set_value (GTK_RANGE (autoraise_delay_slider), - new_settings.autoraise_delay / 1000.0); - - if (n_double_click_actions > 0 && - new_settings.double_click_action != settings->double_click_action) { - gtk_combo_box_set_active (GTK_COMBO_BOX (double_click_titlebar_optionmenu), - new_settings.double_click_action); - } - - if (settings->mouse_move_modifier == NULL || - new_settings.mouse_move_modifier == NULL || - strcmp (settings->mouse_move_modifier, - new_settings.mouse_move_modifier) != 0) { - set_alt_click_value (&new_settings); - } - - mate_wm_settings_free (settings); - settings = mate_wm_settings_copy (&new_settings); - - update_sensitivity (); + g_free (mouse_move_modifier); + } + + /* No matching modifier was found; we set all the toggle buttons to be + * insensitive. */ + for (i = 0; i < n_mouse_modifiers; i++) { + gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (mouse_modifiers[i].radio), ! match_found); + } } static void -wm_settings_changed_callback (MateWindowManager *wm, - void *data) +wm_unsupported () { - reload_settings (); -} - -static void -update_wm (GdkScreen *screen, - gboolean load_settings) -{ - int i; - - g_assert (n_mouse_modifiers > 0); - - if (current_wm != NULL) { - g_signal_handlers_disconnect_by_func (G_OBJECT (current_wm), - G_CALLBACK (wm_settings_changed_callback), - NULL); - current_wm = NULL; - double_click_actions = NULL; - n_double_click_actions = 0; - } - - current_wm = mate_wm_manager_get_current (screen); + GtkWidget *no_tool_dialog; - if (current_wm != NULL) { - g_signal_connect (G_OBJECT (current_wm), "settings_changed", - G_CALLBACK (wm_settings_changed_callback), NULL); + no_tool_dialog = gtk_message_dialog_new (NULL, + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_CLOSE, + " "); + gtk_window_set_title (GTK_WINDOW (no_tool_dialog), ""); + gtk_window_set_resizable (GTK_WINDOW (no_tool_dialog), FALSE); - mate_window_manager_get_double_click_actions (current_wm, - &double_click_actions, - &n_double_click_actions); + gtk_message_dialog_set_markup (GTK_MESSAGE_DIALOG (no_tool_dialog), _("The current window manager is unsupported")); - } + gtk_dialog_run (GTK_DIALOG (no_tool_dialog)); - for (i = 0; i < n_double_click_actions; i++) { - gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (double_click_titlebar_optionmenu), - double_click_actions[i].human_readable_name); - } - - if (load_settings) - reload_settings (); + gtk_widget_destroy (no_tool_dialog); } static void wm_changed_callback (GdkScreen *screen, void *data) { - update_wm (screen, TRUE); + const char *current_wm; + + current_wm = gdk_x11_screen_get_window_manager_name (screen); + + gtk_widget_set_sensitive (dialog_win, g_strcmp0 (current_wm, WM_COMMON_MARCO) == 0); } static void response_cb (GtkWidget *dialog_win, - int response_id, + int response_id, void *data) { - if (response_id == GTK_RESPONSE_HELP) { - capplet_help (GTK_WINDOW (dialog_win), - "goscustdesk-58"); - } else { - gtk_widget_destroy (dialog_win); - } -} - -static void -try_spawn_config_tool (GdkScreen *screen) -{ - GError *error; - - error = NULL; - mate_wm_manager_spawn_config_tool_for_current (screen, &error); - - if (error != NULL) { - GtkWidget *no_tool_dialog; - char *str; - char *escaped; - - escaped = g_markup_escape_text (error->message, -1); - - str = g_strdup_printf ("<b>%s</b>\n\n%s", - _("Cannot start the preferences application for your window manager"), - escaped); - g_free (escaped); - - no_tool_dialog = - gtk_message_dialog_new (NULL, - GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_ERROR, - GTK_BUTTONS_CLOSE, - " "); - gtk_window_set_title (GTK_WINDOW (no_tool_dialog), ""); - gtk_window_set_resizable (GTK_WINDOW (no_tool_dialog), FALSE); - - gtk_message_dialog_set_markup (GTK_MESSAGE_DIALOG (no_tool_dialog), str); - - g_free (str); - - gtk_dialog_run (GTK_DIALOG (no_tool_dialog)); - - gtk_widget_destroy (no_tool_dialog); - g_error_free (error); - - exit (1); - } - - /* exit, let the config tool handle it */ - exit (0); + if (response_id == GTK_RESPONSE_HELP) { + capplet_help (GTK_WINDOW (dialog_win), "goscustdesk-58"); + } else { + gtk_widget_destroy (dialog_win); + } } int main (int argc, char **argv) { - GdkScreen *screen; - MateWMSettings new_settings; - GtkBuilder *builder; - GError *error = NULL; - const char *name; - int rc = 0; - int i; + GdkScreen *screen; + GtkBuilder *builder; + GError *error = NULL; + const char *current_wm; + int i; - bindtextdomain (GETTEXT_PACKAGE, MATELOCALEDIR); - bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); - textdomain (GETTEXT_PACKAGE); + bindtextdomain (GETTEXT_PACKAGE, MATELOCALEDIR); + bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); + textdomain (GETTEXT_PACKAGE); - gtk_init (&argc, &argv); + gtk_init (&argc, &argv); - mate_wm_manager_init (); + screen = gdk_display_get_default_screen (gdk_display_get_default ()); + current_wm = gdk_x11_screen_get_window_manager_name (screen); - screen = gdk_display_get_default_screen (gdk_display_get_default ()); + if (g_strcmp0 (current_wm, WM_COMMON_METACITY) == 0) { + mate_metacity_config_tool (); + return 0; + } - current_wm = mate_wm_manager_get_current (screen); + if (g_strcmp0 (current_wm, WM_COMMON_MARCO) != 0) { + wm_unsupported (); + return 1; + } - if (current_wm == NULL) { - /* metacity support */ - name = gdk_x11_screen_get_window_manager_name (screen); - if (g_strcmp0 (name, WM_COMMON_METACITY) == 0) { - mate_metacity_config_tool (); - return 0; - } + marco_settings = g_settings_new (MARCO_SCHEMA); - /* other window managers */ - try_spawn_config_tool (screen); - goto out; - } - - builder = gtk_builder_new (); - gtk_builder_set_translation_domain (builder, GETTEXT_PACKAGE); + builder = gtk_builder_new (); + gtk_builder_set_translation_domain (builder, GETTEXT_PACKAGE); - if (gtk_builder_add_from_file (builder, UIDIR "/mate-window-properties.ui", &error) == 0) { - g_warning ("Could not parse UI file: %s", error->message); - g_error_free (error); - g_object_unref (builder); - rc = 1; - goto out; - } + if (gtk_builder_add_from_file (builder, UIDIR "/mate-window-properties.ui", &error) == 0) { + g_warning ("Could not parse UI file: %s", error->message); + g_error_free (error); + g_object_unref (builder); + return 1; + } + + dialog_win = GTK_WIDGET (gtk_builder_get_object (builder, "main-dialog")); + compositing_checkbutton = gtk_builder_get_object (builder, "compositing-manager-checkbutton"); + compositing_fast_alt_tab_checkbutton = gtk_builder_get_object (builder, "compositing-fast-alt-tab-checkbutton"); + side_by_side_tiling_checkbutton = gtk_builder_get_object (builder, "side-by-side-tiling"); + focus_mode_checkbutton = gtk_builder_get_object (builder, "focus-mode-checkbutton"); + autoraise_checkbutton = gtk_builder_get_object (builder, "autoraise-checkbutton"); + autoraise_delay_slider = gtk_builder_get_object (builder, "autoraise-delay-slider"); + autoraise_delay_hbox = GTK_WIDGET (gtk_builder_get_object (builder, "autoraise-delay-hbox")); + double_click_titlebar_optionmenu = gtk_builder_get_object (builder, "double-click-titlebar-optionmenu"); + alt_click_hbox = gtk_builder_get_object (builder, "alt-click-box"); + + gtk_range_set_range (GTK_RANGE (autoraise_delay_slider), 0, 10); + gtk_range_set_increments (GTK_RANGE (autoraise_delay_slider), 0.2, 1.0); + + reload_mouse_modifiers (); + + gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (double_click_titlebar_optionmenu), _("Roll up")); + gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (double_click_titlebar_optionmenu), _("Maximize")); + gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (double_click_titlebar_optionmenu), _("Maximize Horizontally")); + gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (double_click_titlebar_optionmenu), _("Maximize Vertically")); + gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (double_click_titlebar_optionmenu), _("Minimize")); + gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (double_click_titlebar_optionmenu), _("None")); + gtk_combo_box_set_active (GTK_COMBO_BOX (double_click_titlebar_optionmenu), + g_settings_get_enum (marco_settings, MARCO_DOUBLE_CLICK_TITLEBAR_KEY)); + + set_alt_click_value (); + gtk_range_set_value (GTK_RANGE (autoraise_delay_slider), + g_settings_get_int (marco_settings, MARCO_AUTORAISE_DELAY_KEY) / 1000.0); + gtk_combo_box_set_active (GTK_COMBO_BOX (double_click_titlebar_optionmenu), + g_settings_get_enum (marco_settings, MARCO_DOUBLE_CLICK_TITLEBAR_KEY)); + + g_signal_connect (G_OBJECT (dialog_win), "response", + G_CALLBACK (response_cb), NULL); + + g_signal_connect (G_OBJECT (dialog_win), "destroy", + G_CALLBACK (gtk_main_quit), NULL); + + g_signal_connect (marco_settings, "changed", + G_CALLBACK (marco_settings_changed_callback), NULL); + + g_settings_bind (marco_settings, + MARCO_COMPOSITING_MANAGER_KEY, + compositing_checkbutton, + "active", + G_SETTINGS_BIND_DEFAULT); + + g_settings_bind (marco_settings, + MARCO_COMPOSITING_FAST_ALT_TAB_KEY, + compositing_fast_alt_tab_checkbutton, + "active", + G_SETTINGS_BIND_DEFAULT); + + g_settings_bind (marco_settings, + MARCO_SIDE_BY_SIDE_TILING_KEY, + side_by_side_tiling_checkbutton, + "active", + G_SETTINGS_BIND_DEFAULT); + + g_signal_connect (focus_mode_checkbutton, "toggled", + G_CALLBACK (mouse_focus_toggled_callback), NULL); + g_signal_connect (marco_settings, "changed::" MARCO_FOCUS_KEY, + G_CALLBACK (mouse_focus_changed_callback), NULL); + + g_settings_bind (marco_settings, + MARCO_AUTORAISE_KEY, + autoraise_checkbutton, + "active", + G_SETTINGS_BIND_DEFAULT); + + g_signal_connect (autoraise_delay_slider, "value_changed", + G_CALLBACK (autoraise_delay_value_changed_callback), NULL); + + g_signal_connect (double_click_titlebar_optionmenu, "changed", + G_CALLBACK (double_click_titlebar_changed_callback), NULL); + + g_signal_connect (G_OBJECT (screen), "window_manager_changed", + G_CALLBACK (wm_changed_callback), NULL); + + i = 0; + while (i < n_mouse_modifiers) { + g_signal_connect (G_OBJECT (mouse_modifiers[i].radio), "toggled", + G_CALLBACK (alt_click_radio_toggled_callback), + &mouse_modifiers[i]); + ++i; + } - dialog_win = GTK_WIDGET (gtk_builder_get_object (builder, - "main-dialog")); - compositing_checkbutton = gtk_builder_get_object (builder, - "compositing-manager-checkbutton"); - compositing_fast_alt_tab_checkbutton = gtk_builder_get_object (builder, - "compositing-fast-alt-tab-checkbutton"); - focus_mode_checkbutton = gtk_builder_get_object (builder, - "focus-mode-checkbutton"); - autoraise_checkbutton = gtk_builder_get_object (builder, - "autoraise-checkbutton"); - autoraise_delay_slider = gtk_builder_get_object (builder, - "autoraise-delay-slider"); - autoraise_delay_hbox = GTK_WIDGET (gtk_builder_get_object (builder, - "autoraise-delay-hbox")); - double_click_titlebar_optionmenu = gtk_builder_get_object (builder, - "double-click-titlebar-optionmenu"); - alt_click_hbox = gtk_builder_get_object (builder, "alt-click-box"); - - gtk_range_set_range (GTK_RANGE (autoraise_delay_slider), - 0, 10); - - gtk_range_set_increments (GTK_RANGE (autoraise_delay_slider), - 0.2, 1.0); - - new_settings.flags = 0; - init_settings_struct (&new_settings); - settings = mate_wm_settings_copy (&new_settings); - - reload_mouse_modifiers (); - update_wm (screen, FALSE); - - set_alt_click_value (&new_settings); - gtk_range_set_value (GTK_RANGE (autoraise_delay_slider), - new_settings.autoraise_delay / 1000.0); - gtk_combo_box_set_active (GTK_COMBO_BOX (double_click_titlebar_optionmenu), - new_settings.double_click_action); - - reload_settings (); /* must come before below signal connections */ - - g_signal_connect (G_OBJECT (dialog_win), "response", - G_CALLBACK (response_cb), NULL); - - g_signal_connect (G_OBJECT (dialog_win), "destroy", - G_CALLBACK (gtk_main_quit), NULL); - - g_signal_connect (compositing_checkbutton, "toggled", - G_CALLBACK (compositing_manager_toggled_callback), NULL); - - g_signal_connect (compositing_fast_alt_tab_checkbutton, "toggled", - G_CALLBACK (compositing_fast_alt_tab_toggled_callback), NULL); - - g_signal_connect (focus_mode_checkbutton, "toggled", - G_CALLBACK (mouse_focus_toggled_callback), NULL); - - g_signal_connect (autoraise_checkbutton, "toggled", - G_CALLBACK (autoraise_toggled_callback), NULL); - - g_signal_connect (autoraise_delay_slider, "value_changed", - G_CALLBACK (autoraise_delay_value_changed_callback), NULL); - - g_signal_connect (double_click_titlebar_optionmenu, "changed", - G_CALLBACK (double_click_titlebar_changed_callback), NULL); - - g_signal_connect (G_OBJECT (screen), "window_manager_changed", - G_CALLBACK (wm_changed_callback), NULL); - - i = 0; - while (i < n_mouse_modifiers) { - g_signal_connect (G_OBJECT (mouse_modifiers[i].radio), "toggled", - G_CALLBACK (alt_click_radio_toggled_callback), - &mouse_modifiers[i]); - ++i; - } + /* update sensitivity */ + update_sensitivity (); - capplet_set_icon (dialog_win, "preferences-system-windows"); - gtk_widget_show (dialog_win); + capplet_set_icon (dialog_win, "preferences-system-windows"); + gtk_widget_show (dialog_win); - gtk_main (); + gtk_main (); - g_object_unref (builder); + g_object_unref (marco_settings); + g_object_unref (builder); -out: - return rc; + return 0; } #include <X11/Xlib.h> @@ -561,159 +390,149 @@ out: static void fill_radio (GtkRadioButton *group, - MouseClickModifier *modifier) + MouseClickModifier *modifier) { - modifier->radio = - gtk_radio_button_new_with_mnemonic_from_widget (group, - modifier->name); - gtk_box_pack_start (GTK_BOX (alt_click_hbox), - modifier->radio, FALSE, FALSE, 0); + modifier->radio = gtk_radio_button_new_with_mnemonic_from_widget (group, modifier->name); + gtk_box_pack_start (GTK_BOX (alt_click_hbox), modifier->radio, FALSE, FALSE, 0); - gtk_widget_show (modifier->radio); + gtk_widget_show (modifier->radio); } static void reload_mouse_modifiers (void) { - XModifierKeymap *modmap; - KeySym *keymap; - int keysyms_per_keycode; - int map_size; - int i; - gboolean have_meta; - gboolean have_hyper; - gboolean have_super; - int min_keycode, max_keycode; - int mod_meta, mod_super, mod_hyper; + XModifierKeymap *modmap; + KeySym *keymap; + int keysyms_per_keycode; + int map_size; + int i; + gboolean have_meta; + gboolean have_hyper; + gboolean have_super; + int min_keycode, max_keycode; + int mod_meta, mod_super, mod_hyper; #if GTK_CHECK_VERSION (3, 0, 0) - XDisplayKeycodes (gdk_x11_display_get_xdisplay(gdk_display_get_default()), + XDisplayKeycodes (gdk_x11_display_get_xdisplay(gdk_display_get_default()), #else - XDisplayKeycodes (gdk_display, + XDisplayKeycodes (gdk_display, #endif - &min_keycode, - &max_keycode); + &min_keycode, + &max_keycode); #if GTK_CHECK_VERSION (3, 0, 0) - keymap = XGetKeyboardMapping (gdk_x11_display_get_xdisplay(gdk_display_get_default()), + keymap = XGetKeyboardMapping (gdk_x11_display_get_xdisplay(gdk_display_get_default()), #else - keymap = XGetKeyboardMapping (gdk_display, + keymap = XGetKeyboardMapping (gdk_display, #endif - min_keycode, - max_keycode - min_keycode, - &keysyms_per_keycode); + min_keycode, + max_keycode - min_keycode, + &keysyms_per_keycode); #if GTK_CHECK_VERSION (3, 0, 0) - modmap = XGetModifierMapping (gdk_x11_display_get_xdisplay(gdk_display_get_default())); + modmap = XGetModifierMapping (gdk_x11_display_get_xdisplay(gdk_display_get_default())); #else - modmap = XGetModifierMapping (gdk_display); + modmap = XGetModifierMapping (gdk_display); #endif - have_super = FALSE; - have_meta = FALSE; - have_hyper = FALSE; - - /* there are 8 modifiers, and the first 3 are shift, shift lock, - * and control + have_super = FALSE; + have_meta = FALSE; + have_hyper = FALSE; + + /* there are 8 modifiers, and the first 3 are shift, shift lock, + * and control + */ + map_size = 8 * modmap->max_keypermod; + i = 3 * modmap->max_keypermod; + mod_meta = mod_super = mod_hyper = 0; + while (i < map_size) { + /* get the key code at this point in the map, + * see if its keysym is one we're interested in */ - map_size = 8 * modmap->max_keypermod; - i = 3 * modmap->max_keypermod; - mod_meta = mod_super = mod_hyper = 0; - while (i < map_size) { - /* get the key code at this point in the map, - * see if its keysym is one we're interested in - */ - int keycode = modmap->modifiermap[i]; - - if (keycode >= min_keycode && - keycode <= max_keycode) { - int j = 0; - KeySym *syms = keymap + (keycode - min_keycode) * keysyms_per_keycode; - - while (j < keysyms_per_keycode) { - if (syms[j] == XK_Super_L || - syms[j] == XK_Super_R) - mod_super = i / modmap->max_keypermod; - else if (syms[j] == XK_Hyper_L || - syms[j] == XK_Hyper_R) - mod_hyper = i / modmap->max_keypermod; - else if ((syms[j] == XK_Meta_L || - syms[j] == XK_Meta_R)) - mod_meta = i / modmap->max_keypermod; - ++j; - } - } - - ++i; + int keycode = modmap->modifiermap[i]; + + if (keycode >= min_keycode && + keycode <= max_keycode) { + int j = 0; + KeySym *syms = keymap + (keycode - min_keycode) * keysyms_per_keycode; + + while (j < keysyms_per_keycode) { + if (syms[j] == XK_Super_L || syms[j] == XK_Super_R) + mod_super = i / modmap->max_keypermod; + else if (syms[j] == XK_Hyper_L || syms[j] == XK_Hyper_R) + mod_hyper = i / modmap->max_keypermod; + else if ((syms[j] == XK_Meta_L || syms[j] == XK_Meta_R)) + mod_meta = i / modmap->max_keypermod; + ++j; + } } - if ((1 << mod_meta) != Mod1Mask) - have_meta = TRUE; - if (mod_super != 0 && - mod_super != mod_meta) - have_super = TRUE; - if (mod_hyper != 0 && - mod_hyper != mod_meta && - mod_hyper != mod_super) - have_hyper = TRUE; - - XFreeModifiermap (modmap); - XFree (keymap); - - i = 0; - while (i < n_mouse_modifiers) { - g_free (mouse_modifiers[i].name); - if (mouse_modifiers[i].radio) - gtk_widget_destroy (mouse_modifiers[i].radio); - ++i; - } - g_free (mouse_modifiers); - mouse_modifiers = NULL; + ++i; + } + + if ((1 << mod_meta) != Mod1Mask) + have_meta = TRUE; + if (mod_super != 0 && mod_super != mod_meta) + have_super = TRUE; + if (mod_hyper != 0 && mod_hyper != mod_meta && mod_hyper != mod_super) + have_hyper = TRUE; + + XFreeModifiermap (modmap); + XFree (keymap); + + i = 0; + while (i < n_mouse_modifiers) { + g_free (mouse_modifiers[i].name); + if (mouse_modifiers[i].radio) + gtk_widget_destroy (mouse_modifiers[i].radio); + ++i; + } + g_free (mouse_modifiers); + mouse_modifiers = NULL; - n_mouse_modifiers = 1; /* alt */ - if (have_super) - ++n_mouse_modifiers; - if (have_hyper) - ++n_mouse_modifiers; - if (have_meta) - ++n_mouse_modifiers; + n_mouse_modifiers = 1; /* alt */ + if (have_super) + ++n_mouse_modifiers; + if (have_hyper) + ++n_mouse_modifiers; + if (have_meta) + ++n_mouse_modifiers; - mouse_modifiers = g_new0 (MouseClickModifier, n_mouse_modifiers); + mouse_modifiers = g_new0 (MouseClickModifier, n_mouse_modifiers); - i = 0; + i = 0; + mouse_modifiers[i].number = i; + mouse_modifiers[i].name = g_strdup (_("_Alt")); + mouse_modifiers[i].value = "Alt"; + ++i; + + if (have_hyper) { mouse_modifiers[i].number = i; - mouse_modifiers[i].name = g_strdup (_("_Alt")); - mouse_modifiers[i].value = "Alt"; + mouse_modifiers[i].name = g_strdup (_("H_yper")); + mouse_modifiers[i].value = "Hyper"; ++i; + } - if (have_hyper) { - mouse_modifiers[i].number = i; - mouse_modifiers[i].name = g_strdup (_("H_yper")); - mouse_modifiers[i].value = "Hyper"; - ++i; - } - - if (have_super) { - mouse_modifiers[i].number = i; - mouse_modifiers[i].name = g_strdup (_("S_uper (or \"Windows logo\")")); - mouse_modifiers[i].value = "Super"; - ++i; - } + if (have_super) { + mouse_modifiers[i].number = i; + mouse_modifiers[i].name = g_strdup (_("S_uper (or \"Windows logo\")")); + mouse_modifiers[i].value = "Super"; + ++i; + } - if (have_meta) { - mouse_modifiers[i].number = i; - mouse_modifiers[i].name = g_strdup (_("_Meta")); - mouse_modifiers[i].value = "Meta"; - ++i; - } + if (have_meta) { + mouse_modifiers[i].number = i; + mouse_modifiers[i].name = g_strdup (_("_Meta")); + mouse_modifiers[i].value = "Meta"; + ++i; + } - g_assert (i == n_mouse_modifiers); + g_assert (i == n_mouse_modifiers); - i = 0; - while (i < n_mouse_modifiers) { - fill_radio (i == 0 ? NULL : GTK_RADIO_BUTTON (mouse_modifiers[i-1].radio), - &mouse_modifiers[i]); - ++i; - } + i = 0; + while (i < n_mouse_modifiers) { + fill_radio (i == 0 ? NULL : GTK_RADIO_BUTTON (mouse_modifiers[i-1].radio), &mouse_modifiers[i]); + ++i; + } } |