diff options
author | Mike Engber <engber@src.gnome.org> | 2000-08-11 21:38:28 +0000 |
---|---|---|
committer | Mike Engber <engber@src.gnome.org> | 2000-08-11 21:38:28 +0000 |
commit | 9c048d9573bfe63e75d88cb9bbb9b69abfcecac0 (patch) | |
tree | 67a95cb8b2668c1c7db8c4d2df893d02d9942ce1 /libnautilus-extensions | |
parent | a0f4fa57f0ccd83e13d12d90c9213afa53fe088a (diff) | |
download | nautilus-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.c | 2 | ||||
-rw-r--r-- | libnautilus-extensions/nautilus-directory-background.c | 472 | ||||
-rw-r--r-- | libnautilus-extensions/nautilus-directory-background.h | 12 |
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 |