diff -up gnome-disk-utility-2.32.0/src/notification/notification-main.c.no-statusicon gnome-disk-utility-2.32.0/src/notification/notification-main.c --- gnome-disk-utility-2.32.0/src/notification/notification-main.c.no-statusicon 2010-08-05 13:03:58.000000000 -0400 +++ gnome-disk-utility-2.32.0/src/notification/notification-main.c 2010-11-05 11:39:30.723300002 -0400 @@ -39,16 +39,12 @@ typedef struct { GduPool *pool; - GtkStatusIcon *status_icon; - /* List of GduDevice objects currently being unmounted */ GList *devices_being_unmounted; /* List of GduDevice objects with ATA SMART failures */ GList *ata_smart_failures; - gboolean show_icon_for_ata_smart_failures; - NotifyNotification *ata_smart_notification; GFileMonitor *ata_smart_ignore_monitor; @@ -69,9 +65,7 @@ static void update_unmount_dialogs (Noti static void update_ata_smart_failures (NotificationData *data); -static void update_status_icon (NotificationData *data); - -static void show_menu_for_status_icon (NotificationData *data); +static void update_notification (NotificationData *data); /* ---------------------------------------------------------------------------------------------------- */ @@ -119,24 +113,6 @@ on_device_job_changed (GduPool *pool, } static void -on_status_icon_activate (GtkStatusIcon *status_icon, - gpointer user_data) -{ - NotificationData *data = user_data; - show_menu_for_status_icon (data); -} - -static void -on_status_icon_popup_menu (GtkStatusIcon *status_icon, - guint button, - guint activate_time, - gpointer user_data) -{ - NotificationData *data = user_data; - show_menu_for_status_icon (data); -} - -static void on_ata_smart_ignore_monitor_changed (GFileMonitor *monitor, GFile *file, GFile *other_file, @@ -164,13 +140,6 @@ notification_data_new (void) g_signal_connect (data->pool, "device-changed", G_CALLBACK (on_device_changed), data); g_signal_connect (data->pool, "device-job-changed", G_CALLBACK (on_device_job_changed), data); - data->status_icon = gtk_status_icon_new (); - gtk_status_icon_set_visible (data->status_icon, FALSE); - gtk_status_icon_set_from_icon_name (data->status_icon, "gdu-warning"); - gtk_status_icon_set_tooltip_markup (data->status_icon, _("One or more disks are failing")); - g_signal_connect (data->status_icon, "activate", G_CALLBACK (on_status_icon_activate), data); - g_signal_connect (data->status_icon, "popup-menu", G_CALLBACK (on_status_icon_popup_menu), data); - dir_path = g_build_filename (g_get_user_config_dir (), "gnome-disk-utility", "ata-smart-ignore", @@ -208,10 +177,6 @@ notification_data_new (void) static void notification_data_free (NotificationData *data) { - g_signal_handlers_disconnect_by_func (data->status_icon, on_status_icon_activate, data); - g_signal_handlers_disconnect_by_func (data->status_icon, on_status_icon_popup_menu, data); - g_object_unref (data->status_icon); - g_signal_handlers_disconnect_by_func (data->pool, on_device_added, data); g_signal_handlers_disconnect_by_func (data->pool, on_device_removed, data); g_signal_handlers_disconnect_by_func (data->pool, on_device_changed, data); @@ -478,197 +443,75 @@ update_ata_smart_failures (NotificationD g_list_foreach (devices, (GFunc) g_object_unref, NULL); g_list_free (devices); - update_status_icon (data); + update_notification (data); } /* ---------------------------------------------------------------------------------------------------- */ -static gboolean -show_notification (NotificationData *data) +static void +on_examine_action_clicked (NotifyNotification *notification, + char *action, + NotificationData *data) { - static int count = 0; - - /* wait for the panel to be settled before showing a bubble */ - if (gtk_status_icon_is_embedded (data->status_icon)) { - notify_notification_show (data->ata_smart_notification, NULL); - } else if (count < 20) { - count++; - g_timeout_add_seconds (1, (GSourceFunc) show_notification, data); - } else { - g_warning ("No notification area. Notification bubbles will not be displayed."); - } - return FALSE; + g_spawn_command_line_async ("palimpsest", NULL); } static void -update_status_icon (NotificationData *data) +update_notification (NotificationData *data) { - gboolean show_icon; - gboolean old_show_icon_for_ata_smart_failures; + int num_drives; - old_show_icon_for_ata_smart_failures = data->show_icon_for_ata_smart_failures; - - data->show_icon_for_ata_smart_failures = FALSE; - if (g_list_length (data->ata_smart_failures) > 0) - data->show_icon_for_ata_smart_failures = TRUE; - - show_icon = data->show_icon_for_ata_smart_failures; - - if (!show_icon) { + if (data->ata_smart_failures == NULL) { if (data->ata_smart_notification != NULL) { notify_notification_close (data->ata_smart_notification, NULL); g_object_unref (data->ata_smart_notification); data->ata_smart_notification = NULL; } - gtk_status_icon_set_visible (data->status_icon, FALSE); goto out; } - gtk_status_icon_set_visible (data->status_icon, TRUE); - - /* we've started showing the icon for ATA RAID failures; pop up a libnotify notification */ - if (old_show_icon_for_ata_smart_failures != data->show_icon_for_ata_smart_failures) { + num_drives = g_list_length (data->ata_smart_failures); + if (data->ata_smart_notification == NULL) { + data->ata_smart_notification = notify_notification_new ( + /* Translators: This is used as the title of the notification */ + _("Hard Disk Problems Detected"), + /* Translators: This is used as the text of the notification*/ + g_dngettext (GETTEXT_PACKAGE, + N_("A hard disk is reporting health problems."), + N_("Multiple system hard disks are reporting health problems."), + num_drives), + "gdu-warning"); - data->ata_smart_notification = notify_notification_new ( - /* Translators: This is used as the title of the notification */ - _("A hard disk may be failing"), - /* Translators: This is used as the text of the notification*/ - _("One or more hard disks report health problems. Click the icon to get more information."), - "gtk-dialog-warning", - NULL); - notify_notification_attach_to_status_icon (data->ata_smart_notification, - data->status_icon); notify_notification_set_urgency (data->ata_smart_notification, NOTIFY_URGENCY_CRITICAL); notify_notification_set_timeout (data->ata_smart_notification, NOTIFY_EXPIRES_NEVER); - show_notification (data); + notify_notification_add_action (data->ata_smart_notification, + "examine", + _("Examine"), + (NotifyActionCallback) on_examine_action_clicked, + data, + NULL); + } else { + notify_notification_update (data->ata_smart_notification, + /* Translators: This is used as the title of the notification */ + _("Hard Disk Problems Detected"), + /* Translators: This is used as the text of the notification*/ + g_dngettext (GETTEXT_PACKAGE, + N_("A hard disk is reporting health problems."), + N_("Multiple hard disks are reporting health problems."), + num_drives), + "gdu-warning"); + } + notify_notification_show (data->ata_smart_notification, NULL); + out: ; } /* ---------------------------------------------------------------------------------------------------- */ -static void -on_menu_item_activated (GtkMenuItem *menu_item, - gpointer user_data) -{ - NotificationData *data = user_data; - GduDevice *device; - GdkScreen *screen; - gchar *command_line; - - device = GDU_DEVICE (g_object_get_data (G_OBJECT (menu_item), "gdu-device")); - - screen = gtk_status_icon_get_screen (data->status_icon); - command_line = g_strdup_printf ("palimpsest --show-drive=%s", gdu_device_get_device_file (device)); - gdk_spawn_command_line_on_screen (screen, command_line, NULL); - g_free (command_line); -} - -static void -show_menu_for_status_icon (NotificationData *data) -{ - GtkWidget *menu; - GList *l; - - /* remove notifications when the user clicks the icon */ - if (data->ata_smart_notification != NULL) { - notify_notification_close (data->ata_smart_notification, NULL); - g_object_unref (data->ata_smart_notification); - data->ata_smart_notification = NULL; - } - - /* TODO: it would be nice to display something like - * - * Select a disk to get more information... - * ----------------------------------------------- - * [Icon] 80 GB ATA INTEL SSDSA2MH08 - * [Icon] 250GB WD 2500JB External - * - * but unfortunately that would require fucking with gtk+'s - * internals the same way the display-settings applet does - * it; see e.g. line 951 of - * - * http://svn.gnome.org/viewvc/gnome-settings-daemon/trunk/plugins/xrandr/gsd-xrandr-manager.c?revision=810&view=markup - */ - - /* TODO: Perhaps it would also be nice to have a "Preferences..." menu item such - * that the user can turn off notifications on a per-device basis. - */ - - menu = gtk_menu_new (); - for (l = data->ata_smart_failures; l != NULL; l = l->next) { - GduDevice *device = GDU_DEVICE (l->data); - GduPresentable *presentable; - gchar *name; - gchar *vpd_name; - const gchar *status; - gchar *status_desc; - gboolean highlight; - GdkPixbuf *pixbuf; - GtkWidget *image; - GtkWidget *menu_item; - gchar *s; - - presentable = gdu_pool_get_drive_by_device (data->pool, device); - name = gdu_presentable_get_name (presentable); - vpd_name = gdu_presentable_get_vpd_name (presentable); - - status = gdu_device_drive_ata_smart_get_status (device); - status_desc = gdu_util_ata_smart_status_to_desc (status, &highlight, NULL, NULL); - - if (highlight) { - s = g_strdup_printf ("%s", status_desc); - g_free (status_desc); - status_desc = s; - } - - s = g_strdup_printf ("%s – %s\n" - "%s", - name, - vpd_name, - status_desc); - - menu_item = gtk_image_menu_item_new_with_label (s); - gtk_label_set_use_markup (GTK_LABEL (gtk_bin_get_child (GTK_BIN (menu_item))), TRUE); - gtk_image_menu_item_set_always_show_image (GTK_IMAGE_MENU_ITEM (menu_item), TRUE); - - g_object_set_data_full (G_OBJECT (menu_item), "gdu-device", g_object_ref (device), g_object_unref); - - pixbuf = gdu_util_get_pixbuf_for_presentable (presentable, GTK_ICON_SIZE_SMALL_TOOLBAR); - image = gtk_image_new_from_pixbuf (pixbuf); - g_object_unref (pixbuf); - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_item), image); - - g_signal_connect (menu_item, - "activate", - G_CALLBACK (on_menu_item_activated), - data); - - gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item); - - g_free (name); - g_free (vpd_name); - g_free (status_desc); - g_free (s); - g_object_unref (presentable); - } - gtk_widget_show_all (menu); - - gtk_menu_popup (GTK_MENU (menu), - NULL, - NULL, - gtk_status_icon_position_menu, - data->status_icon, - 0, - gtk_get_current_event_time ()); - -} - -/* ---------------------------------------------------------------------------------------------------- */ - int main (int argc, char **argv) { @@ -693,7 +536,7 @@ main (int argc, char **argv) bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); textdomain (GETTEXT_PACKAGE); - notify_init ("gdu-notification-daemon"); + notify_init (_("Disk Utility")); gtk_window_set_default_icon_name ("palimpsest");