/* $Id$ */ /* * Copyright (c) 2008 Stephan Arts * Copyright (c) 2008 Jannis Pohlmann * * 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 * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H #include #endif #ifdef HAVE_STDLIB_H #include #endif #ifdef HAVE_STRING_H #include #endif #include #include #include #include #include #include "appearance-dialog_ui.h" #include "images.h" #define INCH_MM 25.4 /* Use a fallback DPI of 96 which should be ok-ish on most systems * and is only applied on rare occasions */ #define FALLBACK_DPI 96 /* Increase this number if new gtk settings have been added */ #define INITIALIZE_UINT (1) enum { COLUMN_THEME_NAME, COLUMN_THEME_DISPLAY_NAME, COLUMN_THEME_COMMENT, N_THEME_COLUMNS }; enum { COLUMN_RGBA_PIXBUF, COLUMN_RGBA_NAME, N_RGBA_COLUMNS }; /* String arrays with the settings in combo boxes */ static const gchar* toolbar_styles_array[] = { "icons", "text", "both", "both-horiz" }; static const gchar* xft_hint_styles_array[] = { "hintnone", "hintslight", "hintmedium", "hintfull" }; static const gchar* xft_rgba_array[] = { "none", "rgb", "bgr", "vrgb", "vbgr" }; /* Option entries */ static GdkNativeWindow opt_socket_id = 0; static gboolean opt_version = FALSE; static GOptionEntry option_entries[] = { { "socket-id", 's', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_INT, &opt_socket_id, N_("Settings manager socket"), N_("SOCKET ID") }, { "version", 'v', 0, G_OPTION_ARG_NONE, &opt_version, N_("Version information"), NULL }, { NULL } }; /* Global xfconf channel */ static XfconfChannel *xsettings_channel; static int compute_xsettings_dpi (GtkWidget *widget) { GdkScreen *screen; int width_mm, height_mm; int width, height; int dpi; screen = gtk_widget_get_screen (widget); width_mm = gdk_screen_get_width_mm (screen); height_mm = gdk_screen_get_height_mm (screen); dpi = FALLBACK_DPI; if (width_mm > 0 && height_mm > 0) { width = gdk_screen_get_width (screen); height = gdk_screen_get_height (screen); dpi = MIN (INCH_MM * width / width_mm, INCH_MM * height / height_mm); } return dpi; } static void cb_theme_tree_selection_changed (GtkTreeSelection *selection, const gchar *property) { GtkTreeModel *model; gboolean has_selection; gchar *name; GtkTreeIter iter; /* Get the selected list iter */ has_selection = gtk_tree_selection_get_selected (selection, &model, &iter); if (G_LIKELY (has_selection)) { /* Get the theme name */ gtk_tree_model_get (model, &iter, COLUMN_THEME_NAME, &name, -1); /* Store the new theme */ xfconf_channel_set_string (xsettings_channel, property, name); /* Cleanup */ g_free (name); } } static void cb_icon_theme_tree_selection_changed (GtkTreeSelection *selection) { /* Set the new icon theme */ cb_theme_tree_selection_changed (selection, "/Net/IconThemeName"); } static void cb_ui_theme_tree_selection_changed (GtkTreeSelection *selection) { /* Set the new UI theme */ cb_theme_tree_selection_changed (selection, "/Net/ThemeName"); } static void cb_toolbar_style_combo_changed (GtkComboBox *combo) { gint active; /* Get active item, prevent number outside the array */ active = CLAMP (gtk_combo_box_get_active (combo), 0, (gint) G_N_ELEMENTS (toolbar_styles_array)); /* Save setting */ xfconf_channel_set_string (xsettings_channel, "/Gtk/ToolbarStyle", toolbar_styles_array[active]); } static void cb_antialias_check_button_toggled (GtkToggleButton *toggle) { gint active; /* Don't allow an inconsistent button anymore */ gtk_toggle_button_set_inconsistent (toggle, FALSE); /* Get active */ active = gtk_toggle_button_get_active (toggle) ? 1 : 0; /* Save setting */ xfconf_channel_set_int (xsettings_channel, "/Xft/Antialias", active); } static void cb_hinting_style_combo_changed (GtkComboBox *combo) { gint active; /* Get active item, prevent number outside the array */ active = CLAMP (gtk_combo_box_get_active (combo), 0, (gint) G_N_ELEMENTS (xft_hint_styles_array)); /* Save setting */ xfconf_channel_set_string (xsettings_channel, "/Xft/HintStyle", xft_hint_styles_array[active]); } static void cb_rgba_style_combo_changed (GtkComboBox *combo) { gint active; /* Get active item, prevent number outside the array */ active = CLAMP (gtk_combo_box_get_active (combo), 0, (gint) G_N_ELEMENTS (xft_rgba_array)); /* Save setting */ xfconf_channel_set_string (xsettings_channel, "/Xft/RGBA", xft_rgba_array[active]); } static void cb_custom_dpi_check_button_toggled (GtkToggleButton *custom_dpi_toggle, GtkSpinButton *custom_dpi_spin) { gint dpi; if (gtk_toggle_button_get_active (custom_dpi_toggle)) { /* Custom DPI is activated, so restore the last custom DPI we know about */ dpi = xfconf_channel_get_int (xsettings_channel, "/Xfce/LastCustomDPI", -1); /* Unfortunately, we don't have a valid custom DPI value to use, so compute it */ if (dpi <= 0) dpi = compute_xsettings_dpi (GTK_WIDGET (custom_dpi_toggle)); /* Apply the computed custom DPI value */ xfconf_channel_set_int (xsettings_channel, "/Xft/DPI", dpi); gtk_widget_set_sensitive (GTK_WIDGET (custom_dpi_spin), TRUE); } else { /* Custom DPI is deactivated, so remember the current value as the last custom DPI */ dpi = gtk_spin_button_get_value_as_int (custom_dpi_spin); xfconf_channel_set_int (xsettings_channel, "/Xfce/LastCustomDPI", dpi); /* Tell xfsettingsd to compute the value itself */ xfconf_channel_set_int (xsettings_channel, "/Xft/DPI", -1); /* Make the spin button insensitive */ gtk_widget_set_sensitive (GTK_WIDGET (custom_dpi_spin), FALSE); } } static void cb_custom_dpi_spin_button_changed (GtkSpinButton *custom_dpi_spin, GtkToggleButton *custom_dpi_toggle) { gint dpi = gtk_spin_button_get_value_as_int (custom_dpi_spin); if (GTK_WIDGET_IS_SENSITIVE (custom_dpi_spin) && gtk_toggle_button_get_active (custom_dpi_toggle)) { /* Custom DPI is turned on and the spin button has changed, so remember the value */ xfconf_channel_set_int (xsettings_channel, "/Xfce/LastCustomDPI", dpi); } /* Tell xfsettingsd to apply the custom DPI value */ xfconf_channel_set_int (xsettings_channel, "/Xft/DPI", dpi); } #ifdef ENABLE_SOUND_SETTINGS static void cb_enable_event_sounds_check_button_toggled (GtkToggleButton *toggle, GtkWidget *button) { gboolean active; active = gtk_toggle_button_get_active (toggle); gtk_widget_set_sensitive (button, active); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), active); } #endif static void appearance_settings_load_icon_themes (GtkListStore *list_store, GtkTreeView *tree_view) { GDir *dir; GtkTreePath *tree_path; GtkTreeIter iter; XfceRc *index_file; const gchar *file; gchar **icon_theme_dirs; gchar *index_filename; const gchar *theme_name; const gchar *theme_comment; gchar *comment_escaped; gchar *active_theme_name; gint i; GSList *check_list = NULL; /* Determine current theme */ active_theme_name = xfconf_channel_get_string (xsettings_channel, "/Net/IconThemeName", "Rodent"); /* Determine directories to look in for icon themes */ xfce_resource_push_path (XFCE_RESOURCE_ICONS, DATADIR G_DIR_SEPARATOR_S "icons"); icon_theme_dirs = xfce_resource_dirs (XFCE_RESOURCE_ICONS); xfce_resource_pop_path (XFCE_RESOURCE_ICONS); /* Iterate over all base directories */ for (i = 0; icon_theme_dirs[i] != NULL; ++i) { /* Open directory handle */ dir = g_dir_open (icon_theme_dirs[i], 0, NULL); /* Try next base directory if this one cannot be read */ if (G_UNLIKELY (dir == NULL)) continue; /* Iterate over filenames in the directory */ while ((file = g_dir_read_name (dir)) != NULL) { /* Build filename for the index.theme of the current icon theme directory */ index_filename = g_build_filename (icon_theme_dirs[i], file, "index.theme", NULL); /* Try to open the theme index file */ index_file = xfce_rc_simple_open (index_filename, TRUE); if (index_file != NULL && g_slist_find_custom (check_list, file, (GCompareFunc) g_utf8_collate) == NULL) { /* Set the icon theme group */ xfce_rc_set_group (index_file, "Icon Theme"); /* Check if the icon theme is valid and visible to the user */ if (G_LIKELY (xfce_rc_has_entry (index_file, "Directories") && !xfce_rc_read_bool_entry (index_file, "Hidden", FALSE))) { /* Insert the theme in the check list */ check_list = g_slist_prepend (check_list, g_strdup (file)); /* Get translated icon theme name and comment */ theme_name = xfce_rc_read_entry (index_file, "Name", file); theme_comment = xfce_rc_read_entry (index_file, "Comment", NULL); /* Escape the comment, since tooltips are markup, not text */ comment_escaped = theme_comment ? g_markup_escape_text (theme_comment, -1) : NULL; /* Append icon theme to the list store */ gtk_list_store_append (list_store, &iter); gtk_list_store_set (list_store, &iter, COLUMN_THEME_NAME, file, COLUMN_THEME_DISPLAY_NAME, theme_name, COLUMN_THEME_COMMENT, comment_escaped, -1); /* Cleanup */ g_free (comment_escaped); /* Check if this is the active theme, if so, select it */ if (G_UNLIKELY (g_utf8_collate (file, active_theme_name) == 0)) { tree_path = gtk_tree_model_get_path (GTK_TREE_MODEL (list_store), &iter); gtk_tree_selection_select_path (gtk_tree_view_get_selection (tree_view), tree_path); gtk_tree_view_scroll_to_cell (tree_view, tree_path, NULL, TRUE, 0.5, 0); gtk_tree_path_free (tree_path); } } } /* Close theme index file */ if (G_LIKELY (index_file)) xfce_rc_close (index_file); /* Free theme index filename */ g_free (index_filename); } /* Close directory handle */ g_dir_close (dir); } /* Free active theme name */ g_free (active_theme_name); /* Free list of base directories */ g_strfreev (icon_theme_dirs); /* Free the check list */ if (G_LIKELY (check_list)) { g_slist_foreach (check_list, (GFunc) g_free, NULL); g_slist_free (check_list); } } static void appearance_settings_load_ui_themes (GtkListStore *list_store, GtkTreeView *tree_view) { GDir *dir; GtkTreePath *tree_path; GtkTreeIter iter; XfceRc *index_file; const gchar *file; gchar **ui_theme_dirs; gchar *index_filename; const gchar *theme_name; const gchar *theme_comment; gchar *active_theme_name; gchar *gtkrc_filename; gchar *comment_escaped; gint i; GSList *check_list = NULL; /* Determine current theme */ active_theme_name = xfconf_channel_get_string (xsettings_channel, "/Net/ThemeName", "Default"); /* Determine directories to look in for ui themes */ xfce_resource_push_path (XFCE_RESOURCE_THEMES, DATADIR G_DIR_SEPARATOR_S "themes"); ui_theme_dirs = xfce_resource_dirs (XFCE_RESOURCE_THEMES); xfce_resource_pop_path (XFCE_RESOURCE_THEMES); /* Iterate over all base directories */ for (i = 0; ui_theme_dirs[i] != NULL; ++i) { /* Open directory handle */ dir = g_dir_open (ui_theme_dirs[i], 0, NULL); /* Try next base directory if this one cannot be read */ if (G_UNLIKELY (dir == NULL)) continue; /* Iterate over filenames in the directory */ while ((file = g_dir_read_name (dir)) != NULL) { /* Build the theme style filename */ gtkrc_filename = g_build_filename (ui_theme_dirs[i], file, "gtk-2.0", "gtkrc", NULL); /* Check if the gtkrc file exists and the theme is not already in the list */ if (g_file_test (gtkrc_filename, G_FILE_TEST_EXISTS) && g_slist_find_custom (check_list, file, (GCompareFunc) g_utf8_collate) == NULL) { /* Insert the theme in the check list */ check_list = g_slist_prepend (check_list, g_strdup (file)); /* Build filename for the index.theme of the current ui theme directory */ index_filename = g_build_filename (ui_theme_dirs[i], file, "index.theme", NULL); /* Try to open the theme index file */ index_file = xfce_rc_simple_open (index_filename, TRUE); if (G_LIKELY (index_file != NULL)) { /* Get translated ui theme name and comment */ theme_name = xfce_rc_read_entry (index_file, "Name", file); theme_comment = xfce_rc_read_entry (index_file, "Comment", NULL); /* Escape the comment because tooltips are markup, not text */ comment_escaped = theme_comment ? g_markup_escape_text (theme_comment, -1) : NULL; /* Close theme index file */ xfce_rc_close (index_file); } else { /* Set defaults */ theme_name = file; comment_escaped = NULL; } /* Append ui theme to the list store */ gtk_list_store_append (list_store, &iter); gtk_list_store_set (list_store, &iter, COLUMN_THEME_NAME, file, COLUMN_THEME_DISPLAY_NAME, theme_name, COLUMN_THEME_COMMENT, comment_escaped, -1); /* Cleanup */ g_free (comment_escaped); /* Check if this is the active theme, if so, select it */ if (G_UNLIKELY (g_utf8_collate (file, active_theme_name) == 0)) { tree_path = gtk_tree_model_get_path (GTK_TREE_MODEL (list_store), &iter); gtk_tree_selection_select_path (gtk_tree_view_get_selection (tree_view), tree_path); gtk_tree_view_scroll_to_cell (tree_view, tree_path, NULL, TRUE, 0.5, 0); gtk_tree_path_free (tree_path); } /* Free theme index filename */ g_free (index_filename); } /* Free gtkrc filename */ g_free (gtkrc_filename); } /* Close directory handle */ g_dir_close (dir); } /* Free active theme name */ g_free (active_theme_name); /* Free list of base directories */ g_strfreev (ui_theme_dirs); /* Free the check list */ if (G_LIKELY (check_list)) { g_slist_foreach (check_list, (GFunc) g_free, NULL); g_slist_free (check_list); } } static void appearance_settings_dialog_channel_property_changed (XfconfChannel *channel, const gchar *property_name, const GValue *value, GtkBuilder *builder) { GObject *object; gchar *str; guint i; gint antialias, dpi, custom_dpi; GtkTreeModel *model; g_return_if_fail (property_name != NULL); g_return_if_fail (GTK_IS_BUILDER (builder)); if (strcmp (property_name, "/Xft/RGBA") == 0) { str = xfconf_channel_get_string (xsettings_channel, property_name, xft_rgba_array[0]); for (i = 0; i < G_N_ELEMENTS (xft_rgba_array); i++) { if (strcmp (str, xft_rgba_array[i]) == 0) { object = gtk_builder_get_object (builder, "xft_rgba_combo_box"); gtk_combo_box_set_active (GTK_COMBO_BOX (object), i); break; } } g_free (str); } else if (strcmp (property_name, "/Gtk/ToolbarStyle") == 0) { str = xfconf_channel_get_string (xsettings_channel, property_name, toolbar_styles_array[2]); for (i = 0; i < G_N_ELEMENTS (toolbar_styles_array); i++) { if (strcmp (str, toolbar_styles_array[i]) == 0) { object = gtk_builder_get_object (builder, "gtk_toolbar_style_combo_box"); gtk_combo_box_set_active (GTK_COMBO_BOX (object), i); break; } } g_free (str); } else if (strcmp (property_name, "/Xft/HintStyle") == 0) { str = xfconf_channel_get_string (xsettings_channel, property_name, xft_hint_styles_array[0]); for (i = 0; i < G_N_ELEMENTS (xft_hint_styles_array); i++) { if (strcmp (str, xft_hint_styles_array[i]) == 0) { object = gtk_builder_get_object (builder, "xft_hinting_style_combo_box"); gtk_combo_box_set_active (GTK_COMBO_BOX (object), i); break; } } g_free (str); } else if (strcmp (property_name, "/Xft/Antialias") == 0) { object = gtk_builder_get_object (builder, "xft_antialias_check_button"); antialias = xfconf_channel_get_int (xsettings_channel, property_name, -1); switch (antialias) { case 1: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (object), TRUE); break; case 0: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (object), FALSE); break; default: /* -1 */ gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (object), TRUE); break; } } else if (strcmp (property_name, "/Xft/DPI") == 0) { /* The DPI has changed, so get its value and the last known custom value */ dpi = xfconf_channel_get_int (xsettings_channel, property_name, FALLBACK_DPI); custom_dpi = xfconf_channel_get_int (xsettings_channel, "/Xfce/LastCustomDPI", -1); /* Activate the check button if we're using a custom DPI */ object = gtk_builder_get_object (builder, "xft_custom_dpi_check_button"); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (object), dpi >= 0); /* If we're not using a custom DPI, compute the future custom DPI automatically */ if (custom_dpi == -1) custom_dpi = compute_xsettings_dpi (GTK_WIDGET (object)); object = gtk_builder_get_object (builder, "xft_custom_dpi_spin_button"); if (dpi > 0) { /* We're using a custom DPI, so use the current DPI setting for the spin value */ gtk_spin_button_set_value (GTK_SPIN_BUTTON (object), dpi); } else { /* Set the spin button value to the last custom DPI */ gtk_spin_button_set_value (GTK_SPIN_BUTTON (object), custom_dpi); } } else if (strcmp (property_name, "/Net/ThemeName") == 0) { GtkTreeIter iter; gboolean reload; object = gtk_builder_get_object (builder, "gtk_theme_treeview"); model = gtk_tree_view_get_model (GTK_TREE_VIEW (object)); reload = TRUE; if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (object)), &model, &iter)) { gchar *selected_name; gchar *new_name; gtk_tree_model_get (model, &iter, COLUMN_THEME_NAME, &selected_name, -1); new_name = xfconf_channel_get_string (channel, property_name, NULL); reload = (strcmp (new_name, selected_name) != 0); g_free (selected_name); g_free (new_name); } if (reload) { gtk_list_store_clear (GTK_LIST_STORE (model)); appearance_settings_load_ui_themes (GTK_LIST_STORE (model), GTK_TREE_VIEW (object)); } } else if (strcmp (property_name, "/Net/IconThemeName") == 0) { GtkTreeIter iter; gboolean reload; reload = TRUE; object = gtk_builder_get_object (builder, "icon_theme_treeview"); model = gtk_tree_view_get_model (GTK_TREE_VIEW (object)); if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (object)), &model, &iter)) { gchar *selected_name; gchar *new_name; gtk_tree_model_get (model, &iter, COLUMN_THEME_NAME, &selected_name, -1); new_name = xfconf_channel_get_string (channel, property_name, NULL); reload = (strcmp (new_name, selected_name) != 0); g_free (selected_name); g_free (new_name); } if (reload) { gtk_list_store_clear (GTK_LIST_STORE (model)); appearance_settings_load_icon_themes (GTK_LIST_STORE (model), GTK_TREE_VIEW (object)); } } } static void appearance_settings_dialog_configure_widgets (GtkBuilder *builder) { GObject *object, *object2; GtkListStore *list_store; GtkCellRenderer *renderer; GdkPixbuf *pixbuf; GtkTreeSelection *selection; /* Icon themes list */ object = gtk_builder_get_object (builder, "icon_theme_treeview"); list_store = gtk_list_store_new (N_THEME_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (list_store), COLUMN_THEME_DISPLAY_NAME, GTK_SORT_ASCENDING); gtk_tree_view_set_model (GTK_TREE_VIEW (object), GTK_TREE_MODEL (list_store)); gtk_tree_view_set_tooltip_column (GTK_TREE_VIEW (object), COLUMN_THEME_COMMENT); renderer = gtk_cell_renderer_text_new (); gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (object), 0, "", renderer, "text", COLUMN_THEME_DISPLAY_NAME, NULL); appearance_settings_load_icon_themes (list_store, GTK_TREE_VIEW (object)); g_object_unref (G_OBJECT (list_store)); selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (object)); gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE); g_signal_connect (G_OBJECT (selection), "changed", G_CALLBACK (cb_icon_theme_tree_selection_changed), NULL); /* Gtk (UI) themes */ object = gtk_builder_get_object (builder, "gtk_theme_treeview"); list_store = gtk_list_store_new (N_THEME_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (list_store), COLUMN_THEME_DISPLAY_NAME, GTK_SORT_ASCENDING); gtk_tree_view_set_model (GTK_TREE_VIEW (object), GTK_TREE_MODEL (list_store)); gtk_tree_view_set_tooltip_column (GTK_TREE_VIEW (object), COLUMN_THEME_COMMENT); renderer = gtk_cell_renderer_text_new(); gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (object), 0, "", renderer, "text", COLUMN_THEME_DISPLAY_NAME, NULL); appearance_settings_load_ui_themes (list_store, GTK_TREE_VIEW (object)); g_object_unref (G_OBJECT (list_store)); selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (object)); gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE); g_signal_connect (G_OBJECT (selection), "changed", G_CALLBACK (cb_ui_theme_tree_selection_changed), NULL); /* Subpixel (rgba) hinting Combo */ object = gtk_builder_get_object (builder, "xft_rgba_store"); pixbuf = gdk_pixbuf_new_from_xpm_data (rgba_image_none_xpm); gtk_list_store_insert_with_values (GTK_LIST_STORE (object), NULL, 0, 0, pixbuf, 1, _("None"), -1); g_object_unref (G_OBJECT (pixbuf)); pixbuf = gdk_pixbuf_new_from_xpm_data (rgba_image_rgb_xpm); gtk_list_store_insert_with_values (GTK_LIST_STORE (object), NULL, 1, 0, pixbuf, 1, _("RGB"), -1); g_object_unref (G_OBJECT (pixbuf)); pixbuf = gdk_pixbuf_new_from_xpm_data (rgba_image_bgr_xpm); gtk_list_store_insert_with_values (GTK_LIST_STORE (object), NULL, 2, 0, pixbuf, 1, _("BGR"), -1); g_object_unref (G_OBJECT (pixbuf)); pixbuf = gdk_pixbuf_new_from_xpm_data (rgba_image_vrgb_xpm); gtk_list_store_insert_with_values (GTK_LIST_STORE (object), NULL, 3, 0, pixbuf, 1, _("Vertical RGB"), -1); g_object_unref (G_OBJECT (pixbuf)); pixbuf = gdk_pixbuf_new_from_xpm_data (rgba_image_vbgr_xpm); gtk_list_store_insert_with_values (GTK_LIST_STORE (object), NULL, 4, 0, pixbuf, 1, _("Vertical BGR"), -1); g_object_unref (G_OBJECT (pixbuf)); object = gtk_builder_get_object (builder, "xft_rgba_combo_box"); appearance_settings_dialog_channel_property_changed (xsettings_channel, "/Xft/RGBA", NULL, builder); g_signal_connect (G_OBJECT (object), "changed", G_CALLBACK (cb_rgba_style_combo_changed), NULL); /* Enable editable menu accelerators */ object = gtk_builder_get_object (builder, "gtk_caneditaccels_check_button"); xfconf_g_property_bind (xsettings_channel, "/Gtk/CanChangeAccels", G_TYPE_BOOLEAN, G_OBJECT (object), "active"); /* Show menu images */ object = gtk_builder_get_object (builder, "gtk_menu_images_check_button"); xfconf_g_property_bind (xsettings_channel, "/Gtk/MenuImages", G_TYPE_BOOLEAN, G_OBJECT (object), "active"); /* Show button images */ object = gtk_builder_get_object (builder, "gtk_button_images_check_button"); xfconf_g_property_bind (xsettings_channel, "/Gtk/ButtonImages", G_TYPE_BOOLEAN, G_OBJECT (object), "active"); /* Font name */ object = gtk_builder_get_object (builder, "gtk_fontname_button"); xfconf_g_property_bind (xsettings_channel, "/Gtk/FontName", G_TYPE_STRING, G_OBJECT (object), "font-name"); /* Toolbar style */ object = gtk_builder_get_object (builder, "gtk_toolbar_style_combo_box"); appearance_settings_dialog_channel_property_changed (xsettings_channel, "/Gtk/ToolbarStyle", NULL, builder); g_signal_connect (G_OBJECT (object), "changed", G_CALLBACK(cb_toolbar_style_combo_changed), NULL); /* Hinting style */ object = gtk_builder_get_object (builder, "xft_hinting_style_combo_box"); appearance_settings_dialog_channel_property_changed (xsettings_channel, "/Xft/HintStyle", NULL, builder); g_signal_connect (G_OBJECT (object), "changed", G_CALLBACK (cb_hinting_style_combo_changed), NULL); /* Hinting */ object = gtk_builder_get_object (builder, "xft_antialias_check_button"); appearance_settings_dialog_channel_property_changed (xsettings_channel, "/Xft/Antialias", NULL, builder); g_signal_connect (G_OBJECT (object), "toggled", G_CALLBACK (cb_antialias_check_button_toggled), NULL); /* DPI */ object = gtk_builder_get_object (builder, "xft_custom_dpi_check_button"); object2 = gtk_builder_get_object (builder, "xft_custom_dpi_spin_button"); appearance_settings_dialog_channel_property_changed (xsettings_channel, "/Xft/DPI", NULL, builder); g_signal_connect (G_OBJECT (object), "toggled", G_CALLBACK (cb_custom_dpi_check_button_toggled), object2); g_signal_connect (G_OBJECT (object2), "value-changed", G_CALLBACK (cb_custom_dpi_spin_button_changed), object); #ifdef ENABLE_SOUND_SETTINGS /* Sounds */ object = gtk_builder_get_object (builder, "event_sounds_frame"); gtk_widget_show (GTK_WIDGET (object)); object = gtk_builder_get_object (builder, "enable_event_sounds_check_button"); object2 = gtk_builder_get_object (builder, "enable_input_feedback_sounds_button"); g_signal_connect (G_OBJECT (object), "toggled", G_CALLBACK (cb_enable_event_sounds_check_button_toggled), object2); xfconf_g_property_bind (xsettings_channel, "/Net/EnableEventSounds", G_TYPE_BOOLEAN, G_OBJECT (object), "active"); xfconf_g_property_bind (xsettings_channel, "/Net/EnableInputFeedbackSounds", G_TYPE_BOOLEAN, G_OBJECT (object2), "active"); gtk_widget_set_sensitive (GTK_WIDGET (object), gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (object2))); #endif } gint main(gint argc, gchar **argv) { GObject *dialog, *plug_child; GtkWidget *plug; GtkBuilder *builder; GError *error = NULL; /* setup translation domain */ xfce_textdomain (GETTEXT_PACKAGE, LOCALEDIR, "UTF-8"); /* initialize Gtk+ */ if (!gtk_init_with_args (&argc, &argv, "", option_entries, GETTEXT_PACKAGE, &error)) { if (G_LIKELY (error)) { /* print error */ g_print ("%s: %s.\n", G_LOG_DOMAIN, error->message); g_print (_("Type '%s --help' for usage."), G_LOG_DOMAIN); g_print ("\n"); /* cleanup */ g_error_free (error); } else { g_error ("Unable to open display."); } return EXIT_FAILURE; } /* print version information */ if (G_UNLIKELY (opt_version)) { g_print ("%s %s (Xfce %s)\n\n", G_LOG_DOMAIN, PACKAGE_VERSION, xfce_version_string ()); g_print ("%s\n", "Copyright (c) 2008-2010"); g_print ("\t%s\n\n", _("The Xfce development team. All rights reserved.")); g_print (_("Please report bugs to <%s>."), PACKAGE_BUGREPORT); g_print ("\n"); return EXIT_SUCCESS; } /* initialize xfconf */ if (!xfconf_init (&error)) { /* print error and exit */ g_error ("Failed to connect to xfconf daemon: %s.", error->message); g_error_free (error); return EXIT_FAILURE; } /* open the xsettings channel */ xsettings_channel = xfconf_channel_new ("xsettings"); if (G_LIKELY (xsettings_channel)) { /* hook to make sure the libxfce4ui library is linked */ if (xfce_titled_dialog_get_type () == 0) return EXIT_FAILURE; /* load the gtk user interface file*/ builder = gtk_builder_new (); if (gtk_builder_add_from_string (builder, appearance_dialog_ui, appearance_dialog_ui_length, &error) != 0) { /* connect signal to monitor the channel */ g_signal_connect (G_OBJECT (xsettings_channel), "property-changed", G_CALLBACK (appearance_settings_dialog_channel_property_changed), builder); appearance_settings_dialog_configure_widgets (builder); if (G_UNLIKELY (opt_socket_id == 0)) { /* build the dialog */ dialog = gtk_builder_get_object (builder, "dialog"); gtk_widget_show (GTK_WIDGET (dialog)); g_signal_connect (dialog, "response", G_CALLBACK (gtk_main_quit), NULL); /* To prevent the settings dialog to be saved in the session */ gdk_set_sm_client_id ("FAKE ID"); gtk_main (); gtk_widget_destroy (GTK_WIDGET (dialog)); } else { /* Create plug widget */ plug = gtk_plug_new (opt_socket_id); g_signal_connect (plug, "delete-event", G_CALLBACK (gtk_main_quit), NULL); gtk_widget_show (plug); /* Stop startup notification */ gdk_notify_startup_complete (); /* Get plug child widget */ plug_child = gtk_builder_get_object (builder, "plug-child"); gtk_widget_reparent (GTK_WIDGET (plug_child), plug); gtk_widget_show (GTK_WIDGET (plug_child)); /* To prevent the settings dialog to be saved in the session */ gdk_set_sm_client_id ("FAKE ID"); /* Enter main loop */ gtk_main (); } } else { g_error ("Failed to load the UI file: %s.", error->message); g_error_free (error); } /* Release Builder */ g_object_unref (G_OBJECT (builder)); /* release the channel */ g_object_unref (G_OBJECT (xsettings_channel)); } /* shutdown xfconf */ xfconf_shutdown (); return EXIT_SUCCESS; }