Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:zhy20120210:failed_1
nautilus
nautilus-fate307519-network-map-permanently.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File nautilus-fate307519-network-map-permanently.patch of Package nautilus
diff --git a/libnautilus-private/nautilus-desktop-icon-file.c b/libnautilus-private/nautilus-desktop-icon-file.c index 512eb67..a4cf2f5 100644 --- a/libnautilus-private/nautilus-desktop-icon-file.c +++ b/libnautilus-private/nautilus-desktop-icon-file.c @@ -183,7 +183,10 @@ update_info_from_link (NautilusDesktopIconFile *icon_file) file->details->can_write = TRUE; file->details->can_mount = FALSE; - file->details->can_unmount = FALSE; + if (nautilus_desktop_link_get_link_type (link) == NAUTILUS_DESKTOP_LINK_MOUNT) + file->details->can_unmount = TRUE; + else + file->details->can_unmount = FALSE; file->details->can_eject = FALSE; if (file->details->mount) { g_object_unref (file->details->mount); @@ -317,12 +320,16 @@ nautilus_desktop_icon_file_unmount (NautilusFile *file, desktop_file = NAUTILUS_DESKTOP_ICON_FILE (file); if (desktop_file) { - mount = nautilus_desktop_link_get_mount (desktop_file->details->link); - if (mount != NULL) { - nautilus_file_operations_unmount_mount (NULL, mount, FALSE, TRUE); + if (nautilus_desktop_link_is_fake (desktop_file->details->link)) { + nautilus_desktop_link_unstick (desktop_file->details->link); + } else { + mount = nautilus_desktop_link_get_mount (desktop_file->details->link); + if (mount != NULL) { + nautilus_file_operations_unmount_mount (NULL, mount, FALSE, TRUE); + } } } - + } static void diff --git a/libnautilus-private/nautilus-desktop-link-monitor.c b/libnautilus-private/nautilus-desktop-link-monitor.c index 43f713e..8fff897 100644 --- a/libnautilus-private/nautilus-desktop-link-monitor.c +++ b/libnautilus-private/nautilus-desktop-link-monitor.c @@ -29,6 +29,7 @@ #include "nautilus-directory.h" #include "nautilus-desktop-directory.h" #include "nautilus-global-preferences.h" +#include "nautilus-metadata.h" #include <eel/eel-debug.h> #include <eel/eel-gtk-macros.h> @@ -199,25 +200,126 @@ has_mount (NautilusDesktopLinkMonitor *monitor, ret = TRUE; break; } - g_object_unref (other_mount); + if (other_mount) + g_object_unref (other_mount); } return ret; } static void +save_mount_metadata (NautilusDesktopLink *link, + GMount *mount) +{ + NautilusFile *file; + gchar *str; + GFile *root; + GIcon *icon; + + file = nautilus_desktop_link_get_icon_file (link); + + root = g_mount_get_root (mount); + str = g_file_get_uri (root); + nautilus_file_set_metadata (file, "uri", str, NULL); + g_free (str); + g_object_unref (root); + + str = nautilus_file_get_display_name (file); + nautilus_file_set_metadata (file, "display_name", str, NULL); + g_free (str); + + icon = nautilus_desktop_link_get_icon (link); + str = g_icon_to_string (icon); + nautilus_file_set_metadata (file, "icon_string", str, NULL); + g_free (str); + g_object_unref (icon); + + str = nautilus_desktop_link_get_file_name (link); + nautilus_file_set_metadata (file, "filename", str, NULL); + g_free (str); + + nautilus_file_set_metadata (file, "stick", "TRUE", NULL); +} + +void +nautilus_desktop_link_monitor_unstick_link (NautilusDesktopLinkMonitor *monitor, + NautilusDesktopLink *link) +{ + monitor->details->mount_links = g_list_remove (monitor->details->mount_links, link); + g_object_unref (link); +} + +static NautilusDesktopLink* +uri_in_mount_links_exist (NautilusDesktopLinkMonitor *monitor, + gchar *name) +{ + GList *l; + char *other_name; + gboolean same; + + for (l = monitor->details->mount_links; l != NULL; l = l->next) { + if (!nautilus_desktop_link_is_fake (l->data)) + continue; + other_name = nautilus_desktop_link_get_uri (l->data); + same = strcmp (name, other_name) == 0; + g_free (other_name); + + if (same) { + return l->data; + } + } + + return NULL; +} + +gboolean +file_is_locale (GFile *file) +{ + char *scheme; + gboolean ret = TRUE; + + scheme = g_file_get_uri_scheme (file); + if (!strcmp (scheme, "ftp") || + !strcmp (scheme, "http") || + !strcmp (scheme, "network") || + !strcmp (scheme, "nvvfs") || + !strcmp (scheme, "sftp") || + !strcmp (scheme, "smb")) { + ret = FALSE; + } + + g_free (scheme); + return ret; +} + +static void create_mount_link (NautilusDesktopLinkMonitor *monitor, GMount *mount) { NautilusDesktopLink *link; + NautilusDesktopLink *fake; + GFile *file; + char *uri; + GFile *root; if (has_mount (monitor, mount)) return; if ((!g_mount_is_shadowed (mount)) && - eel_preferences_get_boolean (NAUTILUS_PREFERENCES_DESKTOP_VOLUMES_VISIBLE)) { - link = nautilus_desktop_link_new_from_mount (mount); - monitor->details->mount_links = g_list_prepend (monitor->details->mount_links, link); + eel_preferences_get_boolean (NAUTILUS_PREFERENCES_DESKTOP_VOLUMES_VISIBLE)) { + root = g_mount_get_root (mount); + uri = g_file_get_uri (root); + + if ((fake = uri_in_mount_links_exist (monitor, uri)) != NULL) { + nautilus_desktop_link_fake_to_real (fake, mount); + } else { + link = nautilus_desktop_link_new_from_mount (mount); + monitor->details->mount_links = g_list_prepend (monitor->details->mount_links, link); + if (!file_is_locale (root)) + save_mount_metadata (link, mount); + } + g_free (uri); + g_object_unref (root); } } @@ -241,8 +343,7 @@ remove_mount_link (NautilusDesktopLinkMonitor *monitor, } if (link) { - monitor->details->mount_links = g_list_remove (monitor->details->mount_links, link); - g_object_unref (link); + nautilus_desktop_link_unstick (link); } } @@ -384,13 +485,21 @@ create_link_and_add_preference (NautilusDesktopLink **link_ref, eel_preferences_add_callback (preference_key, callback, callback_data); } - + static void nautilus_desktop_link_monitor_init (gpointer object, gpointer klass) { NautilusDesktopLinkMonitor *monitor; GList *l, *mounts; GMount *mount; + GConfClient *client; + GSList *dirs, *sl; + const char *key; + gchar *value; + gchar *dir; + gchar *path; + NautilusDesktopLink *link; + gchar *filename; monitor = NAUTILUS_DESKTOP_LINK_MONITOR (object); @@ -429,6 +538,29 @@ nautilus_desktop_link_monitor_init (gpointer object, gpointer klass) desktop_network_visible_changed, monitor); + /* Fake mount */ + client = gconf_client_get_default (); + dirs = gconf_client_all_dirs (client, NAUTILUS_DESKTOP_METADATA_GCONF_PATH, NULL); + for (sl = dirs; sl != NULL; sl = sl->next) { + dir = sl->data; + + path = g_build_filename (dir, "stick", NULL); + value = gconf_client_get_string (client, path, NULL); + g_free (path); + + if (value == NULL ) + continue; + + if (g_strcmp0 (value, "TRUE")) { + g_free (value); + continue; + } + g_free (value); + + link = nautilus_desktop_link_new_fake_mount (dir); + monitor->details->mount_links = g_list_prepend (monitor->details->mount_links, link); + } + /* Mount links */ mounts = g_volume_monitor_get_mounts (monitor->details->volume_monitor); @@ -452,7 +584,6 @@ nautilus_desktop_link_monitor_init (gpointer object, gpointer klass) monitor->details->changed_id = g_signal_connect_object (monitor->details->volume_monitor, "mount_changed", G_CALLBACK (mount_changed_callback), monitor, 0); - } static void diff --git a/libnautilus-private/nautilus-desktop-link-monitor.h b/libnautilus-private/nautilus-desktop-link-monitor.h index c9865cd..44caa45 100644 --- a/libnautilus-private/nautilus-desktop-link-monitor.h +++ b/libnautilus-private/nautilus-desktop-link-monitor.h @@ -62,4 +62,6 @@ void nautilus_desktop_link_monitor_delete_link (NautilusDesktopLinkMonitor *moni char * nautilus_desktop_link_monitor_make_filename_unique (NautilusDesktopLinkMonitor *monitor, const char *filename); +void nautilus_desktop_link_monitor_unstick_link (NautilusDesktopLinkMonitor *monitor, + NautilusDesktopLink *link); #endif /* NAUTILUS_DESKTOP_LINK_MONITOR_H */ diff --git a/libnautilus-private/nautilus-desktop-link.c b/libnautilus-private/nautilus-desktop-link.c index a58f4ce..6c23344 100644 --- a/libnautilus-private/nautilus-desktop-link.c +++ b/libnautilus-private/nautilus-desktop-link.c @@ -50,6 +50,10 @@ struct NautilusDesktopLinkDetails { /* Just for mount icons: */ GMount *mount; + gchar *uri; + gchar *icon_string; + gboolean is_fake; + gchar *gconf_dir; }; G_DEFINE_TYPE(NautilusDesktopLink, nautilus_desktop_link, G_TYPE_OBJECT) @@ -228,6 +232,93 @@ nautilus_desktop_link_new (NautilusDesktopLinkType type) return link; } +gboolean +nautilus_desktop_link_is_fake (NautilusDesktopLink *link) +{ + return link->details->is_fake; +} + +char * +nautilus_desktop_link_get_uri (NautilusDesktopLink *link) +{ + return g_strdup (link->details->uri); +} + + +void +nautilus_desktop_link_fake_to_real (NautilusDesktopLink *link, GMount *mount) +{ + if (link->details->type != NAUTILUS_DESKTOP_LINK_MOUNT || + link->details->is_fake == FALSE) + return; + + link->details->mount = g_object_ref (mount); + + link->details->signal_handler_obj = G_OBJECT (mount); + link->details->signal_handler = + g_signal_connect (mount, "changed", + G_CALLBACK (mount_changed_callback), link); + + nautilus_desktop_icon_file_update (link->details->icon_file); + link->details->is_fake = FALSE; +} + +void +nautilus_desktop_link_unstick (NautilusDesktopLink *link) +{ + GConfClient *client; + NautilusFile *file; + NautilusDesktopLinkMonitor *monitor; + + if (link->details->type != NAUTILUS_DESKTOP_LINK_MOUNT) + return; + + file = nautilus_desktop_link_get_icon_file (link); + nautilus_file_set_metadata (file, "stick", "FALSE", NULL); + + monitor = nautilus_desktop_link_monitor_get (); + nautilus_desktop_link_monitor_unstick_link (monitor, link); +} + +NautilusDesktopLink * +nautilus_desktop_link_new_fake_mount (gchar *gconf_dir) +{ + NautilusDesktopLink *link; + GConfClient *client; + gchar *gconf_path; + gchar *url; + + link = NAUTILUS_DESKTOP_LINK (g_object_new (NAUTILUS_TYPE_DESKTOP_LINK, NULL)); + link->details->type = NAUTILUS_DESKTOP_LINK_MOUNT; + link->details->is_fake = TRUE; + + client = gconf_client_get_default (); + link->details->gconf_dir = g_strdup (gconf_dir); + + gconf_path = g_build_filename (gconf_dir, "uri", NULL); + link->details->uri = gconf_client_get_string (client, gconf_path, NULL); + g_free (gconf_path); + + gconf_path = g_build_filename (gconf_dir, "display_name", NULL); + link->details->display_name = gconf_client_get_string (client, gconf_path, NULL); + g_free (gconf_path); + + gconf_path = g_build_filename (gconf_dir, "icon_string", NULL); + link->details->icon_string = gconf_client_get_string (client, gconf_path, NULL); + g_free (gconf_path); + + gconf_path = g_build_filename (gconf_dir, "filename", NULL); + link->details->filename = gconf_client_get_string (client, gconf_path, NULL); + g_free (gconf_path); + + link->details->icon = g_icon_new_for_string (link->details->icon_string, NULL); + link->details->activation_location = g_file_new_for_uri (link->details->uri); + + create_icon_file (link); + return link; +} + + NautilusDesktopLink * nautilus_desktop_link_new_from_mount (GMount *mount) { @@ -238,6 +329,7 @@ nautilus_desktop_link_new_from_mount (GMount *mount) link = NAUTILUS_DESKTOP_LINK (g_object_new (NAUTILUS_TYPE_DESKTOP_LINK, NULL)); link->details->type = NAUTILUS_DESKTOP_LINK_MOUNT; + link->details->is_fake = FALSE; link->details->mount = g_object_ref (mount); @@ -346,6 +438,12 @@ nautilus_desktop_link_can_rename (NautilusDesktopLink *link) link->details->type == NAUTILUS_DESKTOP_LINK_COMPUTER); } +NautilusFile * +nautilus_desktop_link_get_icon_file (NautilusDesktopLink *link) +{ + return NAUTILUS_FILE (link->details->icon_file); +} + gboolean nautilus_desktop_link_rename (NautilusDesktopLink *link, const char *name) @@ -427,7 +525,8 @@ desktop_link_finalize (GObject *object) link); } - if (link->details->type == NAUTILUS_DESKTOP_LINK_MOUNT) { + if (link->details->type == NAUTILUS_DESKTOP_LINK_MOUNT && + link->details->mount != NULL) { g_object_unref (link->details->mount); } diff --git a/libnautilus-private/nautilus-desktop-link.h b/libnautilus-private/nautilus-desktop-link.h index 5327eca..efb8ab8 100644 --- a/libnautilus-private/nautilus-desktop-link.h +++ b/libnautilus-private/nautilus-desktop-link.h @@ -63,6 +63,7 @@ GType nautilus_desktop_link_get_type (void); NautilusDesktopLink * nautilus_desktop_link_new (NautilusDesktopLinkType type); NautilusDesktopLink * nautilus_desktop_link_new_from_mount (GMount *mount); +NautilusDesktopLink * nautilus_desktop_link_new_fake_mount (gchar *gconf_name); NautilusDesktopLinkType nautilus_desktop_link_get_link_type (NautilusDesktopLink *link); char * nautilus_desktop_link_get_file_name (NautilusDesktopLink *link); char * nautilus_desktop_link_get_display_name (NautilusDesktopLink *link); @@ -77,5 +78,12 @@ gboolean nautilus_desktop_link_can_rename (NautilusD gboolean nautilus_desktop_link_rename (NautilusDesktopLink *link, const char *name); +NautilusFile * nautilus_desktop_link_get_icon_file (NautilusDesktopLink *link); +gboolean nautilus_desktop_link_is_fake (NautilusDesktopLink *link); +void nautilus_desktop_link_fake_to_real (NautilusDesktopLink *link, + GMount *mount); +char * nautilus_desktop_link_get_uri (NautilusDesktopLink *link); +void nautilus_desktop_link_unstick (NautilusDesktopLink *link); + #endif /* NAUTILUS_DESKTOP_LINK_H */
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor