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. diff --git a/libnautilus-private/nautilus-directory-async.c b/libnautilus-private/nautilus-directory-async.c index c1d0a0a..36eb02f 100644 --- a/libnautilus-private/nautilus-directory-async.c +++ b/libnautilus-private/nautilus-directory-async.c @@ -198,7 +198,8 @@ static void link_info_done (NautilusDirectory 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, @@ -1716,7 +1717,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 { @@ -3515,7 +3516,8 @@ link_info_done (NautilusDirectory *directory, 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; @@ -3533,6 +3535,7 @@ link_info_done (NautilusDirectory *directory, } 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); } @@ -3579,6 +3582,7 @@ link_info_got_data (NautilusDirectory *directory, { char *uri, *name, *icon; gboolean is_launcher; + gboolean is_foreign; nautilus_directory_ref (directory); @@ -3586,17 +3590,18 @@ link_info_got_data (NautilusDirectory *directory, name = NULL; icon = NULL; is_launcher = FALSE; + is_foreign = FALSE; /* Handle the case where we read the Nautilus link. */ if (result) { nautilus_link_get_link_info_given_file_contents (file_contents, bytes_read, - &uri, &name, &icon, &is_launcher); + &uri, &name, &icon, &is_launcher, &is_foreign); } 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); @@ -3684,7 +3689,7 @@ link_info_start (NautilusDirectory *directory, /* 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); diff --git a/libnautilus-private/nautilus-file-private.h b/libnautilus-private/nautilus-file-private.h index 8420a7e..2552cf9 100644 --- a/libnautilus-private/nautilus-file-private.h +++ b/libnautilus-private/nautilus-file-private.h @@ -190,6 +190,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; diff --git a/libnautilus-private/nautilus-file.c b/libnautilus-private/nautilus-file.c index 88139eb..23f01df 100644 --- a/libnautilus-private/nautilus-file.c +++ b/libnautilus-private/nautilus-file.c @@ -323,6 +323,7 @@ nautilus_file_clear_info (NautilusFile *file) 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; @@ -2705,7 +2706,8 @@ nautilus_file_should_show (NautilusFile *file, gboolean show_hidden, gboolean show_backup) { - 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)); } @@ -3038,6 +3040,12 @@ nautilus_file_is_launcher (NautilusFile *file) } 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; diff --git a/libnautilus-private/nautilus-file.h b/libnautilus-private/nautilus-file.h index 99e0aeb..9db13f9 100644 --- a/libnautilus-private/nautilus-file.h +++ b/libnautilus-private/nautilus-file.h @@ -378,6 +378,7 @@ GList *nautilus_file_list_filter_hidden_and_backup (GList * 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); diff --git a/libnautilus-private/nautilus-link.c b/libnautilus-private/nautilus-link.c index abe244a..a6625d7 100644 --- a/libnautilus-private/nautilus-link.c +++ b/libnautilus-private/nautilus-link.c @@ -406,16 +406,36 @@ nautilus_link_local_get_link_uri (const char *uri) 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, 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; @@ -437,7 +457,20 @@ nautilus_link_get_link_info_given_file_contents (const char *file_contents, 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); } diff --git a/libnautilus-private/nautilus-link.h b/libnautilus-private/nautilus-link.h index 4a5eb94..aba3103 100644 --- a/libnautilus-private/nautilus-link.h +++ b/libnautilus-private/nautilus-link.h @@ -46,7 +46,8 @@ void nautilus_link_get_link_info_given_file_contents (const char 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,