diff options
-rw-r--r-- | ChangeLog | 13 | ||||
-rw-r--r-- | libnautilus-private/apps_nautilus_preferences.schemas.in | 29 | ||||
-rw-r--r-- | libnautilus-private/nautilus-desktop-link-monitor.c | 148 | ||||
-rw-r--r-- | libnautilus-private/nautilus-desktop-link.c | 80 | ||||
-rw-r--r-- | libnautilus-private/nautilus-desktop-link.h | 5 | ||||
-rw-r--r-- | libnautilus-private/nautilus-global-preferences.h | 2 | ||||
-rw-r--r-- | src/file-manager/fm-directory-view.c | 12 |
7 files changed, 288 insertions, 1 deletions
@@ -1,3 +1,16 @@ +2007-07-31 Sayamindu Dasgupta <sayamindu@gmail.com> + + * src/file-manager/fm-directory-view.c: + (file_list_all_are_folders): + * libnautilus-private/nautilus-desktop-link.[ch]: + (nautilus_desktop_link_new_from_file): + * libnautilus-private/apps_nautilus_preferences.schemas.in: + * libnautilus-private/nautilus-desktop-link-monitor.c: + (nautilus_desktop_link_monitor_init): + * libnautilus-private/nautilus-global-preferences.h: + Initial support for global desktop links (part of Summer of + Code 2007) + 2007-07-31 Martin Wehner <martin.wehner@gmail.com> * configure.in: diff --git a/libnautilus-private/apps_nautilus_preferences.schemas.in b/libnautilus-private/apps_nautilus_preferences.schemas.in index 64462ab81..13e80d4d5 100644 --- a/libnautilus-private/apps_nautilus_preferences.schemas.in +++ b/libnautilus-private/apps_nautilus_preferences.schemas.in @@ -840,6 +840,35 @@ most cases, this should be left alone. -->Sans 10</default> </schema> <schema> + <key>/schemas/apps/nautilus/desktop/global_items_visible</key> + <applyto>/apps/nautilus/desktop/global_items_visible</applyto> + <owner>nautilus</owner> + <type>bool</type> + <default>false</default> + <locale name="C"> + <short>Global items visible on the desktop</short> + <long> + If this is set to true, global desktop items will be shown on the + desktop. + </long> + </locale> + </schema> + + <schema> + <key>/schemas/apps/nautilus/desktop/global_items_dir</key> + <applyto>/apps/nautilus/desktop/global_items_dir</applyto> + <owner>nautilus</owner> + <type>string</type> + <locale name="C"> + <short>Directory for storing global desktop items</short> + <long> + Location of the desktop item directories. + </long> + </locale> + </schema> + + + <schema> <key>/schemas/apps/nautilus/desktop/computer_icon_name</key> <applyto>/apps/nautilus/desktop/computer_icon_name</applyto> <owner>nautilus</owner> diff --git a/libnautilus-private/nautilus-desktop-link-monitor.c b/libnautilus-private/nautilus-desktop-link-monitor.c index 6469c6a85..81501d7c7 100644 --- a/libnautilus-private/nautilus-desktop-link-monitor.c +++ b/libnautilus-private/nautilus-desktop-link-monitor.c @@ -41,11 +41,13 @@ #include <glib/gi18n.h> #include <libgnomevfs/gnome-vfs.h> #include <libgnomevfs/gnome-vfs-volume-monitor.h> +#include <libgnome/gnome-desktop-item.h> #include <libnautilus-private/nautilus-trash-monitor.h> #include <string.h> struct NautilusDesktopLinkMonitorDetails { NautilusDirectory *desktop_dir; + NautilusDirectory *global_dir; NautilusDesktopLink *home_link; NautilusDesktopLink *computer_link; @@ -56,6 +58,9 @@ struct NautilusDesktopLinkMonitorDetails { gulong unmount_id; GList *volume_links; + GList *global_links; + + void *global_dir_client; }; @@ -151,6 +156,7 @@ nautilus_desktop_link_monitor_delete_link (NautilusDesktopLinkMonitor *monitor, case NAUTILUS_DESKTOP_LINK_COMPUTER: case NAUTILUS_DESKTOP_LINK_TRASH: case NAUTILUS_DESKTOP_LINK_NETWORK: + case NAUTILUS_DESKTOP_LINK_GLOBAL: /* just ignore. We don't allow you to delete these */ break; default: @@ -347,6 +353,109 @@ desktop_volumes_visible_changed (gpointer callback_data) } } + +static gint +compare_link_file(NautilusDesktopLink *link, NautilusFile *file) { + NautilusFile *other_file; + + other_file = nautilus_desktop_link_get_file(link); + + /* FIXME: Is this the right way to compare two NautilusFiles ? */ + return g_utf8_collate(nautilus_file_get_uri(other_file), + (nautilus_file_get_uri(file))); + + nautilus_file_unref(other_file); +} + +static void +global_dir_files_added (NautilusDirectory *directory, GList *changed_files, gpointer callback_data) +{ + NautilusDesktopLinkMonitor *monitor; + GList *l; + + monitor = NAUTILUS_DESKTOP_LINK_MONITOR (callback_data); + + for (l = changed_files; l != NULL; l = l->next) { + /* We filter out anything other than .desktop files */ + if (g_str_has_suffix(nautilus_file_get_uri(NAUTILUS_FILE(l->data)), ".desktop")) { + monitor->details->global_links = g_list_prepend (monitor->details->global_links, + nautilus_desktop_link_new_from_file(NAUTILUS_FILE(l->data))); + } + } +} + +static void +global_dir_files_changed (NautilusDirectory *directory, GList *changed_files, gpointer callback_data) { + NautilusDesktopLinkMonitor *monitor; + GList *l, *deleted_link; + deleted_link = NULL; + + monitor = NAUTILUS_DESKTOP_LINK_MONITOR (callback_data); + + for (l = changed_files; l != NULL; l = l->next) { + if (nautilus_file_is_gone (l->data)) {/* We need to run this only if a file gets deleted */ + deleted_link = + g_list_find_custom(monitor->details->global_links, NAUTILUS_FILE(l->data), + (GCompareFunc )compare_link_file); + + if (deleted_link != NULL) { /* Found a link, unref it */ + + NAUTILUS_DESKTOP_LINK_MONITOR(callback_data)->details->global_links = + g_list_remove_link(monitor->details->global_links, deleted_link); + g_object_unref(deleted_link->data); + g_list_free(deleted_link); + deleted_link = NULL; + } + } + } +} + +static void +desktop_global_items_visible_changed (gpointer callback_data) +{ + NautilusDesktopLinkMonitor *monitor; + gchar *global_dir_uri; + + monitor = NAUTILUS_DESKTOP_LINK_MONITOR (callback_data); + + if (eel_preferences_get_boolean (NAUTILUS_PREFERENCES_DESKTOP_GLOBAL_ITEMS_VISIBLE)) { + if (monitor->details->global_links == NULL) { + global_dir_uri = eel_preferences_get(NAUTILUS_PREFERENCES_DESKTOP_GLOBAL_ITEMS_DIR); + + if (global_dir_uri == NULL || !g_utf8_collate(global_dir_uri, "")) /* Just a sanity check */ + return; + + monitor->details->global_dir = nautilus_directory_get(global_dir_uri); + + monitor->details->global_dir_client = g_new0 (int, 1); + + nautilus_directory_file_monitor_add (monitor->details->global_dir, + monitor->details->global_dir_client, FALSE, FALSE, + NAUTILUS_FILE_ATTRIBUTE_METADATA, + global_dir_files_added, monitor); + + g_signal_connect (monitor->details->global_dir, "files_added", + G_CALLBACK (global_dir_files_added), monitor); + g_signal_connect (monitor->details->global_dir, "files_changed", + G_CALLBACK (global_dir_files_changed), monitor); + + } + } + else { + if (monitor->details->global_links != NULL) { + g_list_foreach (monitor->details->global_links, (GFunc)g_object_unref, NULL); + g_list_free (monitor->details->global_links); + monitor->details->global_links = NULL; + + nautilus_directory_file_monitor_remove (monitor->details->global_dir, + monitor->details->global_dir_client); + nautilus_directory_unref (monitor->details->global_dir); + monitor->details->global_dir = NULL; + } + } + +} + static void create_link_and_add_preference (NautilusDesktopLink **link_ref, NautilusDesktopLinkType link_type, @@ -368,6 +477,7 @@ nautilus_desktop_link_monitor_init (gpointer object, gpointer klass) GList *l, *volumes; GnomeVFSVolume *volume; GnomeVFSVolumeMonitor *volume_monitor; + char *global_dir_uri; monitor = NAUTILUS_DESKTOP_LINK_MONITOR (object); @@ -425,6 +535,34 @@ nautilus_desktop_link_monitor_init (gpointer object, gpointer klass) monitor->details->unmount_id = g_signal_connect_object (volume_monitor, "volume_unmounted", G_CALLBACK (volume_unmounted_callback), monitor, 0); + /* Global Items */ + + global_dir_uri = eel_preferences_get(NAUTILUS_PREFERENCES_DESKTOP_GLOBAL_ITEMS_DIR); + + if (eel_preferences_get_boolean (NAUTILUS_PREFERENCES_DESKTOP_GLOBAL_ITEMS_VISIBLE) + && global_dir_uri != NULL && g_utf8_collate(global_dir_uri, "")) { + + monitor->details->global_dir = nautilus_directory_get(global_dir_uri); + + monitor->details->global_dir_client = g_new0 (int, 1); + + nautilus_directory_file_monitor_add (monitor->details->global_dir, + monitor->details->global_dir_client, FALSE, FALSE, + NAUTILUS_FILE_ATTRIBUTE_METADATA, + global_dir_files_added, monitor); + + g_signal_connect (monitor->details->global_dir, + "files_added", G_CALLBACK (global_dir_files_added), monitor); + g_signal_connect (monitor->details->global_dir, + "files_changed", G_CALLBACK (global_dir_files_changed), monitor); + + } + + + eel_preferences_add_callback (NAUTILUS_PREFERENCES_DESKTOP_GLOBAL_ITEMS_VISIBLE, + desktop_global_items_visible_changed, + monitor); + } static void @@ -489,6 +627,16 @@ desktop_link_monitor_finalize (GObject *object) if (monitor->details->unmount_id != 0) { g_source_remove (monitor->details->unmount_id); } + + /* Global Items */ + + g_list_foreach (monitor->details->global_links, (GFunc)g_object_unref, NULL); + g_list_free (monitor->details->global_links); + monitor->details->global_links = NULL; + + nautilus_directory_file_monitor_remove (monitor->details->global_dir, monitor->details->global_dir_client); + nautilus_directory_unref (monitor->details->global_dir); + monitor->details->global_dir = NULL; g_free (monitor->details); diff --git a/libnautilus-private/nautilus-desktop-link.c b/libnautilus-private/nautilus-desktop-link.c index e27bac458..3d868ae63 100644 --- a/libnautilus-private/nautilus-desktop-link.c +++ b/libnautilus-private/nautilus-desktop-link.c @@ -28,12 +28,15 @@ #include "nautilus-desktop-icon-file.h" #include "nautilus-directory-private.h" #include "nautilus-desktop-directory.h" +#include "nautilus-icon-factory.h" +#include "nautilus-mime-actions.h" #include <eel/eel-gtk-macros.h> #include <eel/eel-vfs-extensions.h> #include <gtk/gtksignal.h> #include <glib/gi18n.h> #include <libgnomevfs/gnome-vfs.h> +#include <libgnome/gnome-desktop-item.h> #include <libnautilus-private/nautilus-file-utilities.h> #include <libnautilus-private/nautilus-trash-monitor.h> #include <libnautilus-private/nautilus-global-preferences.h> @@ -56,6 +59,9 @@ struct NautilusDesktopLinkDetails { /* Just for volume icons: */ GnomeVFSVolume *volume; + + /* Just for global icons */ + NautilusFile *file; }; static void nautilus_desktop_link_init (gpointer object, @@ -208,6 +214,71 @@ nautilus_desktop_link_new (NautilusDesktopLinkType type) return link; } + +static void +ready_callback (NautilusFile *file, + gpointer callback_data) +{ + NautilusDesktopLink *link; + + link = NAUTILUS_DESKTOP_LINK(callback_data); + link->details->icon = g_strdup(nautilus_icon_factory_get_icon_for_file(file, FALSE)); + link->details->filename = nautilus_file_get_name(file); + link->details->display_name = nautilus_file_get_display_name(file); + + create_icon_file(link); +} + +static char * +get_real_activation_url (NautilusFile *file) { + GnomeDesktopItem *desktop_file; + char *type, *activation_url; + + desktop_file = gnome_desktop_item_new_from_uri(nautilus_file_get_uri(file), + GNOME_DESKTOP_ITEM_LOAD_ONLY_IF_EXISTS, NULL); + + type = g_strdup(gnome_desktop_item_get_string(desktop_file, GNOME_DESKTOP_ITEM_TYPE)); + + if (!g_ascii_strcasecmp(type, "Link")) { + activation_url = g_strdup(gnome_desktop_item_get_string(desktop_file, + GNOME_DESKTOP_ITEM_URL)); + } else if (!g_ascii_strcasecmp(type, "Application")){ + if (gnome_desktop_item_get_boolean(desktop_file, + GNOME_DESKTOP_ITEM_TERMINAL)) { + activation_url = g_strdup (nautilus_file_get_uri(file)); + } + else { + activation_url = g_strdup(gnome_desktop_item_get_string(desktop_file, + GNOME_DESKTOP_ITEM_EXEC)); + } + } + else { + activation_url = g_strdup (nautilus_file_get_uri(file)); + } + + return (activation_url); +} + +NautilusDesktopLink * +nautilus_desktop_link_new_from_file (NautilusFile *file) +{ + NautilusDesktopLink *link; + NautilusFileAttributes attributes; + + link = NAUTILUS_DESKTOP_LINK (g_object_new (NAUTILUS_TYPE_DESKTOP_LINK, NULL)); + link->details->type = NAUTILUS_DESKTOP_LINK_GLOBAL; + link->details->filename = g_path_get_basename(nautilus_file_get_uri(file)); + link->details->activation_uri = get_real_activation_url (file); + link->details->file = nautilus_file_ref(file); + + /* TODO: The code below should be replaced by nautilus_file_monitor_add() */ + attributes = nautilus_mime_actions_get_full_file_attributes(); + nautilus_file_call_when_ready (link->details->file, attributes, ready_callback, link); + + return link; +} + + NautilusDesktopLink * nautilus_desktop_link_new_from_volume (GnomeVFSVolume *volume) { @@ -254,6 +325,11 @@ nautilus_desktop_link_get_volume (NautilusDesktopLink *link) return gnome_vfs_volume_ref (link->details->volume); } +NautilusFile * +nautilus_desktop_link_get_file (NautilusDesktopLink *link) +{ + return nautilus_file_ref(link->details->file); +} NautilusDesktopLinkType nautilus_desktop_link_get_link_type (NautilusDesktopLink *link) @@ -419,6 +495,10 @@ desktop_link_finalize (GObject *object) gnome_vfs_volume_unref (link->details->volume); } + if (link->details->type == NAUTILUS_DESKTOP_LINK_GLOBAL) { + nautilus_file_unref(link->details->file); + } + g_free (link->details->filename); g_free (link->details->display_name); g_free (link->details->activation_uri); diff --git a/libnautilus-private/nautilus-desktop-link.h b/libnautilus-private/nautilus-desktop-link.h index 578e592a2..089af3962 100644 --- a/libnautilus-private/nautilus-desktop-link.h +++ b/libnautilus-private/nautilus-desktop-link.h @@ -55,12 +55,14 @@ typedef enum { NAUTILUS_DESKTOP_LINK_COMPUTER, NAUTILUS_DESKTOP_LINK_TRASH, NAUTILUS_DESKTOP_LINK_VOLUME, - NAUTILUS_DESKTOP_LINK_NETWORK + NAUTILUS_DESKTOP_LINK_NETWORK, + NAUTILUS_DESKTOP_LINK_GLOBAL } NautilusDesktopLinkType; GType nautilus_desktop_link_get_type (void); NautilusDesktopLink * nautilus_desktop_link_new (NautilusDesktopLinkType type); +NautilusDesktopLink * nautilus_desktop_link_new_from_file (NautilusFile *file); NautilusDesktopLink * nautilus_desktop_link_new_from_volume (GnomeVFSVolume *volume); NautilusDesktopLinkType nautilus_desktop_link_get_link_type (NautilusDesktopLink *link); char * nautilus_desktop_link_get_file_name (NautilusDesktopLink *link); @@ -71,6 +73,7 @@ gboolean nautilus_desktop_link_get_date (NautilusDeskto NautilusDateType date_type, time_t *date); GnomeVFSVolume * nautilus_desktop_link_get_volume (NautilusDesktopLink *link); +NautilusFile * nautilus_desktop_link_get_file (NautilusDesktopLink *link); gboolean nautilus_desktop_link_can_rename (NautilusDesktopLink *link); gboolean nautilus_desktop_link_rename (NautilusDesktopLink *link, diff --git a/libnautilus-private/nautilus-global-preferences.h b/libnautilus-private/nautilus-global-preferences.h index f561cc34c..81dd5949d 100644 --- a/libnautilus-private/nautilus-global-preferences.h +++ b/libnautilus-private/nautilus-global-preferences.h @@ -188,6 +188,8 @@ typedef enum #define NAUTILUS_PREFERENCES_DESKTOP_VOLUMES_VISIBLE "desktop/volumes_visible" #define NAUTILUS_PREFERENCES_DESKTOP_NETWORK_VISIBLE "desktop/network_icon_visible" #define NAUTILUS_PREFERENCES_DESKTOP_NETWORK_NAME "desktop/network_icon_name" +#define NAUTILUS_PREFERENCES_DESKTOP_GLOBAL_ITEMS_VISIBLE "desktop/global_items_visible" +#define NAUTILUS_PREFERENCES_DESKTOP_GLOBAL_ITEMS_DIR "desktop/global_items_dir" void nautilus_global_preferences_init (void); char *nautilus_global_preferences_get_default_folder_viewer_preference_as_iid (void); diff --git a/src/file-manager/fm-directory-view.c b/src/file-manager/fm-directory-view.c index aa3b26648..1853241df 100644 --- a/src/file-manager/fm-directory-view.c +++ b/src/file-manager/fm-directory-view.c @@ -82,6 +82,7 @@ #include <libnautilus-private/nautilus-clipboard-monitor.h> #include <libnautilus-private/nautilus-debug-log.h> #include <libnautilus-private/nautilus-desktop-icon-file.h> +#include <libnautilus-private/nautilus-desktop-link.h> #include <libnautilus-private/nautilus-desktop-directory.h> #include <libnautilus-private/nautilus-search-directory.h> #include <libnautilus-private/nautilus-directory-background.h> @@ -7265,11 +7266,22 @@ file_list_all_are_folders (GList *file_list) { GList *l; NautilusFile *file, *linked_file; + NautilusDesktopLink *desktop_link; char *activation_uri; gboolean is_dir; for (l = file_list; l != NULL; l = l->next) { file = NAUTILUS_FILE (l->data); + + if (NAUTILUS_IS_DESKTOP_ICON_FILE (file)) { + desktop_link = + nautilus_desktop_icon_file_get_link(NAUTILUS_DESKTOP_ICON_FILE(file)); + if (nautilus_desktop_link_get_link_type(desktop_link) == + NAUTILUS_DESKTOP_LINK_GLOBAL) { + return FALSE; + } + } + if (nautilus_file_is_nautilus_link (file) && !NAUTILUS_IS_DESKTOP_ICON_FILE (file)) { activation_uri = nautilus_file_get_activation_uri (file); |