diff options
author | Denys Vlasenko <dvlasenk@redhat.com> | 2011-02-22 14:08:47 +0100 |
---|---|---|
committer | Denys Vlasenko <dvlasenk@redhat.com> | 2011-02-22 14:08:47 +0100 |
commit | 6a391e994b767fd662265cc07cdfc190853097cd (patch) | |
tree | ec276a75ca9971b03239f275d270eed8900bd010 /src/gui-wizard-gtk | |
parent | 21546071bd6b5511fdb0eeabb36d11952321855c (diff) | |
download | abrt-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.c | 132 | ||||
-rw-r--r-- | src/gui-wizard-gtk/wizard.c | 96 | ||||
-rw-r--r-- | src/gui-wizard-gtk/wizard.glade | 9 | ||||
-rw-r--r-- | src/gui-wizard-gtk/wizard.h | 17 |
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); |