Merge lp:~ev/activity-log-manager/whoopsie into lp:~activity-log-manager/activity-log-manager/vala

Proposed by Evan
Status: Merged
Merged at revision: 85
Proposed branch: lp:~ev/activity-log-manager/whoopsie
Merge into: lp:~activity-log-manager/activity-log-manager/vala
Diff against target: 984 lines (+808/-7)
14 files modified
.bzrignore (+1/-0)
configure.ac (+16/-1)
po/POTFILES.in (+1/-0)
src/Makefile.am (+23/-6)
src/activity-log-manager.vala (+4/-0)
src/alm-cc.c (+8/-0)
src/diagnostics-widget.c (+193/-0)
src/diagnostics/Makefile.am (+44/-0)
src/diagnostics/com.ubuntu.WhoopsiePreferences.conf (+26/-0)
src/diagnostics/com.ubuntu.WhoopsiePreferences.service (+4/-0)
src/diagnostics/com.ubuntu.whoopsiepreferences.policy (+18/-0)
src/diagnostics/whoopsie-preferences.c (+297/-0)
src/diagnostics/whoopsie-preferences.xml (+8/-0)
src/diagnostics/whoopsie.ui (+165/-0)
To merge this branch: bzr merge lp:~ev/activity-log-manager/whoopsie
Reviewer Review Type Date Requested Status
Manish Sinha (मनीष सिन्हा) Approve
Review via email: mp+93899@code.launchpad.net

Description of the change

As discussed with Seif and the Canonical design team, we should merge the two existing privacy pages in GNOME Control Center into a single entity, under activity-log-manager. Here is a branch to do just that.

Christian has provided the following mockup as guidance:

http://dl.dropbox.com/u/2935618/canonical/ss/privacy-7.png

The privacy page for the Ubuntu crash report settings, hereafter referred to as "diagnostics," provides a small DBus daemon for writing the root-owned /etc/default/whoopsie preferences file.

This also adds a dependency on PolicyKit.

I've only made one change to activity-log-manager itself, which exposes a new append_page method to allow adding the diagnostics page.

As stated previously in #ubuntu-release and #ubuntu-devel, this code already exists in another form in the archive (whoopsie-daisy), and it is the release team's belief that it therefore falls under UI Freeze and not Feature Freeze. However, care will have to be taken to coordinate a release of whoopsie-daisy that does not have the aforementioned files.

To post a comment you must log in.
Revision history for this message
Seif Lotfy (seif) wrote :

Can you please make sure that the makefile is complete... I can't compile it due to

make[3]: *** No rule to make target `diagnostics/whoopsie-generated.c', needed by `libactivity_log_manager_la_vala.stamp'. Stop.
make[3]: Leaving directory `/home/seif/Projects/whoopsie/src'

Revision history for this message
Evan (ev) wrote :

On Mon, Feb 20, 2012 at 8:51 PM, Seif Lotfy <email address hidden> wrote:
> Can you please make sure that the makefile is complete... I can't compile it due to
>
> make[3]: *** No rule to make target `diagnostics/whoopsie-generated.c', needed by `libactivity_log_manager_la_vala.stamp'.  Stop.
> make[3]: Leaving directory `/home/seif/Projects/whoopsie/src'

Fixed in r85. This was due to the autogenerated vala targets pulling
in libactivity-log-manager even when --with-ccpanel was not set. I've
worked around that by explicitly building against the C source
targets:

activity_log_manager_la_SOURCES = \
    $(SOURCES:.vala=.c) alm-cc.c \
    diagnostics-widget.c \
    diagnostics/whoopsie-generated.c

Revision history for this message
Seif Lotfy (seif) wrote :

Since this is upstream work that will be deployed elsewhere I would like to
have this part optional...
Which means if possible can you make it so if i pass --enable-whoopsie or
--mode=ubuntu upon configuring that the whoopsie widget appears. It should
be disabled by default

cheers
Seif

On Mon, Feb 20, 2012 at 10:48 PM, Evan Dandrea
<email address hidden>wrote:

> On Mon, Feb 20, 2012 at 8:51 PM, Seif Lotfy <email address hidden> wrote:
> > Can you please make sure that the makefile is complete... I can't
> compile it due to
> >
> > make[3]: *** No rule to make target `diagnostics/whoopsie-generated.c',
> needed by `libactivity_log_manager_la_vala.stamp'. Stop.
> > make[3]: Leaving directory `/home/seif/Projects/whoopsie/src'
>
> Fixed in r85. This was due to the autogenerated vala targets pulling
> in libactivity-log-manager even when --with-ccpanel was not set. I've
> worked around that by explicitly building against the C source
> targets:
>
> activity_log_manager_la_SOURCES = \
> $(SOURCES:.vala=.c) alm-cc.c \
> diagnostics-widget.c \
> diagnostics/whoopsie-generated.c
>
> --
> https://code.launchpad.net/~ev/activity-log-manager/whoopsie/+merge/93899
> Your team Activity Log Manager is requested to review the proposed merge
> of lp:~ev/activity-log-manager/whoopsie into lp:activity-log-manager.
>

Revision history for this message
Seif Lotfy (seif) wrote :

Also I cant seem to see the panel anywhere...
Since this is being merged into an upstream project can you please make it so it is disabled by default..
It should be enabled upon configuring by passing a -enable-whoopsie parameter

Revision history for this message
Manish Sinha (मनीष सिन्हा) (manishsinha) wrote :

Please make this as optional (--enable-whoopsie) otherwise it cannot be packaged in other distributions without whoopsie being packaged

review: Needs Fixing (build system)
Revision history for this message
Evan (ev) wrote :

On Mon, Feb 20, 2012 at 10:05 PM, Seif Lotfy <email address hidden> wrote:
> Also I cant seem to see the panel anywhere...
> Since this is being merged into an upstream project can you please make it so it is disabled by default..
> It should be enabled upon configuring by passing a -enable-whoopsie parameter

Okay, I've made the diagnostics tab optional. Enable it by passing
--with-whoopsie to configure. You should then see a "Diagnostics" tab
on the GNOME Control Center Privacy page's GtkNotebook.

Revision history for this message
Evan (ev) wrote :

On Tue, Feb 21, 2012 at 10:31 AM, Evan Dandrea
<email address hidden> wrote:
> Okay, I've made the diagnostics tab optional.  Enable it by passing
> --with-whoopsie to configure.  You should then see a "Diagnostics" tab
> on the GNOME Control Center Privacy page's GtkNotebook.

That's r86.

Revision history for this message
Seif Lotfy (seif) wrote :

Evan I dont mind also having it in the standalone version :D

Revision history for this message
Manish Sinha (मनीष सिन्हा) (manishsinha) wrote :

I get symbol lookup error. This is what I did

./autogen.sh --prefix=/usr --with-ccpanel --with-whoopsie
sudo make install

Running as
$ gnome-control-center activity-log-manager

gnome-control-center: symbol lookup error: /usr/lib/control-center-1/panels/libactivity-log-manager.so: undefined symbol: whoopsie_daisy_preferences_new

----------------

Running strace
$ strace gnome-control-center activity-log-manager

futex(0x20f578b4, FUTEX_WAKE_OP_PRIVATE, 1, 1, 0x20f578b0, {FUTEX_OP_SET, 0, FUTEX_OP_CMP_GT, 1}) = 1
futex(0x20f57fe0, FUTEX_WAKE_PRIVATE, 1) = 1
writev(2, [{"gnome-control-center", 20}, {": ", 2}, {"symbol lookup error", 19}, {": ", 2}, {"/usr/lib/control-center-1/panels"..., 59}, {": ", 2}, {"undefined symbol: whoopsie_daisy"..., 48}, {"", 0}, {"", 0}, {"\n", 1}], 10gnome-control-center: symbol lookup error: /usr/lib/control-center-1/panels/libactivity-log-manager.so: undefined symbol: whoopsie_daisy_preferences_new
) = 153
exit_group(127)

review: Needs Fixing (symbols)
Revision history for this message
Evan (ev) wrote :

On Tue, Feb 21, 2012 at 3:00 PM, Manish Sinha (मनीष सिन्हा
<email address hidden> wrote:
> Review: Needs Fixing symbols
>
> I get symbol lookup error. This is what I did
>
> ./autogen.sh --prefix=/usr --with-ccpanel --with-whoopsie
> sudo make install

This should be fixed in r87. You don't have to specify both
--with-ccpanel and --with-whoopsie. Setting --with-whoopsie will
imply --with-ccpanel.

Revision history for this message
Evan (ev) wrote :

On Tue, Feb 21, 2012 at 2:55 PM, Seif Lotfy <email address hidden> wrote:
> Evan I dont mind also having it in the standalone version :D

Sure, but presumably that requires building the whoopsie code as a
library and generating a vapi, as you cannot directly call C code from
vala source.

So could we get that in a second pass, given that UI freeze is tomorrow?

Revision history for this message
Seif Lotfy (seif) wrote :

Yep merging tomorrow first thing

On Wed, Feb 22, 2012 at 12:41 AM, Evan Dandrea
<email address hidden>wrote:

> On Tue, Feb 21, 2012 at 2:55 PM, Seif Lotfy <email address hidden> wrote:
> > Evan I dont mind also having it in the standalone version :D
>
> Sure, but presumably that requires building the whoopsie code as a
> library and generating a vapi, as you cannot directly call C code from
> vala source.
>
> So could we get that in a second pass, given that UI freeze is tomorrow?
>
> --
> https://code.launchpad.net/~ev/activity-log-manager/whoopsie/+merge/93899
> Your team Activity Log Manager is subscribed to branch
> lp:activity-log-manager.
>

lp:~ev/activity-log-manager/whoopsie updated
85. By Seif Lotfy

merge

Revision history for this message
Manish Sinha (मनीष सिन्हा) (manishsinha) wrote :

Will try it out in a few hours (when back from work) and getting it merged. alm needs to be released today so that it can be uploaded before UIF hits

Revision history for this message
Manish Sinha (मनीष सिन्हा) (manishsinha) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file '.bzrignore'
--- .bzrignore 2012-02-15 19:55:47 +0000
+++ .bzrignore 2012-02-21 23:40:22 +0000
@@ -31,6 +31,7 @@
31 src/applications-widget.c31 src/applications-widget.c
32 src/files-widget.c32 src/files-widget.c
33 src/history-widget.c33 src/history-widget.c
34src/diagnostics/Makefile
34po/*.gmo35po/*.gmo
35src/*.lo36src/*.lo
36po/stamp-it37po/stamp-it
3738
=== modified file 'configure.ac'
--- configure.ac 2012-02-14 20:20:46 +0000
+++ configure.ac 2012-02-21 23:40:22 +0000
@@ -35,6 +35,7 @@
35PKG_CHECK_MODULES(GTK, gtk+-3.0, [HAVE_GTK=yes], [HAVE_GTK=no])35PKG_CHECK_MODULES(GTK, gtk+-3.0, [HAVE_GTK=yes], [HAVE_GTK=no])
36PKG_CHECK_MODULES(GEE, gee-1.0, [HAVE_GEE=yes], [HAVE_GEE=no])36PKG_CHECK_MODULES(GEE, gee-1.0, [HAVE_GEE=yes], [HAVE_GEE=no])
37PKG_CHECK_MODULES(GIO_UNIX, gio-unix-2.0, [HAVE_GIO_UNIX=yes], [HAVE_GIO_UNIX=no])37PKG_CHECK_MODULES(GIO_UNIX, gio-unix-2.0, [HAVE_GIO_UNIX=yes], [HAVE_GIO_UNIX=no])
38PKG_CHECK_MODULES(POLKIT, polkit-gobject-1, [HAVE_POLKIT=yes], [HAVE_POLKIT=no])
3839
39AC_ARG_WITH([extensiondir],40AC_ARG_WITH([extensiondir],
40 [AS_HELP_STRING([--with-extensiondir],41 [AS_HELP_STRING([--with-extensiondir],
@@ -42,6 +43,11 @@
42 [],43 [],
43 [with_extensiondir=yes])44 [with_extensiondir=yes])
4445
46AC_ARG_WITH([whoopsie],
47 [AS_HELP_STRING([--with-whoopsie],
48 [build control-center plugin Ubuntu crash reporting page @<:@default=check@:>@])],
49 [with_ccpanel=yes],
50 [with_whoopsie=check])
45AC_ARG_WITH([ccpanel],51AC_ARG_WITH([ccpanel],
46 [AS_HELP_STRING([--with-ccpanel],52 [AS_HELP_STRING([--with-ccpanel],
47 [build control-center plugin @<:@default=check@:>@])],53 [build control-center plugin @<:@default=check@:>@])],
@@ -56,7 +62,11 @@
56 [CCPANEL_DIR=`$PKG_CONFIG --variable=extensiondir libgnome-control-center`],62 [CCPANEL_DIR=`$PKG_CONFIG --variable=extensiondir libgnome-control-center`],
57 [CCPANEL_DIR="${PREFIX}/lib/control-center-1/panels"])63 [CCPANEL_DIR="${PREFIX}/lib/control-center-1/panels"])
58 AC_SUBST(CCPANEL_DIR),64 AC_SUBST(CCPANEL_DIR),
59 [if test "x$with_ccpanel" != xcheck; then65 [if test "x$with_whoopsie" != xcheck; then
66 AC_MSG_FAILURE(
67 [--with-whoopsie was given, but test for libgnome-control-center failed])
68 fi
69 if test "x$with_ccpanel" != xcheck; then
60 AC_MSG_FAILURE(70 AC_MSG_FAILURE(
61 [--with-ccpanel was given, but test for libgnome-control-center failed])71 [--with-ccpanel was given, but test for libgnome-control-center failed])
62 fi72 fi
@@ -64,6 +74,10 @@
64 )]74 )]
65)75)
66AM_CONDITIONAL([HAVE_CCPANEL], [test -n "$CCPANEL_LIBS"])76AM_CONDITIONAL([HAVE_CCPANEL], [test -n "$CCPANEL_LIBS"])
77AM_CONDITIONAL([HAVE_WHOOPSIE], [test "x$with_whoopsie" != xcheck])
78AS_IF([test "x$with_whoopsie" != xcheck],
79 AC_DEFINE([HAVE_WHOOPSIE], [1],
80 [Build control-center plugin Ubuntu crash reporting page]), [])
6781
6882
6983
@@ -71,5 +85,6 @@
71Makefile85Makefile
72data/Makefile86data/Makefile
73src/Makefile87src/Makefile
88src/diagnostics/Makefile
74po/Makefile.in89po/Makefile.in
75])90])
7691
=== modified file 'po/POTFILES.in'
--- po/POTFILES.in 2012-02-14 20:20:46 +0000
+++ po/POTFILES.in 2012-02-21 23:40:22 +0000
@@ -6,3 +6,4 @@
6src/applications-widget.vala6src/applications-widget.vala
7src/files-widget.vala7src/files-widget.vala
8src/history-widget.vala8src/history-widget.vala
9src/diagnostics/whoopsie.ui
910
=== modified file 'src/Makefile.am'
--- src/Makefile.am 2012-02-08 14:19:18 +0000
+++ src/Makefile.am 2012-02-21 23:40:22 +0000
@@ -2,6 +2,11 @@
2ccpaneldir = $(CCPANEL_DIR)2ccpaneldir = $(CCPANEL_DIR)
3ccpanel_LTLIBRARIES = libactivity-log-manager.la3ccpanel_LTLIBRARIES = libactivity-log-manager.la
4endif4endif
5if HAVE_WHOOPSIE
6gnomeccuidir = $(datadir)/gnome-control-center/ui/
7endif
8
9SUBDIRS = diagnostics
510
6VALAFLAGS = \11VALAFLAGS = \
7 --pkg zeitgeist-1.0 \12 --pkg zeitgeist-1.0 \
@@ -9,7 +14,7 @@
9 --pkg gee-1.0 \14 --pkg gee-1.0 \
10 --target-glib=2.26 \15 --target-glib=2.26 \
11 --pkg gio-unix-2.0 \16 --pkg gio-unix-2.0 \
12 config.vapi17 config.vapi
1318
14bin_PROGRAMS = activity-log-manager19bin_PROGRAMS = activity-log-manager
1520
@@ -28,6 +33,11 @@
28 $(SHARED_CFLAGS) \33 $(SHARED_CFLAGS) \
29 $(CCPANEL_CFLAGS)34 $(CCPANEL_CFLAGS)
3035
36if HAVE_WHOOPSIE
37libactivity_log_manager_la_CFLAGS += \
38 $(POLKIT_CFLAGS) \
39 -DGNOMECC_UI_DIR=\""$(gnomeccuidir)"\"
40endif
3141
32SOURCES = \42SOURCES = \
33 activity-log-manager.vala \43 activity-log-manager.vala \
@@ -38,7 +48,13 @@
38activity_log_manager_SOURCES = \48activity_log_manager_SOURCES = \
39 $(SOURCES) alm.vala 49 $(SOURCES) alm.vala
40libactivity_log_manager_la_SOURCES = \50libactivity_log_manager_la_SOURCES = \
41 $(SOURCES) alm-cc.c51 $(SOURCES:.vala=.c) alm-cc.c
52
53if HAVE_WHOOPSIE
54libactivity_log_manager_la_SOURCES += \
55 diagnostics-widget.c \
56 diagnostics/whoopsie-generated.c
57endif
4258
43activity_log_manager_LDFLAGS = \59activity_log_manager_LDFLAGS = \
44 -Wl,--export-dynamic60 -Wl,--export-dynamic
@@ -55,6 +71,11 @@
55 $(SHARED_LIBS) \71 $(SHARED_LIBS) \
56 $(CCPANEL_LIBS)72 $(CCPANEL_LIBS)
5773
74if HAVE_WHOOPSIE
75libactivity_log_manager_la_LIBADD += \
76 $(POLKIT_LIBS)
77endif
78
58GENERATED_C_FILES = $(alm_SOURCES:.vala=.c)79GENERATED_C_FILES = $(alm_SOURCES:.vala=.c)
5980
60GENERATED_O_FILES = $(alm_SOURCES:.vala=.o)81GENERATED_O_FILES = $(alm_SOURCES:.vala=.o)
@@ -62,7 +83,3 @@
62CLEANFILES = \83CLEANFILES = \
63 $(GENERATED_C_FILES) \84 $(GENERATED_C_FILES) \
64 $(GENERATED_O_FILES)85 $(GENERATED_O_FILES)
65
66
67
68
6986
=== modified file 'src/activity-log-manager.vala'
--- src/activity-log-manager.vala 2012-02-18 21:38:27 +0000
+++ src/activity-log-manager.vala 2012-02-21 23:40:22 +0000
@@ -71,6 +71,10 @@
71 this.show_all();71 this.show_all();
72 }72 }
7373
74 public void append_page (Gtk.Widget widget, string label) {
75 var app_label = new Gtk.Label(_(label));
76 notebook.append_page(widget, app_label);
77 }
74 public void on_incognito_toggled(bool status) {78 public void on_incognito_toggled(bool status) {
75 this.logging_switch.set_active(!status);79 this.logging_switch.set_active(!status);
76 }80 }
7781
=== modified file 'src/alm-cc.c'
--- src/alm-cc.c 2012-02-11 16:53:55 +0000
+++ src/alm-cc.c 2012-02-21 23:40:22 +0000
@@ -21,6 +21,10 @@
21#include "config.h"21#include "config.h"
2222
23extern void* alm_activity_log_manager_new (void);23extern void* alm_activity_log_manager_new (void);
24#ifdef HAVE_WHOOPSIE
25extern void alm_activity_log_manager_append_page (void* alm, GtkWidget* widget, const gchar* label);
26extern void* whoopsie_daisy_preferences_new (void);
27#endif
2428
25#define ALM_TYPE_MAIN_WINDOW_PANEL alm_main_window_panel_get_type()29#define ALM_TYPE_MAIN_WINDOW_PANEL alm_main_window_panel_get_type()
2630
@@ -53,6 +57,10 @@
53alm_main_window_panel_init (AlmMainWindowPanel *self)57alm_main_window_panel_init (AlmMainWindowPanel *self)
54{58{
55 GtkWidget *widget = GTK_WIDGET (alm_activity_log_manager_new ());59 GtkWidget *widget = GTK_WIDGET (alm_activity_log_manager_new ());
60#ifdef HAVE_WHOOPSIE
61 GtkWidget *whoopsie = GTK_WIDGET (whoopsie_daisy_preferences_new ());
62 alm_activity_log_manager_append_page (widget, whoopsie, "Diagnostics");
63#endif
56 gtk_widget_show_all (widget);64 gtk_widget_show_all (widget);
57 gtk_container_add (GTK_CONTAINER (self), widget);65 gtk_container_add (GTK_CONTAINER (self), widget);
58}66}
5967
=== added directory 'src/diagnostics'
=== added file 'src/diagnostics-widget.c'
--- src/diagnostics-widget.c 1970-01-01 00:00:00 +0000
+++ src/diagnostics-widget.c 2012-02-21 23:40:22 +0000
@@ -0,0 +1,193 @@
1#include <gtk/gtk.h>
2#include <gio/gio.h>
3#include <polkit/polkit.h>
4
5#include "diagnostics/whoopsie-generated.h"
6
7static WhoopsiePreferences* proxy = NULL;
8
9#define POL_PATH "com.ubuntu.whoopsiepreferences.change"
10#define PRIVACY_URL "http://www.ubuntu.com/aboutus/privacypolicy"
11
12#define WHOOPSIE_DAISY_TYPE_PREFERENCES whoopsie_daisy_preferences_get_type()
13#define WHOOPSIE_DAISY_PREFERENCES(obj) \
14 (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
15 WHOOPSIE_DAISY_TYPE_PREFERENCES, WhoopsieDaisyPreferences))
16#define WHOOPSIE_DAISY_PREFERENCES_PRIVATE(o) \
17 (G_TYPE_INSTANCE_GET_PRIVATE ((o), WHOOPSIE_DAISY_TYPE_PREFERENCES, WhoopsieDaisyPreferencesPrivate))
18
19GType whoopsie_daisy_preferences_get_type (void) G_GNUC_CONST;
20
21typedef struct _WhoopsieDaisyPreferences WhoopsieDaisyPreferences;
22typedef struct _WhoopsieDaisyPreferencesClass WhoopsieDaisyPreferencesClass;
23typedef struct _WhoopsieDaisyPreferencesPrivate WhoopsieDaisyPreferencesPrivate;
24
25struct _WhoopsieDaisyPreferencesPrivate
26{
27 GtkBuilder* builder;
28 GPermission* permission;
29};
30
31struct _WhoopsieDaisyPreferences
32{
33 GtkBox parent;
34 WhoopsieDaisyPreferencesPrivate* priv;
35};
36
37struct _WhoopsieDaisyPreferencesClass
38{
39 GtkBoxClass parent_class;
40};
41
42G_DEFINE_TYPE (WhoopsieDaisyPreferences, whoopsie_daisy_preferences, GTK_TYPE_BOX)
43
44static void
45whoopsie_daisy_preferences_dispose (GObject* object)
46{
47 WhoopsieDaisyPreferencesPrivate* priv = WHOOPSIE_DAISY_PREFERENCES (object)->priv;
48
49 if (priv->builder) {
50 g_object_unref (priv->builder);
51 priv->builder = NULL;
52 }
53 if (priv->permission) {
54 g_object_unref (priv->permission);
55 priv->permission = NULL;
56 }
57}
58
59static void
60whoopsie_daisy_preferences_class_init (WhoopsieDaisyPreferencesClass *klass)
61{
62 GObjectClass *object_class = G_OBJECT_CLASS (klass);
63 g_type_class_add_private (klass, sizeof (WhoopsieDaisyPreferencesPrivate));
64 object_class->dispose = whoopsie_daisy_preferences_dispose;
65}
66
67static void
68on_privacy_policy_clicked (GtkWidget* button, gpointer user_data)
69{
70 system ("xdg-open " PRIVACY_URL);
71}
72
73static void
74on_permission_changed (GPermission* permission, GParamSpec* pspec, gpointer data)
75{
76 gboolean allowed;
77 GtkWidget* error_reports_box = NULL;
78 WhoopsieDaisyPreferencesPrivate* priv = WHOOPSIE_DAISY_PREFERENCES (data)->priv;
79
80 error_reports_box = GTK_WIDGET (gtk_builder_get_object (
81 priv->builder, "error_reports_box"));
82
83 allowed = g_permission_get_allowed (permission);
84 gtk_widget_set_sensitive (error_reports_box, allowed);
85}
86
87static void
88on_submit_error_reports_checked (GtkToggleButton* button, gpointer user_data)
89{
90 GError* error = NULL;
91
92 whoopsie_preferences_call_set_report_crashes_sync (proxy,
93 gtk_toggle_button_get_active (button), NULL, &error);
94 if (error != NULL) {
95 g_printerr ("Error setting crash reporting: %s\n", error->message);
96 g_error_free (error);
97 }
98}
99
100static void
101on_properties_changed (WhoopsiePreferences* interface,
102 GVariant* changed_properties,
103 const gchar* const* invalidated_properties,
104 gpointer user_data)
105{
106 WhoopsieDaisyPreferencesPrivate* priv = WHOOPSIE_DAISY_PREFERENCES (user_data)->priv;
107 gboolean report_errors;
108 GtkWidget* submit_error_reports = NULL;
109
110 submit_error_reports = GTK_WIDGET (
111 gtk_builder_get_object (priv->builder, "submit_error_reports"));
112 report_errors = whoopsie_preferences_get_report_crashes (interface);
113 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (submit_error_reports), report_errors);
114}
115
116static void
117whoopsie_daisy_preferences_setup_dbus (WhoopsieDaisyPreferences *self, GError *error)
118{
119 WhoopsieDaisyPreferencesPrivate* priv = WHOOPSIE_DAISY_PREFERENCES (self)->priv;
120 proxy = whoopsie_preferences_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
121 G_DBUS_PROXY_FLAGS_NONE,
122 "com.ubuntu.WhoopsiePreferences",
123 "/com/ubuntu/WhoopsiePreferences",
124 NULL, &error);
125 if (!proxy)
126 return
127
128 g_signal_connect (proxy, "g-properties-changed",
129 G_CALLBACK (on_properties_changed), self);
130 on_properties_changed (proxy, NULL, NULL, self);
131}
132static void
133whoopsie_daisy_preferences_init (WhoopsieDaisyPreferences *self)
134{
135 GError *error = NULL;
136 GtkWidget* privacy_page = NULL;
137 GtkWidget* unlock_align = NULL;
138 GtkWidget* unlock_button = NULL;
139 GtkWidget* submit_error_reports = NULL;
140 GtkWidget* privacy_policy = NULL;
141 WhoopsieDaisyPreferencesPrivate* priv;
142 priv = self->priv = WHOOPSIE_DAISY_PREFERENCES_PRIVATE (self);
143
144 priv->builder = gtk_builder_new ();
145 gtk_builder_add_from_file(priv->builder, GNOMECC_UI_DIR "/whoopsie.ui", &error);
146 if (error != NULL) {
147 g_warning ("Could not load interface file: %s", error->message);
148 g_error_free (error);
149 return;
150 }
151 submit_error_reports = GTK_WIDGET (
152 gtk_builder_get_object (priv->builder, "submit_error_reports"));
153 privacy_page = GTK_WIDGET (
154 gtk_builder_get_object (priv->builder, "privacy_page_box"));
155 unlock_align = GTK_WIDGET (
156 gtk_builder_get_object (priv->builder, "unlock_alignment"));
157 privacy_policy = GTK_WIDGET (
158 gtk_builder_get_object (priv->builder, "privacy_policy"));
159
160 gtk_widget_reparent (privacy_page, (GtkWidget *) self);
161 g_object_set (self, "valign", GTK_ALIGN_START, NULL);
162
163 priv->permission = polkit_permission_new_sync (POL_PATH, NULL, NULL, &error);
164 if (!priv->permission) {
165 g_warning ("Could not acquire permission: %s", error->message);
166 g_error_free (error);
167 }
168
169 unlock_button = gtk_lock_button_new (priv->permission);
170 gtk_container_add (GTK_CONTAINER (unlock_align), GTK_WIDGET (unlock_button));
171 gtk_widget_show (unlock_button);
172
173 g_signal_connect (priv->permission, "notify", G_CALLBACK (on_permission_changed), self);
174 on_permission_changed (priv->permission, NULL, self);
175
176 whoopsie_daisy_preferences_setup_dbus (self, error);
177 if (error) {
178 g_warning ("Could not set up DBus connection: %s", error->message);
179 g_error_free (error);
180 }
181
182 g_signal_connect (submit_error_reports, "toggled",
183 G_CALLBACK (on_submit_error_reports_checked), NULL);
184 g_signal_connect (privacy_policy, "clicked",
185 G_CALLBACK (on_privacy_policy_clicked), NULL);
186}
187
188GtkWidget*
189whoopsie_daisy_preferences_new (void)
190{
191 return g_object_new (WHOOPSIE_DAISY_TYPE_PREFERENCES, NULL);
192}
193
0194
=== added file 'src/diagnostics/Makefile.am'
--- src/diagnostics/Makefile.am 1970-01-01 00:00:00 +0000
+++ src/diagnostics/Makefile.am 2012-02-21 23:40:22 +0000
@@ -0,0 +1,44 @@
1if HAVE_CCPANEL
2ccpaneldir = $(CCPANEL_DIR)
3bin_PROGRAMS = whoopsie-preferences
4endif
5
6policykitdir = $(datadir)/polkit-1/actions/
7dbussystemdir = $(sysconfdir)/dbus-1/system.d/
8dbusservicedir = $(datadir)/dbus-1/system-services/
9gnomeccuidir = $(datadir)/gnome-control-center/ui/
10
11whoopsie_preferences_CFLAGS = \
12 -Wall \
13 -g \
14 $(POLKIT_CFLAGS) $(GIO_UNIX_CFLAGS)
15
16whoopsie_preferences_SOURCES = \
17 whoopsie-generated.c whoopsie-generated.h whoopsie-preferences.c
18
19whoopsie_preferences_LDADD = \
20 $(POLKIT_LIBS) \
21 $(GIO_UNIX_LIBS)
22
23EXTRA_DIST = \
24 whoopsie-preferences.xml \
25 com.ubuntu.WhoopsiePreferences.service \
26 com.ubuntu.WhoopsiePreferences.conf \
27 com.ubuntu.whoopsiepreferences.policy \
28 whoopsie.ui
29
30gnomeccui_DATA = \
31 whoopsie.ui
32policykit_DATA = \
33 com.ubuntu.whoopsiepreferences.policy
34dbussystem_DATA = \
35 com.ubuntu.WhoopsiePreferences.conf
36dbusservice_DATA = \
37 com.ubuntu.WhoopsiePreferences.service
38
39whoopsie-generated.c: whoopsie-preferences.xml
40 gdbus-codegen --interface-prefix com.ubuntu. \
41 --generate-c-code whoopsie-generated \
42 $<
43
44CLEANFILES = whoopsie-generated.[ch]
045
=== added file 'src/diagnostics/com.ubuntu.WhoopsiePreferences.conf'
--- src/diagnostics/com.ubuntu.WhoopsiePreferences.conf 1970-01-01 00:00:00 +0000
+++ src/diagnostics/com.ubuntu.WhoopsiePreferences.conf 2012-02-21 23:40:22 +0000
@@ -0,0 +1,26 @@
1<!DOCTYPE busconfig PUBLIC
2 "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
3 "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
4<busconfig>
5
6 <!-- This configuration file specifies the required security policies
7 for configuring the crash daemon. -->
8
9 <!-- Only root can own the service -->
10 <policy user="root">
11 <allow own="com.ubuntu.WhoopsiePreferences"/>
12 </policy>
13
14 <!-- Allow anyone to invoke methods (further constrained by
15 PolicyKit privileges -->
16 <policy context="default">
17 <allow send_destination="com.ubuntu.WhoopsiePreferences"
18 send_interface="com.ubuntu.WhoopsiePreferences"/>
19 <allow send_destination="com.ubuntu.WhoopsiePreferences"
20 send_interface="org.freedesktop.DBus.Introspectable"/>
21 <allow send_destination="com.ubuntu.WhoopsiePreferences"
22 send_interface="org.freedesktop.DBus.Properties"/>
23 </policy>
24
25</busconfig>
26
027
=== added file 'src/diagnostics/com.ubuntu.WhoopsiePreferences.service'
--- src/diagnostics/com.ubuntu.WhoopsiePreferences.service 1970-01-01 00:00:00 +0000
+++ src/diagnostics/com.ubuntu.WhoopsiePreferences.service 2012-02-21 23:40:22 +0000
@@ -0,0 +1,4 @@
1[D-BUS Service]
2Name=com.ubuntu.WhoopsiePreferences
3Exec=/usr/lib/whoopsie/whoopsie-preferences
4User=root
05
=== added file 'src/diagnostics/com.ubuntu.whoopsiepreferences.policy'
--- src/diagnostics/com.ubuntu.whoopsiepreferences.policy 1970-01-01 00:00:00 +0000
+++ src/diagnostics/com.ubuntu.whoopsiepreferences.policy 2012-02-21 23:40:22 +0000
@@ -0,0 +1,18 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<!DOCTYPE policyconfig PUBLIC
3 "-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
4 "http://www.freedesktop.org/standards/PolicyKit/1.0/policyconfig.dtd">
5<policyconfig>
6 <vendor>Ubuntu crash reporting</vendor>
7 <vendor_url>https://launchpad.net/whoopsie-daisy</vendor_url>
8 <icon_name>stock_lock</icon_name>
9 <action id="com.ubuntu.whoopsiepreferences.change">
10 <description gettext-domain="whoopsie">Privacy settings</description>
11 <message gettext-domain="whoopsie">To change your privacy settings you need to authenticate.</message>
12 <defaults>
13 <allow_any>auth_admin</allow_any>
14 <allow_inactive>auth_admin</allow_inactive>
15 <allow_active>auth_admin_keep</allow_active>
16 </defaults>
17 </action>
18</policyconfig>
019
=== added file 'src/diagnostics/whoopsie-preferences.c'
--- src/diagnostics/whoopsie-preferences.c 1970-01-01 00:00:00 +0000
+++ src/diagnostics/whoopsie-preferences.c 2012-02-21 23:40:22 +0000
@@ -0,0 +1,297 @@
1/* whoopsie
2 *
3 * Copyright © 2011 Canonical Ltd.
4 * Author: Evan Dandrea <evan.dandrea@canonical.com>
5 *
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20#include <gio/gio.h>
21#include <stdlib.h>
22#include <polkit/polkit.h>
23
24#include "whoopsie-generated.h"
25
26#define CONFIG_PATH "/etc/default/whoopsie"
27
28static GMainLoop* loop = NULL;
29static guint loop_shutdown = 0;
30static GKeyFile* key_file = NULL;
31static PolkitAuthority* authority = NULL;
32
33/* Eventually, it might make sense to move to gsettings with the dconf
34 * backend, once it gains PolicyKit support, rather than have a program just
35 * to expose an interface to a small configuration file over DBus/PolicyKit.
36 * */
37
38/* Once upstart has an interface for disabiling jobs via initctl, we wont need
39 * a configuration file anymore */
40
41gboolean
42whoopsie_preferences_load_configuration (void)
43{
44 char* data;
45 gsize data_size;
46 gboolean ret = TRUE;
47 GError* error = NULL;
48
49 if (g_key_file_load_from_file (key_file, CONFIG_PATH,
50 G_KEY_FILE_KEEP_COMMENTS, NULL)) {
51 return TRUE;
52 }
53
54 g_key_file_set_boolean (key_file, "General", "report_crashes", TRUE);
55 data = g_key_file_to_data (key_file, &data_size, &error);
56 if (error) {
57 g_print ("Could not process configuration: %s\n", error->message);
58 ret = FALSE;
59 goto out;
60 }
61 if (!g_file_set_contents (CONFIG_PATH, data, data_size, &error)) {
62 g_print ("Could not write configuration: %s\n", error->message);
63 ret = FALSE;
64 goto out;
65 }
66
67 out:
68 if (data)
69 g_free (data);
70 if (error)
71 g_error_free (error);
72 return ret;
73}
74
75static void
76whoopsie_preferences_dbus_notify (WhoopsiePreferences* interface)
77{
78 GError* error = NULL;
79 gboolean report_crashes = FALSE;
80
81 report_crashes = g_key_file_get_boolean (key_file, "General",
82 "report_crashes", &error);
83 if (error) {
84 g_warning ("Could not get crashes: %s", error->message);
85 g_error_free (error);
86 }
87 whoopsie_preferences_set_report_crashes (interface, report_crashes);
88}
89
90static void
91whoopsie_preferences_file_changed (GFileMonitor *monitor, GFile *file,
92 GFile *other_file,
93 GFileMonitorEvent event_type,
94 gpointer user_data)
95{
96 if (event_type == G_FILE_MONITOR_EVENT_CHANGED) {
97 whoopsie_preferences_load_configuration ();
98 whoopsie_preferences_dbus_notify (user_data);
99 }
100}
101
102gboolean
103whoopsie_preferences_load (WhoopsiePreferences* interface)
104{
105 GError* error = NULL;
106 GFile* fp = NULL;
107 GFileMonitor* file_monitor = NULL;
108
109 fp = g_file_new_for_path (CONFIG_PATH);
110 file_monitor = g_file_monitor_file (fp, G_FILE_MONITOR_NONE,
111 NULL, &error);
112 g_signal_connect (file_monitor, "changed",
113 G_CALLBACK (whoopsie_preferences_file_changed),
114 interface);
115 if (error) {
116 g_print ("Could not set up file monitor: %s\n", error->message);
117 g_error_free (error);
118 }
119 g_object_unref (fp);
120
121 key_file = g_key_file_new ();
122 whoopsie_preferences_load_configuration ();
123}
124
125gboolean
126whoopsie_preferences_changed (WhoopsiePreferences* object, GParamSpec* pspec,
127 gpointer user_data)
128{
129 WhoopsiePreferencesIface* iface;
130 gboolean saved_value, new_value;
131 GError* error = NULL;
132 char* data;
133 gsize data_size;
134
135 if (loop_shutdown) {
136 g_source_remove (loop_shutdown);
137 loop_shutdown = 0;
138 }
139 loop_shutdown = g_timeout_add_seconds (60, (GSourceFunc) g_main_loop_quit,
140 loop);
141
142 iface = WHOOPSIE_PREFERENCES_GET_IFACE (object);
143 saved_value = g_key_file_get_boolean (key_file, "General", user_data,
144 &error);
145 if (error) {
146 g_print ("Could not process configuration: %s\n", error->message);
147 return FALSE;
148 }
149 new_value = iface->get_report_crashes (object);
150
151 if (saved_value != new_value) {
152 g_key_file_set_boolean (key_file, "General", user_data, new_value);
153 data = g_key_file_to_data (key_file, &data_size, &error);
154 if (error) {
155 g_print ("Could not process configuration: %s\n", error->message);
156 return FALSE;
157 }
158 if (!g_file_set_contents (CONFIG_PATH, data, data_size, &error)) {
159 g_print ("Could not write configuration: %s\n", error->message);
160 return FALSE;
161 }
162 }
163}
164
165static gboolean
166whoopsie_preferences_on_set_report_crashes (WhoopsiePreferences* object,
167 GDBusMethodInvocation* invocation,
168 gboolean report,
169 gpointer user_data)
170{
171 whoopsie_preferences_set_report_crashes (object, report);
172 whoopsie_preferences_complete_set_report_crashes (object, invocation);
173 return TRUE;
174}
175
176static gboolean
177whoopsie_preferences_authorize_method (GDBusInterfaceSkeleton* interface,
178 GDBusMethodInvocation* invocation,
179 gpointer user_data)
180{
181 PolkitSubject* subject = NULL;
182 PolkitAuthorizationResult* result = NULL;
183 GError* error = NULL;
184 const char* sender = NULL;
185 gboolean ret = FALSE;
186
187 sender = g_dbus_method_invocation_get_sender (invocation);
188 subject = polkit_system_bus_name_new (sender);
189 result = polkit_authority_check_authorization_sync (authority, subject,
190 "com.ubuntu.whoopsiepreferences.change",
191 NULL,
192 POLKIT_CHECK_AUTHORIZATION_FLAGS_NONE,
193 NULL, &error);
194 if (result == NULL) {
195 g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR,
196 G_DBUS_ERROR_AUTH_FAILED, "Could not authorize: %s",
197 error->message);
198 g_error_free (error);
199 goto out;
200 }
201 if (!polkit_authorization_result_get_is_authorized (result)) {
202 g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR,
203 G_DBUS_ERROR_AUTH_FAILED, "Not authorized.");
204 goto out;
205 }
206 ret = TRUE;
207 out:
208 if (result != NULL)
209 g_object_unref (result);
210 g_object_unref (subject);
211 return ret;
212}
213
214static void
215on_bus_acquired (GDBusConnection* connection, const gchar* name,
216 gpointer user_data)
217{
218 WhoopsiePreferences* interface;
219 GError* error = NULL;
220
221 interface = whoopsie_preferences_skeleton_new ();
222 if (!g_dbus_interface_skeleton_export (
223 G_DBUS_INTERFACE_SKELETON (interface),
224 connection,
225 "/com/ubuntu/WhoopsiePreferences", &error)) {
226
227 g_print ("Could not export path: %s\n", error->message);
228 g_error_free (error);
229 g_main_loop_quit (loop);
230 return;
231 }
232
233 authority = polkit_authority_get_sync (NULL, &error);
234 if (authority == NULL) {
235 g_print ("Could not get authority: %s\n", error->message);
236 g_error_free (error);
237 g_main_loop_quit (loop);
238 return;
239 }
240 loop_shutdown = g_timeout_add_seconds (60, (GSourceFunc) g_main_loop_quit,
241 loop);
242
243 g_signal_connect (interface, "notify::report-crashes",
244 G_CALLBACK (whoopsie_preferences_changed),
245 "report_crashes");
246 g_signal_connect (interface, "handle-set-report-crashes",
247 G_CALLBACK (whoopsie_preferences_on_set_report_crashes),
248 NULL);
249 g_signal_connect (interface, "g-authorize-method", G_CALLBACK
250 (whoopsie_preferences_authorize_method), authority);
251
252 whoopsie_preferences_load (interface);
253 whoopsie_preferences_dbus_notify (interface);
254}
255
256static void
257on_name_acquired (GDBusConnection* connection, const gchar* name,
258 gpointer user_data)
259{
260 g_print ("Acquired the name: %s\n", name);
261}
262
263static void
264on_name_lost (GDBusConnection* connection, const gchar* name,
265 gpointer user_data)
266{
267 g_print ("Lost the name: %s\n", name);
268}
269
270int
271main (int argc, char** argv)
272{
273 guint owner_id;
274
275 if (getuid () != 0) {
276 g_print ("This program must be run as root.\n");
277 return 1;
278 }
279
280 g_type_init();
281
282 owner_id = g_bus_own_name (G_BUS_TYPE_SYSTEM,
283 "com.ubuntu.WhoopsiePreferences",
284 G_BUS_NAME_OWNER_FLAGS_NONE,
285 on_bus_acquired,
286 on_name_acquired,
287 on_name_lost,
288 NULL, NULL);
289
290 loop = g_main_loop_new (NULL, FALSE);
291 g_main_loop_run (loop);
292 g_bus_unown_name (owner_id);
293 g_main_loop_unref (loop);
294 if (key_file)
295 g_key_file_free (key_file);
296 return 0;
297}
0298
=== added file 'src/diagnostics/whoopsie-preferences.xml'
--- src/diagnostics/whoopsie-preferences.xml 1970-01-01 00:00:00 +0000
+++ src/diagnostics/whoopsie-preferences.xml 2012-02-21 23:40:22 +0000
@@ -0,0 +1,8 @@
1<node>
2 <interface name="com.ubuntu.WhoopsiePreferences">
3 <property name="ReportCrashes" type="b" access="read" />
4 <method name="SetReportCrashes">
5 <arg direction="in" type="b" name="report" />
6 </method>
7 </interface>
8</node>
09
=== added file 'src/diagnostics/whoopsie.ui'
--- src/diagnostics/whoopsie.ui 1970-01-01 00:00:00 +0000
+++ src/diagnostics/whoopsie.ui 2012-02-21 23:40:22 +0000
@@ -0,0 +1,165 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<interface>
3 <!-- interface-requires gtk+ 3.0 -->
4 <object class="GtkWindow" id="window1">
5 <property name="can_focus">False</property>
6 <property name="has_resize_grip">False</property>
7 <child>
8 <object class="GtkBox" id="privacy_page_box">
9 <property name="visible">True</property>
10 <property name="can_focus">False</property>
11 <property name="border_width">12</property>
12 <property name="orientation">vertical</property>
13 <property name="spacing">12</property>
14 <child>
15 <object class="GtkBox" id="privacy_box">
16 <property name="visible">True</property>
17 <property name="can_focus">False</property>
18 <property name="orientation">vertical</property>
19 <property name="spacing">12</property>
20 <child>
21 <object class="GtkLabel" id="privacy_heading">
22 <property name="visible">True</property>
23 <property name="can_focus">False</property>
24 <property name="xalign">0</property>
25 <property name="label" translatable="yes">Ubuntu can collect anonymous information that helps developers improve it. All information collected is covered by our privacy policy.</property>
26 <property name="wrap">True</property>
27 </object>
28 <packing>
29 <property name="expand">False</property>
30 <property name="fill">True</property>
31 <property name="position">0</property>
32 </packing>
33 </child>
34 <child>
35 <object class="GtkAlignment" id="privacy_policy_alignment">
36 <property name="visible">True</property>
37 <property name="can_focus">False</property>
38 <property name="xalign">0</property>
39 <property name="xscale">0</property>
40 <child>
41 <object class="GtkButton" id="privacy_policy">
42 <property name="label" translatable="yes">Privacy Policy</property>
43 <property name="use_action_appearance">False</property>
44 <property name="visible">True</property>
45 <property name="can_focus">True</property>
46 <property name="receives_default">True</property>
47 <property name="use_action_appearance">False</property>
48 </object>
49 </child>
50 </object>
51 <packing>
52 <property name="expand">False</property>
53 <property name="fill">True</property>
54 <property name="position">1</property>
55 </packing>
56 </child>
57 </object>
58 <packing>
59 <property name="expand">False</property>
60 <property name="fill">True</property>
61 <property name="position">0</property>
62 </packing>
63 </child>
64 <child>
65 <object class="GtkBox" id="reports_box">
66 <property name="visible">True</property>
67 <property name="can_focus">False</property>
68 <property name="orientation">vertical</property>
69 <property name="spacing">12</property>
70 <child>
71 <object class="GtkBox" id="reports_heading_box">
72 <property name="visible">True</property>
73 <property name="can_focus">False</property>
74 <child>
75 <object class="GtkLabel" id="reports_heading">
76 <property name="visible">True</property>
77 <property name="can_focus">False</property>
78 <property name="label" translatable="yes">People using this computer can:</property>
79 </object>
80 <packing>
81 <property name="expand">False</property>
82 <property name="fill">True</property>
83 <property name="position">0</property>
84 </packing>
85 </child>
86 <child>
87 <object class="GtkAlignment" id="unlock_alignment">
88 <property name="visible">True</property>
89 <property name="can_focus">False</property>
90 <property name="xalign">1</property>
91 <property name="xscale">0</property>
92 <child>
93 <placeholder/>
94 </child>
95 </object>
96 <packing>
97 <property name="expand">True</property>
98 <property name="fill">True</property>
99 <property name="position">1</property>
100 </packing>
101 </child>
102 </object>
103 <packing>
104 <property name="expand">False</property>
105 <property name="fill">True</property>
106 <property name="position">0</property>
107 </packing>
108 </child>
109 <child>
110 <object class="GtkBox" id="error_reports_box">
111 <property name="visible">True</property>
112 <property name="can_focus">False</property>
113 <property name="orientation">vertical</property>
114 <property name="spacing">3</property>
115 <child>
116 <object class="GtkCheckButton" id="submit_error_reports">
117 <property name="label" translatable="yes">Send error reports to Canonical</property>
118 <property name="use_action_appearance">False</property>
119 <property name="visible">True</property>
120 <property name="can_focus">True</property>
121 <property name="receives_default">False</property>
122 <property name="use_action_appearance">False</property>
123 <property name="xalign">0</property>
124 <property name="draw_indicator">True</property>
125 </object>
126 <packing>
127 <property name="expand">False</property>
128 <property name="fill">True</property>
129 <property name="position">0</property>
130 </packing>
131 </child>
132 <child>
133 <object class="GtkLabel" id="error_reports_description">
134 <property name="visible">True</property>
135 <property name="can_focus">False</property>
136 <property name="xalign">0</property>
137 <property name="xpad">24</property>
138 <property name="label" translatable="yes">&lt;small&gt;Error reports include information about what a program was doing when it failed. You always have the choice to send or cancel an error report.&lt;/small&gt;</property>
139 <property name="use_markup">True</property>
140 <property name="wrap">True</property>
141 </object>
142 <packing>
143 <property name="expand">False</property>
144 <property name="fill">True</property>
145 <property name="position">1</property>
146 </packing>
147 </child>
148 </object>
149 <packing>
150 <property name="expand">False</property>
151 <property name="fill">True</property>
152 <property name="position">1</property>
153 </packing>
154 </child>
155 </object>
156 <packing>
157 <property name="expand">False</property>
158 <property name="fill">True</property>
159 <property name="position">1</property>
160 </packing>
161 </child>
162 </object>
163 </child>
164 </object>
165</interface>

Subscribers

People subscribed via source and target branches

to all changes: