[maemo-commits] [maemo-commits] r9233 - in projects/haf/branches/maemo-af-desktop/hildon-desktop: . src

From: subversion at stage.maemo.org subversion at stage.maemo.org
Date: Mon Jan 22 18:43:24 EET 2007
Author: jobi
Date: 2007-01-22 18:43:23 +0200 (Mon, 22 Jan 2007)
New Revision: 9233

Modified:
   projects/haf/branches/maemo-af-desktop/hildon-desktop/ChangeLog
   projects/haf/branches/maemo-af-desktop/hildon-desktop/src/hd-home-background-dialog.c
   projects/haf/branches/maemo-af-desktop/hildon-desktop/src/hd-home-background-dialog.h
   projects/haf/branches/maemo-af-desktop/hildon-desktop/src/hd-home-background.c
   projects/haf/branches/maemo-af-desktop/hildon-desktop/src/hd-home-background.h
   projects/haf/branches/maemo-af-desktop/hildon-desktop/src/hd-home-window.c
Log:

2007-01-22  Johan Bilien  <johan.bilien at nokia.com>

	* src/hd-home-background.c:
	- copy the color when setting the property.
	- be sure not to send NULL strings to DBus.
	* src/hd-home-window.c:
	- added background_apply_and_save_callback callback for background
	setting, which saves the background after it's set.
	- added response to the background dialog. Ok and Preview implemented.
	* src/hd-home-background-dialog.c:
	- set the combobox to the correct item when applying existing
	background settings.
	- connect file-chooser dialog.
	- reflect changes to the combobox to the current background.
	- added _get_background method



Modified: projects/haf/branches/maemo-af-desktop/hildon-desktop/ChangeLog
===================================================================
--- projects/haf/branches/maemo-af-desktop/hildon-desktop/ChangeLog	2007-01-22 16:14:28 UTC (rev 9232)
+++ projects/haf/branches/maemo-af-desktop/hildon-desktop/ChangeLog	2007-01-22 16:43:23 UTC (rev 9233)
@@ -1,3 +1,19 @@
+2007-01-22  Johan Bilien  <johan.bilien at nokia.com>
+
+	* src/hd-home-background.c:
+	- copy the color when setting the property.
+	- be sure not to send NULL strings to DBus.
+	* src/hd-home-window.c:
+	- added background_apply_and_save_callback callback for background
+	setting, which saves the background after it's set.
+	- added response to the background dialog. Ok and Preview implemented.
+	* src/hd-home-background-dialog.c:
+	- set the combobox to the correct item when applying existing
+	background settings.
+	- connect file-chooser dialog.
+	- reflect changes to the combobox to the current background.
+	- added _get_background method
+
 2007-01-22  Lucas Rocha  <lucas.rocha at nokia.com>
 
 	* src/hd-home-background-dialog.c: make osso-help related code chunks

Modified: projects/haf/branches/maemo-af-desktop/hildon-desktop/src/hd-home-background-dialog.c
===================================================================
--- projects/haf/branches/maemo-af-desktop/hildon-desktop/src/hd-home-background-dialog.c	2007-01-22 16:14:28 UTC (rev 9232)
+++ projects/haf/branches/maemo-af-desktop/hildon-desktop/src/hd-home-background-dialog.c	2007-01-22 16:43:23 UTC (rev 9233)
@@ -1,4 +1,3 @@
-/* -*- mode:C; c-file-style:"gnu"; -*- */
 /*
  * This file is part of hildon-desktop
  *
@@ -78,9 +77,6 @@
 #define HILDON_HOME_FILE_CHOOSER_EMPTY_PROP   "empty-text"
 #define HILDON_HOME_FILE_CHOOSER_EMPTY        _("home_li_no_images")
 
-#define HILDON_HOME_SET_BG_RESPONSE_IMAGE    GTK_RESPONSE_YES
-#define HILDON_HOME_SET_BG_RESPONSE_PREVIEW  GTK_RESPONSE_APPLY
-
 #define HILDON_HOME_BACKGROUND_NO_IMAGE  "no_image"
 
 
@@ -108,7 +104,7 @@
 {
   gchar            *background_dir;
   GtkListStore     *combobox_contents;
-  GtkTreeIter       active_iter;
+  GtkTreePath      *custom_image;
   GtkWidget        *color_button;
   GtkWidget        *img_combo;
   GtkWidget        *mode_combo;
@@ -117,7 +113,6 @@
 #endif
   
   HDHomeBackground *background;
-  HDHomeBackground *original_background;
 };
 
 static void
@@ -160,6 +155,24 @@
 hd_home_background_dialog_mode_changed (HDHomeBackgroundDialog *dialog);
 
 static void
+hd_home_background_dialog_finalize (GObject *object);
+
+static gchar *
+imagename_from_filename (const gchar *filename)
+{
+  gchar *tmp;
+  gchar *imagename;
+
+  tmp = g_filename_from_uri (filename, NULL, NULL);
+  if (!tmp)
+    tmp = g_strdup (filename);
+
+  imagename = g_filename_display_basename (tmp);
+
+  return imagename;
+}
+
+static void
 hd_home_background_dialog_class_init (HDHomeBackgroundDialogClass *klass)
 {
   GParamSpec       *pspec;
@@ -171,6 +184,7 @@
 
   object_class->set_property = hd_home_background_dialog_set_property;
   object_class->get_property = hd_home_background_dialog_get_property;
+  object_class->finalize = hd_home_background_dialog_finalize;
 
   dialog_class->response = hd_home_background_dialog_response;
 
@@ -357,16 +371,16 @@
                           g_value_get_string (value));
         break;
 
-#ifdef HAVE_LIBOSSOHELP
     case PROP_OSSO_CONTEXT:
         priv->osso_context = g_value_get_pointer (value);
-
+#ifdef HAVE_LIBOSSOHELP
+        /* Add help button */
         if (priv->osso_context)
           ossohelp_dialog_help_enable (GTK_DIALOG (gobject),
                                        HH_HELP_SET_BACKGROUND,
                                        priv->osso_context);
+#endif
         break;
-#endif
         
     case PROP_BACKGROUND:
         hd_home_background_dialog_set_background (
@@ -410,23 +424,43 @@
   }
 }
 
-#if 0
-static gboolean
-home_bgd_select_file_dialog (GtkWidget   * parent,
-			     GtkComboBox * box,
-			     gboolean      built_in)
+static void
+hd_home_background_dialog_finalize (GObject *object)
 {
-  GtkTreeModel *tree = gtk_combo_box_get_model (box);
-  GtkWidget *dialog;
-  GtkFileFilter *mime_type_filter;
-  gint response;
-  gchar *name_str, *dot;
-  gchar *chooser_name;
-  gchar *image_dir;
+  HDHomeBackgroundDialogPrivate    *priv;
+
+  priv = HD_HOME_BACKGROUND_DIALOG_GET_PRIVATE (object);
+
+  if (priv->background)
+    {
+      g_object_unref (priv->background);
+      priv->background = NULL;
+    }
+
+  if (priv->custom_image)
+    {
+      gtk_tree_path_free (priv->custom_image);
+      priv->custom_image = NULL;
+    }
+
+  g_free (priv->background_dir);
+  priv->background_dir = NULL;
+
+}
+
+static void
+hd_home_background_dialog_file_select (HDHomeBackgroundDialog *dialog)
+{
+  HDHomeBackgroundDialogPrivate    *priv;
+  GtkWidget                        *fdialog;
+  GtkFileFilter                    *mime_type_filter;
+  gint                              response;
+  gchar                            *image_dir;
+
+  priv = HD_HOME_BACKGROUND_DIALOG_GET_PRIVATE (dialog);
   
-  dialog =
-    hildon_file_chooser_dialog_new_with_properties(
-					  GTK_WINDOW(parent),
+  fdialog = hildon_file_chooser_dialog_new_with_properties(
+					  GTK_WINDOW (dialog),
 					  HILDON_HOME_FILE_CHOOSER_ACTION_PROP,
 					  GTK_FILE_CHOOSER_ACTION_OPEN,
 					  HILDON_HOME_FILE_CHOOSER_TITLE_PROP,
@@ -438,9 +472,16 @@
 					  NULL);
 
 #ifdef HAVE_LIBOSSOHELP
+<<<<<<< .mine
+  if (priv->osso_context)
+    ossohelp_dialog_help_enable (GTK_DIALOG(fdialog), 
+                                 HH_HELP_SELECT_IMAGE,
+                                 priv->osso_context);
+=======
   ossohelp_dialog_help_enable(GTK_DIALOG(dialog), 
 			      HILDON_HOME_SELECT_IMAGE_HELP_TOPIC,
 			      home_get_osso_context ());
+>>>>>>> .r9232
 #endif
         
   mime_type_filter = gtk_file_filter_new();
@@ -450,129 +491,112 @@
   gtk_file_filter_add_mime_type (mime_type_filter, "image/bmp");
   gtk_file_filter_add_mime_type (mime_type_filter, "image/tiff");
   gtk_file_filter_add_mime_type (mime_type_filter, "sketch/png");
+  gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (fdialog),
+                               mime_type_filter);
 
-  gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (dialog),
-			       mime_type_filter);
-
-  image_dir = g_build_path("/",
-                           g_getenv ("HOME"),
+  image_dir = g_build_path(G_DIR_SEPARATOR_S,
+                           g_get_home_dir (),
                            HILDON_HOME_HC_USER_IMAGE_DIR,
                            NULL);
 
-  if(!gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER (dialog),
-                                          image_dir))
+  if (!gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (fdialog),
+                                            image_dir))
     g_warning ("Couldn't set default image dir for dialog %s", 
                image_dir);
 
   g_free (image_dir);
   
-  response = gtk_dialog_run (GTK_DIALOG (dialog));
+  response = gtk_dialog_run (GTK_DIALOG (fdialog));
     
   if (response == GTK_RESPONSE_OK) 
     {
+      const gchar  *filename;
 
-      chooser_name = 
-          gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (dialog));
+      filename = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (fdialog));
 
-      name_str = g_filename_from_uri (chooser_name, NULL, NULL);
-      if (!name_str)
-        name_str = g_strdup (chooser_name);
+      if (filename) 
+        {
+          GtkTreeModel *model;
+          GtkTreeIter   iter;            
+          gchar        *name;
 
-      /* remove extension */
-      if ((dot = g_strrstr (name_str, ".")) && dot != name_str)
-        *dot = '\0';
+          name = imagename_from_filename (filename);
 
-      if (name_str && *name_str) 
-        {
-          GtkTreeIter iter;            
-          GtkTreePath *path;
-          gint priority = 0;
-          gtk_list_store_append (GTK_LIST_STORE (tree), &iter);
+          model = GTK_TREE_MODEL (priv->combobox_contents);
 
-          gtk_list_store_set (GTK_LIST_STORE (tree),
-                             &iter,
-                             BG_IMAGE_NAME, name_str,
-                             BG_IMAGE_FILENAME, chooser_name,
-                             BG_IMAGE_PRIORITY, G_MAXINT, -1);
+          if (priv->custom_image)
+            {
+              gtk_tree_model_get_iter (model,
+                                       &iter,
+                                       priv->custom_image);
+              gtk_list_store_remove (priv->combobox_contents,
+                                     &iter);
+              gtk_tree_path_free (priv->custom_image);
+            }
 
-          gtk_combo_box_set_active_iter (box, &iter);
+          gtk_list_store_append (priv->combobox_contents,
+                                 &iter);
+          
+          priv->custom_image = gtk_tree_model_get_path (model,
+                                                        &iter);
 
-          path = gtk_tree_model_get_path (tree, &iter);
-          gtk_tree_path_next (path);
+          gtk_list_store_set (priv->combobox_contents,
+                              &iter,
+                              BG_IMAGE_NAME, name?name:filename,
+                              BG_IMAGE_FILENAME, filename,
+                              BG_IMAGE_PRIORITY, G_MAXINT,
+                              -1);
 
-          if (gtk_tree_model_get_iter (tree, &iter, path)) 
-            {
-              priority = home_bgd_get_priority (tree, &iter);
-              if (priority == G_MAXINT) 
-                {
-                  gtk_list_store_remove(GTK_LIST_STORE(tree), &iter);
-
-                }
-            }
-          gtk_tree_path_free(path);
+          gtk_combo_box_set_active_iter (GTK_COMBO_BOX (priv->img_combo),
+                                         &iter);
+          g_free (name);
         }
 
-      /* Clean up */
-      g_free(name_str);
-      gtk_widget_destroy(dialog);    
-
-      return TRUE;
     }  
 
-  gtk_widget_destroy(dialog);
+  gtk_widget_destroy (fdialog);
 
-  return FALSE;
 }
-#endif
 
 static void
 hd_home_background_dialog_response (GtkDialog *dialog, 
                                     gint       arg)
 {
-  HDHomeBackgroundDialogPrivate *priv;
+  HDHomeBackgroundDialog        *background_dialog;
 
-  priv = HD_HOME_BACKGROUND_DIALOG_GET_PRIVATE (dialog);
+  background_dialog = HD_HOME_BACKGROUND_DIALOG (dialog);
 
-#if 0
-  g_debug ("response_data = {\n"
-           "  img_combo    .= %s\n"
-           "  mode_combo   .= %s\n"
-           "  color_button .= %s\n"
-           "  applied      .= %s\n"
-           "  built_in     .= %s\n"
-           "  has_preview  .= %s\n"
-           "}",
-           g_type_name (G_OBJECT_TYPE (d->img_combo)),
-           g_type_name (G_OBJECT_TYPE (d->mode_combo)),
-           g_type_name (G_OBJECT_TYPE (d->color_button)),
-           d->applied ? "<true>" : "<false>",
-           d->built_in ? "<true>" : "<false>",
-           d->has_preview ? "<true>" : "<false>");
-#endif
-
-  switch (arg) 
-    {
-      case HILDON_HOME_SET_BG_RESPONSE_IMAGE:
-      /*    home_bgd_select_file_dialog (dialog, img_combo, d->built_in);*/
-          break;
-      case HILDON_HOME_SET_BG_RESPONSE_PREVIEW:
-          break;
-      case GTK_RESPONSE_OK:
-          gtk_widget_hide (GTK_WIDGET(dialog));
-          break;
-      case GTK_RESPONSE_CANCEL:
-      case GTK_RESPONSE_DELETE_EVENT:
-          gtk_widget_hide (GTK_WIDGET (dialog));
-          break;
-      default:
-          break;
-    }
-
+  if (arg == HILDON_HOME_SET_BG_RESPONSE_IMAGE)
+    hd_home_background_dialog_file_select (background_dialog);
 }
 
 static void
 hd_home_background_dialog_filename_changed (HDHomeBackgroundDialog *dialog)
 {
+  HDHomeBackgroundDialogPrivate    *priv;
+  GtkTreeIter                       iter;
+  gchar                            *filename;
+  
+  priv = HD_HOME_BACKGROUND_DIALOG_GET_PRIVATE (dialog);
+
+  gtk_combo_box_get_active_iter (GTK_COMBO_BOX (priv->img_combo),
+                                 &iter);
+
+  gtk_tree_model_get (GTK_TREE_MODEL (priv->combobox_contents),
+                      &iter,
+                      BG_IMAGE_FILENAME, &filename,
+                      -1);
+
+  if (filename)
+    g_object_set (G_OBJECT (priv->background),
+                  "filename", filename,
+                  NULL);
+  else
+    g_object_set (G_OBJECT (priv->background),
+                  "filename", HD_HOME_BACKGROUND_NO_IMAGE,
+                  NULL);
+
+  g_free (filename);
 }
 
 static void
@@ -664,6 +688,10 @@
                       BG_IMAGE_FILENAME, NULL,
                       BG_IMAGE_PRIORITY, 0, -1);
 
+  /* It's the default */
+  gtk_combo_box_set_active_iter (GTK_COMBO_BOX (priv->img_combo),
+                                 &iterator);
+
   kfile = g_key_file_new ();
 
   while ((image_desc_file = g_dir_read_name (dir)))
@@ -710,41 +738,6 @@
 
       if (error) goto end_of_loop;
 
-#if 0
-      current_uri = background_manager_get_image_uri (bm);
-
-      if (current_uri)
-        {
-          gchar *current_path;
-          GError *error = NULL;
-
-          current_path = g_filename_from_uri (current_uri, NULL, &error);
-          if (error)
-            {
-              g_warning ("Unable to get the filename from uri `%s': %s",
-                         current_uri,
-                         error->message);
-
-              g_error_free (error);
-
-              /* we let the background manager deal with it */
-              current_path = g_strdup (current_uri);
-            }
-
-          g_debug ("current filename [%s], processing [%s]",
-                   current_path, image_path);
-
-          if (image_path &&
-              g_str_equal(image_path, current_path)) 
-            {
-              g_debug ("current BG uses built in image");
-              resp_data->built_in = TRUE;
-            }
-
-          g_free (current_path);
-        }
-#endif
-
       gtk_list_store_append (priv->combobox_contents, &iterator);
 
       gtk_list_store_set (priv->combobox_contents,
@@ -785,7 +778,6 @@
   gchar                            *filename;
   GdkColor                         *color;
   BackgroundMode                    mode;
-  GtkTreeIter                       iter;
 
   g_return_if_fail (HD_IS_HOME_BACKGROUND_DIALOG (dialog));
   priv = HD_HOME_BACKGROUND_DIALOG_GET_PRIVATE (dialog);
@@ -799,29 +791,56 @@
                 "mode", &mode,
                 NULL);
 
-  if (filename)
+  if (filename && *filename && 
+      !g_str_equal (filename, HD_HOME_BACKGROUND_NO_IMAGE))
     {
-      gchar    *image_name;
-      GError   *error = NULL;
+      gboolean      valid;
+      GtkTreeIter   iter;
+      GtkTreeModel *model;
 
-      image_name = g_filename_from_uri (filename, NULL, &error);
-      if (error)
+      model = GTK_TREE_MODEL (priv->combobox_contents);
+
+      valid = gtk_tree_model_get_iter_first (model, &iter);
+
+      while (valid)
         {
-          g_warning ("Could not get image name: %s", error->message);
-          g_error_free (error);
-          image_name = g_filename_display_basename (filename);
+          gchar *existing_filename = NULL;
+
+          gtk_tree_model_get (model,
+                              &iter,
+                              BG_IMAGE_FILENAME, &existing_filename,
+                              -1);
+
+          if (existing_filename && g_str_equal (existing_filename, filename))
+            break;
+
+          valid = gtk_tree_model_iter_next (model, &iter);
         }
 
-      gtk_list_store_append (priv->combobox_contents, &iter);
+      if (!valid)
+        {
+          gchar *image_name = imagename_from_filename (filename);
 
-      gtk_list_store_set (priv->combobox_contents,
-                          &iter,
-                          BG_IMAGE_FILENAME, filename,
-                          BG_IMAGE_NAME, image_name,
-                          BG_IMAGE_PRIORITY, G_MAXINT,
-                          -1);
+          gtk_list_store_append (priv->combobox_contents, &iter);
 
-      g_free (image_name);
+          gtk_list_store_set (priv->combobox_contents,
+                              &iter,
+                              BG_IMAGE_FILENAME, filename,
+                              BG_IMAGE_NAME, image_name,
+                              BG_IMAGE_PRIORITY, G_MAXINT,
+                              -1);
+
+          if (priv->custom_image)
+            gtk_tree_path_free (priv->custom_image);
+
+          priv->custom_image = gtk_tree_model_get_path (model, &iter);
+
+          g_free (image_name);
+        }
+
+      gtk_combo_box_set_active_iter (GTK_COMBO_BOX (priv->img_combo),
+                                     &iter);
+
       g_free (filename);
     }
 
@@ -868,10 +887,18 @@
 
   priv->background = g_object_ref (background);
 
-  if (!priv->original_background)
-    priv->original_background = hd_home_background_copy (background);
-
   g_object_notify (G_OBJECT (dialog), "background");
   hd_home_background_dialog_sync_from_background (dialog);
 
 }
+
+HDHomeBackground *
+hd_home_background_dialog_get_background (HDHomeBackgroundDialog *dialog)
+{
+  HDHomeBackgroundDialogPrivate *priv;
+
+  g_return_val_if_fail (HD_IS_HOME_BACKGROUND_DIALOG (dialog), NULL);
+  priv = HD_HOME_BACKGROUND_DIALOG_GET_PRIVATE (dialog);
+
+  return priv->background;
+}

Modified: projects/haf/branches/maemo-af-desktop/hildon-desktop/src/hd-home-background-dialog.h
===================================================================
--- projects/haf/branches/maemo-af-desktop/hildon-desktop/src/hd-home-background-dialog.h	2007-01-22 16:14:28 UTC (rev 9232)
+++ projects/haf/branches/maemo-af-desktop/hildon-desktop/src/hd-home-background-dialog.h	2007-01-22 16:43:23 UTC (rev 9233)
@@ -27,6 +27,7 @@
 #define __HD_HOME_BACKGROUND_DIALOG_H__
 
 #include <gtk/gtkdialog.h>
+#include "hd-home-background.h"
 
 G_BEGIN_DECLS
 
@@ -41,6 +42,10 @@
 #define HD_IS_HOME_BACKGROUND_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  HD_TYPE_HOME_BACKGROUND_DIALOG))
 #define HD_HOME_BACKGROUND_DIALOG_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  HD_TYPE_HOME_BACKGROUND_DIALOG, HDHomeBackgroundDialogClass))
 
+#define HILDON_HOME_SET_BG_RESPONSE_IMAGE    GTK_RESPONSE_YES
+#define HILDON_HOME_SET_BG_RESPONSE_PREVIEW  GTK_RESPONSE_APPLY
+
+
 struct _HDHomeBackgroundDialog
 {
   GtkDialog parent;
@@ -57,6 +62,9 @@
 
 GType  hd_home_background_dialog_get_type  (void);
 
+HDHomeBackground *    hd_home_background_dialog_get_background
+                                            (HDHomeBackgroundDialog *dialog);
+
 G_END_DECLS
 
 #endif /* __HD_HOME_BACKGROUND_DIALOG_H__ */

Modified: projects/haf/branches/maemo-af-desktop/hildon-desktop/src/hd-home-background.c
===================================================================
--- projects/haf/branches/maemo-af-desktop/hildon-desktop/src/hd-home-background.c	2007-01-22 16:14:28 UTC (rev 9232)
+++ projects/haf/branches/maemo-af-desktop/hildon-desktop/src/hd-home-background.c	2007-01-22 16:43:23 UTC (rev 9233)
@@ -40,6 +40,7 @@
 
 #include <glib/gkeyfile.h>
 
+/* Key used in the home-background.conf */
 #define HD_HOME_BACKGROUND_KEY_GROUP            "Hildon Home"
 #define HD_HOME_BACKGROUND_KEY_URI              "BackgroundImage"
 #define HD_HOME_BACKGROUND_KEY_SIDEBAR          "SidebarImage"
@@ -51,7 +52,8 @@
 #define HD_HOME_BACKGROUND_KEY_BLUE             "Blue"
 #define HD_HOME_BACKGROUND_KEY_MODE             "Mode"
 
-#define HD_HOME_BACKGROUND_VALUE_NO_IMAGE       "no-image"
+/* Some pre-defined values */
+#define HD_HOME_BACKGROUND_VALUE_NO_IMAGE       HD_HOME_BACKGROUND_NO_IMAGE
 #define HD_HOME_BACKGROUND_VALUE_CENTERED       "Centered"
 #define HD_HOME_BACKGROUND_VALUE_STRETCHED      "Stretched"
 #define HD_HOME_BACKGROUND_VALUE_SCALED         "Scaled"
@@ -103,8 +105,6 @@
       G_TYPE_INSTANCE_GET_PRIVATE ((background),
                                    HD_TYPE_HOME_BACKGROUND,
                                    HDHomeBackgroundPrivate);
-
-  background->priv->color = g_new0 (GdkColor, 1);
 }
 
 static void
@@ -208,7 +208,8 @@
   g_free (priv->south_border);
   priv->south_border = NULL;
 
-  g_free (priv->color);
+  if (priv->color)
+    gdk_color_free (priv->color);
   priv->color = NULL;
 
 }
@@ -225,7 +226,11 @@
     {
       case PROP_FILENAME:
           g_free (priv->filename);
-          priv->filename = g_strdup (g_value_get_string (value));
+          if (g_str_equal (g_value_get_string (value),
+                           HD_HOME_BACKGROUND_NO_IMAGE))
+            priv->filename = g_strdup ("");
+          else
+            priv->filename = g_strdup (g_value_get_string (value));
           break;
       case PROP_NORTH_BORDER:
           g_free (priv->north_border);
@@ -247,8 +252,9 @@
           priv->mode = g_value_get_int (value);
           break;
       case PROP_COLOR:
-          g_free (priv->color);
-          priv->color = g_value_get_pointer (value);
+          if (priv->color)
+            gdk_color_free (priv->color);
+          priv->color = gdk_color_copy (g_value_get_pointer (value));
           break;
       default:
           G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -473,6 +479,10 @@
                                       HD_HOME_BACKGROUND_KEY_GROUP,
                                       HD_HOME_BACKGROUND_KEY_RED,
                                       &local_error);
+
+  if (!priv->color)
+    priv->color = g_new0 (GdkColor, 1);
+
   if (local_error)
     {
       priv->color->red = 0;
@@ -551,7 +561,7 @@
   DBusGConnection      *connection;
   GError               *local_error = NULL;
   gint                  pixmap_xid;
-  GdkPixmap            *pixmap;
+  GdkPixmap            *pixmap = NULL;
 
   g_return_if_fail (HD_IS_HOME_BACKGROUND (background) && window);
   priv = background->priv;
@@ -571,19 +581,22 @@
 
   g_debug ("Trying to apply background to window: %x", (int)GDK_WINDOW_XID(window));
 
+#define S(string) (string?string:"")
   org_maemo_hildon_background_manager_set_background (background_manager_proxy,
                                                       GDK_WINDOW_XID (window),
-                                                      priv->filename,
-                                                      priv->west_border,
-                                                      priv->north_border,
+                                                      S(priv->filename),
+                                                      S(priv->west_border),
+                                                      S(priv->north_border),
                                                       priv->color->red,
                                                       priv->color->green,
                                                       priv->color->blue,
                                                       priv->mode,
                                                       &pixmap_xid,
                                                       error);
+#undef S
 
-  pixmap = gdk_pixmap_foreign_new (pixmap_xid);
+  if (pixmap_xid)
+    pixmap = gdk_pixmap_foreign_new (pixmap_xid);
 
   if (pixmap)
     {
@@ -683,19 +696,24 @@
   data->user_data = user_data;
   data->window = window;
 
+  g_debug ("Applying background %s aynchronously",
+           priv->filename);
+
   /* Here goes */
+#define S(string) (string?string:"")
   org_maemo_hildon_background_manager_set_background_async 
                                                 (background_manager_proxy,
                                                  GDK_WINDOW_XID (window),
-                                                 priv->filename,
-                                                 priv->west_border,
-                                                 priv->north_border,
+                                                 S(priv->filename),
+                                                 S(priv->west_border),
+                                                 S(priv->north_border),
                                                  priv->color->red,
                                                  priv->color->green,
                                                  priv->color->blue,
                                                  priv->mode,
                                                  (org_maemo_hildon_background_manager_set_background_reply) hd_home_background_apply_async_dbus_callback,
                                                  data);
+#undef S
 }
 
 HDHomeBackground *

Modified: projects/haf/branches/maemo-af-desktop/hildon-desktop/src/hd-home-background.h
===================================================================
--- projects/haf/branches/maemo-af-desktop/hildon-desktop/src/hd-home-background.h	2007-01-22 16:14:28 UTC (rev 9232)
+++ projects/haf/branches/maemo-af-desktop/hildon-desktop/src/hd-home-background.h	2007-01-22 16:43:23 UTC (rev 9233)
@@ -41,6 +41,8 @@
 #define HD_IS_HOME_BACKGROUND_CLASS(klass)      (G_TYPE_CHECK_CLASS_TYPE ((klass),  HD_TYPE_HOME_BACKGROUND))
 #define HD_HOME_BACKGROUND_GET_CLASS(obj)       (G_TYPE_INSTANCE_GET_CLASS ((obj),  HD_TYPE_HOME_BACKGROUND, HDHomeBackgroundClass))
 
+#define HD_HOME_BACKGROUND_NO_IMAGE             "no-image"
+
 struct _HDHomeBackground
 {
   GObject                       parent;

Modified: projects/haf/branches/maemo-af-desktop/hildon-desktop/src/hd-home-window.c
===================================================================
--- projects/haf/branches/maemo-af-desktop/hildon-desktop/src/hd-home-window.c	2007-01-22 16:14:28 UTC (rev 9232)
+++ projects/haf/branches/maemo-af-desktop/hildon-desktop/src/hd-home-window.c	2007-01-22 16:43:23 UTC (rev 9233)
@@ -271,7 +271,7 @@
   background = g_object_new (HD_TYPE_HOME_BACKGROUND, NULL);
 
   conffile = g_build_path (G_DIR_SEPARATOR_S,
-                           g_getenv ("HOME"),
+                           g_get_home_dir (),
                            HD_DESKTOP_USER_PATH,
                            HD_HOME_BACKGROUND_CONF_FILE,
                            NULL);
@@ -374,6 +374,7 @@
                            GError           *error,
                            HDHomeWindow     *window)
 {
+  HDHomeWindowPrivate  *priv;
   g_debug ("Background applied!");
 
   if (error)
@@ -385,8 +386,58 @@
 
   gdk_window_clear (GTK_WIDGET (window)->window);
   gtk_widget_queue_draw (GTK_WIDGET (window));
+  
+  priv = HD_HOME_WINDOW_GET_PRIVATE (window);
+
+  if (background != priv->background)
+    {
+      if (priv->background)
+        g_object_unref (priv->background);
+      priv->background = g_object_ref (background);
+    }
+ 
 }
 
+static void
+background_apply_and_save_callback (HDHomeBackground *background,
+                                    gint              pixmap_xid,
+                                    GError           *error,
+                                    HDHomeWindow     *window)
+{
+  HDHomeWindowPrivate  *priv;
+  gchar                *conffile;
+  GError               *save_error = NULL;
+
+  background_apply_callback (background, pixmap_xid, error, window);
+
+  /* Do not save if an error occurred */
+  if (error)
+    return;
+
+  conffile = g_build_path (G_DIR_SEPARATOR_S,
+                           g_get_home_dir (),
+                           HD_DESKTOP_USER_PATH,
+                           HD_HOME_BACKGROUND_CONF_FILE,
+                           NULL);
+  
+  priv = HD_HOME_WINDOW_GET_PRIVATE (window);
+  
+  hd_home_background_save (priv->background,
+                           conffile,
+                           &save_error);
+
+  if (save_error)
+    {
+      g_warning ("Error when saving background settings to %s: %s",
+                 conffile,
+                 error->message);
+      g_error_free (save_error);
+    }
+
+  g_free (conffile);
+
+}
+
 static gboolean
 hd_home_window_map_event (GtkWidget    *widget,
                           GdkEventAny  *event)
@@ -980,6 +1031,43 @@
 }
 
 static void
+hd_home_window_set_background_reponse (HDHomeWindow *window,
+                                       gint response,
+                                       GtkDialog *dialog)
+{
+  HDHomeBackground *background;
+
+  background =
+      hd_home_background_dialog_get_background (HD_HOME_BACKGROUND_DIALOG (dialog));
+
+  switch (response)
+    {
+      case GTK_RESPONSE_OK:
+          gtk_widget_hide (GTK_WIDGET(dialog));
+          hd_home_background_apply_async 
+              (background,
+               GTK_WIDGET (window)->window,
+               (HDHomeBackgroundApplyCallback)background_apply_and_save_callback,
+               window);
+          break;
+      case HILDON_HOME_SET_BG_RESPONSE_PREVIEW:
+          hd_home_background_apply_async 
+              (background,
+               GTK_WIDGET (window)->window,
+               (HDHomeBackgroundApplyCallback)background_apply_callback,
+               window);
+
+          break;
+      case GTK_RESPONSE_CANCEL:
+      case GTK_RESPONSE_DELETE_EVENT:
+          gtk_widget_hide (GTK_WIDGET (dialog));
+          break;
+      default:
+          break;
+    }
+}
+
+static void
 hd_home_window_set_background_activate (HDHomeWindow *window)
 {
   HDHomeWindowPrivate      *priv = HD_HOME_WINDOW_GET_PRIVATE (window);
@@ -991,7 +1079,10 @@
                          "background", priv->background,
                          NULL);
 
-  gtk_dialog_run (GTK_DIALOG (dialog));
+  g_signal_connect_swapped (dialog, "response",
+                            G_CALLBACK (hd_home_window_set_background_reponse),
+                            window);
 
-  gtk_widget_destroy (dialog);
+  gtk_widget_show (dialog);
+
 }


More information about the maemo-commits mailing list