gnome-disk-utility/no-statusicon.patch
2010-11-05 11:41:03 -04:00

328 lines
14 KiB
Diff
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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");