summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJiri Moskovcak <jmoskovc@redhat.com>2010-01-19 16:02:40 +0100
committerJiri Moskovcak <jmoskovc@redhat.com>2010-01-19 16:02:40 +0100
commitf750288769b23497ad5b57b1c50f683402c509f6 (patch)
treeb71f2a2c6ed6b5a1f5353c58780b09ef55f2c383 /src
parentb8ef905c6455ef98cd7fa488de7d602a70bd57dc (diff)
parentb7e20eb84250ce9feeefde8dad2eab448125dc5d (diff)
Merge branch 'master' into rhel6
Diffstat (limited to 'src')
-rw-r--r--src/Applet/Applet.cpp1
-rwxr-xr-xsrc/Backtrace/abrt-bz-downloader5
-rwxr-xr-xsrc/Backtrace/abrt-bz-dupchecker10
-rw-r--r--src/CLI/CLI.cpp2
-rw-r--r--src/Daemon/CommLayerServerDBus.cpp9
-rw-r--r--src/Daemon/Daemon.cpp1
-rw-r--r--src/Daemon/MiddleWare.cpp4
-rw-r--r--src/Gui/CCDump.py34
-rw-r--r--src/Gui/CCDumpList.py5
-rw-r--r--src/Gui/CCMainWindow.py7
-rw-r--r--src/Gui/CCReport.py30
-rw-r--r--src/Gui/CCReporterDialog.py228
-rw-r--r--src/Gui/CC_gui_functions.py2
-rw-r--r--src/Gui/Makefile.am2
-rw-r--r--src/Gui/abrt_utils.py2
-rw-r--r--src/Gui/dialogs.glade1
-rw-r--r--src/Gui/report.glade648
17 files changed, 663 insertions, 328 deletions
diff --git a/src/Applet/Applet.cpp b/src/Applet/Applet.cpp
index eea3ef7..550e1aa 100644
--- a/src/Applet/Applet.cpp
+++ b/src/Applet/Applet.cpp
@@ -20,7 +20,6 @@
#include <dbus/dbus-shared.h>
#include <dbus/dbus-glib.h>
#include <dbus/dbus-glib-lowlevel.h>
-#include <limits.h>
#if HAVE_CONFIG_H
#include <config.h>
#endif
diff --git a/src/Backtrace/abrt-bz-downloader b/src/Backtrace/abrt-bz-downloader
index 81084e7..7f29425 100755
--- a/src/Backtrace/abrt-bz-downloader
+++ b/src/Backtrace/abrt-bz-downloader
@@ -1,5 +1,10 @@
#!/usr/bin/python
# -*- mode:python -*-
+# ABRT Bugzilla Backtrace Downloader
+# Downloads all backtraces reported by ABRT from Bugzilla.
+#
+# Please do not run this script unless it's neccessary to do so.
+# It forces Bugzilla to send data related to thousands of bug reports.
from bugzilla import RHBugzilla
from optparse import OptionParser
diff --git a/src/Backtrace/abrt-bz-dupchecker b/src/Backtrace/abrt-bz-dupchecker
index f9caeed..01cafa0 100755
--- a/src/Backtrace/abrt-bz-dupchecker
+++ b/src/Backtrace/abrt-bz-dupchecker
@@ -1,5 +1,15 @@
#!/usr/bin/python
# -*- mode:python -*-
+# ABRT Bugzilla Duplication Checker
+# Downloads all backtraces reported by ABRT from Bugzilla,
+# and search for duplicates using the newest ABRT duplication
+# checker.
+#
+# Some bugs in Bugzilla were reported by older ABRT
+# versions, which had poor duplication detection.
+#
+# Please do not run this script unless it's neccessary to do so.
+# It forces Bugzilla to send data related to thousands of bug reports.
from bugzilla import RHBugzilla
from optparse import OptionParser
diff --git a/src/CLI/CLI.cpp b/src/CLI/CLI.cpp
index 1ea3a5d..bc8ddf6 100644
--- a/src/CLI/CLI.cpp
+++ b/src/CLI/CLI.cpp
@@ -53,7 +53,7 @@ static void print_crash_infos(vector_crash_infos_t& pCrashInfos, int pMode)
for (ii = 0; ii < pCrashInfos.size(); ii++)
{
map_crash_info_t& info = pCrashInfos[ii];
- if (pMode == OPT_GET_LIST_FULL || info.find(CD_REPORTED)->second[CD_CONTENT] != "1")
+ if (pMode == OPT_GET_LIST_FULL || info[CD_REPORTED][CD_CONTENT] != "1")
{
const char *timestr = info[CD_TIME][CD_CONTENT].c_str();
long time = strtol(timestr, NULL, 10);
diff --git a/src/Daemon/CommLayerServerDBus.cpp b/src/Daemon/CommLayerServerDBus.cpp
index db0d2f5..182aa6c 100644
--- a/src/Daemon/CommLayerServerDBus.cpp
+++ b/src/Daemon/CommLayerServerDBus.cpp
@@ -205,10 +205,8 @@ static int handle_Report(DBusMessage* call, DBusMessage* reply)
int r;
DBusMessageIter in_iter;
dbus_message_iter_init(call, &in_iter);
- map_crash_report_t argin1;
- const char* comment;
- const char* reproduce;
+ map_crash_report_t argin1;
r = load_val(&in_iter, argin1);
if (r == ABRT_DBUS_ERROR)
{
@@ -218,9 +216,8 @@ static int handle_Report(DBusMessage* call, DBusMessage* reply)
map_crash_report_t::const_iterator it_comment = argin1.find(CD_COMMENT);
map_crash_report_t::const_iterator it_reproduce = argin1.find(CD_REPRODUCE);
- comment = (it_comment != argin1.end()) ? it_comment->second[CD_CONTENT].c_str() : "";
- reproduce = (it_reproduce != argin1.end()) ? it_reproduce->second[CD_CONTENT].c_str() : "";
-
+ const char* comment = (it_comment != argin1.end()) ? it_comment->second[CD_CONTENT].c_str() : "";
+ const char* reproduce = (it_reproduce != argin1.end()) ? it_reproduce->second[CD_CONTENT].c_str() : "";
const char* errmsg = NULL;
if (strlen(comment) > LIMIT_MESSAGE)
{
diff --git a/src/Daemon/Daemon.cpp b/src/Daemon/Daemon.cpp
index a2970af..dc547af 100644
--- a/src/Daemon/Daemon.cpp
+++ b/src/Daemon/Daemon.cpp
@@ -21,7 +21,6 @@
#include <pthread.h>
#include <resolv.h> /* res_init */
#include <string>
-#include <limits.h>
#include <sys/inotify.h>
#include <xmlrpc-c/base.h>
#include <xmlrpc-c/client.h>
diff --git a/src/Daemon/MiddleWare.cpp b/src/Daemon/MiddleWare.cpp
index 70527eb..c2a122a 100644
--- a/src/Daemon/MiddleWare.cpp
+++ b/src/Daemon/MiddleWare.cpp
@@ -187,7 +187,7 @@ static void DebugDumpToCrashReport(const char *pDebugDumpDir, map_crash_report_t
add_crash_data_to_crash_report(
pCrashReport,
short_name,
- (content.length() < CD_ATT_SIZE ? CD_TXT : CD_ATT),
+ CD_TXT,
CD_ISEDITABLE,
content
);
@@ -433,6 +433,8 @@ report_status_t Report(const map_crash_report_t& pCrashReport,
{
report_status_t ret;
+ /* dbus handler passes pCrashReport from user without checking it */
+
if (!CheckReport(pCrashReport))
{
throw CABRTException(EXCEP_ERROR, "Report(): Some of mandatory report data are missing.");
diff --git a/src/Gui/CCDump.py b/src/Gui/CCDump.py
index 212d441..96d036c 100644
--- a/src/Gui/CCDump.py
+++ b/src/Gui/CCDump.py
@@ -1,9 +1,11 @@
# -*- coding: utf-8 -*-
from datetime import datetime
-TYPE = 0
-EDITABLE = 1
-CONTENT = 2
+from abrt_utils import _, init_logging, log, log1, log2
+
+CD_TYPE = 0
+CD_EDITABLE = 1
+CD_CONTENT = 2
class Dump():
"""Class for mapping the debug dump to python object"""
@@ -19,40 +21,40 @@ class Dump():
self.Reported = None
def getUUID(self):
- return self.UUID[CONTENT]
+ return self.UUID[CD_CONTENT]
def getUID(self):
- return self.UID[CONTENT]
+ return self.UID[CD_CONTENT]
def getCount(self):
- return self.Count[CONTENT]
+ return self.Count[CD_CONTENT]
def getExecutable(self):
- return self.Executable[CONTENT]
+ return self.Executable[CD_CONTENT]
def getPackage(self):
- return self.Package[CONTENT]
+ return self.Package[CD_CONTENT]
def isReported(self):
- return self.Reported[CONTENT] == "1"
+ return self.Reported[CD_CONTENT] == "1"
def getMessage(self):
if not self.Message:
- return []
- #return self.Message[CONTENT].split('\n')
- return self.Message[CONTENT]
+ return "" #[]
+ #return self.Message[CD_CONTENT].split('\n')
+ return self.Message[CD_CONTENT]
def getTime(self,format):
#print format
if format:
try:
- return datetime.fromtimestamp(int(self.Time[CONTENT])).strftime(format)
+ return datetime.fromtimestamp(int(self.Time[CD_CONTENT])).strftime(format)
except Exception, e:
print e
- return int(self.Time[CONTENT])
+ return int(self.Time[CD_CONTENT])
def getPackageName(self):
- return self.Package[CONTENT][:self.Package[CONTENT].find("-")]
+ return self.Package[CD_CONTENT][:self.Package[CD_CONTENT].find("-")]
def getDescription(self):
- return self.Description[CONTENT]
+ return self.Description[CD_CONTENT]
diff --git a/src/Gui/CCDumpList.py b/src/Gui/CCDumpList.py
index a8657e0..9888b10 100644
--- a/src/Gui/CCDumpList.py
+++ b/src/Gui/CCDumpList.py
@@ -2,6 +2,8 @@
import CCDBusBackend
from CCDump import Dump
+from abrt_utils import _, init_logging, log, log1, log2
+
class DumpList(list):
"""Class to store list of debug dumps"""
def __init__(self,dbus_manager=None):
@@ -16,8 +18,7 @@ class DumpList(list):
for row in rows:
entry = Dump()
for column in row:
- #if column == "Reported":
- # print "DumpList adding %s:%s" % (column,row[column])
+ log2(" DumpList.%s='%s'", column, row[column])
entry.__dict__[column] = row[column]
self.append(entry)
except Exception, e:
diff --git a/src/Gui/CCMainWindow.py b/src/Gui/CCMainWindow.py
index dcb71ae..a8101d4 100644
--- a/src/Gui/CCMainWindow.py
+++ b/src/Gui/CCMainWindow.py
@@ -3,9 +3,12 @@ import sys
import os
import pwd
import getopt
+
+from abrt_utils import _, init_logging, log, log1, log2
+import gobject
+gobject.set_prgname(_("Automatic Bug Reporting Tool"))
import pygtk
pygtk.require("2.0")
-import gobject
try:
import gtk
except RuntimeError,e:
@@ -25,10 +28,8 @@ from CCDumpList import getDumpList, DumpList
from CCReporterDialog import ReporterDialog
from PluginsSettingsDialog import PluginsSettingsDialog
from SettingsDialog import SettingsDialog
-from CCReport import Report
from PluginList import getPluginInfoList
import ABRTExceptions
-from abrt_utils import _, init_logging, log, log1, log2
class MainWindow():
diff --git a/src/Gui/CCReport.py b/src/Gui/CCReport.py
deleted file mode 100644
index 90c8a3b..0000000
--- a/src/Gui/CCReport.py
+++ /dev/null
@@ -1,30 +0,0 @@
-# -*- coding: utf-8 -*-
-
-class Report():
- """Class for mapping the report to pyhon object"""
- def __init__(self, report):
- self.UUID = None
- self.Architecture = None
- self.Kernel = None
- self.Release = None
- self.Executable = None
- self.CmdLine = None
- self.Package = None
- self.TextData1 = None
- self.TextData2 = None
- self.BinaryData1 = None
- self.BinaryData2 = None
- for item in report:
- self.__dict__[item] = report[item]
-
- def getUUID(self):
- return self.UUID
-
- def getArchitecture(self):
- return self.Architecture
-
- def getExecutable(self):
- return self.Executable
-
- def getPackage(self):
- return self.Package
diff --git a/src/Gui/CCReporterDialog.py b/src/Gui/CCReporterDialog.py
index ab6ad0f..2cba607 100644
--- a/src/Gui/CCReporterDialog.py
+++ b/src/Gui/CCReporterDialog.py
@@ -6,7 +6,6 @@ import gtk.glade
import pango
import sys
from CC_gui_functions import *
-from CCReport import Report
import CellRenderers
from ABRTPlugin import PluginInfo
from PluginSettingsUI import PluginSettingsUI
@@ -22,7 +21,6 @@ CD_CONTENT = 2
CD_SYS = "s"
CD_BIN = "b"
CD_TXT = "t"
-CD_ATT = "a"
# response
REFRESH = -50
@@ -36,10 +34,11 @@ class ReporterDialog():
self.report = report
#Set the Glade file
# FIXME add to path
- self.gladefile = "%s%sreport.glade" % (sys.path[0],"/")
- self.wTree = gtk.glade.XML(self.gladefile)
+ builderfile = "%s%sreport.glade" % (sys.path[0],"/")
+ self.builder = gtk.Builder()
+ self.builder.add_from_file(builderfile)
#Get the Main Window, and connect the "destroy" event
- self.window = self.wTree.get_widget("reporter_dialog")
+ self.window = self.builder.get_object("reporter_dialog")
self.window.set_default_size(640, 480)
self.window.connect("response", self.on_response, daemon)
if parent:
@@ -47,60 +46,89 @@ class ReporterDialog():
self.window.set_modal(True)
# comment textview
- self.tvComment = self.wTree.get_widget("tvComment")
+ self.tvComment = self.builder.get_object("tvComment")
self.tvComment.connect("focus-in-event", self.on_comment_focus_cb)
self.comment_changed = False
# "how to reproduce" textview
- self.tevHowToReproduce = self.wTree.get_widget("tevHowToReproduce")
+ self.tevHowToReproduce = self.builder.get_object("tevHowToReproduce")
self.how_to_changed = False
- self.tvReport = self.wTree.get_widget("tvReport")
-
- self.reportListStore = gtk.ListStore(str, str, bool, bool, bool)
- # set filter
- #self.modelfilter = self.reportListStore.filter_new()
- #self.modelfilter.set_visible_func(self.filter_reports, None)
- self.tvReport.set_model(self.reportListStore)
- renderer = gtk.CellRendererText()
- column = gtk.TreeViewColumn('Item', renderer, text=0)
- self.tvReport.append_column(column)
-
- renderer = CellRenderers.MultilineCellRenderer()
- renderer.props.editable = True
- renderer.props.wrap_mode = pango.WRAP_WORD
- renderer.props.wrap_width = 800
-
- #renderer.props.wrap_mode = pango.WRAP_WORD
- #renderer.props.wrap_width = 600
- column = gtk.TreeViewColumn('Value', renderer, text=1, editable=2)
- self.tvReport.append_column(column)
- renderer.connect('edited',self.column_edited,self.reportListStore)
- # toggle
- toggle_renderer = gtk.CellRendererToggle()
- toggle_renderer.set_property('activatable', True)
- toggle_renderer.connect( 'toggled', self.on_send_toggled, self.reportListStore )
- column = gtk.TreeViewColumn('Send', toggle_renderer)
- column.add_attribute(toggle_renderer, "active", 3)
- column.add_attribute(toggle_renderer, "visible", 4)
- self.tvReport.insert_column(column,0)
- # connect the signals
- self.tvReport.connect_after("size-allocate", self.on_window_resize)
- # start with the warning hidden, so it's not visible when there is no rating
- self.wTree.get_widget("ebErrors").hide()
- self.wTree.get_widget("bLog").connect("clicked", self.show_log_cb, log)
+ self.builder.get_object("ebErrors").hide()
+ self.builder.get_object("bLog").connect("clicked", self.show_log_cb, log)
+ self.builder.get_object("cbSendBacktrace").connect("toggled", self.on_send_backtrace_toggled)
+ self.allow_send()
self.hydrate()
-
+
+ def check_backtrace(self):
+ print "checking backtrace"
+
+ def warn_user(self, warnings):
+ # FIXME: show in lError
+ ebErrors = self.builder.get_object("ebErrors")
+ lErrors = self.builder.get_object("lErrors")
+ warning_lbl = None
+ for warning in warnings:
+ if warning_lbl:
+ warning_lbl += "\n* %s" % warning
+ else:
+ warning_lbl = "* %s" % warning
+ lErrors.set_label(warning_lbl)
+ ebErrors.show_all()
+
+ def hide_warning(self):
+ ebErrors = self.builder.get_object("ebErrors")
+ lErrors = self.builder.get_object("lErrors")
+ ebErrors.hide()
+
+ def allow_send(self):
+ self.hide_warning()
+ bSend = self.builder.get_object("bSend")
+ SendBacktrace = self.builder.get_object("cbSendBacktrace").get_active()
+ send = True
+ error_msgs = []
+ try:
+ rating = self.report["rating"]
+ except:
+ rating = None
+ # active buttons acording to required fields
+ # if an backtrace has rating use it
+ if not SendBacktrace:
+ send = False
+ error_msgs.append(_("You must agree with submitting the backtrace."))
+ # we have both SendBacktrace and rating
+ elif rating:
+ try:
+ package = self.report["package"][CD_CONTENT]
+ # if we don't have package for some reason
+ except:
+ package = None
+ # not usable report
+ if int(self.report["rating"][CD_CONTENT]) < 3:
+ if package:
+ error_msgs.append(_("Reporting disabled because the backtrace is unusable.\nPlease try to install debuginfo manually using command: <b>debuginfo-install %s</b> \nthen use Refresh button to regenerate the backtrace." % package[0:package.rfind('-',0,package.rfind('-'))]))
+ else:
+ error_msgs.append(_("The backtrace is unusable, you can't report this!"))
+ # probably usable 3
+ elif int(self.report["rating"][CD_CONTENT]) < 4:
+ error_msgs.append(_("The backtrace is incomplete, please make sure you provide good steps to reproduce."))
+
+ if error_msgs:
+ self.warn_user(error_msgs)
+ bSend.set_sensitive(send)
+
+ def on_send_backtrace_toggled(self, toggle_button):
+ self.allow_send()
+
def show_log_cb(self, widget, log):
show_log(log, parent=self.window)
# this callback is called when user press Cancel or Report button in Report dialog
def on_response(self, dialog, response_id, daemon):
# the button has been pressed (probably)
- # print "response_id", response_id
if response_id == gtk.RESPONSE_APPLY:
if not (self.check_settings(daemon) and self.check_report()):
dialog.stop_emission("response")
- self.wTree.get_widget("bSend").stop_emission("clicked")
+ self.builder.get_object("bSend").stop_emission("clicked")
if response_id == SHOW_LOG:
# prevent dialog from quitting the run()
dialog.stop_emission("response")
@@ -113,16 +141,6 @@ class ReporterDialog():
widget.set_buffer(gtk.TextBuffer())
self.comment_changed = True
- def on_window_resize(self, treeview, allocation):
- # multine support
- pass
- #print allocation
-
- def column_edited(self, cell, path, new_text, model):
- # 1 means the second cell
- model[path][1] = new_text
- return
-
def on_config_plugin_clicked(self, button, plugin, image):
ui = PluginSettingsUI(plugin, parent=self.window)
ui.hydrate()
@@ -154,7 +172,6 @@ class ReporterDialog():
if reporter.Settings.check() == False:
wrong_conf_plugs.append(reporter)
- #gui_error_message(_("%s is not properly set!\nPlease check the settings and try to report again." % reporter))
if wrong_conf_plugs:
gladefile = "%s%ssettings_wizard.glade" % (sys.path[0],"/")
builder = gtk.Builder()
@@ -187,8 +204,13 @@ class ReporterDialog():
def hydrate(self):
self.editable = []
- self.reportListStore.clear()
for item in self.report:
+ if item == "backtrace":
+ buff = gtk.TextBuffer()
+ tvBacktrace = self.builder.get_object("tvBacktrace")
+ buff.set_text(self.report[item][CD_CONTENT])
+ tvBacktrace.set_buffer(buff)
+ continue
if item == "Comment":
buff = gtk.TextBuffer()
comment = _("Brief description how to reproduce this or what you did...")
@@ -217,60 +239,36 @@ class ReporterDialog():
self.tevHowToReproduce.set_buffer(buff)
continue
- # if an backtrace has rating use it
- if item == "rating":
- try:
- package = self.report["package"][CD_CONTENT]
- # if we don't have package for some reason
- except:
- package = None
- ebErrors = self.wTree.get_widget("ebErrors")
- fReproducer = self.wTree.get_widget("fReproducer")
- fComments = self.wTree.get_widget("fComments")
- lErrors = self.wTree.get_widget("lErrors")
- bSend = self.wTree.get_widget("bSend")
- # not usable report
- if int(self.report[item][CD_CONTENT]) < 3:
- ebErrors.show()
- fReproducer.hide()
- fComments.hide()
- if package:
- lErrors.set_markup(
- _("Reporting disabled because the backtrace is unusable.\nPlease try to install debuginfo manually using command: <b>debuginfo-install %s</b> \nthen use Refresh button to regenerate the backtrace." % package[0:package.rfind('-',0,package.rfind('-'))]))
- else:
- lErrors.set_markup(_("The backtrace is unusable, you can't report this!"))
- bSend.set_sensitive(False)
- # probably usable 3
- elif int(self.report[item][CD_CONTENT]) < 4:
- ebErrors.show()
- lErrors.set_markup(_("The backtrace is incomplete, please make sure you provide good steps to reproduce."))
- bSend.set_sensitive(True)
- else:
- ebErrors.hide()
- fReproducer.show()
- fComments.show()
- bSend.set_sensitive(True)
if self.report[item][CD_TYPE] != CD_SYS:
# item name 0| value 1| editable? 2| toggled? 3| visible?(attachment)4
- if self.report[item][CD_EDITABLE] == 'y':
- self.editable.append(item)
- self.row_dict[item] = self.reportListStore.append([item, self.report[item][CD_CONTENT],
- item in self.editable, True,
- self.report[item][CD_TYPE] in [CD_ATT,CD_BIN]])
+ # FIXME: handle editable fields
+ if self.report[item][CD_TYPE] == CD_BIN:
+ self.builder.get_object("fAttachment").show()
+ vbAttachments = self.builder.get_object("vbAttachments")
+ toggle = gtk.CheckButton(self.report[item][CD_CONTENT])
+ vbAttachments.pack_start(toggle)
+ # bind item to checkbox
+ toggle.item = item
+ toggle.show()
+ continue
+ item_label = self.builder.get_object("l%s" % item)
+ if item_label:
+ item_label.set_text(self.report[item][CD_CONTENT])
+ else:
+ # no widget to show this item
+ # probably some new item need to adjust the GUI!
+ # FIXME: add some window+button to show all the info
+ # in raw form (smth like the old report dialog)
+ pass
def dehydrate(self):
- attributes = ["item", "content", "editable", "send", "attachment"]
- for row in self.reportListStore:
- rowe = dict(zip(attributes, row))
- if not rowe["editable"] and not rowe["attachment"]:
- self.report[rowe["item"]][CD_CONTENT] = rowe["content"]
- elif rowe["editable"] and not rowe["attachment"]:
- self.report[rowe["item"]][CD_CONTENT] = rowe["content"]
- elif (rowe["attachment"] or (rowe["editable"] and rowe["attachment"])) and rowe["send"]:
- self.report[rowe["item"]][CD_CONTENT] = rowe["content"]
- else:
- del self.report[rowe["item"]]
+ # handle attachments
+ vbAttachments = self.builder.get_object("vbAttachments")
+ for attachment in vbAttachments.get_children():
+ #print "%s file %s" % (["not sending","sending"][attachment.get_active()], attachment.get_label())
+ del self.report[attachment.item]
+
# handle comment
if self.comment_changed:
buff = self.tvComment.get_buffer()
@@ -283,22 +281,14 @@ class ReporterDialog():
self.report["How to reproduce"] = [CD_TXT, 'y', buff.get_text(buff.get_start_iter(),buff.get_end_iter())]
else:
del self.report["How to reproduce"]
+ #handle backtrace
+ tev_backtrace = self.builder.get_object("tvBacktrace")
+ buff = tev_backtrace.get_buffer()
+ self.report["backtrace"] = [CD_TXT, 'y', buff.get_text(buff.get_start_iter(),buff.get_end_iter())]
def check_report(self):
- # FIXME: what to do if user press "Not to send BT and then press cancel"
- # it uncheck the backtrace and let him to edit it, and then user might
- # not noticed, that he is not sending the BT, so should we warn user about this
- # or check the BT automatically?
- attributes = ["item", "content", "editable", "send", "attachment"]
- for row in self.reportListStore:
- rowe = dict(zip(attributes, row))
- if (rowe["attachment"] or (rowe["editable"] and rowe["attachment"])) and rowe["send"]:
- result = gui_question_dialog(_("<b>WARNING</b>, you're about to send data which might contain sensitive information.\n"
- "Do you really want to send <b>%s</b>?\n" % rowe["item"]), self.window)
- if result == gtk.RESPONSE_NO:
- row[attributes.index("send")] = False
- if result in (gtk.RESPONSE_CANCEL, gtk.RESPONSE_DELETE_EVENT):
- return False
+ # FIXME: check the report for passwords and some other potentially
+ # sensitive info
self.dehydrate()
return True
diff --git a/src/Gui/CC_gui_functions.py b/src/Gui/CC_gui_functions.py
index 0379f20..a9c47fa 100644
--- a/src/Gui/CC_gui_functions.py
+++ b/src/Gui/CC_gui_functions.py
@@ -234,5 +234,5 @@ def show_log(log, parent=None):
if __name__ == "__main__":
window = gtk.Window()
- gui_report_dialog("<b>Bugzilla</b>: <span foreground='red'>CReporterBugzilla::Report(): CReporterBugzilla::Login(): RPC response indicates failure. The username or password you entered is not valid.</span>\n<b>Logger</b>: Report was stored into: /var/log/abrt-logger", window)
+ gui_report_dialog("<b>Bugzilla</b>: <span foreground='red'>CReporterBugzilla::Report(): CReporterBugzilla::Login(): RPC response indicates failure. The username or password you entered is not valid.</span>\n<b>Logger</b>: Report was stored into: /var/log/abrt.log", window)
gtk.main()
diff --git a/src/Gui/Makefile.am b/src/Gui/Makefile.am
index 60a7bfe..3cac1ee 100644
--- a/src/Gui/Makefile.am
+++ b/src/Gui/Makefile.am
@@ -3,7 +3,7 @@
bin_SCRIPTS = abrt-gui
PYTHON_FILES = CCDBusBackend.py CCDumpList.py CCDump.py CC_gui_functions.py \
- CCReporterDialog.py CCReport.py abrt_utils.py \
+ CCReporterDialog.py abrt_utils.py \
CCMainWindow.py CellRenderers.py ABRTExceptions.py \
SettingsDialog.py ABRTPlugin.py PluginList.py PluginSettingsUI.py \
PluginsSettingsDialog.py ConfBackend.py
diff --git a/src/Gui/abrt_utils.py b/src/Gui/abrt_utils.py
index 2fabb54..3b0bb79 100644
--- a/src/Gui/abrt_utils.py
+++ b/src/Gui/abrt_utils.py
@@ -1,5 +1,4 @@
import sys
-import gtk.glade
PROGNAME = "abrt"
g_verbose = 0
@@ -10,6 +9,7 @@ import gettext
_ = lambda x: gettext.lgettext(x)
def init_logging(progname, v):
+ import gtk.glade
global PROGNAME, g_verbose
PROGNAME = progname
g_verbose = v
diff --git a/src/Gui/dialogs.glade b/src/Gui/dialogs.glade
index 77e78dd..cf33a49 100644
--- a/src/Gui/dialogs.glade
+++ b/src/Gui/dialogs.glade
@@ -76,6 +76,7 @@
</object>
<object class="GtkDialog" id="LogViewer">
<property name="border_width">5</property>
+ <property name="type">popup</property>
<property name="title" translatable="yes">Log</property>
<property name="modal">True</property>
<property name="default_width">450</property>
diff --git a/src/Gui/report.glade b/src/Gui/report.glade
index 0eae1f1..d3bf5eb 100644
--- a/src/Gui/report.glade
+++ b/src/Gui/report.glade
@@ -1,225 +1,580 @@
<?xml version="1.0"?>
-<glade-interface>
- <!-- interface-requires gtk+ 2.16 -->
- <!-- interface-naming-policy toplevel-contextual -->
- <widget class="GtkDialog" id="reporter_dialog">
- <property name="border_width">6</property>
- <property name="title" translatable="yes">Report</property>
- <property name="modal">True</property>
- <property name="window_position">center-on-parent</property>
- <property name="default_width">400</property>
- <property name="default_height">400</property>
+<interface>
+ <requires lib="gtk+" version="2.16"/>
+ <!-- interface-naming-policy project-wide -->
+ <object class="GtkDialog" id="reporter_dialog">
+ <property name="border_width">5</property>
+ <property name="title" translatable="yes">Automatic Bug Reporting Tool</property>
<property name="type_hint">normal</property>
<property name="has_separator">False</property>
<child internal-child="vbox">
- <widget class="GtkVBox" id="dialog-vbox4">
+ <object class="GtkVBox" id="dialog-vbox1">
<property name="visible">True</property>
<property name="orientation">vertical</property>
- <property name="spacing">12</property>
+ <property name="spacing">2</property>
<child>
- <widget class="GtkVBox" id="vbox1">
+ <object class="GtkVBox" id="vbox1">
<property name="visible">True</property>
<property name="orientation">vertical</property>
- <property name="spacing">12</property>
<child>
- <widget class="GtkVBox" id="vboxNonError">
+ <object class="GtkFrame" id="fSysInfo">
<property name="visible">True</property>
- <property name="orientation">vertical</property>
- <property name="spacing">12</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
<child>
- <widget class="GtkFrame" id="frame1">
+ <object class="GtkAlignment" id="alignment1">
<property name="visible">True</property>
- <property name="label_xalign">0</property>
- <property name="shadow_type">none</property>
+ <property name="left_padding">12</property>
<child>
- <widget class="GtkAlignment" id="alignment3">
+ <object class="GtkHBox" id="hbox1">
<property name="visible">True</property>
- <property name="left_padding">12</property>
<child>
- <widget class="GtkScrolledWindow" id="scrolledwindow5">
+ <object class="GtkVBox" id="vbox3">
<property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="hscrollbar_policy">automatic</property>
- <property name="vscrollbar_policy">automatic</property>
- <property name="shadow_type">in</property>
+ <property name="orientation">vertical</property>
<child>
- <widget class="GtkTreeView" id="tvReport">
+ <object class="GtkLabel" id="l">
<property name="visible">True</property>
- <property name="can_focus">True</property>
- </widget>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">&lt;span fgcolor="blue"&gt;Package:&lt;/span&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label7">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">&lt;span fgcolor="blue"&gt;Component:&lt;/span&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label8">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">&lt;span fgcolor="blue"&gt;Executable:&lt;/span&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
</child>
- </widget>
+ <child>
+ <object class="GtkLabel" id="label9">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">&lt;span fgcolor="blue"&gt;Cmdline:&lt;/span&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
</child>
- </widget>
- </child>
- <child>
- <widget class="GtkLabel" id="label3">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Following items will be sent&lt;/b&gt;</property>
- <property name="use_markup">True</property>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
+ <child>
+ <object class="GtkVBox" id="vbox4">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <property name="homogeneous">True</property>
+ <child>
+ <object class="GtkLabel" id="lpackage">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="xpad">5</property>
+ <property name="label" translatable="yes">N/A</property>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lcomponent">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="xpad">5</property>
+ <property name="label" translatable="yes">N/A</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lexecutable">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="xpad">5</property>
+ <property name="label" translatable="yes">N/A</property>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lcmdline">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="xpad">5</property>
+ <property name="label" translatable="yes">N/A</property>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVBox" id="vbox5">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">&lt;span fgcolor="blue"&gt;Architecture:&lt;/span&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label10">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">&lt;span fgcolor="blue"&gt;Kernel:&lt;/span&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label11">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">&lt;span fgcolor="blue"&gt;Release:&lt;/span&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label13">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">&lt;span fgcolor="blue"&gt;Reason:&lt;/span&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVBox" id="vbox6">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="larchitecture">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="xpad">5</property>
+ <property name="label" translatable="yes">N/A</property>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lkernel">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="xpad">5</property>
+ <property name="label" translatable="yes">N/A</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lrelease">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="xpad">5</property>
+ <property name="label" translatable="yes">N/A</property>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lreason">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="xpad">5</property>
+ <property name="label" translatable="yes">N/A</property>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
</child>
- </widget>
- <packing>
- <property name="position">0</property>
- </packing>
+ </object>
</child>
+ <child type="label">
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="ypad">5</property>
+ <property name="label" translatable="yes">&lt;b&gt;General information&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="fBacktrace">
+ <property name="visible">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
<child>
- <widget class="GtkFrame" id="fReproducer">
+ <object class="GtkAlignment" id="alignment2">
<property name="visible">True</property>
- <property name="label_xalign">0</property>
- <property name="shadow_type">none</property>
+ <property name="left_padding">12</property>
<child>
- <widget class="GtkAlignment" id="alignment1">
+ <object class="GtkVBox" id="vbox7">
<property name="visible">True</property>
- <property name="left_padding">12</property>
+ <property name="orientation">vertical</property>
<child>
- <widget class="GtkScrolledWindow" id="scrolledwindow3">
+ <object class="GtkScrolledWindow" id="scrolledwindow1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">automatic</property>
<property name="vscrollbar_policy">automatic</property>
<child>
- <widget class="GtkViewport" id="viewport1">
+ <object class="GtkTextView" id="tvBacktrace">
+ <property name="height_request">200</property>
<property name="visible">True</property>
- <property name="resize_mode">queue</property>
- <child>
- <widget class="GtkTextView" id="tevHowToReproduce">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="wrap_mode">word-char</property>
- </widget>
- </child>
- </widget>
+ <property name="can_focus">True</property>
+ </object>
</child>
- </widget>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
</child>
- </widget>
- </child>
- <child>
- <widget class="GtkLabel" id="label1">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;How to reproduce (in a few simple steps)&lt;/b&gt;</property>
- <property name="use_markup">True</property>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
+ <child>
+ <object class="GtkCheckButton" id="cbSendBacktrace">
+ <property name="label" translatable="yes">I agree to submit this backtrace, which could contain sensitive data</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
</child>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">1</property>
- </packing>
+ </object>
</child>
+ <child type="label">
+ <object class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="ypad">5</property>
+ <property name="label" translatable="yes">&lt;b&gt;Backtrace&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="frame2">
+ <property name="visible">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
<child>
- <widget class="GtkFrame" id="fComments">
+ <object class="GtkAlignment" id="alignment3">
<property name="visible">True</property>
- <property name="label_xalign">0</property>
- <property name="shadow_type">none</property>
+ <property name="left_padding">12</property>
<child>
- <widget class="GtkAlignment" id="alignment2">
+ <object class="GtkVBox" id="vbox2">
<property name="visible">True</property>
- <property name="left_padding">12</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">12</property>
<child>
- <widget class="GtkScrolledWindow" id="scrolledwindow2">
+ <object class="GtkVBox" id="vboxNonError">
<property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="hscrollbar_policy">automatic</property>
- <property name="vscrollbar_policy">automatic</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">12</property>
+ <child>
+ <object class="GtkFrame" id="fReproducer">
+ <property name="visible">True</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment5">
+ <property name="visible">True</property>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow3">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">automatic</property>
+ <property name="vscrollbar_policy">automatic</property>
+ <child>
+ <object class="GtkViewport" id="viewport1">
+ <property name="visible">True</property>
+ <property name="resize_mode">queue</property>
+ <child>
+ <object class="GtkTextView" id="tevHowToReproduce">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="wrap_mode">word-char</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label5">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;How to reproduce (in a few simple steps)&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
<child>
- <widget class="GtkViewport" id="viewport2">
+ <object class="GtkFrame" id="fComments">
<property name="visible">True</property>
- <property name="resize_mode">queue</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
<child>
- <widget class="GtkTextView" id="tvComment">
+ <object class="GtkAlignment" id="alignment6">
<property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="wrap_mode">word-char</property>
- </widget>
+ <property name="left_padding">12</property>
+ <child>
+ <object class="GtkScrolledWindow" id="scrolledwindow2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">automatic</property>
+ <property name="vscrollbar_policy">automatic</property>
+ <child>
+ <object class="GtkViewport" id="viewport2">
+ <property name="visible">True</property>
+ <property name="resize_mode">queue</property>
+ <child>
+ <object class="GtkTextView" id="tvComment">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="wrap_mode">word-char</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
</child>
- </widget>
+ <child type="label">
+ <object class="GtkLabel" id="label6">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Comment&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
</child>
- </widget>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
</child>
- </widget>
+ </object>
</child>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="ypad">5</property>
+ <property name="label" translatable="yes">&lt;b&gt;User information&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkFrame" id="fAttachment">
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
+ <child>
+ <object class="GtkAlignment" id="alignment4">
+ <property name="visible">True</property>
+ <property name="left_padding">12</property>
<child>
- <widget class="GtkLabel" id="label2">
+ <object class="GtkVBox" id="vbAttachments">
<property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Comment&lt;/b&gt;</property>
- <property name="use_markup">True</property>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
+ <property name="orientation">vertical</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
</child>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">2</property>
- </packing>
+ </object>
+ </child>
+ <child type="label">
+ <object class="GtkLabel" id="fAttachments">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Attachments&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
</child>
- </widget>
+ </object>
<packing>
- <property name="position">0</property>
+ <property name="position">3</property>
</packing>
</child>
<child>
- <widget class="GtkHBox" id="ebErrors">
+ <object class="GtkHBox" id="ebErrors">
<property name="visible">True</property>
- <property name="spacing">12</property>
<child>
- <widget class="GtkImage" id="image1">
+ <object class="GtkAlignment" id="alignment7">
+ <property name="visible">True</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkImage" id="image1">
<property name="visible">True</property>
<property name="stock">gtk-dialog-warning</property>
<property name="icon-size">6</property>
- </widget>
+ </object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
- <property name="position">0</property>
+ <property name="position">1</property>
</packing>
</child>
<child>
- <widget class="GtkLabel" id="lErrors">
+ <object class="GtkVBox" id="vbox8">
<property name="visible">True</property>
- <property name="label" translatable="yes"> </property>
- <property name="use_markup">True</property>
- </widget>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="label12">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Please fix the following problems&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="lErrors">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes"> </property>
+ <property name="use_markup">True</property>
+ <property name="selectable">True</property>
+ </object>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
<packing>
- <property name="position">1</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="alignment8">
+ <property name="visible">True</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="position">3</property>
</packing>
</child>
- </widget>
+ </object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
- <property name="position">1</property>
+ <property name="position">4</property>
</packing>
</child>
- </widget>
+ </object>
<packing>
- <property name="position">0</property>
+ <property name="position">1</property>
</packing>
</child>
<child internal-child="action_area">
- <widget class="GtkHButtonBox" id="dialog-action_area4">
+ <object class="GtkHButtonBox" id="dialog-action_area1">
<property name="visible">True</property>
<property name="layout_style">end</property>
<child>
- <widget class="GtkButton" id="bLog">
+ <object class="GtkButton" id="bLog">
<property name="label" translatable="yes">Log</property>
- <property name="response_id">-60</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
- </widget>
+ </object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
@@ -227,14 +582,13 @@
</packing>
</child>
<child>
- <widget class="GtkButton" id="bCancel">
+ <object class="GtkButton" id="bCancel">
<property name="label">gtk-cancel</property>
- <property name="response_id">-6</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
- </widget>
+ </object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
@@ -242,14 +596,13 @@
</packing>
</child>
<child>
- <widget class="GtkButton" id="bRefresh">
+ <object class="GtkButton" id="bRefresh">
<property name="label">gtk-refresh</property>
- <property name="response_id">-50</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
- </widget>
+ </object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
@@ -257,27 +610,32 @@
</packing>
</child>
<child>
- <widget class="GtkButton" id="bSend">
+ <object class="GtkButton" id="bSend">
<property name="label" translatable="yes">Send</property>
- <property name="response_id">-10</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
- </widget>
+ </object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">3</property>
</packing>
</child>
- </widget>
+ </object>
<packing>
<property name="expand">False</property>
<property name="pack_type">end</property>
- <property name="position">1</property>
+ <property name="position">0</property>
</packing>
</child>
- </widget>
+ </object>
</child>
- </widget>
-</glade-interface>
+ <action-widgets>
+ <action-widget response="-60">bLog</action-widget>
+ <action-widget response="-6">bCancel</action-widget>
+ <action-widget response="-50">bRefresh</action-widget>
+ <action-widget response="-10">bSend</action-widget>
+ </action-widgets>
+ </object>
+</interface>