Mercurial > projects > pk-update-icon
annotate pkui-icon.c @ 14:64f05992d8ec
GObject-based rewrite
use asynchronous packagekit-glib API
use persistent menu widget and notification object
update existing notification when new updates become available, close it when no updates are available
show status icon when updates are available, hide it when no updates are available
hide icon when gpk-update-viewer is executed, check for updates when gpk-update-viewer exits
introduce a startup delay before the first check for updates is made
add context menu item to manually trigger a check for updates
remove context menu item for quitting pk-update-icon
author | Guido Berhoerster <guido@berhoerster.name> |
---|---|
date | Thu, 20 Oct 2011 08:19:22 +0200 |
parents | |
children | 9537882d759f |
rev | line source |
---|---|
14
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
1 /* |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
2 * (C) 2011 Guido Berhoerster <gber@opensuse.org> |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
3 * |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
4 * Licensed under the GNU General Public License Version 2 |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
5 * |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
6 * This program is free software; you can redistribute it and/or modify |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
7 * it under the terms of the GNU General Public License as published by |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
8 * the Free Software Foundation; either version 2 of the License, or |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
9 * (at your option) any later version. |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
10 * |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
11 * This program is distributed in the hope that it will be useful, |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
14 * GNU General Public License for more details. |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
15 * |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
16 * You should have received a copy of the GNU General Public License |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
17 * along with this program; if not, write to the Free Software |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
19 */ |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
20 |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
21 #include <glib/gi18n.h> |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
22 #include <libnotify/notify.h> |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
23 #include "pkui-backend.h" |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
24 #include "pkui-icon.h" |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
25 |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
26 G_DEFINE_TYPE(PkuiIcon, pkui_icon, G_TYPE_OBJECT) |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
27 |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
28 #define UPDATE_VIEWER_COMMAND "/usr/bin/gpk-update-viewer" |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
29 |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
30 #define PKUI_ICON_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), \ |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
31 PKUI_TYPE_ICON, PkuiIconPrivate)) |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
32 |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
33 struct _PkuiIconPrivate |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
34 { |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
35 PkuiBackend *backend; |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
36 |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
37 GtkStatusIcon *status_icon; |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
38 GtkWidget *status_icon_popup_menu; |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
39 NotifyNotification *notification; |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
40 }; |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
41 |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
42 static GtkWidget* icon_popup_menu_create(PkuiIcon *self); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
43 static void icon_popup_menu_popup(GtkStatusIcon *status_icon, guint button, |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
44 guint activate_time, gpointer user_data); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
45 static void icon_activated(GtkStatusIcon *status_icon, gpointer user_data); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
46 static void backend_state_changed(PkuiBackend *backend, gpointer user_data); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
47 |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
48 static void |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
49 pkui_icon_finalize(GObject *gobject) |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
50 { |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
51 PkuiIcon *self = PKUI_ICON(gobject); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
52 |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
53 gtk_widget_destroy(self->priv->status_icon_popup_menu); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
54 g_object_unref(self->priv->status_icon_popup_menu); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
55 g_object_unref(self->priv->status_icon); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
56 if (self->priv->notification != NULL) { |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
57 notify_notification_close(self->priv->notification, NULL); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
58 g_object_unref(self->priv->notification); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
59 } |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
60 g_object_unref(self->priv->backend); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
61 |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
62 G_OBJECT_CLASS(pkui_icon_parent_class)->finalize(gobject); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
63 } |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
64 |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
65 static void |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
66 pkui_icon_class_init(PkuiIconClass *klass) |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
67 { |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
68 GObjectClass *gobject_class = G_OBJECT_CLASS(klass); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
69 |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
70 gobject_class->finalize = pkui_icon_finalize; |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
71 |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
72 g_type_class_add_private(klass, sizeof (PkuiIconPrivate)); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
73 } |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
74 |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
75 static void |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
76 pkui_icon_init(PkuiIcon *self) |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
77 { |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
78 self->priv = PKUI_ICON_GET_PRIVATE(self); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
79 |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
80 gtk_window_set_default_icon_name("system-software-update"); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
81 |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
82 self->priv->status_icon_popup_menu = icon_popup_menu_create(self); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
83 g_object_ref(self->priv->status_icon_popup_menu); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
84 g_object_ref_sink(GTK_OBJECT(self->priv->status_icon_popup_menu)); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
85 |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
86 self->priv->status_icon = gtk_status_icon_new(); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
87 gtk_status_icon_set_title(self->priv->status_icon, |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
88 _("Software Updates")); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
89 gtk_status_icon_set_visible(self->priv->status_icon, FALSE); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
90 g_signal_connect(G_OBJECT(self->priv->status_icon), "activate", |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
91 G_CALLBACK(icon_activated), self); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
92 g_signal_connect(G_OBJECT(self->priv->status_icon), "popup-menu", |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
93 G_CALLBACK(icon_popup_menu_popup), self); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
94 |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
95 self->priv->notification = NULL; |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
96 |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
97 self->priv->backend = NULL; |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
98 } |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
99 |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
100 static void |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
101 backend_check_now(GtkMenuItem *menu_item, gpointer user_data) |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
102 { |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
103 PkuiIcon *self = PKUI_ICON(user_data); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
104 |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
105 g_return_if_fail(PKUI_IS_BACKEND(self->priv->backend)); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
106 |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
107 pkui_backend_check_now(self->priv->backend); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
108 } |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
109 |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
110 static GtkWidget* |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
111 icon_popup_menu_create(PkuiIcon *self) |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
112 { |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
113 GtkWidget *popup_menu = gtk_menu_new(); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
114 GtkWidget *item; |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
115 GtkWidget *image; |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
116 |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
117 item = gtk_image_menu_item_new_with_mnemonic(_("_Check for Updates")); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
118 image = gtk_image_new_from_icon_name(GTK_STOCK_REFRESH, |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
119 GTK_ICON_SIZE_MENU); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
120 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), image); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
121 gtk_menu_shell_append(GTK_MENU_SHELL(popup_menu), item); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
122 g_signal_connect(G_OBJECT(item), "activate", |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
123 G_CALLBACK(backend_check_now), self); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
124 |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
125 gtk_widget_show_all(GTK_WIDGET(popup_menu)); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
126 |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
127 return (popup_menu); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
128 } |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
129 |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
130 static void |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
131 icon_popup_menu_popup(GtkStatusIcon *status_icon, guint button, |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
132 guint activate_time, gpointer user_data) |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
133 { |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
134 PkuiIcon *self = PKUI_ICON(user_data); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
135 |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
136 gtk_menu_popup(GTK_MENU(self->priv->status_icon_popup_menu), NULL, NULL, |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
137 NULL, NULL, button, activate_time); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
138 } |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
139 |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
140 static void |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
141 update_notification(PkuiIcon *self, guint updates_normal, |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
142 guint updates_important) |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
143 { |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
144 gchar *message; |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
145 gchar *title = updates_important ? |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
146 ngettext("Important Software Update", "Important Software Updates", |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
147 updates_important + updates_normal) : |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
148 ngettext("Software Update", "Software Updates", updates_important + |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
149 updates_normal); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
150 gchar *icon = updates_important ? "software-update-urgent" : |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
151 "software-update-available"; |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
152 |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
153 if (updates_important > 0) |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
154 if (updates_normal > 0) |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
155 message = g_strdup_printf(ngettext("There are %d " |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
156 "software updates available, %d of them is " |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
157 "important.", "There are %d software updates " |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
158 "available, %d of them are important.", |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
159 updates_important), |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
160 updates_normal + updates_important, |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
161 updates_important); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
162 else |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
163 message = g_strdup_printf(ngettext("There is an " |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
164 "important software update available.", "There are " |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
165 "%d important software updates available.", |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
166 updates_important), updates_important); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
167 else |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
168 message = g_strdup_printf(ngettext("There is a software update " |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
169 "available.", "There are %d software updates available.", |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
170 updates_normal), updates_normal); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
171 |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
172 gtk_status_icon_set_tooltip(self->priv->status_icon, message); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
173 gtk_status_icon_set_from_icon_name(self->priv->status_icon, icon); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
174 gtk_status_icon_set_visible(self->priv->status_icon, TRUE); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
175 |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
176 if (self->priv->notification == NULL) |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
177 self->priv->notification = notify_notification_new(title, |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
178 message, icon |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
179 #if (NOTIFY_VERSION_MAJOR == 0 && NOTIFY_VERSION_MINOR < 7) |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
180 , NULL |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
181 #endif |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
182 ); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
183 else |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
184 notify_notification_update(self->priv->notification, title, |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
185 message, icon); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
186 |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
187 notify_notification_set_timeout(self->priv->notification, |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
188 NOTIFY_EXPIRES_NEVER); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
189 notify_notification_set_urgency(self->priv->notification, |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
190 updates_important ? NOTIFY_URGENCY_CRITICAL : |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
191 NOTIFY_URGENCY_NORMAL); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
192 notify_notification_show(self->priv->notification, NULL); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
193 |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
194 g_free(message); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
195 } |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
196 |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
197 static void |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
198 hide_notification(PkuiIcon *self) |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
199 { |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
200 gtk_status_icon_set_visible(self->priv->status_icon, FALSE); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
201 notify_notification_close(self->priv->notification, NULL); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
202 } |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
203 |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
204 |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
205 static void |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
206 backend_state_changed(PkuiBackend *backend, gpointer user_data) |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
207 { |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
208 PkuiIcon *self = PKUI_ICON(user_data); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
209 guint updates_normal; |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
210 guint updates_important; |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
211 |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
212 g_return_if_fail(PKUI_IS_BACKEND(backend)); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
213 |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
214 updates_normal = pkui_backend_get_updates_normal(backend); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
215 updates_important = pkui_backend_get_updates_important(backend); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
216 if (updates_normal > 0 || updates_important > 0) |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
217 update_notification(self, updates_normal, updates_important); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
218 else if (updates_normal + updates_important == 0) |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
219 hide_notification(self); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
220 } |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
221 |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
222 static void |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
223 update_viewer_exited(GPid pid, gint status, gpointer user_data) |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
224 { |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
225 PkuiIcon *self = PKUI_ICON(user_data); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
226 |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
227 g_return_if_fail(PKUI_IS_BACKEND(self->priv->backend)); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
228 |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
229 g_spawn_close_pid(pid); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
230 |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
231 pkui_backend_check_now(self->priv->backend); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
232 pkui_backend_set_inhibit_check(self->priv->backend, FALSE); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
233 } |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
234 |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
235 static void |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
236 icon_activated(GtkStatusIcon *status_icon, gpointer user_data) |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
237 { |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
238 PkuiIcon *self = PKUI_ICON(user_data); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
239 static const gchar *argv[] = { UPDATE_VIEWER_COMMAND, NULL }; |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
240 GPid pid; |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
241 gboolean retval; |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
242 |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
243 g_return_if_fail(PKUI_IS_BACKEND(self->priv->backend)); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
244 |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
245 retval = g_spawn_async(NULL, (gchar **)argv, NULL, |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
246 G_SPAWN_DO_NOT_REAP_CHILD, NULL, NULL, &pid, NULL); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
247 if (!retval) { |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
248 g_warning("Could not execute" UPDATE_VIEWER_COMMAND); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
249 return; |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
250 } |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
251 g_child_watch_add(pid, (GChildWatchFunc)update_viewer_exited, self); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
252 |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
253 pkui_backend_set_inhibit_check(self->priv->backend, TRUE); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
254 hide_notification(self); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
255 } |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
256 |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
257 PkuiIcon * |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
258 pkui_icon_new(guint startup_delay, guint check_interval) |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
259 { |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
260 PkuiIcon *icon = g_object_new(PKUI_TYPE_ICON, NULL); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
261 |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
262 icon->priv->backend = pkui_backend_new(startup_delay, check_interval); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
263 g_signal_connect(icon->priv->backend, "state-changed", |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
264 G_CALLBACK(backend_state_changed), icon); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
265 |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
266 return (icon); |
64f05992d8ec
GObject-based rewrite
Guido Berhoerster <guido@berhoerster.name>
parents:
diff
changeset
|
267 } |