summaryrefslogtreecommitdiffstats
path: root/src/gui-wizard-gtk
diff options
context:
space:
mode:
authorDenys Vlasenko <dvlasenk@redhat.com>2011-02-22 14:08:47 +0100
committerDenys Vlasenko <dvlasenk@redhat.com>2011-02-22 14:08:47 +0100
commit6a391e994b767fd662265cc07cdfc190853097cd (patch)
treeec276a75ca9971b03239f275d270eed8900bd010 /src/gui-wizard-gtk
parent21546071bd6b5511fdb0eeabb36d11952321855c (diff)
downloadabrt-6a391e994b767fd662265cc07cdfc190853097cd.tar.gz
abrt-6a391e994b767fd662265cc07cdfc190853097cd.tar.xz
abrt-6a391e994b767fd662265cc07cdfc190853097cd.zip
gui-wizard-gtk: add crash_data reloading; add -v propagation
Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
Diffstat (limited to 'src/gui-wizard-gtk')
-rw-r--r--src/gui-wizard-gtk/main.c132
-rw-r--r--src/gui-wizard-gtk/wizard.c96
-rw-r--r--src/gui-wizard-gtk/wizard.glade9
-rw-r--r--src/gui-wizard-gtk/wizard.h17
4 files changed, 127 insertions, 127 deletions
diff --git a/src/gui-wizard-gtk/main.c b/src/gui-wizard-gtk/main.c
index 5fe9a8c7..0b936a98 100644
--- a/src/gui-wizard-gtk/main.c
+++ b/src/gui-wizard-gtk/main.c
@@ -6,12 +6,12 @@
#define PROGNAME "bug-reporting-wizard"
char *g_glade_file = NULL;
-
char *g_dump_dir_name = NULL;
-
char *g_analyze_label_selected = NULL;
+char *g_analyze_events = NULL;
+char *g_report_events = NULL;
+crash_data_t *g_cd;
-crash_data_t *cd;
static void analyze_rb_was_toggled(GtkToggleButton *button, gpointer user_data)
{
@@ -23,8 +23,15 @@ static void analyze_rb_was_toggled(GtkToggleButton *button, gpointer user_data)
}
}
+static void remove_child_widget(GtkWidget *widget, gpointer container)
+{
+ gtk_container_remove(container, widget);
+}
+
static GtkWidget *add_event_buttons(GtkBox *box, char *event_name, GCallback func, bool radio)
{
+ gtk_container_foreach(GTK_CONTAINER(box), &remove_child_widget, box);
+
GtkWidget *first_button = NULL;
while (event_name[0])
{
@@ -48,51 +55,61 @@ static GtkWidget *add_event_buttons(GtkBox *box, char *event_name, GCallback fun
return first_button;
}
-int main(int argc, char **argv)
+static void append_item_to_details_ls(gpointer name, gpointer value, gpointer data)
{
- gtk_init(&argc, &argv);
-
- /* Can't keep these strings/structs static: _() doesn't support that */
- const char *program_usage_string = _(
- PROGNAME" [-v] [-g GUI_FILE] DIR\n\n"
- "GUI tool to analyze and report ABRT crash in specified DIR"
- );
- enum {
- OPT_v = 1 << 0,
- OPT_g = 1 << 1,
- };
- /* Keep enum above and order of options below in sync! */
- struct options program_options[] = {
- OPT__VERBOSE(&g_verbose),
- OPT_STRING('g', NULL, &g_glade_file, "FILE" , _("Alternate GUI file")),
- OPT_END()
- };
+ crash_item *item = (crash_item*)value;
+ GtkTreeIter iter;
- /*unsigned opts =*/ parse_opts(argc, argv, program_options, program_usage_string);
+ gtk_list_store_append(g_details_ls, &iter);
- argv += optind;
- if (!argv[0] || argv[1]) /* zero or >1 arguments */
- show_usage_and_die(program_usage_string, program_options);
+ //FIXME: use the value representation here
+ /* If text and not multiline... */
+ if ((item->flags & CD_FLAG_TXT) && !strchr(item->content, '\n'))
+ {
+ gtk_list_store_set(g_details_ls, &iter,
+ COLUMN_NAME, (char *)name,
+ COLUMN_VALUE, item->content,
+ COLUMN_PATH, xasprintf("%s%s", g_dump_dir_name, name),
+ -1);
+ }
+ else
+ {
+ gtk_list_store_set(g_details_ls, &iter,
+ COLUMN_NAME, (char *)name,
+ COLUMN_VALUE, _("Content is too long, please use the \"View\" button to display it."),
+ COLUMN_PATH, xasprintf("%s%s", g_dump_dir_name, name),
+ -1);
+//FIXME: we leak xasprintf results above?
+ }
+}
- g_dump_dir_name = argv[0];
+void reload_dump_dir(void)
+{
+ free_crash_data(g_cd);
+ free(g_analyze_events);
+ free(g_report_events);
struct dump_dir *dd = dd_opendir(g_dump_dir_name, 0);
if (!dd)
- return 1;
- cd = create_crash_data_from_dump_dir(dd);
- char *analyze_events = list_possible_events(dd, g_dump_dir_name, "analyze");
- char *report_events = list_possible_events(dd, g_dump_dir_name, "report");
+ xfunc_die(); /* dd_opendir already logged error msg */
+ g_cd = create_crash_data_from_dump_dir(dd);
+ g_analyze_events = list_possible_events(dd, g_dump_dir_name, "analyze");
+ g_report_events = list_possible_events(dd, g_dump_dir_name, "report");
dd_close(dd);
- GtkWidget *assistant = create_assistant();
+ const char *reason = get_crash_item_content_or_NULL(g_cd, FILENAME_REASON);
+ gtk_label_set_text(g_lbl_cd_reason, reason ? reason : _("(no description)"));
+
+ gtk_list_store_clear(g_details_ls);
+ g_hash_table_foreach(g_cd, append_item_to_details_ls, NULL);
- const char *reason = get_crash_item_content_or_NULL(cd, FILENAME_REASON);
- if (reason)
- gtk_label_set_text(g_lbl_cd_reason, reason);
+ GtkTextBuffer *backtrace_buf = gtk_text_view_get_buffer(g_backtrace_tv);
+ const char *bt = g_cd ? get_crash_item_content_or_NULL(g_cd, FILENAME_BACKTRACE) : NULL;
+ gtk_text_buffer_set_text(backtrace_buf, bt ? bt : "", -1);
- if (analyze_events[0])
+ if (g_analyze_events[0])
{
- GtkWidget *first_rb = add_event_buttons(g_box_analyzers, analyze_events, G_CALLBACK(analyze_rb_was_toggled), /*radio:*/ true);
+ GtkWidget *first_rb = add_event_buttons(g_box_analyzers, g_analyze_events, G_CALLBACK(analyze_rb_was_toggled), /*radio:*/ true);
if (first_rb)
{
const char *label = gtk_button_get_label(GTK_BUTTON(first_rb));
@@ -110,10 +127,49 @@ int main(int argc, char **argv)
// gtk_assistant_set_current_page(GTK_ASSISTANT(assistant), PAGENO_REPORTER_SELECTOR);
}
- if (report_events[0])
+ if (g_report_events[0])
{
- add_event_buttons(g_box_reporters, report_events, /*callback:*/NULL, /*radio:*/ false);
+ add_event_buttons(g_box_reporters, g_report_events, /*callback:*/NULL, /*radio:*/ false);
}
+}
+
+int main(int argc, char **argv)
+{
+ gtk_init(&argc, &argv);
+
+ char *env_verbose = getenv("ABRT_VERBOSE");
+ if (env_verbose)
+ g_verbose = atoi(env_verbose);
+
+ /* Can't keep these strings/structs static: _() doesn't support that */
+ const char *program_usage_string = _(
+ PROGNAME" [-v] [-g GUI_FILE] DIR\n\n"
+ "GUI tool to analyze and report ABRT crash in specified DIR"
+ );
+ enum {
+ OPT_v = 1 << 0,
+ OPT_g = 1 << 1,
+ };
+ /* Keep enum above and order of options below in sync! */
+ struct options program_options[] = {
+ OPT__VERBOSE(&g_verbose),
+ OPT_STRING('g', NULL, &g_glade_file, "FILE" , _("Alternate GUI file")),
+ OPT_END()
+ };
+
+ /*unsigned opts =*/ parse_opts(argc, argv, program_options, program_usage_string);
+
+ putenv(xasprintf("ABRT_VERBOSE=%u", g_verbose));
+
+ argv += optind;
+ if (!argv[0] || argv[1]) /* zero or >1 arguments */
+ show_usage_and_die(program_usage_string, program_options);
+
+ g_dump_dir_name = argv[0];
+
+ GtkWidget *assistant = create_assistant();
+
+ reload_dump_dir();
gtk_widget_show_all(assistant);
diff --git a/src/gui-wizard-gtk/wizard.c b/src/gui-wizard-gtk/wizard.c
index 0a326862..05e4001c 100644
--- a/src/gui-wizard-gtk/wizard.c
+++ b/src/gui-wizard-gtk/wizard.c
@@ -10,9 +10,11 @@ GtkLabel *g_lbl_analyze_log;
GtkBox *g_box_analyzers;
GtkBox *g_box_reporters;
GtkTextView *g_analyze_log;
+GtkTextView *g_backtrace_tv;
+GtkTreeView *g_details_tv;
+GtkListStore *g_details_ls;
static GtkWidget *assistant;
-static GtkListStore *details_ls;
static GtkBuilder *builder;
/* THE PAGE FLOW
@@ -70,34 +72,12 @@ static page_obj_t pages[8] =
{NULL}
};
-enum
-{
- COLUMN_NAME,
- COLUMN_VALUE,
- COLUMN_PATH,
- COLUMN_COUNT
-};
-
void on_b_refresh_clicked(GtkButton *button)
{
g_print("Refresh clicked!\n");
}
-static void fill_backtrace()
-{
- crash_item *ci = NULL;
- GtkTextView *backtrace_tev = GTK_TEXT_VIEW(gtk_builder_get_object(builder, "bactrace_tev"));
- GtkTextBuffer *backtrace_buf = gtk_text_buffer_new(NULL);
- ci = g_hash_table_lookup(cd, FILENAME_BACKTRACE);
- if(ci != NULL)
- {
- //g_print(ci->content);
- gtk_text_buffer_set_text(backtrace_buf, ci->content, -1);
- gtk_text_view_set_buffer(backtrace_tev, backtrace_buf);
- }
-}
-
-GtkTreeView *create_details_treeview()
+static GtkTreeView *create_details_treeview()
{
GtkTreeView *details_tv = GTK_TREE_VIEW(gtk_builder_get_object(builder, "details_tv"));
GtkCellRenderer *renderer;
@@ -132,41 +112,6 @@ GtkTreeView *create_details_treeview()
return details_tv;
}
-static void *append_item_to_details_ls(gpointer name, gpointer value, gpointer data)
-{
- crash_item *item = (crash_item*)value;
- GtkTreeIter iter;
-
- gtk_list_store_append(details_ls, &iter);
-
- //FIXME: use the vaule representation here
- if(strlen(item->content) < 30)
- {
- gtk_list_store_set(details_ls, &iter,
- COLUMN_NAME, (char *)name,
- COLUMN_VALUE, item->content,
- COLUMN_PATH, xasprintf("%s%s", g_dump_dir_name, name),
- -1);
- }
- else
- {
- gtk_list_store_set(details_ls, &iter,
- COLUMN_NAME, (char *)name,
- COLUMN_VALUE, _("Content is too long, please use the \"View\" button to display it."),
- COLUMN_PATH, xasprintf("%s%s", g_dump_dir_name, name),
- -1);
- }
-
- return NULL;
-}
-
-static void fill_details(GtkTreeView *treeview)
-{
- details_ls = gtk_list_store_new(COLUMN_COUNT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
- g_hash_table_foreach(cd, (GHFunc)append_item_to_details_ls, NULL);
- gtk_tree_view_set_model(GTK_TREE_VIEW(treeview), GTK_TREE_MODEL(details_ls));
-}
-
/* wizard.glade file as a string WIZARD_GLADE_CONTENTS: */
#include "wizard_glade.c"
@@ -174,17 +119,21 @@ static void add_pages()
{
GError *error = NULL;
if (!g_glade_file)
+ {
/* Load UI from internal string */
gtk_builder_add_objects_from_string(builder,
WIZARD_GLADE_CONTENTS, sizeof(WIZARD_GLADE_CONTENTS) - 1,
(gchar**)page_names,
&error);
+ if (error != NULL)
+ error_msg_and_die("Error loading glade data: %s", error->message);
+ }
else
+ {
/* -g FILE: load IU from it */
gtk_builder_add_objects_from_file(builder, g_glade_file, (gchar**)page_names, &error);
- if (error != NULL)
- {
- error_msg_and_die("can't load %s: %s", "wizard.glade", error->message);
+ if (error != NULL)
+ error_msg_and_die("Can't load %s: %s", g_glade_file, error->message);
}
for (int i = 0; page_names[i] != NULL; i++)
@@ -211,6 +160,7 @@ static void add_pages()
g_box_analyzers = GTK_BOX(gtk_builder_get_object(builder, "vb_analyzers"));
g_box_reporters = GTK_BOX(gtk_builder_get_object(builder, "vb_reporters"));
g_analyze_log = GTK_TEXT_VIEW(gtk_builder_get_object(builder, "analyze_log"));
+ g_backtrace_tv = GTK_TEXT_VIEW(gtk_builder_get_object(builder, "bactrace_tev"));
}
@@ -334,22 +284,6 @@ static void next_page(GtkAssistant *assistant, gpointer user_data)
}
}
-
-static void on_page_prepare(GtkAssistant *assistant, GtkWidget *page, gpointer user_data)
-{
- page_obj_t *cur_page = pages;
- while (cur_page->page_widget != page)
- {
- if (!cur_page->page_widget)
- return; /* end of pages[] */
- ++cur_page;
- }
-
- if (cur_page->name == PAGE_BACKTRACE_APPROVAL)
- fill_backtrace();
-}
-
-
GtkWidget *create_assistant()
{
assistant = gtk_assistant_new();
@@ -360,12 +294,12 @@ GtkWidget *create_assistant()
g_signal_connect(G_OBJECT(assistant), "cancel", G_CALLBACK(gtk_main_quit), NULL);
g_signal_connect(G_OBJECT(assistant), "close", G_CALLBACK(gtk_main_quit), NULL);
g_signal_connect(G_OBJECT(assistant), "apply", G_CALLBACK(next_page), NULL);
- g_signal_connect(G_OBJECT(assistant), "prepare", G_CALLBACK(on_page_prepare), NULL);
builder = gtk_builder_new();
add_pages();
- GtkTreeView *details_tv = create_details_treeview();
- fill_details(details_tv);
+ g_details_tv = create_details_treeview();
+ g_details_ls = gtk_list_store_new(COLUMN_COUNT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
+ gtk_tree_view_set_model(g_details_tv, GTK_TREE_MODEL(g_details_ls));
gtk_builder_connect_signals(builder, NULL);
return assistant;
diff --git a/src/gui-wizard-gtk/wizard.glade b/src/gui-wizard-gtk/wizard.glade
index 65b0c38c..35915904 100644
--- a/src/gui-wizard-gtk/wizard.glade
+++ b/src/gui-wizard-gtk/wizard.glade
@@ -18,10 +18,9 @@
<property name="orientation">vertical</property>
<child>
<object class="GtkLabel" id="lbl_page1">
- <property name="width_request">750</property>
<property name="visible">True</property>
+ <property name="xalign">0</property>
<property name="label" translatable="yes">A problem was detected on your computer:</property>
- <property name="justify">fill</property>
<property name="wrap">True</property>
</object>
<packing>
@@ -32,8 +31,7 @@
<object class="GtkLabel" id="lbl_cd_reason">
<property name="width_request">750</property>
<property name="visible">True</property>
- <property name="label" translatable="yes">(no description)</property>
- <property name="justify">center</property>
+ <property name="xalign">0</property>
<property name="wrap">True</property>
<attributes>
<attribute name="style" value="normal"/>
@@ -47,10 +45,9 @@
</child>
<child>
<object class="GtkLabel" id="lbl_page5">
- <property name="width_request">750</property>
<property name="visible">True</property>
+ <property name="xalign">0</property>
<property name="label" translatable="yes">Select how you would like to analyze the problem:</property>
- <property name="justify">fill</property>
<property name="wrap">True</property>
</object>
<packing>
diff --git a/src/gui-wizard-gtk/wizard.h b/src/gui-wizard-gtk/wizard.h
index 85c33611..3e42d22a 100644
--- a/src/gui-wizard-gtk/wizard.h
+++ b/src/gui-wizard-gtk/wizard.h
@@ -11,10 +11,23 @@ extern GtkLabel *g_lbl_cd_reason;
extern GtkLabel *g_lbl_analyze_log;
extern GtkBox *g_box_analyzers;
extern GtkBox *g_box_reporters;
+extern GtkTextView *g_backtrace_tv;
+enum
+{
+ COLUMN_NAME,
+ COLUMN_VALUE,
+ COLUMN_PATH,
+ COLUMN_COUNT,
+};
+extern GtkTreeView *g_details_tv;
+extern GtkListStore *g_details_ls;
GtkWidget *create_assistant(void);
extern char *g_glade_file;
-extern crash_data_t *cd;
-extern char *g_analyze_label_selected;
extern char *g_dump_dir_name;
+extern char *g_analyze_label_selected;
+extern char *g_analyze_events;
+extern char *g_report_events;
+extern crash_data_t *g_cd;
+void reload_dump_dir(void);