2008-03-26 Federico Mena Quintero Do not show .desktop files in ~/Desktop which are OnlyShowIn=KDE or similar. http://bugzilla.gnome.org/show_bug.cgi?id=338933 https://bugzilla.novell.com/show_bug.cgi?id=366100 * libnautilus-private/nautilus-link.c (nautilus_link_get_link_info_given_file_contents): Add a return "is_foreign" argument, which says if OnlyShowIn/NotShowIn within the .desktop file say that it shouldn't be shown in GNOME. * libnautilus-private/nautilus-directory-async.c (link_info_got_data): Use the is_foreign information. (link_info_done): Store file->details->is_foreign_link. * libnautilus-private/nautilus-file-private.h (struct NautilusFileDetails): Add an is_foreign_link field. * libnautilus-private/nautilus-file.c (nautilus_file_clear_info): Initialize is_foreign_link. (nautilus_file_is_foreign_link): New public function. (nautilus_file_should_show): Don't show foreign links in the desktop directory. Index: nautilus-2.24.1/libnautilus-private/nautilus-directory-async.c =================================================================== --- nautilus-2.24.1.orig/libnautilus-private/nautilus-directory-async.c +++ nautilus-2.24.1/libnautilus-private/nautilus-directory-async.c @@ -199,7 +199,8 @@ static void link_info_done const char *uri, const char *name, const char *icon, - gboolean is_launcher); + gboolean is_launcher, + gboolean is_foreign); static void move_file_to_low_priority_queue (NautilusDirectory *directory, NautilusFile *file); static void move_file_to_extension_queue (NautilusDirectory *directory, @@ -1717,7 +1718,7 @@ lacks_link_info (NautilusFile *file) if (nautilus_file_is_nautilus_link (file)) { return TRUE; } else { - link_info_done (file->details->directory, file, NULL, NULL, NULL, FALSE); + link_info_done (file->details->directory, file, NULL, NULL, NULL, FALSE, FALSE); return FALSE; } } else { @@ -3558,7 +3559,8 @@ link_info_done (NautilusDirectory *direc const char *uri, const char *name, const char *icon, - gboolean is_launcher) + gboolean is_launcher, + gboolean is_foreign) { file->details->link_info_is_up_to_date = TRUE; @@ -3576,6 +3578,7 @@ link_info_done (NautilusDirectory *direc } file->details->custom_icon = g_strdup (icon); file->details->is_launcher = is_launcher; + file->details->is_foreign_link = is_foreign; nautilus_directory_async_state_changed (directory); } @@ -3622,6 +3625,7 @@ link_info_got_data (NautilusDirectory *d { char *link_uri, *uri, *name, *icon; gboolean is_launcher; + gboolean is_foreign; nautilus_directory_ref (directory); @@ -3629,19 +3633,20 @@ link_info_got_data (NautilusDirectory *d name = NULL; icon = NULL; is_launcher = FALSE; + is_foreign = FALSE; /* Handle the case where we read the Nautilus link. */ if (result) { link_uri = nautilus_file_get_uri (file); nautilus_link_get_link_info_given_file_contents (file_contents, bytes_read, link_uri, - &uri, &name, &icon, &is_launcher); + &uri, &name, &icon, &is_launcher, &is_foreign); g_free (link_uri); } else { /* FIXME bugzilla.gnome.org 42433: We should report this error to the user. */ } nautilus_file_ref (file); - link_info_done (directory, file, uri, name, icon, is_launcher); + link_info_done (directory, file, uri, name, icon, is_launcher, is_foreign); nautilus_file_changed (file); nautilus_file_unref (file); @@ -3729,7 +3734,7 @@ link_info_start (NautilusDirectory *dire /* If it's not a link we are done. If it is, we need to read it. */ if (!nautilus_style_link) { - link_info_done (directory, file, NULL, NULL, NULL, FALSE); + link_info_done (directory, file, NULL, NULL, NULL, FALSE, FALSE); } else if (should_read_link_info_sync (file)) { result = g_file_load_contents (location, NULL, &file_contents, &file_size, NULL, NULL); link_info_got_data (directory, file, result, file_size, file_contents); Index: nautilus-2.24.1/libnautilus-private/nautilus-file-private.h =================================================================== --- nautilus-2.24.1.orig/libnautilus-private/nautilus-file-private.h +++ nautilus-2.24.1/libnautilus-private/nautilus-file-private.h @@ -198,6 +198,7 @@ struct NautilusFileDetails eel_boolean_bit has_open_window : 1; eel_boolean_bit is_launcher : 1; + eel_boolean_bit is_foreign_link : 1; eel_boolean_bit is_symlink : 1; eel_boolean_bit is_mountpoint : 1; eel_boolean_bit is_hidden : 1; Index: nautilus-2.24.1/libnautilus-private/nautilus-file.c =================================================================== --- nautilus-2.24.1.orig/libnautilus-private/nautilus-file.c +++ nautilus-2.24.1/libnautilus-private/nautilus-file.c @@ -332,6 +332,7 @@ nautilus_file_clear_info (NautilusFile * file->details->thumbnailing_failed = FALSE; file->details->is_launcher = FALSE; + file->details->is_foreign_link = FALSE; file->details->is_symlink = FALSE; file->details->is_hidden = FALSE; file->details->is_backup = FALSE; @@ -2791,7 +2792,10 @@ nautilus_file_should_show (NautilusFile if (nautilus_file_is_in_trash (file)) { return TRUE; } else { - return (show_hidden || (!nautilus_file_is_hidden_file (file) && !is_file_hidden (file))) && + return (show_hidden || + (!nautilus_file_is_hidden_file (file) && !is_file_hidden (file) && + !(nautilus_file_is_in_desktop (file) + && nautilus_file_is_foreign_link (file)))) && (show_backup || !nautilus_file_is_backup_file (file)); } } @@ -3196,6 +3200,12 @@ nautilus_file_is_launcher (NautilusFile } gboolean +nautilus_file_is_foreign_link (NautilusFile *file) +{ + return file->details->is_foreign_link; +} + +gboolean nautilus_file_has_activation_uri (NautilusFile *file) { return file->details->activation_location != NULL; Index: nautilus-2.24.1/libnautilus-private/nautilus-file.h =================================================================== --- nautilus-2.24.1.orig/libnautilus-private/nautilus-file.h +++ nautilus-2.24.1/libnautilus-private/nautilus-file.h @@ -397,6 +397,7 @@ GList *nautilus_file_li * Getting this can require reading the contents of the file. */ gboolean nautilus_file_is_launcher (NautilusFile *file); +gboolean nautilus_file_is_foreign_link (NautilusFile *file); gboolean nautilus_file_has_activation_uri (NautilusFile *file); char * nautilus_file_get_activation_uri (NautilusFile *file); GFile * nautilus_file_get_activation_location (NautilusFile *file); Index: nautilus-2.24.1/libnautilus-private/nautilus-link.c =================================================================== --- nautilus-2.24.1.orig/libnautilus-private/nautilus-link.c +++ nautilus-2.24.1/libnautilus-private/nautilus-link.c @@ -430,6 +430,23 @@ nautilus_link_local_get_link_uri (const return retval; } +static gboolean +string_array_contains (char **array, + const char *str) +{ + char **p; + + if (!array) + return FALSE; + + for (p = array; *p; p++) + if (g_ascii_strcasecmp (*p, str) == 0) { + return TRUE; + } + + return FALSE; +} + void nautilus_link_get_link_info_given_file_contents (const char *file_contents, int link_file_size, @@ -437,10 +454,13 @@ nautilus_link_get_link_info_given_file_c char **uri, char **name, char **icon, - gboolean *is_launcher) + gboolean *is_launcher, + gboolean *is_foreign) { GnomeDesktopItem *desktop_file; const char *type; + char **only_show_in; + char **not_show_in; if (!is_link_data (file_contents, link_file_size)) { return; @@ -464,7 +484,20 @@ nautilus_link_get_link_info_given_file_c gnome_desktop_item_get_string (desktop_file, "Exec") != NULL) { *is_launcher = TRUE; } - + + *is_foreign = FALSE; + only_show_in = gnome_desktop_item_get_strings (desktop_file, GNOME_DESKTOP_ITEM_ONLY_SHOW_IN); + if (only_show_in && !string_array_contains (only_show_in, "GNOME")) { + *is_foreign = TRUE; + } + g_strfreev (only_show_in); + + not_show_in = gnome_desktop_item_get_strings (desktop_file, "NotShowIn"); /* bleh, there isn't GNOME_DESKTOP_ITEM_NO_SHOW_IN */ + if (not_show_in && string_array_contains (not_show_in, "GNOME")) { + *is_foreign = TRUE; + } + g_strfreev (not_show_in); + gnome_desktop_item_unref (desktop_file); } Index: nautilus-2.24.1/libnautilus-private/nautilus-link.h =================================================================== --- nautilus-2.24.1.orig/libnautilus-private/nautilus-link.h +++ nautilus-2.24.1/libnautilus-private/nautilus-link.h @@ -47,7 +47,8 @@ void nautilus_link_get_link_ char **uri, char **name, char **icon, - gboolean *is_launcher); + gboolean *is_launcher, + gboolean *is_foreign); void nautilus_link_local_create_from_gnome_entry (GnomeDesktopItem *entry, const char *dest_uri, const GdkPoint *position,