328 lines
14 KiB
Diff
328 lines
14 KiB
Diff
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 ("<span fgcolor=\"red\"><b>%s</b></span>", status_desc);
|
||
- g_free (status_desc);
|
||
- status_desc = s;
|
||
- }
|
||
-
|
||
- s = g_strdup_printf ("<b>%s</b> – %s\n"
|
||
- "<small>%s</small>",
|
||
- 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");
|
||
|