The attached patch makes Nautilus not display permission emblems and permissions in the properties dialog for locations for locations like "computer:///", "network:///" etc. and also adds a "Computer" properties page. My initial plan was to use libgtop, but it turned out to be not that useful, because for in-depth information you always need other apps like "hal-device-manager". Therefore, I've modified Nautilus to display links to these applications on the "Computer" page. The "hal-device-manager" desktop file is in the capplet directory, and therefore requires a GnomeVFS API addition. -- Christian Neumair <chris gnome-de org>
Index: libnautilus-private/nautilus-file.c
===================================================================
RCS file: /cvs/gnome/nautilus/libnautilus-private/nautilus-file.c,v
retrieving revision 1.374
diff -u -p -r1.374 nautilus-file.c
--- libnautilus-private/nautilus-file.c 20 Oct 2005 15:22:12 -0000 1.374
+++ libnautilus-private/nautilus-file.c 19 Nov 2005 11:08:01 -0000
@@ -1921,11 +1921,13 @@ prepend_automatic_emblem_names (Nautilus
names = g_list_prepend
(names, g_strdup (NAUTILUS_FILE_EMBLEM_NAME_NOTE));
}
- if (!nautilus_file_can_write (file)) {
+ if (nautilus_file_should_show_permissions (file) &&
+ !nautilus_file_can_write (file)) {
names = g_list_prepend
(names, g_strdup (NAUTILUS_FILE_EMBLEM_NAME_CANT_WRITE));
}
- if (!nautilus_file_can_read (file)) {
+ if (nautilus_file_should_show_permissions (file) &&
+ !nautilus_file_can_read (file)) {
names = g_list_prepend
(names, g_strdup (NAUTILUS_FILE_EMBLEM_NAME_CANT_READ));
}
@@ -3219,6 +3221,26 @@ nautilus_file_should_show_type (Nautilus
ret = ((strcmp (uri, "computer:///") != 0) &&
(strcmp (uri, "network:///") != 0) &&
(strcmp (uri, "smb:///") != 0));
+ g_free (uri);
+
+ return ret;
+}
+
+gboolean
+nautilus_file_should_show_permissions (NautilusFile *file)
+{
+ char *uri;
+ gboolean ret;
+
+ g_return_val_if_fail (NAUTILUS_IS_FILE (file), FALSE);
+
+ uri = nautilus_file_get_uri (file);
+ ret = ((strcmp (uri, "computer:///") != 0) &&
+ (strcmp (uri, "network:///") != 0) &&
+ (strcmp (uri, "smb:///") != 0) &&
+ (strcmp (uri, "trash:///") != 0) &&
+ (strcmp (uri, "themes:///") != 0) &&
+ (strcmp (uri, "fonts:///") != 0));
g_free (uri);
return ret;
Index: libnautilus-private/nautilus-file.h
===================================================================
RCS file: /cvs/gnome/nautilus/libnautilus-private/nautilus-file.h,v
retrieving revision 1.108
diff -u -p -r1.108 nautilus-file.h
--- libnautilus-private/nautilus-file.h 20 Oct 2005 15:22:12 -0000 1.108
+++ libnautilus-private/nautilus-file.h 19 Nov 2005 11:08:01 -0000
@@ -168,6 +170,7 @@ NautilusRequestStatus nautilus_file_ge
gboolean force);
gboolean nautilus_file_should_show_directory_item_count (NautilusFile *file);
gboolean nautilus_file_should_show_type (NautilusFile *file);
+gboolean nautilus_file_should_show_permissions (NautilusFile *file);
GList * nautilus_file_get_keywords (NautilusFile *file);
void nautilus_file_set_keywords (NautilusFile *file,
GList *keywords);
Index: libnautilus-private/nautilus-program-choosing.c
===================================================================
RCS file: /cvs/gnome/nautilus/libnautilus-private/nautilus-program-choosing.c,v
retrieving revision 1.80
diff -u -p -r1.80 nautilus-program-choosing.c
--- libnautilus-private/nautilus-program-choosing.c 20 Oct 2005 15:30:42 -0000 1.80
+++ libnautilus-private/nautilus-program-choosing.c 19 Nov 2005 11:08:01 -0000
@@ -685,11 +695,11 @@ nautilus_launch_application (GnomeVFSMim
#endif
uri = NULL;
- if (nautilus_file_is_nautilus_link (file)) {
+ if (file != NULL && nautilus_file_is_nautilus_link (file)) {
uri = nautilus_file_get_activation_uri (file);
}
- if (uri == NULL) {
+ if (file != NULL && uri == NULL) {
uri = nautilus_file_get_uri (file);
}
@@ -711,26 +721,34 @@ nautilus_launch_application (GnomeVFSMim
{
char *name;
char *icon;
+ char *description;
sn_context = sn_launcher_context_new (sn_display,
screen ? gdk_screen_get_number (screen) :
DefaultScreen (gdk_display));
-
- name = nautilus_file_get_display_name (file);
+
+ name = NULL;
+ if (file != NULL) {
+ name = nautilus_file_get_display_name (file);
+ description = g_strdup_printf (_("Opening %s"), name);
+ } else {
+ name = g_strdup (gnome_vfs_mime_application_get_name (application));
+ description = g_strdup_printf (_("Launching %s"), name);
+ }
+
if (name != NULL) {
- char *description;
-
sn_launcher_context_set_name (sn_context, name);
-
- description = g_strdup_printf (_("Opening %s"), name);
-
sn_launcher_context_set_description (sn_context, description);
g_free (name);
g_free (description);
}
- icon = nautilus_icon_factory_get_icon_for_file (file, FALSE);
+ icon = NULL;
+ if (file != NULL) {
+ icon = nautilus_icon_factory_get_icon_for_file (file, FALSE);
+ }
+
if (icon != NULL) {
sn_launcher_context_set_icon_name (sn_context, icon);
g_free (icon);
@@ -784,7 +802,11 @@ nautilus_launch_application (GnomeVFSMim
break;
case GNOME_VFS_ERROR_NOT_SUPPORTED:
- uri_scheme = nautilus_file_get_uri_scheme (file);
+ uri_scheme = NULL;
+ if (file != NULL) {
+ uri_scheme = nautilus_file_get_uri_scheme (file);
+ }
+
application_cannot_open_location (application,
file,
uri_scheme,
Index: src/file-manager/fm-properties-window.c
===================================================================
RCS file: /cvs/gnome/nautilus/src/file-manager/fm-properties-window.c,v
retrieving revision 1.221
diff -u -p -r1.221 fm-properties-window.c
--- src/file-manager/fm-properties-window.c 14 Nov 2005 15:10:50 -0000 1.221
+++ src/file-manager/fm-properties-window.c 19 Nov 2005 11:08:05 -0000
@@ -78,6 +78,7 @@
#include <libnautilus-private/nautilus-undo-signal-handlers.h>
#include <libnautilus-private/nautilus-mime-actions.h>
#include <libnautilus-private/nautilus-undo.h>
+#include <libnautilus-private/nautilus-program-choosing.h>
#include <string.h>
#define PREVIEW_IMAGE_WIDTH 96
@@ -420,16 +421,17 @@ get_pixbuf_for_properties_window (FMProp
static void
-update_properties_window_icon (GtkImage *image)
+update_properties_window_icon (FMPropertiesWindow *window)
{
- GdkPixbuf *pixbuf;
- FMPropertiesWindow *window;
+ GdkPixbuf *pixbuf;
+
+ g_assert (FM_IS_PROPERTIES_WINDOW (window));
- window = g_object_get_data (G_OBJECT (image), "properties_window");
-
pixbuf = get_pixbuf_for_properties_window (window);
- gtk_image_set_from_pixbuf (image, pixbuf);
+ if (window->details->icon_image != NULL) {
+ gtk_image_set_from_pixbuf (GTK_IMAGE (window->details->icon_image), pixbuf);
+ }
gtk_window_set_icon (GTK_WINDOW (window), pixbuf);
@@ -576,7 +578,7 @@ create_image_widget (FMPropertiesWindow
g_signal_connect_object (nautilus_icon_factory_get (),
"icons_changed",
G_CALLBACK (update_properties_window_icon),
- image, G_CONNECT_SWAPPED);
+ window, G_CONNECT_SWAPPED);
window->details->icon_image = image;
window->details->icon_button = button;
@@ -1186,9 +1188,11 @@ properties_window_update (FMPropertiesWi
if (dirty_original) {
update_properties_window_title (window);
- update_properties_window_icon (GTK_IMAGE (window->details->icon_image));
+ update_properties_window_icon (window);
- update_name_field (window);
+ if (window->details->name_field != NULL) {
+ update_name_field (window);
+ }
for (l = window->details->emblem_buttons; l != NULL; l = l->next) {
emblem_button_update (window, GTK_TOGGLE_BUTTON (l->data));
@@ -2221,7 +2225,8 @@ should_show_file_type (FMPropertiesWindo
{
/* The trash on the desktop is one-of-a-kind */
if (!is_multi_file_window (window)
- && is_merged_trash_directory (get_target_file (window))) {
+ && (is_merged_trash_directory (get_target_file (window))
+ || !nautilus_file_should_show_type (get_target_file (window)))) {
return FALSE;
}
@@ -2398,6 +2403,80 @@ create_basic_page (FMPropertiesWindow *w
}
}
+static void
+desktop_launch_button_clicked (GtkButton *button,
+ GnomeVFSMimeApplication *app)
+{
+ nautilus_launch_application (app, NULL, GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (button))));
+}
+
+static GtkWidget *
+create_desktop_launch_button (const char *label,
+ const char *desktop_file_or_id)
+{
+ GnomeVFSMimeApplication *app;
+ GtkWidget *button;
+ GtkWidget *image;
+ GdkPixbuf *pixbuf;
+
+ button = gtk_button_new_with_mnemonic (label);
+
+#if GNOME_VFS_API_IN_PLACE
+ app = gnome_vfs_mime_application_new_from_desktop_file (desktop_file_or_id);
+#else
+ app = NULL;
+#endif
+
+ if (app == NULL) {
+ app = gnome_vfs_mime_application_new_from_desktop_id (desktop_file_or_id);
+ }
+
+ if (app != NULL) {
+ pixbuf = nautilus_icon_factory_get_pixbuf_from_name_with_stock_size
+ (gnome_vfs_mime_application_get_icon (app),
+ NULL, GTK_ICON_SIZE_BUTTON, NULL);
+ if (pixbuf != NULL) {
+ image = gtk_image_new_from_pixbuf (pixbuf);
+ gtk_button_set_image (GTK_BUTTON (button), image);
+ gdk_pixbuf_unref (pixbuf);
+ }
+
+ g_object_set_data_full (G_OBJECT (button), "Nautilus::GnomeVFSMimeApplication",
+ app, (GDestroyNotify) gnome_vfs_mime_application_free);
+ g_signal_connect (button, "clicked",
+ G_CALLBACK (desktop_launch_button_clicked), app);
+ }
+
+ gtk_widget_set_sensitive (button, app != NULL);
+
+ return button;
+}
+
+static void
+create_computer_page (FMPropertiesWindow *window)
+{
+ GtkWidget *vbox;
+ GtkWidget *button;
+
+ vbox = create_page_with_vbox (window->details->notebook,
+ _("Computer"));
+ gtk_box_set_spacing (GTK_BOX (vbox), 6);
+
+ button = create_desktop_launch_button (_("_View System Log"), "gnome-system-log.desktop");
+ gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
+ gtk_widget_show (GTK_WIDGET (button));
+
+ button = create_desktop_launch_button (_("_Launch System Monitor"), "gnome-system-monitor.desktop");
+ gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
+ gtk_widget_show (GTK_WIDGET (button));
+
+#if GNOME_VFS_API_IN_PLACE
+ button = create_desktop_launch_button ("L_aunch Device Manager", DATADIR "/control-center-2.0/capplets/hal-device-manager.desktop");
+ gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
+ gtk_widget_show (GTK_WIDGET (button));
+#endif
+}
+
static GHashTable *
get_initial_emblems (GList *files)
{
@@ -3146,13 +3225,27 @@ should_show_emblems (FMPropertiesWindow
}
static gboolean
+should_show_computer (FMPropertiesWindow *window)
+{
+ char *uri;
+ gboolean ret;
+
+ ret = FALSE;
+ if (!is_multi_file_window (window)) {
+ uri = nautilus_file_get_uri (get_target_file (window));
+ ret = gnome_vfs_uris_match (uri, "computer:///");
+ g_free (uri);
+ }
+
+ return ret;
+}
+
+static gboolean
should_show_permissions (FMPropertiesWindow *window)
{
- /* Don't show permissions for the Trash since it's not
- * really a file system object.
- */
if (!is_multi_file_window (window)
- && is_merged_trash_directory (get_target_file (window))) {
+ && (!nautilus_file_can_get_permissions (get_target_file (window))
+ || !nautilus_file_should_show_permissions (get_target_file (window)))) {
return FALSE;
}
@@ -3313,6 +3406,7 @@ create_properties_window (StartupData *s
/* Set initial window title */
update_properties_window_title (window);
+ update_properties_window_icon (window);
/* Start monitoring the file attributes we display. Note that some
* of the attributes are for the original file, and some for the
@@ -3379,7 +3473,11 @@ create_properties_window (StartupData *s
TRUE, TRUE, 0);
/* Create the pages. */
- create_basic_page (window);
+ if (should_show_computer (window)) {
+ create_computer_page (window);
+ } else {
+ create_basic_page (window);
+ }
if (should_show_emblems (window)) {
create_emblems_page (window);
@@ -3699,6 +3797,10 @@ real_destroy (GtkObject *object)
g_source_remove (window->details->update_files_timeout_id);
window->details->update_files_timeout_id = 0;
}
+
+ g_signal_handlers_disconnect_by_func (nautilus_icon_factory_get (),
+ update_properties_window_icon,
+ window);
GTK_OBJECT_CLASS (parent_class)->destroy (object);
}
Attachment:
signature.asc
Description: This is a digitally signed message part