Author: kelnos
Date: 2008-09-08 07:46:13 +0000 (Mon, 08 Sep 2008)
New Revision: 27747

Modified:
   xfdesktop/trunk/settings/main.c
   xfdesktop/trunk/settings/xfdesktop-settings.glade
Log:
backdrop lists are mostly working, switching between stuff should too

Modified: xfdesktop/trunk/settings/main.c
===================================================================
--- xfdesktop/trunk/settings/main.c     2008-09-08 07:46:02 UTC (rev 27746)
+++ xfdesktop/trunk/settings/main.c     2008-09-08 07:46:13 UTC (rev 27747)
@@ -35,6 +35,10 @@
 #include <string.h>
 #endif
 
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
 #include <gdk-pixbuf/gdk-pixbuf.h>
 #include <gtk/gtk.h>
 #include <glade/glade.h>
@@ -73,16 +77,25 @@
     XfconfChannel *channel;
     gint screen;
     gint monitor;
+    gulong show_image:1,
+           image_selector_loaded:1,
+           image_list_loaded:1;
 
+    GtkWidget *frame_image_list;
+    GtkWidget *image_treeview;
+    GtkWidget *btn_plus;
+    GtkWidget *btn_minus;
+    GtkWidget *btn_newlist;
+    GtkWidget *image_style_combo;
+
+    GtkWidget *radio_singleimage;
+    GtkWidget *radio_imagelist;
+    GtkWidget *radio_none;
+
     GtkWidget *color_style_combo;
     GtkWidget *color1_btn;
     GtkWidget *color2_btn;
-    GtkWidget *single_image_radio;
-    GtkWidget *image_list_radio;
-    GtkWidget *image_treeview;
-    GtkWidget *plus_btn;
-    GtkWidget *minus_btn;
-    GtkWidget *image_style_combo;
+
     GtkWidget *brightness_slider;
     GtkWidget *saturation_slider;
 } AppearancePanel;
@@ -291,6 +304,110 @@
     return iter_ret;
 }
 
+static gboolean
+xfdesktop_settings_ensure_backdrop_list(gchar *filename,
+                                        GtkWindow *parent)
+{
+    FILE *fp;
+
+    g_return_val_if_fail(filename && *filename, FALSE);
+
+    if(xfdesktop_backdrop_list_is_valid(filename))
+        return TRUE;
+
+    fp = fopen(filename, "w");
+    if(!fp) {
+        gchar *shortfile = g_path_get_basename(filename);
+        gchar *primary = g_strdup_printf(_("Cannot create backdrop list 
\"%s\""),
+                                         shortfile);
+
+        xfce_message_dialog(parent,
+                            _("Backdrop List Error"),
+                            GTK_STOCK_DIALOG_ERROR,
+                            primary, strerror(errno),
+                            GTK_STOCK_CLOSE, GTK_RESPONSE_ACCEPT,
+                            NULL);
+        g_free(primary);
+        g_free(shortfile);
+
+        return FALSE;
+    }
+
+    fprintf(fp, "%s\n", LIST_TEXT);
+    fclose(fp);
+
+    return TRUE;
+}
+
+static gchar *
+xfdesktop_settings_dialog_create_load_list(AppearancePanel *panel)
+{
+    gchar *list_file = NULL;
+    GtkWindow *parent = 
GTK_WINDOW(gtk_widget_get_toplevel(panel->image_treeview));
+    GtkWidget *chooser;
+    gchar *path;
+
+    chooser = gtk_file_chooser_dialog_new(_("Create/Load Backdrop List"),
+                                          parent, GTK_FILE_CHOOSER_ACTION_SAVE,
+                                          GTK_STOCK_CANCEL, 
GTK_RESPONSE_CANCEL,
+                                          GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
+                                          NULL);
+    path = xfce_resource_save_location(XFCE_RESOURCE_CONFIG,
+                                       "xfce4/desktop/", TRUE);
+    if(path) {
+        gtk_file_chooser_add_shortcut_folder(GTK_FILE_CHOOSER(chooser),
+                                             path, NULL);
+        g_free(path);
+    }
+
+    for(;;) {
+        if(GTK_RESPONSE_ACCEPT != gtk_dialog_run(GTK_DIALOG(chooser))) {
+            gtk_widget_destroy(chooser);
+            return NULL;
+        }
+
+        list_file = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(chooser));
+        if(g_file_test(list_file, G_FILE_TEST_EXISTS)
+           && !xfdesktop_backdrop_list_is_valid(list_file))
+        {
+            gchar *shortfile = g_path_get_basename(list_file);
+            gchar *primary = g_strdup_printf(_("File \"%s\" is not a valid 
backdrop list file.  Do you wish to overwrite it?"),
+                                             shortfile);
+            gint resp;
+
+            resp = xfce_message_dialog(GTK_WINDOW(chooser),
+                                       _("Invalid List File"),
+                                       GTK_STOCK_DIALOG_ERROR,
+                                       primary,
+                                       _("Overwriting the file will cause its 
contents to be lost."),
+                                       GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+                                       XFCE_CUSTOM_STOCK_BUTTON, _("Replace"), 
GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
+                                       NULL);
+            g_free(primary);
+            g_free(shortfile);
+
+            if(GTK_RESPONSE_ACCEPT == resp)
+                break;
+            else {
+                g_free(list_file);
+                list_file = NULL;
+            }
+        } else
+            break;
+    }
+
+    gtk_widget_destroy(chooser);
+    while(gtk_events_pending())
+        gtk_main_iteration();
+
+    if(!xfdesktop_settings_ensure_backdrop_list(list_file, parent)) {
+        g_free(list_file);
+        return NULL;
+    }
+
+    return list_file;
+}
+
 static void
 cb_image_selection_changed(GtkTreeSelection *sel,
                            gpointer user_data)
@@ -303,6 +420,9 @@
 
     TRACE("entering");
 
+    if(panel->image_list_loaded)
+        return;
+
     if(!gtk_tree_selection_get_selected(sel, &model, &iter))
         return;
 
@@ -313,41 +433,64 @@
     g_snprintf(buf, sizeof(buf), PER_SCREEN_PROP_FORMAT "/image-path",
                panel->screen, panel->monitor);
     xfconf_channel_set_string(panel->channel, buf, filename);
-    g_free(filename);
+    g_snprintf(buf, sizeof(buf), PER_SCREEN_PROP_FORMAT "/last-single-image",
+               panel->screen, panel->monitor);
+    xfconf_channel_set_string(panel->channel, buf, filename);
 }
 
-static void
-xfdesktop_settings_dialog_populate_image_list(GladeXML *gxml,
-                                              AppearancePanel *panel)
+static gboolean
+xfdesktop_settings_dialog_populate_image_list(AppearancePanel *panel)
 {
-    gchar buf[PATH_MAX], *image_file;
+    gchar prop_image[1024], prop_last[1024], *image_file;
     GtkListStore *ls;
     GtkTreeIter iter, *image_file_iter = NULL;
-    gboolean do_sort = TRUE, connect_changed_signal = FALSE;
+    gboolean do_sort = TRUE;
     GtkTreeSelection *sel;
 
     sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(panel->image_treeview));
     ls = gtk_list_store_new(N_COLS, GDK_TYPE_PIXBUF, G_TYPE_STRING,
                             G_TYPE_STRING, G_TYPE_STRING);
 
-    g_snprintf(buf, sizeof(buf), PER_SCREEN_PROP_FORMAT "/image-path",
+    g_snprintf(prop_image, sizeof(prop_image),
+               PER_SCREEN_PROP_FORMAT "/image-path",
                panel->screen, panel->monitor);
-    image_file = xfconf_channel_get_string(panel->channel, buf, NULL);
+    image_file = xfconf_channel_get_string(panel->channel, prop_image, NULL);
 
-    if(image_file && xfdesktop_backdrop_list_is_valid(image_file)) {
+    
if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(panel->radio_imagelist))) {
         gchar **images;
 
+        g_snprintf(prop_last, sizeof(prop_last),
+                   PER_SCREEN_PROP_FORMAT "/last-image-list",
+                   panel->screen, panel->monitor);
+
+        if(!image_file || !xfdesktop_backdrop_list_is_valid(image_file)) {
+            g_free(image_file);
+            image_file = xfconf_channel_get_string(panel->channel, prop_last,
+                                                   NULL);
+            if(!image_file || !xfdesktop_backdrop_list_is_valid(image_file)) {
+                g_free(image_file);
+                image_file = xfce_resource_save_location(XFCE_RESOURCE_CONFIG,
+                                                         DEFAULT_BACKDROP_LIST,
+                                                         TRUE);
+                if(!xfdesktop_settings_ensure_backdrop_list(image_file,
+                                                            
GTK_WINDOW(gtk_widget_get_toplevel(panel->image_treeview))))
+                {
+                    /* FIXME: go back to single image mode or something */
+                    g_free(image_file);
+                    return FALSE;
+                }
+            }
+        }
+
         do_sort = FALSE;
 
-        
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(glade_xml_get_widget(gxml,
-                                                                            
"radio_imagelist")),
-                                     TRUE);
-        gtk_widget_show(glade_xml_get_widget(gxml, "btn_image_remove"));
-
         images = xfdesktop_backdrop_list_load(image_file, NULL, NULL);
         if(images) {
             gint i;
 
+            xfconf_channel_set_string(panel->channel, prop_image, image_file);
+            xfconf_channel_set_string(panel->channel, prop_last, image_file);
+
             for(i = 0; images[i]; ++i) {
                 gchar *name;
 
@@ -370,17 +513,32 @@
             }
 
             g_strfreev(images);
+            panel->image_list_loaded = TRUE;
+            panel->image_selector_loaded = FALSE;
+            gtk_tree_selection_set_mode(sel, GTK_SELECTION_MULTIPLE);
         }
-    } else {
+    } else 
if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(panel->radio_singleimage))) {
         GtkTreeIter *tmp;
         gchar **backdrop_dirs;
         gint i;
 
-        
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(glade_xml_get_widget(gxml,
-                                                                            
"radio_singleimage")),
-                                     TRUE);
-        gtk_widget_hide(glade_xml_get_widget(gxml, "btn_image_remove"));
+        g_snprintf(prop_last, sizeof(prop_last),
+                   PER_SCREEN_PROP_FORMAT "/last-image",
+                   panel->screen, panel->monitor);
 
+        if(!image_file || !xfdesktop_image_file_is_valid(image_file)) {
+            g_free(image_file);
+            image_file = xfconf_channel_get_string(panel->channel, prop_last,
+                                                   NULL);
+            if(!image_file || !xfdesktop_image_file_is_valid(image_file)) {
+                g_free(image_file);
+                image_file = g_strdup(DEFAULT_BACKDROP);
+            }
+        }
+
+        xfconf_channel_set_string(panel->channel, prop_image, image_file);
+        xfconf_channel_set_string(panel->channel, prop_last, image_file);
+
         backdrop_dirs = xfce_resource_lookup_all(XFCE_RESOURCE_DATA,
                                                  "xfce4/backdrops/");
         for(i = 0; backdrop_dirs[i]; ++i) {
@@ -390,7 +548,7 @@
                 image_file_iter = tmp;
         }
 
-        if(image_file && !image_file_iter) {
+        if(!image_file_iter) {
             gchar *name, *key = NULL;
 
             /* FIXME: set image thumbnail */
@@ -420,7 +578,12 @@
             g_free(key);
         }
 
-        connect_changed_signal = TRUE;
+        panel->image_list_loaded = FALSE;
+        panel->image_selector_loaded = TRUE;
+        gtk_tree_selection_set_mode(sel, GTK_SELECTION_SINGLE);
+    } else {
+        g_warning("xfdesktop_settings_populate_image_list() called when image 
style set to 'none'");
+        return FALSE;
     }
 
     if(do_sort) {
@@ -438,15 +601,31 @@
     }
     g_object_unref(G_OBJECT(ls));
 
-    if(connect_changed_signal) {
-        g_signal_connect(G_OBJECT(sel), "changed",
-                         G_CALLBACK(cb_image_selection_changed), panel);
-    }
+    g_free(image_file);
 
-    g_free(image_file);
+    return TRUE;
 }
 
 static void
+newlist_button_clicked(GtkWidget *button,
+                       gpointer user_data)
+{
+    AppearancePanel *panel = user_data;
+    gchar *list_file, propname[1024];
+
+    list_file = xfdesktop_settings_dialog_create_load_list(panel);
+    if(!list_file)
+        return;
+
+    g_snprintf(propname, sizeof(propname), PER_SCREEN_PROP_FORMAT 
"/image-path",
+               panel->screen, panel->monitor);
+    xfconf_channel_set_string(panel->channel, propname, list_file);
+    g_free(list_file);
+
+    xfdesktop_settings_dialog_populate_image_list(panel);
+}
+
+static void
 cb_xfdesktop_chk_custom_font_size_toggled(GtkCheckButton *button,
                                           gpointer user_data)
 {
@@ -455,6 +634,62 @@
                              
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)));
 }
 
+static gboolean
+xfdesktop_settings_save_backdrop_list(AppearancePanel *panel,
+                                      GtkTreeModel *model)
+{
+    gboolean ret = TRUE;
+    gint n_images;
+    gchar **images = NULL, *list_file;
+    GtkTreeIter iter;
+    gchar propname[1024];
+    GError *error = NULL;
+
+    n_images = gtk_tree_model_iter_n_children(model, NULL);
+    images = g_new(gchar *, n_images + 1);
+    images[n_images] = NULL;
+
+    if(gtk_tree_model_get_iter_first(model, &iter)) {
+        gint i = 0;
+
+        do {
+            gtk_tree_model_get(model, &iter,
+                               COL_FILENAME, &(images[i++]),
+                               -1);
+        } while(gtk_tree_model_iter_next(model, &iter));
+    }
+
+    g_snprintf(propname, sizeof(propname),
+               PER_SCREEN_PROP_FORMAT "/last-image-list",
+               panel->screen, panel->monitor);
+    list_file = xfconf_channel_get_string(panel->channel, propname, NULL);
+    if(!list_file) {
+        list_file = xfce_resource_save_location(XFCE_RESOURCE_CONFIG,
+                                                DEFAULT_BACKDROP_LIST, TRUE);
+        g_warning("Didn't find prop %s when saving backdrop list; using 
default %s",
+                  propname, list_file);
+    }
+
+    if(!xfdesktop_backdrop_list_save(list_file, images, &error)) {
+        gchar *primary = g_strdup_printf(_("Failed to write backdrop list to 
\"%s\""),
+                                         list_file);
+
+        
xfce_message_dialog(GTK_WINDOW(gtk_widget_get_toplevel(panel->frame_image_list)),
+                            _("Backdrop List Error"), GTK_STOCK_DIALOG_ERROR,
+                            primary, error->message,
+                            GTK_STOCK_CLOSE, GTK_RESPONSE_ACCEPT, NULL);
+
+        g_free(primary);
+        g_error_free(error);
+        ret = FALSE;
+    }
+
+    g_free(list_file);
+    g_strfreev(images);
+
+    return ret;
+}
+
 static void
 add_file_button_clicked(GtkWidget *button,
                         gpointer user_data)
@@ -503,12 +738,52 @@
         g_free(filename);
         g_free(name);
         g_free(name_utf8);
+
+        if(panel->image_list_loaded)
+            xfdesktop_settings_save_backdrop_list(panel, model);
     }
 
     gtk_widget_destroy(chooser);
 }
 
 static void
+remove_file_button_clicked(GtkWidget *button,
+                           gpointer user_data)
+{
+    AppearancePanel *panel = user_data;
+    GtkTreeSelection *sel;
+    GtkTreeModel *model = NULL;
+    GList *rows, *l;
+
+    sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(panel->image_treeview));
+    rows = gtk_tree_selection_get_selected_rows(sel, &model);
+    if(rows) {
+        GSList *rrefs = NULL, *m;
+        GtkTreeIter iter;
+
+        for(l = rows; l; l = l->next) {
+            rrefs = g_slist_prepend(rrefs, gtk_tree_row_reference_new(model,
+                                                                      
l->data));
+            gtk_tree_path_free(l->data);
+        }
+        g_list_free(rows);
+
+        for(m = rrefs; m; m = m->next) {
+            GtkTreePath *path = gtk_tree_row_reference_get_path(m->data);
+
+            if(gtk_tree_model_get_iter(model, &iter, path))
+                gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
+
+            gtk_tree_path_free(path);
+            gtk_tree_row_reference_free(m->data);
+        }
+        g_slist_free(rrefs);
+
+        xfdesktop_settings_save_backdrop_list(panel, model);
+    }
+}
+
+static void
 cb_xfdesktop_combo_color_changed(GtkComboBox *combo,
                                  gpointer user_data)
 {
@@ -532,6 +807,119 @@
     }
 }
 
+static void
+cb_image_type_radio_clicked(GtkWidget *w,
+                            gpointer user_data)
+{
+    AppearancePanel *panel = user_data;
+    gchar prop_image_show[1024], prop_image_path[1024];
+    
+    if(!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w)))
+        return;
+
+    g_snprintf(prop_image_show, sizeof(prop_image_show),
+               PER_SCREEN_PROP_FORMAT "/image-show", panel->screen,
+               panel->monitor);
+    g_snprintf(prop_image_path, sizeof(prop_image_path),
+               PER_SCREEN_PROP_FORMAT "/image-path", panel->screen,
+               panel->monitor);
+
+    if(w == panel->radio_singleimage) {
+        DBG("widget is singleimage");
+        if(!panel->image_selector_loaded) {
+            DBG("about to populate image list with avail backdrops");
+            if(!xfdesktop_settings_dialog_populate_image_list(panel)) {
+                DBG("show_image=%s", panel->show_image?"true":"false");
+                if(panel->show_image) {
+                    
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(panel->radio_imagelist),
+                                                 TRUE);
+                } else {
+                    
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(panel->radio_none),
+                                                 TRUE);
+                }
+                return;
+            }
+        }
+
+        gtk_widget_set_sensitive(panel->btn_minus, FALSE);
+        gtk_widget_set_sensitive(panel->btn_newlist, FALSE);
+        gtk_widget_set_sensitive(panel->frame_image_list, TRUE);
+        DBG("show_image=%s", panel->show_image?"true":"false");
+        if(!panel->show_image) {
+            panel->show_image = TRUE;
+            xfconf_channel_set_bool(panel->channel, prop_image_show, TRUE);
+        }
+    } else if(w == panel->radio_imagelist) {
+        DBG("widget is imagelist");
+        if(!panel->image_list_loaded) {
+            DBG("about to populate image list with backdrop list file");
+            if(!xfdesktop_settings_dialog_populate_image_list(panel)) {
+                DBG("show_image=%s", panel->show_image?"true":"false");
+                if(panel->show_image) {
+                    
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(panel->radio_singleimage),
+                                                 TRUE);
+                } else {
+                    
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(panel->radio_none),
+                                                 TRUE);
+                }
+                return;
+            }
+        }
+
+        gtk_widget_set_sensitive(panel->btn_minus, TRUE);
+        gtk_widget_set_sensitive(panel->btn_newlist, TRUE);
+        gtk_widget_set_sensitive(panel->frame_image_list, TRUE);
+        DBG("show_image=%s", panel->show_image?"true":"false");
+        if(!panel->show_image) {
+            panel->show_image = TRUE;
+            xfconf_channel_set_bool(panel->channel, prop_image_show, TRUE);
+        }
+    } else if(w == panel->radio_none) {
+        DBG("widget is none");
+        gtk_widget_set_sensitive(panel->frame_image_list, FALSE);
+        DBG("show_image=%s", panel->show_image?"true":"false");
+        if(panel->show_image) {
+            panel->show_image = FALSE;
+            xfconf_channel_set_bool(panel->channel, prop_image_show, FALSE);
+        }
+    }
+}
+
+static void
+cb_show_image_changed(XfconfChannel *channel,
+                      const gchar *property,
+                      const GValue *value,
+                      gpointer user_data)
+{
+    AppearancePanel *panel = user_data;
+
+    TRACE("entering, value=%s, panel->show_image=%s",
+          g_value_get_boolean(value)?"true":"false",
+          panel->show_image?"true":"false");
+    if(g_value_get_boolean(value) == panel->show_image)
+        return;
+
+    if(g_value_get_boolean(value)) {
+        gchar propname[1024], *filename;
+
+        g_snprintf(propname, sizeof(propname),
+                   PER_SCREEN_PROP_FORMAT "/image-path",
+                   panel->screen, panel->monitor);
+        filename = xfconf_channel_get_string(channel, propname, NULL);
+        if(filename && xfdesktop_backdrop_list_is_valid(filename)) {
+            
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(panel->radio_imagelist),
+                                         TRUE);
+        } else {
+            
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(panel->radio_singleimage),
+                                         TRUE);
+        }
+        g_free(filename);
+    } else {
+        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(panel->radio_none),
+                                     TRUE);
+    }
+}
+
 static GtkWidget *
 xfdesktop_settings_dialog_new(XfconfChannel *channel)
 {
@@ -574,7 +962,7 @@
             gchar buf[1024];
             GladeXML *appearance_gxml;
             AppearancePanel *panel = g_new0(AppearancePanel, 1);
-            GtkWidget *appearance_settings, *appearance_label, *btn;
+            GtkWidget *appearance_settings, *appearance_label;
             GtkCellRenderer *render;
             GtkTreeViewColumn *col;
 
@@ -624,17 +1012,18 @@
             /* Connect xfconf bindings */
             g_snprintf(buf, sizeof(buf), PER_SCREEN_PROP_FORMAT "/brightness",
                        i, j);
-            panel->brightness_slider =glade_xml_get_widget(appearance_gxml,
-                                                           
"slider_brightness");
+            panel->brightness_slider = glade_xml_get_widget(appearance_gxml,
+                                                            
"slider_brightness");
             xfconf_g_property_bind(channel, buf, G_TYPE_INT,
                                    
G_OBJECT(gtk_range_get_adjustment(GTK_RANGE(panel->brightness_slider))),
                                    "value");
 
             g_snprintf(buf, sizeof(buf), PER_SCREEN_PROP_FORMAT "/saturation",
                        i, j);
+            panel->saturation_slider = glade_xml_get_widget(appearance_gxml,
+                                                            
"slider_saturation");
             xfconf_g_property_bind(channel, buf, G_TYPE_DOUBLE,
-                                   
G_OBJECT(gtk_range_get_adjustment(GTK_RANGE(glade_xml_get_widget(appearance_gxml,
-                                                                               
                     "slider_saturation")))),
+                                   
G_OBJECT(gtk_range_get_adjustment(GTK_RANGE(panel->saturation_slider))),
                                    "value");
 
             w = glade_xml_get_widget(appearance_gxml, "combo_style");
@@ -674,6 +1063,9 @@
             cb_xfdesktop_combo_color_changed(GTK_COMBO_BOX(color_style_widget),
                                              panel);
 
+            panel->frame_image_list = glade_xml_get_widget(appearance_gxml,
+                                                           "frame_image_list");
+
             panel->image_treeview = glade_xml_get_widget(appearance_gxml,
                                                          "treeview_imagelist");
             render = gtk_cell_renderer_pixbuf_new();
@@ -687,13 +1079,63 @@
             gtk_tree_view_append_column(GTK_TREE_VIEW(panel->image_treeview),
                                         col);
 
-            xfdesktop_settings_dialog_populate_image_list(appearance_gxml,
-                                                          panel);
+            
g_signal_connect(G_OBJECT(gtk_tree_view_get_selection(GTK_TREE_VIEW(panel->image_treeview))),
+                             "changed",
+                             G_CALLBACK(cb_image_selection_changed), panel);
 
-            btn = glade_xml_get_widget(appearance_gxml, "btn_plus");
-            g_signal_connect(G_OBJECT(btn), "clicked",
+            panel->btn_plus = glade_xml_get_widget(appearance_gxml, 
"btn_plus");
+            g_signal_connect(G_OBJECT(panel->btn_plus), "clicked",
                              G_CALLBACK(add_file_button_clicked), panel);
 
+            panel->btn_minus = glade_xml_get_widget(appearance_gxml,
+                                                    "btn_minus");
+            g_signal_connect(G_OBJECT(panel->btn_minus), "clicked",
+                             G_CALLBACK(remove_file_button_clicked), panel);
+
+            panel->btn_newlist = glade_xml_get_widget(appearance_gxml,
+                                                      "btn_newlist");
+            g_signal_connect(G_OBJECT(panel->btn_newlist), "clicked",
+                             G_CALLBACK(newlist_button_clicked), panel);
+
+            panel->radio_singleimage = glade_xml_get_widget(appearance_gxml,
+                                                            
"radio_singleimage");
+            g_signal_connect(G_OBJECT(panel->radio_singleimage), "toggled",
+                             G_CALLBACK(cb_image_type_radio_clicked), panel);
+            panel->radio_imagelist = glade_xml_get_widget(appearance_gxml,
+                                                          "radio_imagelist");
+            g_signal_connect(G_OBJECT(panel->radio_imagelist), "toggled",
+                             G_CALLBACK(cb_image_type_radio_clicked), panel);
+            panel->radio_none = glade_xml_get_widget(appearance_gxml,
+                                                     "radio_none");
+            g_signal_connect(G_OBJECT(panel->radio_none), "toggled",
+                             G_CALLBACK(cb_image_type_radio_clicked), panel);
+            g_snprintf(buf, sizeof(buf),
+                       "property-changed::" PER_SCREEN_PROP_FORMAT 
"/image-show",
+                       i, j);
+            g_signal_connect(G_OBJECT(channel), buf,
+                             G_CALLBACK(cb_show_image_changed), panel);
+
+            if(!xfconf_channel_get_bool(channel, buf+18, TRUE)) {
+                panel->show_image = FALSE;
+                
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(panel->radio_none),
+                                             TRUE);
+            } else {
+                gchar *image_path = NULL;
+
+                panel->show_image = TRUE;
+
+                g_snprintf(buf, sizeof(buf),
+                           PER_SCREEN_PROP_FORMAT "/image-path", i, j);
+                image_path = xfconf_channel_get_string(channel, buf, NULL);
+                if(image_path && xfdesktop_backdrop_list_is_valid(image_path)) 
{
+                    
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(panel->radio_imagelist),
+                                                 TRUE);
+                } else
+                    xfdesktop_settings_dialog_populate_image_list(panel);
+                g_free(image_path);
+
+            }
+
             g_object_unref(G_OBJECT(appearance_gxml));
         }
     }

Modified: xfdesktop/trunk/settings/xfdesktop-settings.glade
===================================================================
--- xfdesktop/trunk/settings/xfdesktop-settings.glade   2008-09-08 07:46:02 UTC 
(rev 27746)
+++ xfdesktop/trunk/settings/xfdesktop-settings.glade   2008-09-08 07:46:13 UTC 
(rev 27747)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
-<!--Generated with glade3 3.4.5 on Sat Aug 30 21:21:59 2008 -->
+<!--Generated with glade3 3.4.5 on Mon Sep  8 00:43:53 2008 -->
 <glade-interface>
   <requires lib="xfce4"/>
   <widget class="XfceTitledDialog" id="prefs_dialog">
@@ -25,6 +25,7 @@
             <child>
               <widget class="GtkCheckButton" id="chk_managedesktop">
                 <property name="visible">True</property>
+                <property name="sensitive">False</property>
                 <property name="can_focus">True</property>
                 <property name="events">GDK_POINTER_MOTION_MASK | 
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | 
GDK_BUTTON_RELEASE_MASK</property>
                 <property name="label" translatable="yes">Use _Xfce to manage 
the desktop</property>
@@ -62,8 +63,9 @@
                             <child>
                               <widget class="GtkHBox" id="hbox1">
                                 <property name="visible">True</property>
+                                <property name="spacing">12</property>
                                 <child>
-                                  <widget class="GtkFrame" id="frame8">
+                                  <widget class="GtkFrame" 
id="frame_image_list">
                                     <property name="visible">True</property>
                                     <property name="label_xalign">0</property>
                                     <property 
name="shadow_type">GTK_SHADOW_NONE</property>
@@ -122,12 +124,13 @@
                                                   </packing>
                                                 </child>
                                                 <child>
-                                                  <widget class="GtkButton" 
id="btn_image_remove">
+                                                  <widget class="GtkButton" 
id="btn_minus">
                                                     <property 
name="visible">True</property>
+                                                    <property 
name="sensitive">False</property>
                                                     <property 
name="can_focus">True</property>
                                                     <property 
name="receives_default">True</property>
                                                     <property 
name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | 
GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                                    <property name="tooltip" 
translatable="yes">Remove the selected image from the list</property>
+                                                    <property name="tooltip" 
translatable="yes">Remove the selected image(s) from the list</property>
                                                     <property 
name="response_id">0</property>
                                                     <signal name="clicked" 
handler="remove_clicked"/>
                                                     <child>
@@ -146,16 +149,19 @@
                                                   </packing>
                                                 </child>
                                                 <child>
-                                                  <widget class="GtkButton" 
id="button6">
+                                                  <widget class="GtkButton" 
id="btn_newlist">
+                                                    <property 
name="visible">True</property>
+                                                    <property 
name="sensitive">False</property>
                                                     <property 
name="can_focus">True</property>
                                                     <property 
name="receives_default">True</property>
                                                     <property 
name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | 
GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                    <property name="tooltip" 
translatable="yes">Create a new list, or load an existing one</property>
                                                     <property 
name="response_id">0</property>
                                                     <child>
                                                       <widget class="GtkImage" 
id="image3">
                                                         <property 
name="visible">True</property>
                                                         <property 
name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | 
GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                                        <property 
name="stock">gtk-edit</property>
+                                                        <property 
name="stock">gtk-new</property>
                                                         <property 
name="icon_size">1</property>
                                                       </widget>
                                                     </child>
@@ -175,6 +181,7 @@
                                                   </widget>
                                                   <packing>
                                                     <property 
name="expand">False</property>
+                                                    <property 
name="padding">3</property>
                                                     <property 
name="pack_type">GTK_PACK_END</property>
                                                     <property 
name="position">3</property>
                                                   </packing>
@@ -241,9 +248,9 @@
                                                 <child>
                                                   <widget 
class="GtkRadioButton" id="radio_singleimage">
                                                     <property 
name="visible">True</property>
-                                                    <property 
name="sensitive">False</property>
                                                     <property 
name="can_focus">True</property>
                                                     <property 
name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | 
GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                    <property name="tooltip" 
translatable="yes">Select a single image as the backdrop</property>
                                                     <property name="label" 
translatable="yes">_Single image</property>
                                                     <property 
name="use_underline">True</property>
                                                     <property 
name="response_id">0</property>
@@ -258,9 +265,9 @@
                                                 <child>
                                                   <widget 
class="GtkRadioButton" id="radio_imagelist">
                                                     <property 
name="visible">True</property>
-                                                    <property 
name="sensitive">False</property>
                                                     <property 
name="can_focus">True</property>
                                                     <property 
name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | 
GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                    <property name="tooltip" 
translatable="yes">Automatically pick a random image from a list file</property>
                                                     <property name="label" 
translatable="yes">Image _list</property>
                                                     <property 
name="use_underline">True</property>
                                                     <property 
name="response_id">0</property>
@@ -276,8 +283,8 @@
                                                 <child>
                                                   <widget 
class="GtkRadioButton" id="radio_none">
                                                     <property 
name="visible">True</property>
-                                                    <property 
name="sensitive">False</property>
                                                     <property 
name="can_focus">True</property>
+                                                    <property name="tooltip" 
translatable="yes">Don't display an image at all</property>
                                                     <property name="label" 
translatable="yes">_None</property>
                                                     <property 
name="use_underline">True</property>
                                                     <property 
name="response_id">0</property>
@@ -449,6 +456,7 @@
                                                 <property 
name="visible">True</property>
                                                 <property 
name="can_focus">True</property>
                                                 <property 
name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | 
GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                <property name="tooltip" 
translatable="yes">Increase or decrease the brightness of the final 
image</property>
                                                 <property 
name="update_policy">GTK_UPDATE_DISCONTINUOUS</property>
                                                 <property name="adjustment">0 
-128 127 1 10 0</property>
                                                 <property 
name="digits">0</property>
@@ -486,6 +494,7 @@
                                                 <property 
name="visible">True</property>
                                                 <property 
name="can_focus">True</property>
                                                 <property 
name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | 
GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                                <property name="tooltip" 
translatable="yes">Increase or decrease the color saturation of the final 
image</property>
                                                 <property 
name="update_policy">GTK_UPDATE_DISCONTINUOUS</property>
                                                 <property name="adjustment">1 
-10 10 0.10000000000000001 10 0</property>
                                                 <property 
name="value_pos">GTK_POS_RIGHT</property>

_______________________________________________
Xfce4-commits mailing list
Xfce4-commits@xfce.org
http://foo-projects.org/mailman/listinfo/xfce4-commits

Reply via email to