summaryrefslogtreecommitdiff
path: root/libnautilus-extensions
diff options
context:
space:
mode:
authorMike Engber <engber@src.gnome.org>2000-08-11 21:38:28 +0000
committerMike Engber <engber@src.gnome.org>2000-08-11 21:38:28 +0000
commit9c048d9573bfe63e75d88cb9bbb9b69abfcecac0 (patch)
tree67a95cb8b2668c1c7db8c4d2df893d02d9942ce1 /libnautilus-extensions
parenta0f4fa57f0ccd83e13d12d90c9213afa53fe088a (diff)
downloadnautilus-9c048d9573bfe63e75d88cb9bbb9b69abfcecac0.tar.gz
First cut at syncing our desktop background with GNOME's (bug 1047) Still
First cut at syncing our desktop background with GNOME's (bug 1047) Still need to handle centered & scaled images + update issues. * libnautilus-extensions/nautilus-background.c: (nautilus_background_initialize_class): * libnautilus-extensions/nautilus-directory-background.c: (nautilus_directory_background_set_desktop), (nautilus_directory_background_is_desktop), (theme_image_path_to_uri), (nautilus_directory_background_get_default_settings), (nautilus_gnome_config_string_match_no_case), (nautilus_directory_background_read_desktop_settings), (nautilus_directory_background_write_desktop_settings), (nautilus_directory_background_write_desktop_default_settings), (nautilus_directory_background_is_set), (background_changed_callback), (directory_changed_callback), (nautilus_directory_background_theme_changed), (background_reset_callback), (nautilus_connect_background_to_directory_metadata), (nautilus_connect_desktop_background_to_directory_metadata): * libnautilus-extensions/nautilus-directory-background.h: * src/file-manager/fm-icon-view.c: (fm_icon_view_begin_loading):
Diffstat (limited to 'libnautilus-extensions')
-rw-r--r--libnautilus-extensions/nautilus-background.c2
-rw-r--r--libnautilus-extensions/nautilus-directory-background.c472
-rw-r--r--libnautilus-extensions/nautilus-directory-background.h12
3 files changed, 336 insertions, 150 deletions
diff --git a/libnautilus-extensions/nautilus-background.c b/libnautilus-extensions/nautilus-background.c
index 789e33791..28fc198ec 100644
--- a/libnautilus-extensions/nautilus-background.c
+++ b/libnautilus-extensions/nautilus-background.c
@@ -110,7 +110,7 @@ nautilus_background_initialize_class (gpointer klass)
0);
signals[RESET] =
gtk_signal_new ("reset",
- GTK_RUN_FIRST | GTK_RUN_NO_RECURSE,
+ GTK_RUN_LAST | GTK_RUN_NO_RECURSE,
object_class->type,
GTK_SIGNAL_OFFSET (NautilusBackgroundClass,
reset),
diff --git a/libnautilus-extensions/nautilus-directory-background.c b/libnautilus-extensions/nautilus-directory-background.c
index e01c00dc2..6adf2604d 100644
--- a/libnautilus-extensions/nautilus-directory-background.c
+++ b/libnautilus-extensions/nautilus-directory-background.c
@@ -34,6 +34,7 @@
#include "nautilus-metadata.h"
#include "nautilus-string.h"
#include "nautilus-theme.h"
+#include "libnautilus-extensions/nautilus-gdk-extensions.h"
static void background_changed_callback (NautilusBackground *background,
NautilusDirectory *directory);
@@ -42,6 +43,236 @@ static void directory_changed_callback (NautilusDirectory *directory,
static void background_reset_callback (NautilusBackground *background,
NautilusDirectory *directory);
+void
+static nautilus_directory_background_set_desktop (NautilusBackground *background)
+{
+ gtk_object_set_data (GTK_OBJECT (background), "desktop", (void *) -1);
+}
+
+static gboolean
+nautilus_directory_background_is_desktop (NautilusBackground *background)
+{
+ return gtk_object_get_data (GTK_OBJECT (background), "desktop") != NULL;
+}
+
+
+/* utility routine to handle mapping local image files in themes to a uri */
+static char*
+theme_image_path_to_uri (char *image_file)
+{
+ char *image_path;
+ char *image_uri;
+
+ if (image_file != NULL && !nautilus_istr_has_prefix (image_file, "file://")) {
+
+ if (nautilus_str_has_prefix (image_file, "./")) {
+ image_path = nautilus_theme_get_image_path (image_file + 2);
+ } else {
+ image_path = g_strdup_printf ("%s/%s", NAUTILUS_DATADIR, image_file);
+ }
+
+ g_assert (g_file_exists (image_path));
+
+ image_uri = nautilus_get_uri_from_local_path (image_path);
+ g_free (image_path);
+ } else {
+ image_uri = g_strdup (image_file);
+ }
+
+ return image_uri;
+}
+
+/* FIXME combine mode (image over gradient) does not work for the GNOME desktop.
+ * None of our themes currently specify this for the desktop.
+ */
+
+static void
+nautilus_directory_background_get_default_settings (gboolean is_desktop,
+ char **color, char **image, gboolean *combine)
+{
+ char *theme_source;
+ char *combine_str;
+ char *image_local_path;
+
+ theme_source = is_desktop ? "desktop" : "directory";
+
+ *color = nautilus_theme_get_theme_data (theme_source, NAUTILUS_METADATA_KEY_DIRECTORY_BACKGROUND_COLOR);
+
+ image_local_path = nautilus_theme_get_theme_data (theme_source, NAUTILUS_METADATA_KEY_DIRECTORY_BACKGROUND_IMAGE);
+ *image = theme_image_path_to_uri (image_local_path);
+ g_free (image_local_path);
+
+ combine_str = nautilus_theme_get_theme_data (theme_source, "COMBINE");
+ *combine = combine_str != NULL;
+ g_free (combine_str);
+}
+
+static gboolean
+nautilus_gnome_config_string_match_no_case (const char *path, const char *test_value)
+{
+ char *value;
+ gboolean result;
+ value = gnome_config_get_string (path);
+ result = !nautilus_strcasecmp (value, test_value);
+ g_free (value);
+ return result;
+}
+
+/* This enum is from gnome-source/control-center/capplets/background-properties/render-background.h */
+enum {
+ WALLPAPER_TILED,
+ WALLPAPER_CENTERED,
+ WALLPAPER_SCALED,
+ WALLPAPER_SCALED_KEEP,
+ WALLPAPER_EMBOSSED
+};
+
+static void
+nautilus_directory_background_read_desktop_settings (char **color, char **image, gboolean *combine)
+{
+ gboolean use_image;
+ char* image_local_path;
+ int image_alignment;
+ char* default_image_file;
+
+ char *end_color;
+ char *start_color;
+ char *default_color;
+ gboolean use_gradient;
+ gboolean is_horizontal;
+ gboolean no_start_color;
+ gboolean no_end_color;
+
+ nautilus_directory_background_get_default_settings (TRUE, &default_color, &default_image_file, combine);
+ /* note - value of combine comes from the theme */
+
+ use_image = !nautilus_gnome_config_string_match_no_case ("/Background/Default/wallpaper=none", "none");
+ image_local_path = gnome_config_get_string ("/Background/Default/wallpaper");
+ image_alignment = gnome_config_get_int ("/Background/Default/wallpaperAlign=0");
+
+ end_color = gnome_config_get_string_with_default ("/Background/Default/color2", &no_end_color);
+ start_color = gnome_config_get_string_with_default ("/Background/Default/color1", &no_start_color);
+ use_gradient = !nautilus_gnome_config_string_match_no_case ("/Background/Default/simple=solid", "solid");
+ is_horizontal = !nautilus_gnome_config_string_match_no_case ("/Background/Default/gradient=vertical", "vertical");
+
+ if (use_image) {
+ *image = nautilus_get_uri_from_local_path (image_local_path);
+ switch (image_alignment)
+ {
+ case WALLPAPER_TILED:
+ case WALLPAPER_CENTERED:
+ case WALLPAPER_SCALED:
+ case WALLPAPER_SCALED_KEEP:
+ case WALLPAPER_EMBOSSED:
+ /* FIXME need to fix nautilus_background to handle image alignment
+ */
+ }
+ } else {
+ *image = NULL;
+ }
+
+ if (use_gradient) {
+ if (no_start_color || no_end_color) {
+ *color = g_strdup (default_color);
+ } else {
+ *color = nautilus_gradient_new (start_color, end_color , is_horizontal);
+ }
+ } else {
+ if (no_start_color) {
+ *color = g_strdup (default_color);
+ } else {
+ *color = g_strdup (start_color);
+ }
+ }
+
+ g_free(start_color);
+ g_free(end_color);
+ g_free(default_color);
+
+ g_free(image_local_path);
+ g_free(default_image_file);
+}
+
+static void
+nautilus_directory_background_write_desktop_settings (char *color, char *image, gboolean combine)
+{
+ char *end_color;
+ char *start_color;
+ char *image_local_path;
+
+ if (color != NULL) {
+ start_color = nautilus_gradient_get_start_color_spec (color);
+ gnome_config_set_string ("/Background/Default/color1", start_color);
+ g_free (start_color);
+
+ /* if color is not a gradient, this ends up writing same as start_color */
+ end_color = nautilus_gradient_get_end_color_spec (color);
+ gnome_config_set_string ("/Background/Default/color2", end_color);
+ g_free (end_color);
+
+ gnome_config_set_string ("/Background/Default/simple", nautilus_gradient_is_gradient (color) ? "gradient" : "solid");
+ gnome_config_set_string ("/Background/Default/gradient", nautilus_gradient_is_horizontal (color) ? "vertical" : "horizontal");
+ }
+
+ if (image != NULL) {
+ image_local_path = nautilus_get_local_path_from_uri (image);
+ gnome_config_set_string ("/Background/Default/wallpaper", image_local_path);
+ g_free (image_local_path);
+ /* FIXME need to fix nautilus_background to handle image alignment
+ * and write out the proper value here.
+ */
+ gnome_config_set_int ("/Background/Default/wallpaperAlign", WALLPAPER_TILED);
+ } else {
+ gnome_config_set_string ("/Background/Default/wallpaper", "none");
+ }
+
+ gnome_config_sync ();
+
+ /* FIXME
+ * Try to trick GNOME into re-reading the settings.
+ */
+}
+
+static void
+nautilus_directory_background_write_desktop_default_settings ()
+{
+ char *color;
+ char *image;
+ gboolean combine;
+ nautilus_directory_background_get_default_settings (TRUE, &color, &image, &combine);
+ nautilus_directory_background_write_desktop_settings (color, image, combine);
+}
+
+/* return true if the background is not in the default state */
+gboolean
+nautilus_directory_background_is_set (NautilusBackground *background)
+{
+ char *color;
+ char *image;
+ char *default_color;
+ char *default_image;
+
+ gboolean is_set;
+ gboolean combine;
+ gboolean default_combine;
+
+ color = nautilus_background_get_color (background);
+ image = nautilus_background_get_tile_image_uri (background);
+ default_combine = nautilus_background_get_combine_mode (background);
+ nautilus_directory_background_get_default_settings (nautilus_directory_background_is_desktop (background), &default_color, &default_image, &combine);
+
+ is_set = !nautilus_strcmp (color, default_color) ||
+ !nautilus_strcmp (image, default_image) ||
+ combine != default_combine;
+
+ g_free (color);
+ g_free (image);
+ g_free (default_color);
+ g_free (default_image);
+
+ return is_set;
+}
+
/* handle the background changed signal */
static void
background_changed_callback (NautilusBackground *background,
@@ -54,54 +285,38 @@ background_changed_callback (NautilusBackground *background,
g_assert (gtk_object_get_data (GTK_OBJECT (background), "nautilus_background_directory")
== directory);
- /* Block the other handler while we are writing metadata so it doesn't
- * try to change the background.
- */
- gtk_signal_handler_block_by_func (GTK_OBJECT (directory),
- directory_changed_callback,
- background);
- /* Update metadata based on color. */
color = nautilus_background_get_color (background);
- nautilus_directory_set_metadata (directory,
- NAUTILUS_METADATA_KEY_DIRECTORY_BACKGROUND_COLOR,
- NULL,
- color);
- g_free (color);
-
- /* Update metadata based on tile image. */
image = nautilus_background_get_tile_image_uri (background);
- nautilus_directory_set_metadata (directory,
- NAUTILUS_METADATA_KEY_DIRECTORY_BACKGROUND_IMAGE,
- NULL,
- image);
- g_free (image);
-
- /* Unblock the handler. */
- gtk_signal_handler_unblock_by_func (GTK_OBJECT (directory),
- directory_changed_callback,
- background);
-}
-/* utility routine to handle mapping local file names to a uri */
-static char*
-local_data_file_to_uri (char *file_name)
-{
- char *temp_str;
-
- if (file_name != NULL && !nautilus_istr_has_prefix (file_name, "file://")) {
-
- if (nautilus_str_has_prefix (file_name, "./")) {
- temp_str = nautilus_theme_get_image_path (file_name + 2);
- } else {
- temp_str = g_strdup_printf ("%s/%s", NAUTILUS_DATADIR, file_name);
- }
-
- g_free (file_name);
- file_name = nautilus_get_uri_from_local_path (temp_str);
- g_free (temp_str);
+ if (nautilus_directory_background_is_desktop (background)) {
+ nautilus_directory_background_write_desktop_settings (color, image, nautilus_background_get_combine_mode (background));
+ } else {
+ /* Block the other handler while we are writing metadata so it doesn't
+ * try to change the background.
+ */
+ gtk_signal_handler_block_by_func (GTK_OBJECT (directory),
+ directory_changed_callback,
+ background);
+
+ nautilus_directory_set_metadata (directory,
+ NAUTILUS_METADATA_KEY_DIRECTORY_BACKGROUND_COLOR,
+ NULL,
+ color);
+
+ nautilus_directory_set_metadata (directory,
+ NAUTILUS_METADATA_KEY_DIRECTORY_BACKGROUND_IMAGE,
+ NULL,
+ image);
+
+ /* Unblock the handler. */
+ gtk_signal_handler_unblock_by_func (GTK_OBJECT (directory),
+ directory_changed_callback,
+ background);
}
- return file_name;
+
+ g_free (color);
+ g_free (image);
}
/* handle the directory changed signal */
@@ -109,59 +324,49 @@ static void
directory_changed_callback (NautilusDirectory *directory,
NautilusBackground *background)
{
- char *color, *image, *combine;
- char *theme_source;
+ char *color, *image;
+ gboolean combine;
g_assert (NAUTILUS_IS_DIRECTORY (directory));
g_assert (NAUTILUS_IS_BACKGROUND (background));
g_assert (gtk_object_get_data (GTK_OBJECT (background), "nautilus_background_directory")
== directory);
+ if (nautilus_directory_background_is_desktop (background)) {
+ nautilus_directory_background_read_desktop_settings (&color, &image, &combine);
+ } else {
+ color = nautilus_directory_get_metadata (directory,
+ NAUTILUS_METADATA_KEY_DIRECTORY_BACKGROUND_COLOR,
+ NULL);
+ image = nautilus_directory_get_metadata (directory,
+ NAUTILUS_METADATA_KEY_DIRECTORY_BACKGROUND_IMAGE,
+ NULL);
+ combine = FALSE; /* only from theme, at least for now */
+
+ /* if there's none, read the default from the theme */
+ if (color == NULL && image == NULL) {
+ nautilus_directory_background_get_default_settings (FALSE, &color, &image, &combine);
+ }
+ }
+
/* Block the other handler while we are responding to changes
* in the metadata so it doesn't try to change the metadata.
*/
gtk_signal_handler_block_by_func (GTK_OBJECT (background),
background_changed_callback,
directory);
-
-
- /* set up the theme source by checking if the background is attached to the desktop */
- if (gtk_object_get_data (GTK_OBJECT (background), "desktop")) {
- theme_source = "desktop";
- } else {
- theme_source = "directory";
- }
-
- /* Update color and tile image based on metadata. */
- color = nautilus_directory_get_metadata (directory,
- NAUTILUS_METADATA_KEY_DIRECTORY_BACKGROUND_COLOR,
- NULL);
- image = nautilus_directory_get_metadata (directory,
- NAUTILUS_METADATA_KEY_DIRECTORY_BACKGROUND_IMAGE,
- NULL);
- combine = NULL; /* only from theme, at least for now */
-
- /* if there's none, read the default from the theme */
- if (color == NULL && image == NULL) {
- color = nautilus_theme_get_theme_data (theme_source, NAUTILUS_METADATA_KEY_DIRECTORY_BACKGROUND_COLOR);
- image = nautilus_theme_get_theme_data (theme_source, NAUTILUS_METADATA_KEY_DIRECTORY_BACKGROUND_IMAGE);
- combine = nautilus_theme_get_theme_data (theme_source, "COMBINE");
-
- image = local_data_file_to_uri(image);
- }
nautilus_background_set_color (background, color);
nautilus_background_set_tile_image_uri (background, image);
- nautilus_background_set_combine_mode (background, combine != NULL);
-
- g_free (color);
- g_free (image);
- g_free (combine);
+ nautilus_background_set_combine_mode (background, combine);
/* Unblock the handler. */
gtk_signal_handler_unblock_by_func (GTK_OBJECT (background),
background_changed_callback,
directory);
+
+ g_free (color);
+ g_free (image);
}
/* handle the theme changing */
@@ -170,7 +375,7 @@ nautilus_directory_background_theme_changed (gpointer user_data)
{
NautilusDirectory *directory;
NautilusBackground *background;
-
+
background = NAUTILUS_BACKGROUND (user_data);
directory = gtk_object_get_data (GTK_OBJECT (background),
"nautilus_background_directory");
@@ -184,51 +389,38 @@ static void
background_reset_callback (NautilusBackground *background,
NautilusDirectory *directory)
{
- char *color, *image, *combine;
- char *theme_source;
-
- /* set up the theme source by checking if the background is attached to the desktop */
- if (gtk_object_get_data (GTK_OBJECT (background), "desktop")) {
- theme_source = "desktop";
+ if (nautilus_directory_background_is_desktop (background)) {
+ nautilus_directory_background_write_desktop_default_settings ();
} else {
- theme_source = "directory";
+ /* Block the other handler while we are writing metadata so it doesn't
+ * try to change the background.
+ */
+ gtk_signal_handler_block_by_func (GTK_OBJECT (directory),
+ directory_changed_callback,
+ background);
+
+ /* reset the metadata */
+ nautilus_directory_set_metadata (directory,
+ NAUTILUS_METADATA_KEY_DIRECTORY_BACKGROUND_COLOR,
+ NULL,
+ NULL);
+
+ nautilus_directory_set_metadata (directory,
+ NAUTILUS_METADATA_KEY_DIRECTORY_BACKGROUND_IMAGE,
+ NULL,
+ NULL);
+ /* Unblock the handler. */
+ gtk_signal_handler_unblock_by_func (GTK_OBJECT (directory),
+ directory_changed_callback,
+ background);
}
-
- color = nautilus_theme_get_theme_data (theme_source, NAUTILUS_METADATA_KEY_DIRECTORY_BACKGROUND_COLOR);
- image = nautilus_theme_get_theme_data (theme_source, NAUTILUS_METADATA_KEY_DIRECTORY_BACKGROUND_IMAGE);
- combine = nautilus_theme_get_theme_data (theme_source, "COMBINE");
-
- image = local_data_file_to_uri(image);
- /* block the handler so we don't write metadata */
- gtk_signal_handler_block_by_func (GTK_OBJECT (background),
- background_changed_callback,
- directory);
- nautilus_background_set_color (background, color);
- nautilus_background_set_tile_image_uri (background, image);
- nautilus_background_set_combine_mode (background, combine != NULL);
-
- /* Unblock the handler. */
- gtk_signal_handler_unblock_by_func (GTK_OBJECT (background),
- background_changed_callback,
- directory);
- g_free (color);
- g_free (image);
- g_free (combine);
-
- /* reset the metadata */
- nautilus_directory_set_metadata (directory,
- NAUTILUS_METADATA_KEY_DIRECTORY_BACKGROUND_COLOR,
- NULL,
- NULL);
-
- nautilus_directory_set_metadata (directory,
- NAUTILUS_METADATA_KEY_DIRECTORY_BACKGROUND_IMAGE,
- NULL,
- NULL);
-
- gtk_signal_emit_stop_by_name (GTK_OBJECT (background),
- "reset");
+ directory_changed_callback (directory, background);
+
+ /* We don't want the default reset handler running.
+ * It will set color and tile_image_uri to NULL.
+ */
+ gtk_signal_emit_stop_by_name (GTK_OBJECT (background), "reset");
}
/* handle the background destroyed signal */
@@ -245,31 +437,6 @@ background_destroyed_callback (NautilusBackground *background,
background);
}
-/* return true if the background is not in the default state */
-gboolean
-nautilus_directory_background_is_set (NautilusBackground *background)
-{
- gboolean is_set;
- NautilusDirectory *directory;
- char *color, *image;
-
- directory = NAUTILUS_DIRECTORY(gtk_object_get_data (GTK_OBJECT (background),
- "nautilus_background_directory"));
-
- color = nautilus_directory_get_metadata (directory,
- NAUTILUS_METADATA_KEY_DIRECTORY_BACKGROUND_COLOR,
- NULL);
- image = nautilus_directory_get_metadata (directory,
- NAUTILUS_METADATA_KEY_DIRECTORY_BACKGROUND_IMAGE,
- NULL);
- is_set = (color != NULL) || (image != NULL);
-
- g_free (color);
- g_free (image);
-
- return is_set;
-}
-
/* key routine that hooks up a background and directory */
void
nautilus_connect_background_to_directory_metadata (GtkWidget *widget,
@@ -281,6 +448,7 @@ nautilus_connect_background_to_directory_metadata (GtkWidget *widget,
/* Get at the background object we'll be connecting. */
background = nautilus_get_widget_background (widget);
+
/* Check if it is already connected. */
old_directory = gtk_object_get_data (GTK_OBJECT (background),
"nautilus_background_directory");
@@ -352,6 +520,22 @@ nautilus_connect_background_to_directory_metadata (GtkWidget *widget,
}
void
+nautilus_connect_desktop_background_to_directory_metadata (GtkWidget *widget,
+ NautilusDirectory *directory)
+{
+ nautilus_directory_background_set_desktop (nautilus_get_widget_background (widget));
+
+ /* Strictly speaking, we don't need to know about metadata changes, since
+ * the desktop setting aren't stored there. But, hooking up to metadata
+ * changes is actually a small part of what this fn does, and we do need
+ * the other stuff (hooked up to background & theme changes). Being notified
+ * of metadata changes on the directory is a waste, but won't hurt, so I don't
+ * think it's worth refactoring the fn at this point.
+ */
+ nautilus_connect_background_to_directory_metadata (widget, directory);
+}
+
+void
nautilus_connect_background_to_directory_metadata_by_uri (GtkWidget *widget,
const char *uri)
{
diff --git a/libnautilus-extensions/nautilus-directory-background.h b/libnautilus-extensions/nautilus-directory-background.h
index b2816ee68..6663eea7f 100644
--- a/libnautilus-extensions/nautilus-directory-background.h
+++ b/libnautilus-extensions/nautilus-directory-background.h
@@ -28,8 +28,10 @@
#include "nautilus-directory.h"
#include "nautilus-background.h"
-void nautilus_connect_background_to_directory_metadata (GtkWidget *widget,
- NautilusDirectory *directory);
-void nautilus_connect_background_to_directory_metadata_by_uri (GtkWidget *widget,
- const char *uri);
-gboolean nautilus_directory_background_is_set (NautilusBackground *background);
+void nautilus_connect_background_to_directory_metadata (GtkWidget *widget,
+ NautilusDirectory *directory);
+void nautilus_connect_desktop_background_to_directory_metadata (GtkWidget *widget,
+ NautilusDirectory *directory);
+void nautilus_connect_background_to_directory_metadata_by_uri (GtkWidget *widget,
+ const char *uri);
+gboolean nautilus_directory_background_is_set (NautilusBackground *background); \ No newline at end of file