summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSayamindu Dasgupta <sayamindu@src.gnome.org>2007-07-31 10:16:27 +0000
committerSayamindu Dasgupta <sayamindu@src.gnome.org>2007-07-31 10:16:27 +0000
commit4919ad7351cf2273f1fb3e32c9bb851f069128c4 (patch)
tree4ed62a5d605f90c4564902012f6d81e69913fa30
parent1ff2c6e19b6359c1b697906c4e0950ccba1942b4 (diff)
downloadnautilus-4919ad7351cf2273f1fb3e32c9bb851f069128c4.tar.gz
Added initial support for global desktop links
svn path=/branches/nautilus-lockdown/; revision=13044
-rw-r--r--ChangeLog13
-rw-r--r--libnautilus-private/apps_nautilus_preferences.schemas.in29
-rw-r--r--libnautilus-private/nautilus-desktop-link-monitor.c148
-rw-r--r--libnautilus-private/nautilus-desktop-link.c80
-rw-r--r--libnautilus-private/nautilus-desktop-link.h5
-rw-r--r--libnautilus-private/nautilus-global-preferences.h2
-rw-r--r--src/file-manager/fm-directory-view.c12
7 files changed, 288 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 3519f83d0..82bb19f46 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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);