9
#include <libnotify/notify.h>
11
#include "update-notifier.h"
13
#include "trayappletui.h"
16
check_system_crashes(void)
23
// check for system crashes
24
gchar *argv[] = { CRASHREPORT_HELPER, "--system", NULL };
25
if(!g_spawn_sync(NULL,
28
G_SPAWN_STDOUT_TO_DEV_NULL|G_SPAWN_STDERR_TO_DEV_NULL,
35
g_warning("Can not run %s\n", CRASHREPORT_HELPER);
43
ask_invoke_apport_with_pkexec(void)
46
gchar *msg = _("System program problem detected");
47
gchar *descr = _("Do you want to report the problem "
49
dialog = (GtkDialog*)gtk_message_dialog_new (NULL,
50
GTK_DIALOG_DESTROY_WITH_PARENT,
54
gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),
56
gtk_dialog_add_button(dialog, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
57
gtk_dialog_add_button(dialog, _("Report problem…"), GTK_RESPONSE_ACCEPT);
58
int res = gtk_dialog_run(dialog);
59
gtk_widget_destroy(GTK_WIDGET(dialog));
60
if (res == GTK_RESPONSE_ACCEPT)
66
run_apport(TrayApplet *ta)
68
g_debug("fire up the crashreport tool\n");
69
// be nice and always ask first before firing up pkexec
70
if (check_system_crashes() && ask_invoke_apport_with_pkexec()) {
71
invoke_with_pkexec(CRASHREPORT_REPORT_APP);
73
return g_spawn_command_line_async(CRASHREPORT_REPORT_APP, NULL);
79
show_notification (TrayApplet *ta)
81
NotifyNotification *n;
83
// check if the update-icon is still visible (in the delay time a
84
// update may already have been performed)
85
if(!tray_applet_ui_get_visible(ta))
88
n = tray_applet_ui_get_data (ta, "notification");
91
tray_applet_ui_set_data (ta, "notification", NULL);
93
// now show a notification handle
94
n = notify_notification_new(
95
_("Crash report detected"),
96
_("An application has crashed on your "
97
"system (now or in the past). "
98
"Click on the notification icon to "
101
GTK_STOCK_DIALOG_INFO);
102
notify_notification_set_timeout (n, 60000);
103
notify_notification_show (n, NULL);
104
tray_applet_ui_set_data (ta, "notification", n);
110
hide_crash_applet(TrayApplet *ta)
112
NotifyNotification *n;
114
tray_applet_ui_set_visible(ta, FALSE);
116
/* Hide any notification popup */
117
n = tray_applet_ui_get_data (ta, "notification");
119
notify_notification_close (n, NULL);
122
tray_applet_ui_set_data (ta, "notification", NULL);
126
crashreport_check (TrayApplet *ta)
128
int crashreports_found = 0;
129
gboolean system_crashes;
130
g_debug("crashreport_check\n");
132
// don't do anything if no apport-gtk is installed
133
if(!g_file_test(CRASHREPORT_REPORT_APP, G_FILE_TEST_IS_EXECUTABLE))
136
// Check whether the user doesn't want notifications
137
if (!g_settings_get_boolean (ta->un->settings,
138
SETTINGS_KEY_APPORT_NOTIFICATIONS)) {
139
g_debug("apport notifications disabled, not displaying crashes");
143
// check for (new) reports by calling CRASHREPORT_HELPER
144
// and checking the return code
146
gchar *argv[] = { CRASHREPORT_HELPER, NULL };
147
if(!g_spawn_sync(NULL,
150
G_SPAWN_STDOUT_TO_DEV_NULL|G_SPAWN_STDERR_TO_DEV_NULL,
157
g_warning("Can not run %s\n", CRASHREPORT_HELPER);
160
// exitcode == 0: reports found, else no reports
161
system_crashes = check_system_crashes();
162
crashreports_found = !exitcode || system_crashes;
164
// in autolaunch mode, just open windows,
165
gboolean autolaunch = g_settings_get_boolean(ta->un->settings,
166
SETTINGS_KEY_AUTO_LAUNCH);
168
if (crashreports_found > 0) {
169
g_debug("autolaunch mode, just running apport now");
170
crashreports_found=0;
177
// non-autolaunch will always use the notification area
178
gboolean visible = tray_applet_ui_get_visible(ta);
181
if(crashreports_found > 0 && !visible) {
182
tray_applet_ui_set_visible(ta, TRUE);
183
/* Show the notification, after a delay so it doesn't look ugly
184
* if we've just logged in */
185
g_timeout_add(5000, (GSourceFunc)(show_notification), ta);
188
// no crashreports, but visible
189
if((crashreports_found == 0) && visible) {
190
hide_crash_applet(ta);
197
button_release_cb (GtkWidget *widget,
201
hide_crash_applet(ta);
206
crashreport_check_initially(TrayApplet *ta)
208
crashreport_check(ta);
209
// stop timeout handler
214
crashreport_tray_icon_init (TrayApplet *ta)
216
tray_applet_ui_set_single_action(ta,
217
_("Crash report detected"),
218
G_CALLBACK(button_release_cb),
221
/* Check for crashes for the first time */
222
g_timeout_add_seconds(1, (GSourceFunc)crashreport_check_initially, ta);