From ab4adfac2c27f8d800345946a621b24bddb44118 Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Tue, 30 Oct 2018 02:00:55 -0300 Subject: [PATCH] Refresh the preferences when monitors are modified --- src/desktop/desktop.c | 632 ++++++++++++++++++++++-------------------- 1 file changed, 326 insertions(+), 306 deletions(-) diff --git a/src/desktop/desktop.c b/src/desktop/desktop.c index 9ff5501..8c086f5 100644 --- a/src/desktop/desktop.c +++ b/src/desktop/desktop.c @@ -239,6 +239,16 @@ static int _desktop_icon_remove(Desktop * desktop, DesktopIcon * icon); static void _desktop_show_preferences(Desktop * desktop); /* callbacks */ +static gboolean _desktop_on_preferences_closex(gpointer data); +static void _desktop_on_preferences_monitors_changed(gpointer data); +static void _desktop_on_preferences_monitors_refresh(gpointer data); +static void _desktop_on_preferences_response(GtkWidget * widget, gint response, + gpointer data); +static void _desktop_on_preferences_response_apply(gpointer data); +static void _desktop_on_preferences_response_cancel(gpointer data); +static void _desktop_on_preferences_response_ok(gpointer data); +static void _desktop_on_preferences_update_preview(gpointer data); + static gboolean _desktop_on_refresh(gpointer data); @@ -442,6 +452,8 @@ static void _on_monitor_added(GdkDisplay * display, GdkMonitor * monitor, if(desktop->display != display) return; desktop_reset(desktop); + if(desktop->pr_window != NULL) + _desktop_on_preferences_monitors_refresh(desktop); } static void _on_monitor_removed(GdkDisplay * display, GdkMonitor * monitor, @@ -2036,15 +2048,6 @@ static void _preferences_set(Desktop * desktop); static void _preferences_set_color(Config * config, char const * section, char const * variable, char const * fallback, GtkWidget * widget); -static gboolean _on_preferences_closex(gpointer data); -static void _on_preferences_monitors_changed(gpointer data); -static void _on_preferences_monitors_refresh(gpointer data); -static void _on_preferences_response(GtkWidget * widget, gint response, - gpointer data); -static void _on_preferences_response_apply(gpointer data); -static void _on_preferences_response_cancel(gpointer data); -static void _on_preferences_response_ok(gpointer data); -static void _on_preferences_update_preview(gpointer data); static void _desktop_show_preferences(Desktop * desktop) { @@ -2070,9 +2073,9 @@ static void _desktop_show_preferences(Desktop * desktop) GTK_WIN_POS_CENTER); gtk_window_set_resizable(GTK_WINDOW(desktop->pr_window), FALSE); g_signal_connect_swapped(G_OBJECT(desktop->pr_window), "delete-event", - G_CALLBACK(_on_preferences_closex), desktop); + G_CALLBACK(_desktop_on_preferences_closex), desktop); g_signal_connect(G_OBJECT(desktop->pr_window), "response", G_CALLBACK( - _on_preferences_response), desktop); + _desktop_on_preferences_response), desktop); #if GTK_CHECK_VERSION(2, 14, 0) vbox = gtk_dialog_get_content_area(GTK_DIALOG(desktop->pr_window)); #else @@ -2084,7 +2087,7 @@ static void _desktop_show_preferences(Desktop * desktop) _preferences_background(desktop, notebook); _preferences_icons(desktop, notebook); _preferences_monitors(desktop, notebook); - _on_preferences_monitors_refresh(desktop); + _desktop_on_preferences_monitors_refresh(desktop); gtk_box_pack_start(GTK_BOX(vbox), notebook, TRUE, TRUE, 0); /* container */ _preferences_set(desktop); @@ -2144,7 +2147,8 @@ static void _preferences_background(Desktop * desktop, GtkWidget * notebook) gtk_file_chooser_set_preview_widget(GTK_FILE_CHOOSER( desktop->pr_background), gtk_image_new()); g_signal_connect_swapped(desktop->pr_background, "update-preview", - G_CALLBACK(_on_preferences_update_preview), desktop); + G_CALLBACK(_desktop_on_preferences_update_preview), + desktop); gtk_box_pack_start(GTK_BOX(hbox), desktop->pr_background, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox2), hbox, FALSE, TRUE, 0); @@ -2367,307 +2371,18 @@ static void _preferences_monitors(Desktop * desktop, GtkWidget * notebook) gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 0); widget = gtk_button_new_from_stock(GTK_STOCK_REFRESH); g_signal_connect_swapped(widget, "clicked", G_CALLBACK( - _on_preferences_monitors_refresh), desktop); + _desktop_on_preferences_monitors_refresh), + desktop); gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox2), hbox, FALSE, TRUE, 0); /* updates */ g_signal_connect_swapped(desktop->pr_monitors, "changed", G_CALLBACK( - _on_preferences_monitors_changed), desktop); + _desktop_on_preferences_monitors_changed), + desktop); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox2, gtk_label_new( _("Monitors"))); } -static gboolean _on_preferences_closex(gpointer data) -{ - _on_preferences_response_cancel(data); - return TRUE; -} - -static void _on_preferences_monitors_changed(gpointer data) -{ - Desktop * desktop = data; - gint active; - GdkRectangle geometry; - gint width; - gint height; - char buf[64]; - - active = gtk_combo_box_get_active(GTK_COMBO_BOX(desktop->pr_monitors)); - if(active < 0 - || _desktop_get_monitor_properties(desktop, active, - &geometry, NULL, NULL, &width, &height) != 0) - _desktop_get_properties(desktop, &geometry, NULL, NULL, - &width, &height); - if(width < 0 || height < 0) - snprintf(buf, sizeof(buf), "%s", _("Unknown size")); - else - snprintf(buf, sizeof(buf), _("%dx%d (at %d,%d)"), - geometry.width, geometry.height, - geometry.x, geometry.y); - gtk_label_set_text(GTK_LABEL(desktop->pr_monitors_res), buf); - if(width < 0 || height < 0) - snprintf(buf, sizeof(buf), "%s", _("Unknown resolution")); - else - snprintf(buf, sizeof(buf), _("%dx%d mm (%.0fx%.0f DPI)"), - width, height, geometry.width * 25.4 / width, - geometry.height * 25.4 / height); - gtk_label_set_text(GTK_LABEL(desktop->pr_monitors_size), buf); -} - -static void _on_preferences_monitors_refresh(gpointer data) -{ - Desktop * desktop = data; - GtkTreeModel * model1; - GtkTreeModel * model2; - gint active; -#if GTK_CHECK_VERSION(2, 14, 0) - gint n; - gint i; - gchar * name; - char buf[32]; -# if GTK_CHECK_VERSION(3, 22, 0) - GdkMonitor * monitor; - char const * manufacturer; - char const * model; - char buf2[64]; -# endif -#endif - - active = gtk_combo_box_get_active(GTK_COMBO_BOX(desktop->pr_imonitor)); - model1 = gtk_combo_box_get_model(GTK_COMBO_BOX(desktop->pr_imonitor)); - model2 = gtk_combo_box_get_model(GTK_COMBO_BOX(desktop->pr_monitors)); - gtk_list_store_clear(GTK_LIST_STORE(model1)); - gtk_list_store_clear(GTK_LIST_STORE(model2)); -#if GTK_CHECK_VERSION(2, 24, 0) - gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(desktop->pr_imonitor), - _("Default monitor")); -#else - gtk_combo_box_append_text(GTK_COMBO_BOX(desktop->pr_imonitor), - _("Default monitor")); -#endif -#if GTK_CHECK_VERSION(2, 14, 0) -# if GTK_CHECK_VERSION(3, 22, 0) - n = gdk_display_get_n_monitors(desktop->display); -# else - n = gdk_screen_get_n_monitors(desktop->screen); -# endif - for(i = 0; i < n; i++) - { - snprintf(buf, sizeof(buf), _("Monitor %d"), i); -# if GTK_CHECK_VERSION(3, 22, 0) - if((monitor = gdk_display_get_monitor(desktop->display, i)) - == NULL) - continue; - manufacturer = gdk_monitor_get_manufacturer(monitor); - model = gdk_monitor_get_model(monitor); - if(manufacturer != NULL || model != NULL) - { - snprintf(buf2, sizeof(buf2), "%s%s%s", - (manufacturer != NULL) - ? manufacturer : "", - (manufacturer != NULL && model != NULL) - ? " " : "", - (model != NULL) ? model : ""); - name = g_strdup(buf2); - } - else - name = NULL; -# else - name = gdk_screen_get_monitor_plug_name(desktop->screen, i); -# endif -# if GTK_CHECK_VERSION(2, 24, 0) - gtk_combo_box_text_append_text( - GTK_COMBO_BOX_TEXT(desktop->pr_imonitor), - (name != NULL) ? name : buf); - gtk_combo_box_text_append_text( - GTK_COMBO_BOX_TEXT(desktop->pr_monitors), - (name != NULL) ? name : buf); -# else - gtk_combo_box_append_text(GTK_COMBO_BOX(desktop->pr_imonitor), - (name != NULL) ? name : buf); - gtk_combo_box_append_text(GTK_COMBO_BOX(desktop->pr_monitors), - (name != NULL) ? name : buf); -# endif - g_free(name); - } -#endif - gtk_combo_box_set_active(GTK_COMBO_BOX(desktop->pr_imonitor), active); - gtk_combo_box_set_active(GTK_COMBO_BOX(desktop->pr_monitors), 0); -} - -static void _on_preferences_response(GtkWidget * widget, gint response, - gpointer data) -{ - Desktop * desktop = data; - (void) widget; - - if(response == GTK_RESPONSE_OK) - _on_preferences_response_ok(desktop); - else if(response == GTK_RESPONSE_APPLY) - _on_preferences_response_apply(desktop); - else if(response == GTK_RESPONSE_CANCEL) - _on_preferences_response_cancel(desktop); -} - -static void _on_preferences_response_apply(gpointer data) -{ - Desktop * desktop = data; - int i; - - /* XXX not very efficient */ - desktop_reset(desktop); - /* icons */ - desktop->prefs.icons = gtk_combo_box_get_active( - GTK_COMBO_BOX(desktop->pr_ilayout)); - /* monitor */ - i = gtk_combo_box_get_active(GTK_COMBO_BOX(desktop->pr_imonitor)); - desktop->prefs.monitor = (i >= 0) ? i - 1 : i; -} - -static void _on_preferences_response_cancel(gpointer data) -{ - Desktop * desktop = data; - - gtk_widget_hide(desktop->pr_window); - _preferences_set(desktop); -} - -static void _on_preferences_response_ok(gpointer data) -{ - Desktop * desktop = data; - Config * config; -#if GTK_CHECK_VERSION(3, 0, 0) - GdkRGBA color; -#else - GdkColor color; -#endif - char * p; - char const * q; - int i; - char buf[12]; - - gtk_widget_hide(desktop->pr_window); - _on_preferences_response_apply(desktop); - if((config = _desktop_get_config(desktop)) == NULL) - return; - /* background */ - p = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER( - desktop->pr_background)); - config_set(config, "background", "wallpaper", p); - g_free(p); -#if GTK_CHECK_VERSION(3, 4, 0) - gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(desktop->pr_color), - &color); - p = gdk_rgba_to_string(&color); -#elif GTK_CHECK_VERSION(3, 0, 0) - gtk_color_button_get_rgba(GTK_COLOR_BUTTON(desktop->pr_color), &color); - p = gdk_rgba_to_string(&color); -#else - gtk_color_button_get_color(GTK_COLOR_BUTTON(desktop->pr_color), &color); - p = gdk_color_to_string(&color); -#endif - config_set(config, "background", "color", p); - g_free(p); - i = gtk_combo_box_get_active(GTK_COMBO_BOX(desktop->pr_background_how)); - if(i >= 0 && i < DESKTOP_HOW_COUNT) - config_set(config, "background", "how", _desktop_hows[i]); - p = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( - desktop->pr_background_extend)) ? "1" : "0"; - config_set(config, "background", "extend", p); - /* icons */ - i = gtk_combo_box_get_active(GTK_COMBO_BOX(desktop->pr_ilayout)); - if(desktop->prefs.icons >= 0 - && desktop->prefs.icons < DESKTOP_ICONS_COUNT) - config_set(config, "icons", "layout", - _desktop_icons_config[desktop->prefs.icons]); -#if GTK_CHECK_VERSION(3, 4, 0) - gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(desktop->pr_ibcolor), - &color); - p = gdk_rgba_to_string(&color); -#elif GTK_CHECK_VERSION(3, 0, 0) - gtk_color_button_get_rgba(GTK_COLOR_BUTTON(desktop->pr_ibcolor), - &color); - p = gdk_rgba_to_string(&color); -#else - gtk_color_button_get_color(GTK_COLOR_BUTTON(desktop->pr_ibcolor), - &color); - p = gdk_color_to_string(&color); -#endif - config_set(config, "icons", "background", p); - g_free(p); -#if GTK_CHECK_VERSION(3, 4, 0) - gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(desktop->pr_ifcolor), - &color); - p = gdk_rgba_to_string(&color); -#elif GTK_CHECK_VERSION(3, 0, 0) - gtk_color_button_get_rgba(GTK_COLOR_BUTTON(desktop->pr_ifcolor), - &color); - p = gdk_rgba_to_string(&color); -#else - gtk_color_button_get_color(GTK_COLOR_BUTTON(desktop->pr_ifcolor), - &color); - p = gdk_color_to_string(&color); -#endif - config_set(config, "icons", "foreground", p); - g_free(p); - q = gtk_font_button_get_font_name(GTK_FONT_BUTTON(desktop->pr_ifont)); - config_set(config, "icons", "font", q); - /* monitor */ - snprintf(buf, sizeof(buf), "%d", desktop->prefs.monitor); - config_set(config, "icons", "monitor", buf); - config_set(config, "icons", "show_hidden", desktop->show_hidden - ? "1" : "0"); - /* XXX code duplication */ - if((p = string_new_append(desktop->home, "/" DESKTOPRC, NULL)) != NULL) - { - if(config_save(config, p) != 0) - error_print(PROGNAME_DESKTOP); - string_delete(p); - } - config_delete(config); -} - -static void _on_preferences_update_preview(gpointer data) -{ - Desktop * desktop = data; -#if !GTK_CHECK_VERSION(2, 6, 0) - gint ratio = desktop->window.width / desktop->window.height; -#endif - GtkFileChooser * chooser = GTK_FILE_CHOOSER(desktop->pr_background); - GtkWidget * widget; - char * filename; - GdkPixbuf * pixbuf; - gboolean active = FALSE; - GError * error = NULL; - - widget = gtk_file_chooser_get_preview_widget(chooser); - if((filename = gtk_file_chooser_get_preview_filename(chooser)) != NULL) - { -#if GTK_CHECK_VERSION(2, 6, 0) - pixbuf = gdk_pixbuf_new_from_file_at_scale(filename, 96, -1, - TRUE, &error); -#else - pixbuf = gdk_pixbuf_new_from_file_at_size(filename, 96, - 96 / ratio, &error); -#endif - if(error != NULL) - { -#ifdef DEBUG - _desktop_error(NULL, NULL, error->message, 1); -#endif - g_error_free(error); - } - if(pixbuf != NULL) - { - gtk_image_set_from_pixbuf(GTK_IMAGE(widget), pixbuf); - g_object_unref(pixbuf); - active = TRUE; - } - } - g_free(filename); - gtk_file_chooser_set_preview_widget_active(chooser, active); -} - static void _preferences_set(Desktop * desktop) { Config * config; @@ -2783,6 +2498,311 @@ static void _preferences_set_color(Config * config, char const * section, /* callbacks */ +/* desktop_on_preferences_closex */ +static gboolean _desktop_on_preferences_closex(gpointer data) +{ + _desktop_on_preferences_response_cancel(data); + return TRUE; +} + + +/* desktop_on_preferences_monitors_changed */ +static void _desktop_on_preferences_monitors_changed(gpointer data) +{ + Desktop * desktop = data; + gint active; + GdkRectangle geometry; + gint width; + gint height; + char buf[64]; + + active = gtk_combo_box_get_active(GTK_COMBO_BOX(desktop->pr_monitors)); + if(active < 0 + || _desktop_get_monitor_properties(desktop, active, + &geometry, NULL, NULL, &width, &height) != 0) + _desktop_get_properties(desktop, &geometry, NULL, NULL, + &width, &height); + if(width < 0 || height < 0) + snprintf(buf, sizeof(buf), "%s", _("Unknown size")); + else + snprintf(buf, sizeof(buf), _("%dx%d (at %d,%d)"), + geometry.width, geometry.height, + geometry.x, geometry.y); + gtk_label_set_text(GTK_LABEL(desktop->pr_monitors_res), buf); + if(width < 0 || height < 0) + snprintf(buf, sizeof(buf), "%s", _("Unknown resolution")); + else + snprintf(buf, sizeof(buf), _("%dx%d mm (%.0fx%.0f DPI)"), + width, height, geometry.width * 25.4 / width, + geometry.height * 25.4 / height); + gtk_label_set_text(GTK_LABEL(desktop->pr_monitors_size), buf); +} + + +/* desktop_on_preferences_monitors_refresh */ +static void _desktop_on_preferences_monitors_refresh(gpointer data) +{ + Desktop * desktop = data; + GtkTreeModel * model1; + GtkTreeModel * model2; + gint active; +#if GTK_CHECK_VERSION(2, 14, 0) + gint n; + gint i; + gchar * name; + char buf[32]; +# if GTK_CHECK_VERSION(3, 22, 0) + GdkMonitor * monitor; + char const * manufacturer; + char const * model; + char buf2[64]; +# endif +#endif + + active = gtk_combo_box_get_active(GTK_COMBO_BOX(desktop->pr_imonitor)); + model1 = gtk_combo_box_get_model(GTK_COMBO_BOX(desktop->pr_imonitor)); + model2 = gtk_combo_box_get_model(GTK_COMBO_BOX(desktop->pr_monitors)); + gtk_list_store_clear(GTK_LIST_STORE(model1)); + gtk_list_store_clear(GTK_LIST_STORE(model2)); +#if GTK_CHECK_VERSION(2, 24, 0) + gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(desktop->pr_imonitor), + _("Default monitor")); +#else + gtk_combo_box_append_text(GTK_COMBO_BOX(desktop->pr_imonitor), + _("Default monitor")); +#endif +#if GTK_CHECK_VERSION(2, 14, 0) +# if GTK_CHECK_VERSION(3, 22, 0) + n = gdk_display_get_n_monitors(desktop->display); +# else + n = gdk_screen_get_n_monitors(desktop->screen); +# endif + for(i = 0; i < n; i++) + { + snprintf(buf, sizeof(buf), _("Monitor %d"), i); +# if GTK_CHECK_VERSION(3, 22, 0) + if((monitor = gdk_display_get_monitor(desktop->display, i)) + == NULL) + continue; + manufacturer = gdk_monitor_get_manufacturer(monitor); + model = gdk_monitor_get_model(monitor); + if(manufacturer != NULL || model != NULL) + { + snprintf(buf2, sizeof(buf2), "%s%s%s", + (manufacturer != NULL) + ? manufacturer : "", + (manufacturer != NULL && model != NULL) + ? " " : "", + (model != NULL) ? model : ""); + name = g_strdup(buf2); + } + else + name = NULL; +# else + name = gdk_screen_get_monitor_plug_name(desktop->screen, i); +# endif +# if GTK_CHECK_VERSION(2, 24, 0) + gtk_combo_box_text_append_text( + GTK_COMBO_BOX_TEXT(desktop->pr_imonitor), + (name != NULL) ? name : buf); + gtk_combo_box_text_append_text( + GTK_COMBO_BOX_TEXT(desktop->pr_monitors), + (name != NULL) ? name : buf); +# else + gtk_combo_box_append_text(GTK_COMBO_BOX(desktop->pr_imonitor), + (name != NULL) ? name : buf); + gtk_combo_box_append_text(GTK_COMBO_BOX(desktop->pr_monitors), + (name != NULL) ? name : buf); +# endif + g_free(name); + } +#endif + gtk_combo_box_set_active(GTK_COMBO_BOX(desktop->pr_imonitor), active); + gtk_combo_box_set_active(GTK_COMBO_BOX(desktop->pr_monitors), 0); +} + + +/* desktop_on_preferences_response */ +static void _desktop_on_preferences_response(GtkWidget * widget, gint response, + gpointer data) +{ + Desktop * desktop = data; + (void) widget; + + if(response == GTK_RESPONSE_OK) + _desktop_on_preferences_response_ok(desktop); + else if(response == GTK_RESPONSE_APPLY) + _desktop_on_preferences_response_apply(desktop); + else if(response == GTK_RESPONSE_CANCEL) + _desktop_on_preferences_response_cancel(desktop); +} + + +/* desktop_on_preferences_response_apply */ +static void _desktop_on_preferences_response_apply(gpointer data) +{ + Desktop * desktop = data; + int i; + + /* XXX not very efficient */ + desktop_reset(desktop); + /* icons */ + desktop->prefs.icons = gtk_combo_box_get_active( + GTK_COMBO_BOX(desktop->pr_ilayout)); + /* monitor */ + i = gtk_combo_box_get_active(GTK_COMBO_BOX(desktop->pr_imonitor)); + desktop->prefs.monitor = (i >= 0) ? i - 1 : i; +} + + +/* desktop_on_preferences_response_cancel */ +static void _desktop_on_preferences_response_cancel(gpointer data) +{ + Desktop * desktop = data; + + gtk_widget_hide(desktop->pr_window); + _preferences_set(desktop); +} + + +/* desktop_on_preferences_response_ok */ +static void _desktop_on_preferences_response_ok(gpointer data) +{ + Desktop * desktop = data; + Config * config; +#if GTK_CHECK_VERSION(3, 0, 0) + GdkRGBA color; +#else + GdkColor color; +#endif + char * p; + char const * q; + int i; + char buf[12]; + + gtk_widget_hide(desktop->pr_window); + _desktop_on_preferences_response_apply(desktop); + if((config = _desktop_get_config(desktop)) == NULL) + return; + /* background */ + p = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER( + desktop->pr_background)); + config_set(config, "background", "wallpaper", p); + g_free(p); +#if GTK_CHECK_VERSION(3, 4, 0) + gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(desktop->pr_color), + &color); + p = gdk_rgba_to_string(&color); +#elif GTK_CHECK_VERSION(3, 0, 0) + gtk_color_button_get_rgba(GTK_COLOR_BUTTON(desktop->pr_color), &color); + p = gdk_rgba_to_string(&color); +#else + gtk_color_button_get_color(GTK_COLOR_BUTTON(desktop->pr_color), &color); + p = gdk_color_to_string(&color); +#endif + config_set(config, "background", "color", p); + g_free(p); + i = gtk_combo_box_get_active(GTK_COMBO_BOX(desktop->pr_background_how)); + if(i >= 0 && i < DESKTOP_HOW_COUNT) + config_set(config, "background", "how", _desktop_hows[i]); + p = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( + desktop->pr_background_extend)) ? "1" : "0"; + config_set(config, "background", "extend", p); + /* icons */ + i = gtk_combo_box_get_active(GTK_COMBO_BOX(desktop->pr_ilayout)); + if(desktop->prefs.icons >= 0 + && desktop->prefs.icons < DESKTOP_ICONS_COUNT) + config_set(config, "icons", "layout", + _desktop_icons_config[desktop->prefs.icons]); +#if GTK_CHECK_VERSION(3, 4, 0) + gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(desktop->pr_ibcolor), + &color); + p = gdk_rgba_to_string(&color); +#elif GTK_CHECK_VERSION(3, 0, 0) + gtk_color_button_get_rgba(GTK_COLOR_BUTTON(desktop->pr_ibcolor), + &color); + p = gdk_rgba_to_string(&color); +#else + gtk_color_button_get_color(GTK_COLOR_BUTTON(desktop->pr_ibcolor), + &color); + p = gdk_color_to_string(&color); +#endif + config_set(config, "icons", "background", p); + g_free(p); +#if GTK_CHECK_VERSION(3, 4, 0) + gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(desktop->pr_ifcolor), + &color); + p = gdk_rgba_to_string(&color); +#elif GTK_CHECK_VERSION(3, 0, 0) + gtk_color_button_get_rgba(GTK_COLOR_BUTTON(desktop->pr_ifcolor), + &color); + p = gdk_rgba_to_string(&color); +#else + gtk_color_button_get_color(GTK_COLOR_BUTTON(desktop->pr_ifcolor), + &color); + p = gdk_color_to_string(&color); +#endif + config_set(config, "icons", "foreground", p); + g_free(p); + q = gtk_font_button_get_font_name(GTK_FONT_BUTTON(desktop->pr_ifont)); + config_set(config, "icons", "font", q); + /* monitor */ + snprintf(buf, sizeof(buf), "%d", desktop->prefs.monitor); + config_set(config, "icons", "monitor", buf); + config_set(config, "icons", "show_hidden", desktop->show_hidden + ? "1" : "0"); + /* XXX code duplication */ + if((p = string_new_append(desktop->home, "/" DESKTOPRC, NULL)) != NULL) + { + if(config_save(config, p) != 0) + error_print(PROGNAME_DESKTOP); + string_delete(p); + } + config_delete(config); +} + + +/* desktop_on_preferences_update_preview */ +static void _desktop_on_preferences_update_preview(gpointer data) +{ + Desktop * desktop = data; +#if !GTK_CHECK_VERSION(2, 6, 0) + gint ratio = desktop->window.width / desktop->window.height; +#endif + GtkFileChooser * chooser = GTK_FILE_CHOOSER(desktop->pr_background); + GtkWidget * widget; + char * filename; + GdkPixbuf * pixbuf; + gboolean active = FALSE; + GError * error = NULL; + + widget = gtk_file_chooser_get_preview_widget(chooser); + if((filename = gtk_file_chooser_get_preview_filename(chooser)) != NULL) + { +#if GTK_CHECK_VERSION(2, 6, 0) + pixbuf = gdk_pixbuf_new_from_file_at_scale(filename, 96, -1, + TRUE, &error); +#else + pixbuf = gdk_pixbuf_new_from_file_at_size(filename, 96, + 96 / ratio, &error); +#endif + if(error != NULL) + { +#ifdef DEBUG + _desktop_error(NULL, NULL, error->message, 1); +#endif + g_error_free(error); + } + if(pixbuf != NULL) + { + gtk_image_set_from_pixbuf(GTK_IMAGE(widget), pixbuf); + g_object_unref(pixbuf); + active = TRUE; + } + } + g_free(filename); + gtk_file_chooser_set_preview_widget_active(chooser, active); +} /* desktop_on_refresh */ static void _refresh_cleanup(Desktop * desktop); static void _refresh_done_applications(Desktop * desktop);