http://bugzilla.gnome.org/show_bug.cgi?id=338933 Don't show .desktop files which are specific to other desktop environments ("OnlyShowIn=foo" where foo != GNOME). This patch ignores those files at a very low level (NautilusDirectoryAsync), and for all directories. It should probably only do it for ~/Desktop: the original bug is about not wanting to show the .desktop files which KDE drops in your ~/Desktop (those files do have OnlyShowIn=KDE). 2006-05-22 Federico Mena Quintero * libnautilus-private/nautilus-directory-async.c (is_foreign_desktop_file): Argh, check that the OnlyShowIn / NotShowIn strings exist before testing their contents. Fixes https://bugzilla.novell.com/show_bug.cgi?id=177777; this was filtering all .desktop files! 2006-05-16 Federico Mena Quintero * libnautilus-private/nautilus-directory-async.c (is_foreign_desktop_file): Split the contents of the OnlyShowIn key; it can be a list of strings. Also consider the NotShowIn key. Fixes https://bugzilla.novell.com/show_bug.cgi?id=176123 2006-04-18 Federico Mena Quintero Skip .desktop files which are specific to other desktop environments ("OnlyShowIn=foo"). Fixes these bugs: http://bugzilla.gnome.org/show_bug.cgi?id=338933 https://bugzilla.novell.com/show_bug.cgi?id=158158 * libnautilus-private/nautilus-directory-async.c (is_foreign_desktop_file): New helper function: returns TRUE if it gets a .desktop file with "OnlyShowIn=" not for GNOME. (directory_load_one): Use is_foreign_desktop_file(), and skip .desktop files which belong to other desktop environments. * src/nautilus-application.c (remove_desktop_dot_hidden): Unlink ~/Desktop/.hidden, which was a Suse hack. (finish_startup): Call remove_desktop_dot_hidden(). ================================================================================ --- nautilus-2.15.4/libnautilus-private/nautilus-directory-async.c +++ nautilus-2.15.4/libnautilus-private/nautilus-directory-async.c @@ -939,12 +939,79 @@ } } +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; +} + +static gboolean +is_foreign_desktop_file (NautilusDirectory *directory, + GnomeVFSFileInfo *info) +{ + const char *mime_type; + char *uri; + GnomeDesktopItem *ditem; + gboolean retval; + + if (!(info->valid_fields & GNOME_VFS_FILE_INFO_FIELDS_MIME_TYPE)) { + return FALSE; + } + + mime_type = gnome_vfs_file_info_get_mime_type (info); + if (g_ascii_strcasecmp (mime_type, "application/x-desktop") != 0) { + return FALSE; + } + + uri = nautilus_directory_get_file_uri (directory, info->name); + + /* NULL GError */ + ditem = gnome_desktop_item_new_from_uri (uri, 0, NULL); + + retval = FALSE; + + if (ditem) { + char **only_show_in; + char **not_show_in; + + only_show_in = gnome_desktop_item_get_strings (ditem, GNOME_DESKTOP_ITEM_ONLY_SHOW_IN); + if (only_show_in && !string_array_contains (only_show_in, "GNOME")) { + retval = TRUE; + } + g_strfreev (only_show_in); + + not_show_in = gnome_desktop_item_get_strings (ditem, "NotShowIn"); + if (not_show_in && string_array_contains (not_show_in, "GNOME")) { + retval = TRUE; + } + g_strfreev (not_show_in); + + gnome_desktop_item_unref (ditem); + } + + g_free (uri); + + return retval; +} + static void directory_load_one (NautilusDirectory *directory, GnomeVFSFileInfo *info) { if (info == NULL || info->name == NULL || - is_dot_or_dot_dot (info->name)) { + is_dot_or_dot_dot (info->name) || + is_foreign_desktop_file (directory, info)) { return; } --- nautilus-2.15.4/src/nautilus-application.c +++ nautilus-2.15.4/src/nautilus-application.c @@ -384,6 +384,45 @@ nautilus_module_extension_list_free (providers); } +/* Suse had a hack in Nautilus (dot-hidden.dif) that would create a + * ~/Desktop/hidden file with the following entries, in order to skip + * launchers created by KDE: + * + * myComputer.desktop + * Printer.desktop + * Network.desktop + * SuSE.desktop + * MozillaFirefox.desktop + * Office.desktop + * trash.desktop + * + * This was a hack around https://bugzilla.novell.com/show_bug.cgi?id=58875, but + * it creates problems: people like to drag a MozillaFirefox.desktop to their + * desktop, and it would be ignored due to that patch. + * + * So, now we unlink() the ~/Desktop/.hidden file under the rationale that that + * folder is under your complete control --- if you don't want to see a file in + * there, you can just delete it. + * + * The .desktop files for KDE launchers should have "OnlyShowIn=KDE" in them; + * now we support this properly. See + * https://bugzilla.novell.com/show_bug.cgi?id=158158 for this. + */ +static void +remove_desktop_dot_hidden (void) +{ + char *desktop_dir; + char *dot_hidden; + + desktop_dir = nautilus_get_desktop_directory (); + dot_hidden = g_build_filename (desktop_dir, ".hidden", NULL); + + unlink (dot_hidden); + + g_free (desktop_dir); + g_free (dot_hidden); +} + static void finish_startup (NautilusApplication *application) { @@ -401,6 +440,9 @@ /* Make the desktop work with old Nautilus. */ migrate_old_nautilus_files (); + /* Remove artifact from the old dot-hidden.dif patch in Suse */ + remove_desktop_dot_hidden (); + /* Initialize the desktop link monitor singleton */ nautilus_desktop_link_monitor_get (); }