~ubuntu-branches/ubuntu/trusty/activity-log-manager/trusty-updates

« back to all changes in this revision

Viewing changes to .pc/11_make_all_widgets_sensitive.patch/src/diagnostics-widget.c

  • Committer: Package Import Robot
  • Author(s): Iain Lane
  • Date: 2014-03-25 12:56:33 UTC
  • Revision ID: package-import@ubuntu.com-20140325125633-epl6k2b3y7q52f0x
Tags: 0.9.7-0ubuntu12
* debian/patches/10_build-with-gee-0.8.patch: Port to gee 0.8 API to avoid
  loading two gee versions in the same process (LP: #1293036)
* 01_really_hide_automatic_reports.patch: Delete, this is obsolete given
  03_use_libwhoopsie-preferences.patch. Add 13_hide_automatic_reports.patch
  to achieve this with that new patch. (LP: #1203042)
* 11_make_all_widgets_sensitive.patch: Recursively make all widgets
  sensitive/insensitive when we need to, to avoid missing some.
* 12_hide_lock_unlock_button.patch: Hide Lock button when it doesn't do
  anything (when the user can't drop the permissions). (LP: #1239752)
* 14_seconds_combo.patch: Make the entries translatable. (LP: #1235627)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include <gtk/gtk.h>
 
2
#include <gio/gio.h>
 
3
#include <polkit/polkit.h>
 
4
#include <stdlib.h>
 
5
 
 
6
#define _GNU_SOURCE
 
7
#include <stdio.h>
 
8
 
 
9
#include "whoopsie-preferences/libwhoopsie-preferences.h"
 
10
 
 
11
#define POL_PATH "com.ubuntu.whoopsiepreferences.change"
 
12
#define PRIVACY_URL "http://www.ubuntu.com/aboutus/privacypolicy?crashdb"
 
13
#define SYSTEM_ERRORS_URL "https://errors.ubuntu.com/user"
 
14
 
 
15
#define WHOOPSIE_DAISY_TYPE_PREFERENCES (whoopsie_daisy_preferences_get_type())
 
16
#define WHOOPSIE_DAISY_PREFERENCES(obj) \
 
17
    (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
 
18
    WHOOPSIE_DAISY_TYPE_PREFERENCES, WhoopsieDaisyPreferences))
 
19
#define WHOOPSIE_DAISY_PREFERENCES_PRIVATE(o) \
 
20
    (G_TYPE_INSTANCE_GET_PRIVATE ((o), WHOOPSIE_DAISY_TYPE_PREFERENCES, WhoopsieDaisyPreferencesPrivate))
 
21
 
 
22
GType whoopsie_daisy_preferences_get_type (void) G_GNUC_CONST;
 
23
 
 
24
typedef struct _WhoopsieDaisyPreferences WhoopsieDaisyPreferences;
 
25
typedef struct _WhoopsieDaisyPreferencesClass WhoopsieDaisyPreferencesClass;
 
26
typedef struct _WhoopsieDaisyPreferencesPrivate WhoopsieDaisyPreferencesPrivate;
 
27
 
 
28
struct _WhoopsieDaisyPreferencesPrivate
 
29
{
 
30
    GtkBuilder* builder;
 
31
    GPermission* permission;
 
32
    WhoopsiePreferences* proxy;
 
33
};
 
34
 
 
35
struct _WhoopsieDaisyPreferences
 
36
{
 
37
    GtkBox parent;
 
38
    WhoopsieDaisyPreferencesPrivate* priv;
 
39
};
 
40
 
 
41
struct _WhoopsieDaisyPreferencesClass
 
42
{
 
43
    GtkBoxClass parent_class;
 
44
};
 
45
 
 
46
G_DEFINE_TYPE (WhoopsieDaisyPreferences, whoopsie_daisy_preferences, GTK_TYPE_BOX)
 
47
 
 
48
static void
 
49
whoopsie_daisy_preferences_dispose (GObject* object)
 
50
{
 
51
    WhoopsieDaisyPreferencesPrivate* priv = WHOOPSIE_DAISY_PREFERENCES (object)->priv;
 
52
 
 
53
    if (priv->builder) {
 
54
        g_object_unref (priv->builder);
 
55
        priv->builder = NULL;
 
56
    }
 
57
    if (priv->permission) {
 
58
        g_object_unref (priv->permission);
 
59
        priv->permission = NULL;
 
60
    }
 
61
    if (priv->proxy) {
 
62
        g_object_unref (priv->proxy);
 
63
        priv->proxy = NULL;
 
64
    }
 
65
}
 
66
 
 
67
static void
 
68
whoopsie_daisy_preferences_class_init (WhoopsieDaisyPreferencesClass *klass)
 
69
{
 
70
    GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
71
    g_type_class_add_private (klass, sizeof (WhoopsieDaisyPreferencesPrivate));
 
72
    object_class->dispose = whoopsie_daisy_preferences_dispose;
 
73
}
 
74
 
 
75
static void
 
76
on_privacy_policy_clicked (GtkWidget* button, gpointer user_data)
 
77
{
 
78
    if (system ("xdg-open " PRIVACY_URL) < 0)
 
79
        g_warning ("Error opening URL.\n");
 
80
}
 
81
 
 
82
static void
 
83
on_show_previous_reports_clicked (GtkWidget* button, gpointer user_data)
 
84
{
 
85
    WhoopsieDaisyPreferencesPrivate* priv = WHOOPSIE_DAISY_PREFERENCES (user_data)->priv;
 
86
    GError* error = NULL;
 
87
    gchar* identifier = NULL;
 
88
    gchar* command = NULL;
 
89
 
 
90
    whoopsie_preferences_call_get_identifier_sync (priv->proxy, &identifier, NULL, &error);
 
91
 
 
92
    if (!error) {
 
93
        asprintf (&command, "xdg-open " SYSTEM_ERRORS_URL "/%s", identifier);
 
94
        if (system (command) < 0)
 
95
            g_warning ("Error opening URL.\n");
 
96
    } else {
 
97
        g_printerr ("Error getting identifier: %s\n", error->message);
 
98
        g_error_free (error);
 
99
    }
 
100
}
 
101
 
 
102
static void
 
103
on_permission_changed (GPermission* permission, GParamSpec* pspec, gpointer data)
 
104
{
 
105
    gboolean allowed;
 
106
    GtkWidget* error_reports_box = NULL;
 
107
    GtkWidget* metrics_reports_box = NULL;
 
108
    WhoopsieDaisyPreferencesPrivate* priv = WHOOPSIE_DAISY_PREFERENCES (data)->priv;
 
109
 
 
110
    error_reports_box = GTK_WIDGET (gtk_builder_get_object (
 
111
                                    priv->builder, "error_reports_box"));
 
112
    metrics_reports_box = GTK_WIDGET (gtk_builder_get_object (
 
113
                                      priv->builder, "metrics_reports_box"));
 
114
 
 
115
    allowed = g_permission_get_allowed (permission);
 
116
    gtk_widget_set_sensitive(error_reports_box, allowed);
 
117
    gtk_widget_set_sensitive(metrics_reports_box, allowed);
 
118
    gtk_container_foreach (GTK_CONTAINER (error_reports_box), (GtkCallback)gtk_widget_set_sensitive, allowed);
 
119
    gtk_container_foreach (GTK_CONTAINER (metrics_reports_box), (GtkCallback)gtk_widget_set_sensitive, allowed);
 
120
}
 
121
 
 
122
static void
 
123
on_submit_error_reports_checked (GtkToggleButton* button, gpointer user_data)
 
124
{
 
125
    WhoopsieDaisyPreferencesPrivate* priv = WHOOPSIE_DAISY_PREFERENCES (user_data)->priv;
 
126
    GError* error = NULL;
 
127
 
 
128
    whoopsie_preferences_call_set_report_crashes_sync (priv->proxy,
 
129
        gtk_toggle_button_get_active (button), NULL, &error);
 
130
    if (error != NULL) {
 
131
        g_printerr ("Error setting crash reporting: %s\n", error->message);
 
132
        g_error_free (error);
 
133
    }
 
134
}
 
135
 
 
136
static void
 
137
on_submit_metrics_reports_checked (GtkToggleButton* button, gpointer user_data)
 
138
{
 
139
    WhoopsieDaisyPreferencesPrivate* priv = WHOOPSIE_DAISY_PREFERENCES (user_data)->priv;
 
140
    GError* error = NULL;
 
141
 
 
142
    whoopsie_preferences_call_set_report_metrics_sync (priv->proxy,
 
143
        gtk_toggle_button_get_active (button), NULL, &error);
 
144
    if (error != NULL) {
 
145
        g_printerr ("Error setting metrics reporting: %s\n", error->message);
 
146
        g_error_free (error);
 
147
    }
 
148
}
 
149
 
 
150
static void
 
151
on_properties_changed (WhoopsiePreferences* interface,
 
152
                       GVariant* changed_properties,
 
153
                       const gchar* const* invalidated_properties,
 
154
                       gpointer user_data)
 
155
{
 
156
    WhoopsieDaisyPreferencesPrivate* priv = WHOOPSIE_DAISY_PREFERENCES (user_data)->priv;
 
157
    gboolean report_errors, report_metrics;
 
158
    GtkWidget* submit_error_reports = NULL;
 
159
    GtkWidget* submit_metrics_reports = NULL;
 
160
 
 
161
    submit_error_reports = GTK_WIDGET (
 
162
        gtk_builder_get_object (priv->builder, "submit_error_reports"));
 
163
    submit_metrics_reports = GTK_WIDGET (
 
164
        gtk_builder_get_object (priv->builder, "submit_metrics_reports"));
 
165
 
 
166
    report_errors = whoopsie_preferences_get_report_crashes (interface);
 
167
    report_metrics = whoopsie_preferences_get_report_metrics (interface);
 
168
 
 
169
    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (submit_error_reports), report_errors);
 
170
    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (submit_metrics_reports), report_metrics);
 
171
}
 
172
 
 
173
static void
 
174
whoopsie_daisy_preferences_setup_dbus (WhoopsieDaisyPreferences *self, GError *error)
 
175
{
 
176
    WhoopsieDaisyPreferencesPrivate* priv = self->priv;
 
177
 
 
178
    priv->proxy = whoopsie_preferences_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
 
179
                                         G_DBUS_PROXY_FLAGS_NONE,
 
180
                                         "com.ubuntu.WhoopsiePreferences",
 
181
                                         "/com/ubuntu/WhoopsiePreferences",
 
182
                                         NULL, &error);
 
183
    if (!priv->proxy)
 
184
        return;
 
185
 
 
186
    g_signal_connect (priv->proxy, "g-properties-changed",
 
187
                                   G_CALLBACK (on_properties_changed), self);
 
188
    on_properties_changed (priv->proxy, NULL, NULL, self);
 
189
}
 
190
static void
 
191
whoopsie_daisy_preferences_init (WhoopsieDaisyPreferences *self)
 
192
{
 
193
    GError *error = NULL;
 
194
    GtkWidget* privacy_page = NULL;
 
195
    GtkWidget* unlock_align = NULL;
 
196
    GtkWidget* unlock_button = NULL;
 
197
    GtkWidget* submit_error_reports = NULL;
 
198
    GtkWidget* submit_metrics_reports = NULL;
 
199
    GtkWidget* privacy_policy = NULL;
 
200
    GtkWidget* show_previous_reports = NULL;
 
201
    WhoopsieDaisyPreferencesPrivate* priv;
 
202
    priv = self->priv = WHOOPSIE_DAISY_PREFERENCES_PRIVATE (self);
 
203
    gchar **objects;
 
204
    
 
205
    priv->builder = gtk_builder_new ();
 
206
    gtk_builder_set_translation_domain (priv->builder, GETTEXT_PACKAGE);
 
207
    objects = g_strsplit ("privacy_page_box", ":", -1);
 
208
    gtk_builder_add_objects_from_file(priv->builder, UI_DIR "/whoopsie.ui", objects, &error);
 
209
    g_strfreev (objects);
 
210
    if (error != NULL) {
 
211
        g_warning ("Could not load interface file: %s", error->message);
 
212
        g_error_free (error);
 
213
        return;
 
214
    }
 
215
    submit_error_reports = GTK_WIDGET (
 
216
        gtk_builder_get_object (priv->builder, "submit_error_reports"));
 
217
    submit_metrics_reports = GTK_WIDGET (
 
218
        gtk_builder_get_object (priv->builder, "submit_metrics_reports"));
 
219
    gtk_widget_hide (submit_metrics_reports);
 
220
    privacy_page = GTK_WIDGET (
 
221
        gtk_builder_get_object (priv->builder, "privacy_page_box"));
 
222
    unlock_align = GTK_WIDGET (
 
223
        gtk_builder_get_object (priv->builder, "unlock_alignment"));
 
224
    privacy_policy = GTK_WIDGET (
 
225
        gtk_builder_get_object (priv->builder, "privacy_policy"));
 
226
    show_previous_reports = GTK_WIDGET (
 
227
        gtk_builder_get_object (priv->builder, "show_previous_reports"));
 
228
 
 
229
    gtk_box_pack_start (GTK_BOX (self), privacy_page, TRUE, TRUE, 0);
 
230
    g_object_set (self, "valign", GTK_ALIGN_START, NULL);
 
231
 
 
232
    priv->permission = polkit_permission_new_sync (POL_PATH, NULL, NULL, &error);
 
233
    if (!priv->permission) {
 
234
        g_warning ("Could not acquire permission: %s", error->message);
 
235
        g_error_free (error);
 
236
    }
 
237
 
 
238
    unlock_button = gtk_lock_button_new (priv->permission);
 
239
    gtk_container_add (GTK_CONTAINER (unlock_align), GTK_WIDGET (unlock_button));
 
240
    gtk_widget_show (unlock_button);
 
241
 
 
242
    g_signal_connect (priv->permission, "notify", G_CALLBACK (on_permission_changed), self);
 
243
    on_permission_changed (priv->permission, NULL, self);
 
244
 
 
245
    whoopsie_daisy_preferences_setup_dbus (self, error);
 
246
    if (error) {
 
247
        g_warning ("Could not set up DBus connection: %s", error->message);
 
248
        g_error_free (error);
 
249
    }
 
250
 
 
251
    g_signal_connect (submit_error_reports, "toggled",
 
252
                      G_CALLBACK (on_submit_error_reports_checked), self);
 
253
    g_signal_connect (submit_metrics_reports, "toggled",
 
254
                      G_CALLBACK (on_submit_metrics_reports_checked), self);
 
255
    g_signal_connect (privacy_policy, "clicked",
 
256
                      G_CALLBACK (on_privacy_policy_clicked), self);
 
257
    g_signal_connect (show_previous_reports, "clicked",
 
258
                      G_CALLBACK (on_show_previous_reports_clicked), self);
 
259
}
 
260
 
 
261
GtkWidget*
 
262
whoopsie_daisy_preferences_new (void)
 
263
{
 
264
    return g_object_new (WHOOPSIE_DAISY_TYPE_PREFERENCES, NULL);
 
265
}
 
266