---
src/gui-wizard-gtk/main.c | 3 +
src/gui-wizard-gtk/wizard.c | 129 +++++++++++++++++++++++++++++++------------
src/gui-wizard-gtk/wizard.h | 1 +
3 files changed, 98 insertions(+), 35 deletions(-)
diff --git a/src/gui-wizard-gtk/main.c b/src/gui-wizard-gtk/main.c
index dc31dd8..344d109 100644
--- a/src/gui-wizard-gtk/main.c
+++ b/src/gui-wizard-gtk/main.c
@@ -26,6 +26,7 @@
char *g_glade_file = NULL;
char *g_dump_dir_name = NULL;
char *g_analyze_events = NULL;
+char *g_collect_events = NULL;
char *g_report_events = NULL;
int g_report_only = false;
problem_data_t *g_cd;
@@ -34,6 +35,7 @@ problem_data_t *g_cd;
void reload_problem_data_from_dump_dir(void)
{
free(g_analyze_events);
+ free(g_collect_events);
free(g_report_events);
struct dump_dir *dd = dd_opendir(g_dump_dir_name, DD_OPEN_READONLY);
@@ -44,6 +46,7 @@ void reload_problem_data_from_dump_dir(void)
add_to_problem_data_ext(new_cd, CD_DUMPDIR, g_dump_dir_name, (CD_FLAG_TXT |
CD_FLAG_ISNOTEDITABLE));
g_analyze_events = list_possible_events(dd, NULL, "analyze");
+ g_collect_events = list_possible_events(dd, NULL, "collect");
g_report_events = list_possible_events(dd, NULL, "report");
dd_close(dd);
diff --git a/src/gui-wizard-gtk/wizard.c b/src/gui-wizard-gtk/wizard.c
index 63cc6c6..40de5ae 100644
--- a/src/gui-wizard-gtk/wizard.c
+++ b/src/gui-wizard-gtk/wizard.c
@@ -39,6 +39,7 @@ typedef struct event_gui_data_t
static GtkAssistant *g_assistant;
static char *g_analyze_event_selected;
+static unsigned g_collect_events_selected_count = 0;
static char *g_reporter_events_selected;
static unsigned g_black_event_count = 0;
@@ -48,6 +49,12 @@ static GList *g_list_analyzers;
static GtkLabel *g_lbl_analyze_log;
static GtkTextView *g_tv_analyze_log;
+static GtkBox *g_box_collectors;
+/* List of event_gui_data's */
+static GList *g_list_collectors;
+static GtkLabel *g_lbl_collect_log;
+static GtkTextView *g_tv_collect_log;
+
static GtkBox *g_box_reporters;
/* List of event_gui_data's */
static GList *g_list_reporters;
@@ -641,6 +648,31 @@ static void report_tb_was_toggled(GtkButton *button_unused, gpointer
user_data_u
gtk_label_set_text(g_lbl_reporters, g_reporter_events_selected);
}
+static void collect_tb_was_toggled(GtkButton *button_unused, gpointer user_data_unused)
+{
+ /* Update the number of selected collectors. */
+ g_collect_events_selected_count = 0;
+
+ GList *li = g_list_collectors;
+ for (; li; li = li->next)
+ {
+ event_gui_data_t *event_gui_data = li->data;
+ if (gtk_toggle_button_get_active(event_gui_data->toggle_button) == TRUE)
+ {
+ g_collect_events_selected_count++;
+
+ GHashTable *errors = validate_event(event_gui_data->event_name);
+ if (errors != NULL)
+ {
+ g_hash_table_unref(errors);
+ show_event_opt_error_dialog(event_gui_data->event_name);
+ }
+ }
+ }
+
+ /* The page is complete even if no checkbox is checked. */
+}
+
/* event_name contains "EVENT1\nEVENT2\nEVENT3\n".
* Add new {radio/check}buttons to GtkBox for each EVENTn (type depends on bool radio).
* Remember them in GList **p_event_list (list of event_gui_data_t's).
@@ -833,6 +865,55 @@ static void append_item_to_ls_details(gpointer name, gpointer value,
gpointer da
}
}
+/* Update collector/reporter checkboxes according to events parameter.
+ * Checkboxes are created in box specified by the second argument and their
+ * data stored in events_gui_data list. Parameter func is the callback function
+ * passed to the checkboxes.
+ */
+static void update_event_checkboxes(GList **events_gui_data,
+ GtkBox *box,
+ char *events,
+ GCallback func)
+{
+ /* Remember names of selected events */
+ GList *old_events = NULL;
+ GList *li = *events_gui_data;
+ for (; li; li = li->next)
+ {
+ event_gui_data_t *event_gui_data = li->data;
+ if (gtk_toggle_button_get_active(event_gui_data->toggle_button) == TRUE)
+ {
+ /* order isn't important. prepend is faster */
+ old_events = g_list_prepend(old_events,
xstrdup(event_gui_data->event_name));
+ }
+ }
+ /* Delete old checkboxes and create new ones */
+ add_event_buttons(box, events_gui_data,
+ events, /*callback:*/ func,
+ /*radio:*/ false
+ );
+ /* Re-select new events which were selected before we deleted them */
+ GList *li_new = *events_gui_data;
+ for (; li_new; li_new = li_new->next)
+ {
+ event_gui_data_t *new_gui_data = li_new->data;
+ GList *li_old = old_events;
+ for (; li_old; li_old = li_old->next)
+ {
+ if (strcmp(new_gui_data->event_name, li_old->data) == 0)
+ {
+ gtk_toggle_button_set_active(new_gui_data->toggle_button, true);
+ break;
+ }
+ }
+ }
+ list_free_with_free(old_events);
+
+ /* Update readiness state of event selector page
+ * and eventually the "list of reporters" label */
+ ((void (*)(GtkButton*, gpointer*))func)(NULL, NULL);
+}
+
void update_gui_state_from_problem_data(void)
{
gtk_window_set_title(GTK_WINDOW(g_assistant), g_dump_dir_name);
@@ -865,42 +946,12 @@ void update_gui_state_from_problem_data(void)
VERB2 log("g_analyze_event_selected='%s'",
g_analyze_event_selected);
/* Update reporter checkboxes */
- /* Remember names of selected reporters */
- GList *old_reporters = NULL;
- GList *li = g_list_reporters;
- for (; li; li = li->next)
- {
- event_gui_data_t *event_gui_data = li->data;
- if (gtk_toggle_button_get_active(event_gui_data->toggle_button) == TRUE)
- {
- /* order isn't important. prepend is faster */
- old_reporters = g_list_prepend(old_reporters,
xstrdup(event_gui_data->event_name));
- }
- }
- /* Delete old checkboxes and create new ones */
- add_event_buttons(g_box_reporters, &g_list_reporters,
- g_report_events, /*callback:*/ G_CALLBACK(report_tb_was_toggled),
- /*radio:*/ false
- );
- /* Re-select new reporters which were selected before we deleted them */
- GList *li_new = g_list_reporters;
- for (; li_new; li_new = li_new->next)
- {
- event_gui_data_t *new_gui_data = li_new->data;
- GList *li_old = old_reporters;
- for (; li_old; li_old = li_old->next)
- {
- if (strcmp(new_gui_data->event_name, li_old->data) == 0)
- {
- gtk_toggle_button_set_active(new_gui_data->toggle_button, true);
- break;
- }
- }
- }
- list_free_with_free(old_reporters);
+ update_event_checkboxes(&g_list_reporters, g_box_reporters, g_report_events,
+ G_CALLBACK(report_tb_was_toggled));
- /* Update readiness state of reporter selector page and "list of reporters"
label */
- report_tb_was_toggled(NULL, NULL);
+ /* Update collector checkboxes in a similar way */
+ update_event_checkboxes(&g_list_collectors, g_box_collectors, g_collect_events,
+ G_CALLBACK(collect_tb_was_toggled));
/* We can't just do gtk_widget_show_all once in main:
* We created new widgets (buttons). Need to make them visible.
@@ -2117,6 +2168,9 @@ static void add_pages()
g_box_analyzers = GTK_BOX( gtk_builder_get_object(builder,
"vb_analyzers"));
g_lbl_analyze_log = GTK_LABEL( gtk_builder_get_object(builder,
"lbl_analyze_log"));
g_tv_analyze_log = GTK_TEXT_VIEW( gtk_builder_get_object(builder,
"tv_analyze_log"));
+ g_box_collectors = GTK_BOX( gtk_builder_get_object(builder,
"vb_collectors"));
+ g_lbl_collect_log = GTK_LABEL( gtk_builder_get_object(builder,
"lbl_collect_log"));
+ g_tv_collect_log = GTK_TEXT_VIEW( gtk_builder_get_object(builder,
"tv_collect_log"));
g_box_reporters = GTK_BOX( gtk_builder_get_object(builder,
"vb_reporters"));
g_lbl_report_log = GTK_LABEL( gtk_builder_get_object(builder,
"lbl_report_log"));
g_tv_report_log = GTK_TEXT_VIEW( gtk_builder_get_object(builder,
"tv_report_log"));
@@ -2158,6 +2212,11 @@ static void add_pages()
if (config_btn)
g_signal_connect(G_OBJECT(config_btn), "clicked",
G_CALLBACK(on_show_event_list_cb), NULL);
+ /* Configure btn on select collectors page */
+ config_btn = GTK_WIDGET(gtk_builder_get_object(builder, "button_cfg3"));
+ if (config_btn)
+ g_signal_connect(G_OBJECT(config_btn), "clicked",
G_CALLBACK(on_show_event_list_cb), NULL);
+
/* Add "Close" button */
GtkWidget *w;
w = gtk_button_new_from_stock(GTK_STOCK_CLOSE);
diff --git a/src/gui-wizard-gtk/wizard.h b/src/gui-wizard-gtk/wizard.h
index 2e1767c..9533280 100644
--- a/src/gui-wizard-gtk/wizard.h
+++ b/src/gui-wizard-gtk/wizard.h
@@ -29,6 +29,7 @@ void show_error_as_msgbox(const char *msg);
extern char *g_glade_file;
extern char *g_dump_dir_name;
extern char *g_analyze_events;
+extern char *g_collect_events;
extern char *g_report_events;
extern problem_data_t *g_cd;
extern int g_report_only;
--
1.7.6