Author: vuntz Date: Sun Feb 10 21:52:44 2008 New Revision: 10797 URL: http://svn.gnome.org/viewvc/gnome-panel?rev=10797&view=rev
Log: 2008-02-10 Vincent Untz <[EMAIL PROTECTED]> Once upon a time, someone created gio. And those words were told: "thou shall port your application to gio". And people worked hard towards this goal. * Makefile.am: * panel-mount-operation.[ch]: add PanelMountOperation, stolen from eel * panel-menu-items.c: (activate_uri): easy port to gio (panel_menu_items_append_from_desktop): ditto (panel_place_menu_item_append_gtk_bookmarks): harder, but still okay port to gio (drive_poll_for_media_cb): new, callback when polling a drive. There's a FIXME: should we automount the newly discovered volume? (panel_menu_item_rescan_drive): new, we poll a drive when we activate it (panel_menu_item_append_drive): new, to append a drive to the menu (volume_mount_cb): new, callback when mounting a volume. There's a FIXME: should we activate the URI of the new mount? (panel_menu_item_mount_volume): new, we mount a volume when we activate it (panel_menu_item_append_volume): new, to append a volume to the menu (panel_menu_item_append_mount): new, to append a mount to the menu (panel_place_menu_item_append_volumes): new, based on nautilus code (panel_place_menu_item_append_mounts): ditto (panel_place_menu_item_create_menu): simplify code to get the name of the Home folder, easy port to gio (panel_place_menu_item_gtk_bookmarks_changed): updated (panel_place_menu_item_mounts_changed): updated (panel_place_menu_item_finalize): updated (panel_place_menu_item_init): easy port * panel-util.[ch]: (panel_util_get_icon_name_from_g_icon): export (panel_util_get_file_display_name_if_mount): fix leak (panel_util_get_file_icon_name_if_mount): fix leak Added: trunk/gnome-panel/panel-mount-operation.c trunk/gnome-panel/panel-mount-operation.h Modified: trunk/gnome-panel/ChangeLog trunk/gnome-panel/Makefile.am trunk/gnome-panel/panel-menu-items.c trunk/gnome-panel/panel-util.c trunk/gnome-panel/panel-util.h Modified: trunk/gnome-panel/Makefile.am ============================================================================== --- trunk/gnome-panel/Makefile.am (original) +++ trunk/gnome-panel/Makefile.am Sun Feb 10 21:52:44 2008 @@ -99,6 +99,7 @@ panel-gdm.c \ panel-power-manager.c \ panel-ditem-editor.c \ + panel-mount-operation.c \ $(NULL) panel_headers = \ @@ -149,6 +150,7 @@ panel-power-manager.h \ panel-ditem-editor.h \ panel-icon-names.h \ + panel-mount-operation.h \ $(NULL) gnome_panel_SOURCES = \ Modified: trunk/gnome-panel/panel-menu-items.c ============================================================================== --- trunk/gnome-panel/panel-menu-items.c (original) +++ trunk/gnome-panel/panel-menu-items.c Sun Feb 10 21:52:44 2008 @@ -37,8 +37,8 @@ #include <string.h> #include <glib/gi18n.h> +#include <gio/gio.h> -#include <libgnomevfs/gnome-vfs.h> #include <libgnome/gnome-url.h> #include <libgnomeui/gnome-url.h> @@ -47,6 +47,7 @@ #include "panel-globals.h" #include "panel-icon-names.h" #include "panel-lockdown.h" +#include "panel-mount-operation.h" #include "panel-recent.h" #include "panel-stock-icons.h" #include "panel-util.h" @@ -71,10 +72,12 @@ GtkRecentManager *recent_manager; - GnomeVFSMonitorHandle *bookmarks_monitor; + GFileMonitor *bookmarks_monitor; - gulong volume_mounted_id; - gulong volume_unmounted_id; + GVolumeMonitor *volume_monitor; + gulong mount_added_id; + gulong mount_changed_id; + gulong mount_removed_id; guint use_image : 1; }; @@ -87,21 +90,29 @@ guint append_lock_logout : 1; }; -static GnomeVFSVolumeMonitor *volume_monitor = NULL; - static void activate_uri (GtkWidget *menuitem, const char *path) { GError *error = NULL; + GFile *file; GdkScreen *screen; - char *url; char *escaped; + char *scheme; + char *url; screen = menuitem_to_screen (menuitem); - - url = gnome_vfs_make_uri_from_input_with_dirs (path, - GNOME_VFS_MAKE_URI_DIR_HOMEDIR); + + scheme = g_uri_get_scheme (path); + if (scheme) { + url = g_strdup (path); + g_free (scheme); + } else { + file = g_file_new_for_path (path); + url = g_file_get_uri (file); + g_object_unref (file); + } + if (g_str_has_prefix (url, "x-nautilus-search:")) { //FIXME: this is ugly... char *command; @@ -218,7 +229,8 @@ g_signal_connect (G_OBJECT (item), "button_press_event", G_CALLBACK (menu_dummy_button_press_event), NULL); - uri = gnome_vfs_get_uri_from_local_path (full_path); + uri = g_filename_to_uri (full_path); + setup_uri_drag (item, uri, icon); g_free (uri); @@ -342,10 +354,10 @@ for (i = 0; lines[i]; i++) { if (lines[i][0] && !g_hash_table_lookup (table, lines[i])) { - GnomeVFSURI *uri; - char *space; - char *label; - gboolean keep; + GFile *file; + char *space; + char *label; + gboolean keep; g_hash_table_insert (table, lines[i], lines[i]); @@ -358,22 +370,15 @@ } keep = FALSE; - uri = NULL; - if (g_str_has_prefix (lines[i], "x-nautilus-search:") || - g_str_has_prefix (lines[i], "trash:")) + if (g_str_has_prefix (lines[i], "x-nautilus-search:")) keep = TRUE; if (!keep) { - uri = gnome_vfs_uri_new (lines[i]); - if (uri) { - const char *scheme; - - scheme = gnome_vfs_uri_get_scheme (uri); - keep = strcmp (scheme, "file") != 0 || - gnome_vfs_uri_exists (uri); - gnome_vfs_uri_unref (uri); - } + file = g_file_new_for_uri (lines[i]); + keep = !g_file_is_native (file) || + g_file_query_exists (file, NULL); + g_object_unref (file); } if (!keep) { @@ -412,17 +417,20 @@ } for (l = add_bookmarks; l; l = l->next) { - char *display_uri; + char *display_name; char *tooltip; char *label; char *icon; + GFile *file; bookmark = l->data; - - display_uri = gnome_vfs_format_uri_for_display (bookmark->full_uri); + + file = g_file_new_for_uri (bookmark->full_uri); + display_name = g_file_get_parse_name (file); + g_object_unref (file); /* Translators: %s is a URI */ - tooltip = g_strdup_printf (_("Open '%s'"), display_uri); - g_free (display_uri); + tooltip = g_strdup_printf (_("Open '%s'"), display_name); + g_free (display_name); label = NULL; if (bookmark->label) { @@ -471,58 +479,340 @@ } static void -panel_place_menu_item_append_volumes (GtkWidget *menu, - gboolean connected_volumes) +drive_poll_for_media_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) { - GtkWidget *add_menu; - GList *volumes, *l; - GSList *add_volumes, *sl; + GdkScreen *screen; + GError *error; + char *primary; + char *name; - volumes = gnome_vfs_volume_monitor_get_mounted_volumes (volume_monitor); - add_volumes = NULL; + error = NULL; + if (!g_drive_poll_for_media_finish (G_DRIVE (source_object), + res, &error)) { + if (error->code != G_IO_ERROR_FAILED_HANDLED) { + screen = GDK_SCREEN (user_data); + + name = g_drive_get_name (G_DRIVE (source_object)); + primary = g_strdup_printf (_("Unable to scan %s for media changes"), + name); + g_free (name); + panel_error_dialog (NULL, screen, + "cannot_scan_drive", TRUE, + primary, error->message); + g_free (primary); + } + g_error_free (error); + } - for (l = volumes; l; l = l->next) { - GnomeVFSVolume *volume = l->data; + //FIXME: should we mount the volume and activate the root of the new + //mount? +} - if (!gnome_vfs_volume_is_user_visible (volume) || - !gnome_vfs_volume_is_mounted (volume)) - continue; +static void +panel_menu_item_rescan_drive (GtkWidget *menuitem, + GDrive *drive) +{ + g_drive_poll_for_media (drive, NULL, + drive_poll_for_media_cb, + menuitem_to_screen (menuitem)); +} + +static void +panel_menu_item_append_drive (GtkWidget *menu, + GDrive *drive) +{ + GtkWidget *item; + GIcon *icon; + char *icon_name; + char *title; + char *tooltip; + + icon = g_drive_get_icon (drive); + icon_name = panel_util_get_icon_name_from_g_icon (icon); + g_object_unref (icon); + + title = g_drive_get_name (drive); + + item = gtk_image_menu_item_new (); + setup_menu_item_with_icon (item, + panel_menu_icon_get_size (), + icon_name, + NULL, + title); - switch (gnome_vfs_volume_get_volume_type (volume)) { - case GNOME_VFS_VOLUME_TYPE_CONNECTED_SERVER: - if (connected_volumes) - add_volumes = g_slist_prepend (add_volumes, - volume); - break; - default: - if (!connected_volumes) - add_volumes = g_slist_prepend (add_volumes, - volume); - break; + tooltip = g_strdup_printf (_("Rescan %s"), title); + panel_util_set_tooltip_text (item, tooltip); + g_free (tooltip); + + g_free (icon_name); + g_free (title); + + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + + g_signal_connect_data (item, "activate", + G_CALLBACK (panel_menu_item_rescan_drive), + g_object_ref (drive), + (GClosureNotify) g_object_unref, 0); + + g_signal_connect (G_OBJECT (item), "button_press_event", + G_CALLBACK (menu_dummy_button_press_event), NULL); +} + +typedef struct { + GdkScreen *screen; + GMountOperation *mount_op; +} PanelVolumeMountData; + +static void +volume_mount_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + PanelVolumeMountData *mount_data = user_data; + GError *error; + char *primary; + char *name; + + error = NULL; + if (!g_volume_mount_finish (G_VOLUME (source_object), res, &error)) { + if (error->code != G_IO_ERROR_FAILED_HANDLED) { + name = g_volume_get_name (G_VOLUME (source_object)); + primary = g_strdup_printf (_("Unable to mount %s"), + name); + g_free (name); + + panel_error_dialog (NULL, mount_data->screen, + "cannot_mount_volume", TRUE, + primary, error->message); + g_free (primary); } + g_error_free (error); } + + //FIXME: should we activate the root of the new mount? - add_volumes = g_slist_sort (add_volumes, - (GCompareFunc) gnome_vfs_volume_compare); + g_object_unref (mount_data->mount_op); + g_slice_free (PanelVolumeMountData, mount_data); +} - if (g_slist_length (add_volumes) <= MAX_ITEMS_OR_SUBMENU) { - add_menu = menu; - } else { - GtkWidget *item; - const char *title; - const char *icon; +static void +panel_menu_item_mount_volume (GtkWidget *menuitem, + GVolume *volume) +{ + PanelVolumeMountData *mount_data; + + mount_data = g_slice_new (PanelVolumeMountData); + mount_data->screen = menuitem_to_screen (menuitem); + /*FIXME: kill PanelMountOperation when we can depend on newer GTK+ that + * will have the same feature */ + mount_data->mount_op = panel_mount_operation_new (NULL); + + g_volume_mount (volume, mount_data->mount_op, NULL, + volume_mount_cb, mount_data); +} + +static void +panel_menu_item_append_volume (GtkWidget *menu, + GVolume *volume) +{ + GtkWidget *item; + GIcon *icon; + char *icon_name; + char *title; + char *tooltip; + + icon = g_volume_get_icon (volume); + icon_name = panel_util_get_icon_name_from_g_icon (icon); + g_object_unref (icon); + + title = g_volume_get_name (volume); - if (connected_volumes) { - title = _("Network Places"); - icon = PANEL_ICON_NETWORK_SERVER; + item = gtk_image_menu_item_new (); + setup_menu_item_with_icon (item, + panel_menu_icon_get_size (), + icon_name, + NULL, + title); + + tooltip = g_strdup_printf (_("Mount %s"), title); + panel_util_set_tooltip_text (item, tooltip); + g_free (tooltip); + + g_free (icon_name); + g_free (title); + + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + + g_signal_connect_data (item, "activate", + G_CALLBACK (panel_menu_item_mount_volume), + g_object_ref (volume), + (GClosureNotify) g_object_unref, 0); + + g_signal_connect (G_OBJECT (item), "button_press_event", + G_CALLBACK (menu_dummy_button_press_event), NULL); +} + +static void +panel_menu_item_append_mount (GtkWidget *menu, + GMount *mount) +{ + GFile *root; + GIcon *icon; + char *icon_name; + char *display_name; + char *activation_uri; + + icon = g_mount_get_icon (mount); + icon_name = panel_util_get_icon_name_from_g_icon (icon); + g_object_unref (icon); + + display_name = g_mount_get_name (mount); + + root = g_mount_get_root (mount); + activation_uri = g_file_get_uri (root); + g_object_unref (root); + + panel_menu_items_append_place_item (icon_name, + display_name, + display_name, //FIXME tooltip + menu, + G_CALLBACK (activate_uri), + activation_uri); + + g_free (icon_name); + g_free (display_name); + g_free (activation_uri); +} + +/* this is loosely based on update_places() from nautilus-places-sidebar.c */ +static void +panel_place_menu_item_append_volumes (PanelPlaceMenuItem *place_item, + GtkWidget *menu) +{ + GList *l; + GList *ll; + GList *drives; + GDrive *drive; + GList *volumes; + GVolume *volume; + GMount *mount; + + /* first go through all connected drives */ + drives = g_volume_monitor_get_connected_drives (place_item->priv->volume_monitor); + for (l = drives; l != NULL; l = l->next) { + drive = l->data; + + volumes = g_drive_get_volumes (drive); + if (volumes != NULL) { + for (ll = volumes; ll != NULL; ll = ll->next) { + volume = ll->data; + mount = g_volume_get_mount (volume); + if (mount != NULL) { + panel_menu_item_append_mount (menu, + mount); + g_object_unref (mount); + } else { + /* Do show the unmounted volumes; this + * is so the user can mount it (in case + * automounting is off). + * + * Also, even if automounting is + * enabled, this gives a visual cue + * that the user should remember to + * yank out the media if he just + * unmounted it. + */ + panel_menu_item_append_volume (menu, + volume); + } + g_object_unref (volume); + } + g_list_free (volumes); } else { - title = _("Removable Media"); - icon = PANEL_ICON_REMOVABLE_MEDIA; + if (g_drive_is_media_removable (drive) && + !g_drive_is_media_check_automatic (drive)) { + /* If the drive has no mountable volumes and we + * cannot detect media change.. we display the + * drive so the user can manually poll the + * drive by clicking on it..." + * + * This is mainly for drives like floppies + * where media detection doesn't work.. but + * it's also for human beings who like to turn + * off media detection in the OS to save + * battery juice. + */ + panel_menu_item_append_drive (menu, drive); + } + } + g_object_unref (drive); + } + g_list_free (drives); + + /* add all volumes that is not associated with a drive */ + volumes = g_volume_monitor_get_volumes (place_item->priv->volume_monitor); + for (l = volumes; l != NULL; l = l->next) { + volume = l->data; + drive = g_volume_get_drive (volume); + if (drive != NULL) { + g_object_unref (volume); + g_object_unref (drive); + continue; + } + mount = g_volume_get_mount (volume); + if (mount != NULL) { + panel_menu_item_append_mount (menu, mount); + g_object_unref (mount); + } else { + /* see comment above in why we add an icon for an + * unmounted mountable volume */ + panel_menu_item_append_volume (menu, volume); + } + g_object_unref (volume); + } + g_list_free (volumes); +} + +/* this is loosely based on update_places() from nautilus-places-sidebar.c */ +static void +panel_place_menu_item_append_mounts (PanelPlaceMenuItem *place_item, + GtkWidget *menu) +{ + GtkWidget *add_menu; + GList *mounts, *l; + GMount *mount; + GSList *add_mounts, *sl; + + /* add mounts that has no volume (/etc/mtab mounts, ftp, sftp,...) */ + mounts = g_volume_monitor_get_mounts (place_item->priv->volume_monitor); + add_mounts = NULL; + + for (l = mounts; l; l = l->next) { + GVolume *volume; + + mount = l->data; + volume = g_mount_get_volume (mount); + if (volume != NULL) { + g_object_unref (volume); + g_object_unref (mount); + continue; } + add_mounts = g_slist_prepend (add_mounts, mount); + } + add_mounts = g_slist_reverse (add_mounts); + + if (g_slist_length (add_mounts) <= MAX_ITEMS_OR_SUBMENU) { + add_menu = menu; + } else { + GtkWidget *item; + item = gtk_image_menu_item_new (); setup_menu_item_with_icon (item, panel_menu_icon_get_size (), - icon, NULL, title); + PANEL_ICON_NETWORK_SERVER, NULL, + _("Network Places")); gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); gtk_widget_show (item); @@ -531,32 +821,14 @@ gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), add_menu); } - for (sl = add_volumes; sl; sl = sl->next) { - GnomeVFSVolume *volume = sl->data; - char *icon; - char *display_name; - char *activation_uri; - - icon = gnome_vfs_volume_get_icon (volume); - display_name = gnome_vfs_volume_get_display_name (volume); - activation_uri = gnome_vfs_volume_get_activation_uri (volume); - - panel_menu_items_append_place_item (icon, - display_name, - display_name, //FIXME tooltip - add_menu, - G_CALLBACK (activate_uri), - activation_uri); - - g_free (icon); - g_free (display_name); - g_free (activation_uri); + for (sl = add_mounts; sl; sl = sl->next) { + mount = sl->data; + panel_menu_item_append_mount (add_menu, mount); + g_object_unref (mount); } - g_slist_free (add_volumes); - - g_list_foreach (volumes, (GFunc) gnome_vfs_volume_unref, NULL); - g_list_free (volumes); + g_slist_free (add_mounts); + g_list_free (mounts); } @@ -566,31 +838,33 @@ GtkWidget *places_menu; GtkWidget *item; char *gconf_name; + char *name; char *uri; + GFile *file; places_menu = panel_create_menu (); - gconf_name = gconf_client_get_string (panel_gconf_get_client (), - HOME_NAME_KEY, - NULL); - - uri = gnome_vfs_get_uri_from_local_path (g_get_home_dir ()); + file = g_file_new_for_path (g_get_home_dir ()); + uri = g_file_get_uri (file); + name = panel_util_get_label_for_uri (uri); + g_object_unref (file); + panel_menu_items_append_place_item (PANEL_ICON_HOME, - string_empty (gconf_name) ? - _("Home Folder") : gconf_name, + name, _("Open your personal folder"), places_menu, G_CALLBACK (activate_home_uri), uri); + g_free (name); g_free (uri); - if (gconf_name) - g_free (gconf_name); - if (!gconf_client_get_bool (panel_gconf_get_client (), DESKTOP_IS_HOME_DIR_KEY, NULL)) { - uri = gnome_vfs_get_uri_from_local_path (g_get_user_special_dir (G_USER_DIRECTORY_DESKTOP)); + file = g_file_new_for_path (g_get_user_special_dir (G_USER_DIRECTORY_DESKTOP)); + uri = g_file_get_uri (file); + g_object_unref (file); + panel_menu_items_append_place_item ( PANEL_ICON_DESKTOP, /* Translators: Desktop is used here as in @@ -622,13 +896,13 @@ "nautilus-cd-burner.desktop", NULL); - panel_place_menu_item_append_volumes (places_menu, FALSE); + panel_place_menu_item_append_volumes (place_item, places_menu); add_menu_separator (places_menu); panel_menu_items_append_from_desktop (places_menu, "network-scheme.desktop", NULL); - panel_place_menu_item_append_volumes (places_menu, TRUE); + panel_place_menu_item_append_mounts (place_item, places_menu); if (panel_is_program_in_path ("nautilus-connect-server")) { item = panel_menu_items_create_action_item (PANEL_ACTION_CONNECT_SERVER); @@ -677,19 +951,19 @@ } static void -panel_place_menu_item_gtk_bookmarks_changed (GnomeVFSMonitorHandle *handle, - const gchar *monitor_uri, - const gchar *info_uri, - GnomeVFSMonitorEventType event_type, - gpointer user_data) +panel_place_menu_item_gtk_bookmarks_changed (GFileMonitor *handle, + GFile *file, + GFile *other_file, + GFileMonitorEvent event, + gpointer user_data) { panel_place_menu_item_recreate_menu (GTK_WIDGET (user_data)); } static void -panel_place_menu_item_volume_changed (GnomeVFSVolumeMonitor *monitor, - GnomeVFSVolume *volume, - GtkWidget *place_menu) +panel_place_menu_item_mounts_changed (GVolumeMonitor *monitor, + GMount *mount, + GtkWidget *place_menu) { panel_place_menu_item_recreate_menu (place_menu); } @@ -767,19 +1041,30 @@ NAMES_DIR, NULL); - if (menuitem->priv->bookmarks_monitor != NULL) - gnome_vfs_monitor_cancel (menuitem->priv->bookmarks_monitor); + if (menuitem->priv->bookmarks_monitor != NULL) { + g_file_monitor_cancel (menuitem->priv->bookmarks_monitor); + g_object_unref (menuitem->priv->bookmarks_monitor); + } menuitem->priv->bookmarks_monitor = NULL; - if (menuitem->priv->volume_mounted_id) - g_signal_handler_disconnect (volume_monitor, - menuitem->priv->volume_mounted_id); - menuitem->priv->volume_mounted_id = 0; - - if (menuitem->priv->volume_unmounted_id) - g_signal_handler_disconnect (volume_monitor, - menuitem->priv->volume_unmounted_id); - menuitem->priv->volume_unmounted_id = 0; + if (menuitem->priv->mount_added_id) + g_signal_handler_disconnect (menuitem->priv->volume_monitor, + menuitem->priv->mount_added_id); + menuitem->priv->mount_added_id = 0; + + if (menuitem->priv->mount_changed_id) + g_signal_handler_disconnect (menuitem->priv->volume_monitor, + menuitem->priv->mount_changed_id); + menuitem->priv->mount_changed_id = 0; + + if (menuitem->priv->mount_removed_id) + g_signal_handler_disconnect (menuitem->priv->volume_monitor, + menuitem->priv->mount_removed_id); + menuitem->priv->mount_removed_id = 0; + + if (menuitem->priv->volume_monitor != NULL) + g_object_unref (menuitem->priv->volume_monitor); + menuitem->priv->volume_monitor = NULL; G_OBJECT_CLASS (panel_place_menu_item_parent_class)->finalize (object); } @@ -798,8 +1083,9 @@ static void panel_place_menu_item_init (PanelPlaceMenuItem *menuitem) { - char *bookmarks_filename; - char *bookmarks_uri; + GFile *bookmark; + char *bookmarks_filename; + GError *error; menuitem->priv = PANEL_PLACE_MENU_ITEM_GET_PRIVATE (menuitem); @@ -826,42 +1112,42 @@ bookmarks_filename = g_build_filename (g_get_home_dir (), BOOKMARKS_FILENAME, NULL); - bookmarks_uri = gnome_vfs_get_uri_from_local_path (bookmarks_filename); - - if (bookmarks_uri) { - GnomeVFSResult result; + bookmark = g_file_new_for_path (bookmarks_filename); - result = gnome_vfs_monitor_add (&menuitem->priv->bookmarks_monitor, - bookmarks_uri, - GNOME_VFS_MONITOR_FILE, - panel_place_menu_item_gtk_bookmarks_changed, - menuitem); - - if (result == GNOME_VFS_ERROR_NOT_SUPPORTED) - g_message ("File monitoring not supported in the compiled version of gnome-vfs: bookmarks won't be monitored."); - else if (result != GNOME_VFS_OK) - g_warning ("Failed to add file monitor for %s: %s\n", - bookmarks_uri, - gnome_vfs_result_to_string (result)); - - g_free (bookmarks_uri); + error = NULL; + menuitem->priv->bookmarks_monitor = g_file_monitor_file + (bookmark, + G_FILE_MONITOR_NONE, + NULL, + &error); + if (error) { + g_warning ("Failed to add file monitor for %s: %s\n", + bookmarks_filename, error->message); + g_error_free (error); } else { - g_warning ("Could not make URI of ~/"BOOKMARKS_FILENAME); + g_signal_connect (G_OBJECT (menuitem->priv->bookmarks_monitor), + "changed", + (GCallback) panel_place_menu_item_gtk_bookmarks_changed, + menuitem); } + g_object_unref (bookmark); g_free (bookmarks_filename); - if (!volume_monitor) - volume_monitor = gnome_vfs_get_volume_monitor (); + menuitem->priv->volume_monitor = g_volume_monitor_get (); - menuitem->priv->volume_mounted_id = g_signal_connect (volume_monitor, - "volume_mounted", - G_CALLBACK (panel_place_menu_item_volume_changed), - menuitem); - menuitem->priv->volume_unmounted_id = g_signal_connect (volume_monitor, - "volume_unmounted", - G_CALLBACK (panel_place_menu_item_volume_changed), - menuitem); + menuitem->priv->mount_added_id = g_signal_connect (menuitem->priv->volume_monitor, + "mount-added", + G_CALLBACK (panel_place_menu_item_mounts_changed), + menuitem); + menuitem->priv->mount_changed_id = g_signal_connect (menuitem->priv->volume_monitor, + "mount-changed", + G_CALLBACK (panel_place_menu_item_mounts_changed), + menuitem); + menuitem->priv->mount_removed_id = g_signal_connect (menuitem->priv->volume_monitor, + "mount-removed", + G_CALLBACK (panel_place_menu_item_mounts_changed), + menuitem); } Added: trunk/gnome-panel/panel-mount-operation.c ============================================================================== --- (empty file) +++ trunk/gnome-panel/panel-mount-operation.c Sun Feb 10 21:52:44 2008 @@ -0,0 +1,256 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ + +/* Based on eel-mount-operation.c - Gtk+ implementation for GMountOperation + + Copyright (C) 2007 Red Hat, Inc. + + The Gnome Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + + Author: Alexander Larsson <[EMAIL PROTECTED]> +*/ + +#include <config.h> +#include <glib/gi18n.h> +#include "panel-mount-operation.h" +#include <libgnomeui/gnome-password-dialog.h> +#include <gtk/gtkmessagedialog.h> + +G_DEFINE_TYPE (PanelMountOperation, panel_mount_operation, G_TYPE_MOUNT_OPERATION); + +enum { + ACTIVE_CHANGED, + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL] = { 0 }; + +struct PanelMountOperationPrivate { + GtkWindow *parent_window; + gboolean is_active; +}; + +static void +panel_mount_operation_finalize (GObject *object) +{ + PanelMountOperation *operation; + PanelMountOperationPrivate *priv; + + operation = PANEL_MOUNT_OPERATION (object); + + priv = operation->priv; + + if (priv->parent_window) { + g_object_unref (priv->parent_window); + } + + (*G_OBJECT_CLASS (panel_mount_operation_parent_class)->finalize) (object); +} + +static void +set_active (PanelMountOperation *operation, + gboolean is_active) +{ + if (operation->priv->is_active != is_active) { + operation->priv->is_active = is_active; + g_signal_emit (operation, signals[ACTIVE_CHANGED], 0, is_active); + } +} + +static void +password_dialog_button_clicked (GtkDialog *dialog, + gint button_number, + GMountOperation *op) +{ + char *username, *domain, *password; + gboolean anon; + GnomePasswordDialog *gpd; + + gpd = GNOME_PASSWORD_DIALOG (dialog); + + if (button_number == GTK_RESPONSE_OK) { + username = gnome_password_dialog_get_username (gpd); + if (username) { + g_mount_operation_set_username (op, username); + g_free (username); + } + + domain = gnome_password_dialog_get_domain (gpd); + if (domain) { + g_mount_operation_set_domain (op, domain); + g_free (domain); + } + + password = gnome_password_dialog_get_password (gpd); + if (password) { + g_mount_operation_set_password (op, password); + g_free (password); + } + + anon = gnome_password_dialog_anon_selected (gpd); + g_mount_operation_set_anonymous (op, anon); + + g_mount_operation_reply (op, G_MOUNT_OPERATION_HANDLED); + } else { + g_mount_operation_reply (op, G_MOUNT_OPERATION_ABORTED); + } + + gtk_widget_destroy (GTK_WIDGET (dialog)); + set_active (PANEL_MOUNT_OPERATION (op), FALSE); + g_object_unref (op); +} + +static void +ask_password (GMountOperation *op, + const char *message, + const char *default_user, + const char *default_domain, + GAskPasswordFlags flags) +{ + GtkWidget *dialog; + + dialog = gnome_password_dialog_new (_("Enter Password"), + message, + default_user, + "", + FALSE); + + gnome_password_dialog_set_show_password (GNOME_PASSWORD_DIALOG (dialog), + flags & G_ASK_PASSWORD_NEED_PASSWORD); + + gnome_password_dialog_set_show_username (GNOME_PASSWORD_DIALOG (dialog), + flags & G_ASK_PASSWORD_NEED_USERNAME); + gnome_password_dialog_set_show_domain (GNOME_PASSWORD_DIALOG (dialog), + flags & G_ASK_PASSWORD_NEED_DOMAIN); + gnome_password_dialog_set_show_userpass_buttons (GNOME_PASSWORD_DIALOG (dialog), + flags & G_ASK_PASSWORD_ANONYMOUS_SUPPORTED); + if (default_domain) { + gnome_password_dialog_set_domain (GNOME_PASSWORD_DIALOG (dialog), + default_domain); + } + + if (PANEL_MOUNT_OPERATION (op)->priv->parent_window != NULL) { + gtk_window_set_transient_for (GTK_WINDOW (dialog), + PANEL_MOUNT_OPERATION (op)->priv->parent_window); + } + + g_signal_connect (dialog, "response", + G_CALLBACK (password_dialog_button_clicked), op); + + set_active (PANEL_MOUNT_OPERATION (op), TRUE); + gtk_widget_show (GTK_WIDGET (dialog)); + g_object_ref (op); +} + + +static void +question_dialog_button_clicked (GtkDialog *dialog, + gint button_number, + GMountOperation *op) +{ + if (button_number >= 0) { + g_mount_operation_set_choice (op, button_number); + g_mount_operation_reply (op, G_MOUNT_OPERATION_HANDLED); + } else { + g_mount_operation_reply (op, G_MOUNT_OPERATION_ABORTED); + } + + gtk_widget_destroy (GTK_WIDGET (dialog)); + set_active (PANEL_MOUNT_OPERATION (op), FALSE); + g_object_unref (op); +} + + +static void +ask_question (GMountOperation *op, + const char *message, + const char *choices[]) +{ + GtkWidget *dialog; + int cnt, len; + + dialog = gtk_message_dialog_new (PANEL_MOUNT_OPERATION (op)->priv->parent_window, + 0, GTK_MESSAGE_QUESTION, + GTK_BUTTONS_NONE, "%s", message); + + if (choices) { + /* First count the items in the list then + * add the buttons in reverse order */ + for (len = 0; choices[len] != NULL; len++) { + ; + } + + for (cnt = len - 1; cnt >= 0; cnt--) { + gtk_dialog_add_button (GTK_DIALOG (dialog), choices[cnt], cnt); + } + } + + + g_signal_connect (GTK_OBJECT(dialog), "response", + G_CALLBACK (question_dialog_button_clicked), op); + + set_active (PANEL_MOUNT_OPERATION (op), TRUE); + + gtk_widget_show (GTK_WIDGET (dialog)); + + g_object_ref (op); +} + +static void +panel_mount_operation_class_init (PanelMountOperationClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GMountOperationClass *gmountoperation_class = G_MOUNT_OPERATION_CLASS (klass); + + g_type_class_add_private (klass, sizeof (PanelMountOperationPrivate)); + + gobject_class->finalize = panel_mount_operation_finalize; + + gmountoperation_class->ask_password = ask_password; + gmountoperation_class->ask_question = ask_question; + + + signals[ACTIVE_CHANGED] = + g_signal_new ("active_changed", + G_TYPE_FROM_CLASS (gobject_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (PanelMountOperationClass, active_changed), + NULL, NULL, + g_cclosure_marshal_VOID__BOOLEAN, + G_TYPE_NONE, 1, + G_TYPE_BOOLEAN); +} + +static void +panel_mount_operation_init (PanelMountOperation *operation) +{ + operation->priv = G_TYPE_INSTANCE_GET_PRIVATE (operation, + PANEL_TYPE_MOUNT_OPERATION, + PanelMountOperationPrivate); +} + +GMountOperation * +panel_mount_operation_new (GtkWindow *parent) +{ + PanelMountOperation *mount_operation; + + mount_operation = g_object_new (panel_mount_operation_get_type (), NULL); + + if (parent) { + mount_operation->priv->parent_window = g_object_ref (parent); + } + + return G_MOUNT_OPERATION (mount_operation); +} Added: trunk/gnome-panel/panel-mount-operation.h ============================================================================== --- (empty file) +++ trunk/gnome-panel/panel-mount-operation.h Sun Feb 10 21:52:44 2008 @@ -0,0 +1,70 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ + +/* Based on eel-mount-operation.h - Gtk+ implementation for GMountOperation + + Copyright (C) 2007 Red Hat, Inc. + + The Gnome Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The Gnome Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the Gnome Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + + Author: Alexander Larsson <[EMAIL PROTECTED]> +*/ + +#ifndef PANEL_MOUNT_OPERATION_H +#define PANEL_MOUNT_OPERATION_H + +#include <glib.h> +#include <gio/gio.h> +#include <gtk/gtkwindow.h> + +G_BEGIN_DECLS + +#define PANEL_TYPE_MOUNT_OPERATION (panel_mount_operation_get_type ()) +#define PANEL_MOUNT_OPERATION(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), PANEL_TYPE_MOUNT_OPERATION, PanelMountOperation)) +#define PANEL_MOUNT_OPERATION_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), PANEL_TYPE_MOUNT_OPERATION, PanelMountOperationClass)) +#define PANEL_IS_MOUNT_OPERATION(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), PANEL_TYPE_MOUNT_OPERATION)) +#define PANEL_IS_MOUNT_OPERATION_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), PANEL_TYPE_MOUNT_OPERATION)) +#define PANEL_MOUNT_OPERATION_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), PANEL_TYPE_MOUNT_OPERATION, PanelMountOperationClass)) + +typedef struct PanelMountOperation PanelMountOperation; +typedef struct PanelMountOperationClass PanelMountOperationClass; +typedef struct PanelMountOperationPrivate PanelMountOperationPrivate; + +struct PanelMountOperation +{ + GMountOperation parent_instance; + + PanelMountOperationPrivate *priv; +}; + +struct PanelMountOperationClass +{ + GMountOperationClass parent_class; + + + /* signals: */ + + void (* active_changed) (PanelMountOperation *operation, + gboolean is_active); +}; + +GType panel_mount_operation_get_type (void); +GMountOperation *panel_mount_operation_new (GtkWindow *parent); + +G_END_DECLS + +#endif /* PANEL_MOUNT_OPERATION_H */ + + Modified: trunk/gnome-panel/panel-util.c ============================================================================== --- trunk/gnome-panel/panel-util.c (original) +++ trunk/gnome-panel/panel-util.c Sun Feb 10 21:52:44 2008 @@ -1327,7 +1327,7 @@ return parent_old; } -static char * +char * panel_util_get_icon_name_from_g_icon (GIcon *gicon) { const char * const *names; @@ -1365,10 +1365,9 @@ GMount *mount; mount = G_MOUNT (l->data); compare = g_mount_get_root (mount); - if (g_file_equal (file, compare)) { + if (!ret && g_file_equal (file, compare)) ret = g_mount_get_name (mount); - break; - } + g_object_unref (mount); } g_list_free (mounts); g_object_unref (monitor); @@ -1459,13 +1458,13 @@ GMount *mount; mount = G_MOUNT (l->data); compare = g_mount_get_root (mount); - if (g_file_equal (file, compare)) { + if (!ret && g_file_equal (file, compare)) { GIcon *gicon; gicon = g_mount_get_icon (mount); ret = panel_util_get_icon_name_from_g_icon (gicon); g_object_unref (gicon); - break; } + g_object_unref (mount); } g_list_free (mounts); g_object_unref (monitor); Modified: trunk/gnome-panel/panel-util.h ============================================================================== --- trunk/gnome-panel/panel-util.h (original) +++ trunk/gnome-panel/panel-util.h Sun Feb 10 21:52:44 2008 @@ -135,6 +135,7 @@ void panel_util_set_tooltip_text (GtkWidget *widget, const char *text); +char *panel_util_get_icon_name_from_g_icon (GIcon *gicon); GFile *panel_util_get_file_optional_homedir (const char *location); G_END_DECLS _______________________________________________ SVN-commits-list mailing list (read only) http://mail.gnome.org/mailman/listinfo/svn-commits-list Want to limit the commits to a few modules? Go to above URL, log in to edit your options and select the modules ('topics') you want. Module maintainer? It is possible to set the reply-to to your development mailing list. Email [EMAIL PROTECTED] if interested.