ishcherb / rpms / abrt

Forked from rpms/abrt 6 years ago
Clone
34c7e2d
From b89e812251efdbbc83ed84932c7dc0d0852d153c Mon Sep 17 00:00:00 2001
34c7e2d
From: Matej Habrnal <mhabrnal@redhat.com>
34c7e2d
Date: Mon, 8 Jun 2015 10:31:07 +0200
34c7e2d
Subject: [PATCH] configui: add option always generate backtrace locally
34c7e2d
34c7e2d
The option 'Ask before uploading coredump' is replaced by 'Upload coredump for
34c7e2d
backtrace generation'. The new config option allows the user to choose the option always
34c7e2d
generate the backtrace locally ('Never').
34c7e2d
34c7e2d
Related to rhbz#986876
34c7e2d
Related to abrt/gnome-abrt#131
34c7e2d
34c7e2d
Signed-off-by: Matej Habrnal <mhabrnal@redhat.com>
34c7e2d
Signed-off-by: Jakub Filak <jfilak@redhat.com>
34c7e2d
---
34c7e2d
 src/configuration-gui/abrt-config-widget.c     | 152 ++++++++++++++++++++++---
34c7e2d
 src/configuration-gui/abrt-config-widget.glade | 119 +++++++++++++------
34c7e2d
 2 files changed, 219 insertions(+), 52 deletions(-)
34c7e2d
34c7e2d
diff --git a/src/configuration-gui/abrt-config-widget.c b/src/configuration-gui/abrt-config-widget.c
34c7e2d
index 664180d..7d2430b 100644
34c7e2d
--- a/src/configuration-gui/abrt-config-widget.c
34c7e2d
+++ b/src/configuration-gui/abrt-config-widget.c
34c7e2d
@@ -38,10 +38,11 @@ typedef struct {
34c7e2d
 } AbrtAppConfiguration;
34c7e2d
 
34c7e2d
 typedef struct {
34c7e2d
-    const char *name;
34c7e2d
-    GtkSwitch *widget;
34c7e2d
-    gboolean default_value;
34c7e2d
-    gboolean current_value;
34c7e2d
+    const char *name;           ///< e.g. ask_steal_dir, report-technical-problems
34c7e2d
+    GtkSwitch *switch_widget;
34c7e2d
+    GtkWidget *radio_button_widget[3];
34c7e2d
+    int default_value;
34c7e2d
+    int current_value;
34c7e2d
     AbrtAppConfiguration *config;
34c7e2d
 } AbrtConfigWidgetOption;
34c7e2d
 
34c7e2d
@@ -49,17 +50,34 @@ enum AbrtOptions
34c7e2d
 {
34c7e2d
     _ABRT_OPT_BEGIN_,
34c7e2d
 
34c7e2d
-    ABRT_OPT_UPLOAD_COREDUMP = _ABRT_OPT_BEGIN_,
34c7e2d
-    ABRT_OPT_STEAL_DIRECTORY,
34c7e2d
+    _ABRT_OPT_SWITCH_BEGIN_= _ABRT_OPT_BEGIN_,
34c7e2d
+
34c7e2d
+    ABRT_OPT_STEAL_DIRECTORY= _ABRT_OPT_BEGIN_,
34c7e2d
     ABRT_OPT_PRIVATE_TICKET,
34c7e2d
     ABRT_OPT_SEND_UREPORT,
34c7e2d
     ABRT_OPT_SHORTENED_REPORTING,
34c7e2d
     ABRT_OPT_SILENT_SHORTENED_REPORTING,
34c7e2d
     ABRT_OPT_NOTIFY_INCOMPLETE_PROBLEMS,
34c7e2d
 
34c7e2d
+    _ABRT_OPT_SWITCH_END_,
34c7e2d
+
34c7e2d
+    _ABRT_RADIOBUTTON_OPT_BEGIN_= _ABRT_OPT_SWITCH_END_,
34c7e2d
+
34c7e2d
+    ABRT_OPT_UPLOAD_COREDUMP= _ABRT_OPT_SWITCH_END_,
34c7e2d
+
34c7e2d
     _ABRT_OPT_END_,
34c7e2d
 };
34c7e2d
 
34c7e2d
+enum AbrtRadioButtonOptions
34c7e2d
+{
34c7e2d
+    _ABRT_RADIOBUTTON_OPT_ = -1,
34c7e2d
+    ABRT_RADIOBUTTON_OPT_NEVER = 0,
34c7e2d
+    ABRT_RADIOBUTTON_OPT_ALWAYS = 1,
34c7e2d
+    ABRT_RADIOBUTTON_OPT_ASK = 2,
34c7e2d
+};
34c7e2d
+
34c7e2d
+/* This structure holds private data of AbrtConfigWidget
34c7e2d
+ */
34c7e2d
 struct AbrtConfigWidgetPrivate {
34c7e2d
     GtkBuilder   *builder;
34c7e2d
     AbrtAppConfiguration *report_gtk_conf;
34c7e2d
@@ -103,7 +121,13 @@ abrt_app_configuration_set_value(AbrtAppConfiguration *conf, const char *name, c
34c7e2d
 static const char *
34c7e2d
 abrt_app_configuration_get_value(AbrtAppConfiguration *conf, const char *name)
34c7e2d
 {
34c7e2d
-    return get_app_user_setting(conf->settings, name);
34c7e2d
+    if (conf->settings)
34c7e2d
+    {
34c7e2d
+        const char *val = get_app_user_setting(conf->settings, name);
34c7e2d
+        return (val == NULL || strcmp(val, "") == 0) ? NULL : val;
34c7e2d
+    }
34c7e2d
+
34c7e2d
+    assert(!"BUG: not properly initialized AbrtAppConfiguration");
34c7e2d
 }
34c7e2d
 
34c7e2d
 static void
34c7e2d
@@ -186,9 +210,30 @@ on_switch_activate(GObject       *object,
34c7e2d
 }
34c7e2d
 
34c7e2d
 static void
34c7e2d
-update_option_current_value(AbrtConfigWidget *self, enum AbrtOptions opid)
34c7e2d
+on_radio_button_toggle(GObject       *object,
34c7e2d
+        AbrtConfigWidget *config)
34c7e2d
 {
34c7e2d
-    assert((opid >= _ABRT_OPT_BEGIN_ && opid < _ABRT_OPT_END_) || !"Out of range Option ID value");
34c7e2d
+    /* inactive radio button */
34c7e2d
+    if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(object)) == false)
34c7e2d
+        return;
34c7e2d
+
34c7e2d
+    AbrtConfigWidgetOption *option = g_object_get_data(G_OBJECT(object), "abrt-option");
34c7e2d
+    if (option->config == NULL)
34c7e2d
+        return;
34c7e2d
+
34c7e2d
+    /* get active radio button */
34c7e2d
+    const char *val = g_object_get_data(G_OBJECT(object), "abrt-triple-switch-value");
34c7e2d
+    log_debug("%s : %s", option->name, val);
34c7e2d
+
34c7e2d
+    abrt_app_configuration_set_value(option->config, option->name, val);
34c7e2d
+    abrt_app_configuration_save(option->config);
34c7e2d
+    emit_change(config);
34c7e2d
+}
34c7e2d
+
34c7e2d
+static void
34c7e2d
+update_option_switch_current_value(AbrtConfigWidget *self, enum AbrtOptions opid)
34c7e2d
+{
34c7e2d
+    assert((opid >= _ABRT_OPT_SWITCH_BEGIN_ && opid < _ABRT_OPT_SWITCH_END_) || !"Out of range Option ID value");
34c7e2d
 
34c7e2d
     AbrtConfigWidgetOption *option = &(self->priv->options[opid]);
34c7e2d
     const char *val = abrt_app_configuration_get_value(option->config, option->name);
34c7e2d
@@ -196,19 +241,80 @@ update_option_current_value(AbrtConfigWidget *self, enum AbrtOptions opid)
34c7e2d
 }
34c7e2d
 
34c7e2d
 static void
34c7e2d
+update_option_radio_button_current_value(AbrtConfigWidget *self, enum AbrtOptions opid)
34c7e2d
+{
34c7e2d
+    assert((opid >= _ABRT_RADIOBUTTON_OPT_BEGIN_ && opid < _ABRT_OPT_END_) || !"Out of range Option ID value");
34c7e2d
+
34c7e2d
+    AbrtConfigWidgetOption *option = &(self->priv->options[opid]);
34c7e2d
+
34c7e2d
+    const char *val = NULL;
34c7e2d
+    if (option->config != NULL)
34c7e2d
+        val = abrt_app_configuration_get_value(option->config, option->name);
34c7e2d
+
34c7e2d
+    if (val == NULL)
34c7e2d
+        option->current_value = option->default_value;
34c7e2d
+    else if (string_to_bool(val))
34c7e2d
+        option->current_value = ABRT_RADIOBUTTON_OPT_ALWAYS;
34c7e2d
+    else
34c7e2d
+        option->current_value = ABRT_RADIOBUTTON_OPT_NEVER;
34c7e2d
+}
34c7e2d
+
34c7e2d
+static void
34c7e2d
 connect_switch_with_option(AbrtConfigWidget *self, enum AbrtOptions opid, const char *switch_name)
34c7e2d
 {
34c7e2d
-    assert((opid >= _ABRT_OPT_BEGIN_ && opid < _ABRT_OPT_END_) || !"Out of range Option ID value");
34c7e2d
+    assert((opid >= _ABRT_OPT_SWITCH_BEGIN_ && opid < _ABRT_OPT_SWITCH_END_) || !"Out of range Option ID value");
34c7e2d
 
34c7e2d
     AbrtConfigWidgetOption *option = &(self->priv->options[opid]);
34c7e2d
-    update_option_current_value(self, opid);
34c7e2d
+    update_option_switch_current_value(self, opid);
34c7e2d
 
34c7e2d
     GtkSwitch *gsw = GTK_SWITCH(WID(switch_name));
34c7e2d
-    option->widget = gsw;
34c7e2d
-    gtk_switch_set_active(gsw, option->current_value);
34c7e2d
+    option->switch_widget = gsw;
34c7e2d
+    gtk_switch_set_active(gsw, (gboolean)option->current_value);
34c7e2d
+
34c7e2d
     g_object_set_data(G_OBJECT(gsw), "abrt-option", option);
34c7e2d
     g_signal_connect(G_OBJECT(gsw), "notify::active",
34c7e2d
             G_CALLBACK(on_switch_activate), self);
34c7e2d
+
34c7e2d
+    /* If the option has no config, make the corresponding insensitive. */
34c7e2d
+    gtk_widget_set_sensitive(GTK_WIDGET(gsw), option->config != NULL);
34c7e2d
+}
34c7e2d
+
34c7e2d
+static void
34c7e2d
+connect_radio_buttons_with_option(AbrtConfigWidget *self, enum AbrtOptions opid,
34c7e2d
+                 const char *btn_always_name, const char *btn_never_name,
34c7e2d
+                 const char *btn_ask_name)
34c7e2d
+{
34c7e2d
+    assert((opid >= _ABRT_RADIOBUTTON_OPT_BEGIN_ && opid < _ABRT_OPT_END_) || !"Out of range Option ID value");
34c7e2d
+
34c7e2d
+    AbrtConfigWidgetOption *option = &(self->priv->options[opid]);
34c7e2d
+    update_option_radio_button_current_value(self, opid);
34c7e2d
+
34c7e2d
+    GtkWidget *btn_always = WID(btn_always_name);
34c7e2d
+    GtkWidget *btn_never = WID(btn_never_name);
34c7e2d
+    GtkWidget *btn_ask = WID(btn_ask_name);
34c7e2d
+
34c7e2d
+    option->radio_button_widget[ABRT_RADIOBUTTON_OPT_ALWAYS] = btn_always;
34c7e2d
+    option->radio_button_widget[ABRT_RADIOBUTTON_OPT_NEVER] = btn_never;
34c7e2d
+    option->radio_button_widget[ABRT_RADIOBUTTON_OPT_ASK] = btn_ask;
34c7e2d
+
34c7e2d
+    GtkWidget *active_button = option->radio_button_widget[option->current_value];
34c7e2d
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(active_button), TRUE);
34c7e2d
+
34c7e2d
+    g_object_set_data(G_OBJECT(btn_always), "abrt-option", option);
34c7e2d
+    g_object_set_data(G_OBJECT(btn_always), "abrt-triple-switch-value", (char *)"yes");
34c7e2d
+    g_object_set_data(G_OBJECT(btn_never), "abrt-option", option);
34c7e2d
+    g_object_set_data(G_OBJECT(btn_never), "abrt-triple-switch-value", (char *)"no");
34c7e2d
+    g_object_set_data(G_OBJECT(btn_ask), "abrt-option", option);
34c7e2d
+    g_object_set_data(G_OBJECT(btn_ask), "abrt-triple-switch-value", NULL);
34c7e2d
+
34c7e2d
+    g_signal_connect(btn_always, "toggled", G_CALLBACK(on_radio_button_toggle), self);
34c7e2d
+    g_signal_connect(btn_never, "toggled", G_CALLBACK(on_radio_button_toggle), self);
34c7e2d
+    g_signal_connect(btn_ask, "toggled", G_CALLBACK(on_radio_button_toggle), self);
34c7e2d
+
34c7e2d
+    /* If the option has no config, make the corresponding insensitive. */
34c7e2d
+    gtk_widget_set_sensitive(GTK_WIDGET(btn_always), option->config != NULL);
34c7e2d
+    gtk_widget_set_sensitive(GTK_WIDGET(btn_never), option->config != NULL);
34c7e2d
+    gtk_widget_set_sensitive(GTK_WIDGET(btn_ask), option->config != NULL);
34c7e2d
 }
34c7e2d
 
34c7e2d
 static void
34c7e2d
@@ -246,8 +352,8 @@ abrt_config_widget_init(AbrtConfigWidget *self)
34c7e2d
     self->priv->options[ABRT_OPT_STEAL_DIRECTORY].default_value = TRUE;
34c7e2d
     self->priv->options[ABRT_OPT_STEAL_DIRECTORY].config = self->priv->report_gtk_conf;
34c7e2d
 
34c7e2d
-    self->priv->options[ABRT_OPT_UPLOAD_COREDUMP].name = "abrt_analyze_smart_ask_upload_coredump";
34c7e2d
-    self->priv->options[ABRT_OPT_UPLOAD_COREDUMP].default_value = TRUE;
34c7e2d
+    self->priv->options[ABRT_OPT_UPLOAD_COREDUMP].name = "abrt_analyze_upload_coredump";
34c7e2d
+    self->priv->options[ABRT_OPT_UPLOAD_COREDUMP].default_value = ABRT_RADIOBUTTON_OPT_ASK;
34c7e2d
     self->priv->options[ABRT_OPT_UPLOAD_COREDUMP].config = self->priv->report_gtk_conf;
34c7e2d
 
34c7e2d
     self->priv->options[ABRT_OPT_PRIVATE_TICKET].name = CREATE_PRIVATE_TICKET;
34c7e2d
@@ -271,8 +377,11 @@ abrt_config_widget_init(AbrtConfigWidget *self)
34c7e2d
     self->priv->options[ABRT_OPT_NOTIFY_INCOMPLETE_PROBLEMS].default_value = FALSE;
34c7e2d
     self->priv->options[ABRT_OPT_NOTIFY_INCOMPLETE_PROBLEMS].config = self->priv->abrt_applet_conf;
34c7e2d
 
34c7e2d
+    /* Connect radio buttons with options */
34c7e2d
+    connect_radio_buttons_with_option(self, ABRT_OPT_UPLOAD_COREDUMP,
34c7e2d
+                                        "bg_always", "bg_never", "bg_ask" );
34c7e2d
+
34c7e2d
     /* Connect widgets with options */
34c7e2d
-    connect_switch_with_option(self, ABRT_OPT_UPLOAD_COREDUMP, "switch_upload_coredump");
34c7e2d
     connect_switch_with_option(self, ABRT_OPT_STEAL_DIRECTORY, "switch_steal_directory");
34c7e2d
     connect_switch_with_option(self, ABRT_OPT_PRIVATE_TICKET, "switch_private_ticket");
34c7e2d
     connect_switch_with_option(self, ABRT_OPT_SEND_UREPORT, "switch_send_ureport");
34c7e2d
@@ -302,6 +411,13 @@ abrt_config_widget_new()
34c7e2d
 void
34c7e2d
 abrt_config_widget_reset_to_defaults(AbrtConfigWidget *self)
34c7e2d
 {
34c7e2d
-    for(unsigned i = _ABRT_OPT_BEGIN_; i < _ABRT_OPT_END_; ++i)
34c7e2d
-        gtk_switch_set_active(self->priv->options[i].widget, self->priv->options[i].default_value);
34c7e2d
+    for(unsigned i = _ABRT_OPT_SWITCH_BEGIN_; i < _ABRT_OPT_SWITCH_END_; ++i)
34c7e2d
+        gtk_switch_set_active(self->priv->options[i].switch_widget, self->priv->options[i].default_value);
34c7e2d
+
34c7e2d
+    for(unsigned i = _ABRT_RADIOBUTTON_OPT_BEGIN_; i < _ABRT_OPT_END_; ++i)
34c7e2d
+    {
34c7e2d
+        unsigned default_value = self->priv->options[i].default_value;
34c7e2d
+        GtkWidget *radio_button = self->priv->options[i].radio_button_widget[default_value];
34c7e2d
+        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_button), TRUE);
34c7e2d
+    }
34c7e2d
 }
34c7e2d
diff --git a/src/configuration-gui/abrt-config-widget.glade b/src/configuration-gui/abrt-config-widget.glade
34c7e2d
index 3aa566c..30737ff 100644
34c7e2d
--- a/src/configuration-gui/abrt-config-widget.glade
34c7e2d
+++ b/src/configuration-gui/abrt-config-widget.glade
34c7e2d
@@ -49,21 +49,6 @@
34c7e2d
           </packing>
34c7e2d
         </child>
34c7e2d
         <child>
34c7e2d
-          <object class="GtkSwitch" id="switch_upload_coredump">
34c7e2d
-            <property name="visible">True</property>
34c7e2d
-            <property name="can_focus">True</property>
34c7e2d
-            <property name="halign">end</property>
34c7e2d
-            <property name="valign">center</property>
34c7e2d
-            <property name="margin_left">10</property>
34c7e2d
-          </object>
34c7e2d
-          <packing>
34c7e2d
-            <property name="left_attach">1</property>
34c7e2d
-            <property name="top_attach">0</property>
34c7e2d
-            <property name="width">1</property>
34c7e2d
-            <property name="height">1</property>
34c7e2d
-          </packing>
34c7e2d
-        </child>
34c7e2d
-        <child>
34c7e2d
           <object class="GtkSwitch" id="switch_steal_directory">
34c7e2d
             <property name="visible">True</property>
34c7e2d
             <property name="can_focus">True</property>
34c7e2d
@@ -163,7 +148,7 @@
34c7e2d
           <object class="GtkImage" id="image1">
34c7e2d
             <property name="visible">True</property>
34c7e2d
             <property name="can_focus">False</property>
34c7e2d
-            <property name="tooltip_text" translatable="yes">The coredump file is necessary for generating stack trace which is time and space consuming operation. ABRT provides a service which generates the stack trace from the coredump but you have to upload the coredump to this service. With this option disabled ABRT will upload the coredump without asking.</property>
34c7e2d
+            <property name="tooltip_text" translatable="yes">The coredump file is necessary for generating stack trace which is time and space consuming operation. ABRT provides a service which generates the stack trace from the coredump but you have to upload the coredump to this service. With option 'Always' ABRT will always upload the coredump without asking. With option 'Never' the stack trace will be always generated locally. With option 'Ask' ABRT will always ask the user.</property>
34c7e2d
             <property name="halign">end</property>
34c7e2d
             <property name="margin_left">5</property>
34c7e2d
             <property name="margin_right">1</property>
34c7e2d
@@ -241,24 +226,6 @@
34c7e2d
           </packing>
34c7e2d
         </child>
34c7e2d
         <child>
34c7e2d
-          <object class="GtkLabel" id="label1">
34c7e2d
-            <property name="visible">True</property>
34c7e2d
-            <property name="can_focus">False</property>
34c7e2d
-            <property name="halign">start</property>
34c7e2d
-            <property name="hexpand">True</property>
34c7e2d
-            <property name="ypad">10</property>
34c7e2d
-            <property name="label" translatable="yes">Ask before uploading coredump</property>
34c7e2d
-            <signal name="enter-notify-event" handler="label_enter_notify_event_cb" swapped="no"/>
34c7e2d
-            <signal name="leave-notify-event" handler="label_leave_notify_event_cb" swapped="no"/>
34c7e2d
-          </object>
34c7e2d
-          <packing>
34c7e2d
-            <property name="left_attach">0</property>
34c7e2d
-            <property name="top_attach">0</property>
34c7e2d
-            <property name="width">1</property>
34c7e2d
-            <property name="height">1</property>
34c7e2d
-          </packing>
34c7e2d
-        </child>
34c7e2d
-        <child>
34c7e2d
           <object class="GtkImage" id="image6">
34c7e2d
             <property name="visible">True</property>
34c7e2d
             <property name="can_focus">False</property>
34c7e2d
@@ -352,6 +319,90 @@
34c7e2d
             <property name="height">1</property>
34c7e2d
           </packing>
34c7e2d
         </child>
34c7e2d
+        <child>
34c7e2d
+          <object class="GtkButtonBox" id="bg_button_box">
34c7e2d
+            <property name="visible">True</property>
34c7e2d
+            <property name="can_focus">False</property>
34c7e2d
+            <property name="halign">end</property>
34c7e2d
+            <property name="valign">center</property>
34c7e2d
+            <property name="hexpand">False</property>
34c7e2d
+            <property name="vexpand">False</property>
34c7e2d
+            <property name="resize_mode">immediate</property>
34c7e2d
+            <property name="layout_style">expand</property>
34c7e2d
+            <child>
34c7e2d
+              <object class="GtkRadioButton" id="bg_always">
34c7e2d
+                <property name="label" translatable="yes">Always</property>
34c7e2d
+                <property name="visible">True</property>
34c7e2d
+                <property name="can_focus">True</property>
34c7e2d
+                <property name="receives_default">False</property>
34c7e2d
+                <property name="xalign">0</property>
34c7e2d
+                <property name="active">True</property>
34c7e2d
+                <property name="draw_indicator">False</property>
34c7e2d
+                <property name="group">bg_ask</property>
34c7e2d
+              </object>
34c7e2d
+              <packing>
34c7e2d
+                <property name="expand">True</property>
34c7e2d
+                <property name="fill">True</property>
34c7e2d
+                <property name="position">2</property>
34c7e2d
+                <property name="non_homogeneous">True</property>
34c7e2d
+              </packing>
34c7e2d
+            </child>
34c7e2d
+            <child>
34c7e2d
+              <object class="GtkRadioButton" id="bg_never">
34c7e2d
+                <property name="label" translatable="yes">Never</property>
34c7e2d
+                <property name="visible">True</property>
34c7e2d
+                <property name="can_focus">True</property>
34c7e2d
+                <property name="receives_default">False</property>
34c7e2d
+                <property name="xalign">0</property>
34c7e2d
+                <property name="active">True</property>
34c7e2d
+                <property name="draw_indicator">False</property>
34c7e2d
+                <property name="group">bg_ask</property>
34c7e2d
+              </object>
34c7e2d
+              <packing>
34c7e2d
+                <property name="expand">True</property>
34c7e2d
+                <property name="fill">True</property>
34c7e2d
+                <property name="position">2</property>
34c7e2d
+              </packing>
34c7e2d
+            </child>
34c7e2d
+            <child>
34c7e2d
+              <object class="GtkRadioButton" id="bg_ask">
34c7e2d
+                <property name="label" translatable="yes">Ask</property>
34c7e2d
+                <property name="visible">True</property>
34c7e2d
+                <property name="can_focus">True</property>
34c7e2d
+                <property name="receives_default">False</property>
34c7e2d
+                <property name="xalign">0</property>
34c7e2d
+                <property name="active">True</property>
34c7e2d
+                <property name="draw_indicator">False</property>
34c7e2d
+              </object>
34c7e2d
+              <packing>
34c7e2d
+                <property name="expand">False</property>
34c7e2d
+                <property name="fill">True</property>
34c7e2d
+                <property name="position">2</property>
34c7e2d
+              </packing>
34c7e2d
+            </child>
34c7e2d
+          </object>
34c7e2d
+          <packing>
34c7e2d
+            <property name="left_attach">1</property>
34c7e2d
+            <property name="top_attach">0</property>
34c7e2d
+          </packing>
34c7e2d
+        </child>
34c7e2d
+        <child>
34c7e2d
+          <object class="GtkLabel" id="label1">
34c7e2d
+            <property name="visible">True</property>
34c7e2d
+            <property name="can_focus">False</property>
34c7e2d
+            <property name="halign">start</property>
34c7e2d
+            <property name="hexpand">True</property>
34c7e2d
+            <property name="ypad">10</property>
34c7e2d
+            <property name="label" translatable="yes">Upload coredump for backtrace generation</property>
34c7e2d
+          </object>
34c7e2d
+          <packing>
34c7e2d
+            <property name="left_attach">0</property>
34c7e2d
+            <property name="top_attach">0</property>
34c7e2d
+          </packing>
34c7e2d
+        </child>
34c7e2d
+        <child>
34c7e2d
+          <placeholder/>
34c7e2d
+        </child>
34c7e2d
       </object>
34c7e2d
     </child>
34c7e2d
   </object>
34c7e2d
-- 
34c7e2d
2.1.0
34c7e2d