From 97db1f93f59091fc85624b618e7cec1ac3d48169 Mon Sep 17 00:00:00 2001 From: Nikola Pajkovsky Date: Wed, 9 Mar 2011 12:31:03 +0100 Subject: view details in extrenal editor for multiline non-binary files Signed-off-by: Nikola Pajkovsky --- src/gui-wizard-gtk/wizard.c | 34 ++++++++++++++++++++++++++++++++++ src/include/report/crash_data.h | 4 ++++ src/lib/crash_data.c | 13 ++++++++++++- 3 files changed, 50 insertions(+), 1 deletion(-) diff --git a/src/gui-wizard-gtk/wizard.c b/src/gui-wizard-gtk/wizard.c index c7683533..30e60a13 100644 --- a/src/gui-wizard-gtk/wizard.c +++ b/src/gui-wizard-gtk/wizard.c @@ -326,6 +326,39 @@ struct cd_stats { unsigned filecount; }; +static void tv_details_edit_cb(GtkTreeView *tree_view, + GtkTreePath *path, + GtkTreeViewColumn *column, + gpointer user_data) +{ + GtkTreeModel *model; + GtkTreeIter iter; + GtkTreeSelection* selection = gtk_tree_view_get_selection(tree_view); + if (!gtk_tree_selection_get_selected(selection, &model, &iter)) + return; + + gchar *column_name; + gtk_tree_model_get(model, &iter, DETAIL_COLUMN_NAME, &column_name, -1); + struct crash_item *item = get_crash_data_item_or_NULL(g_cd, column_name); + if (!item || !IS_TXT(item->flags)) + return; + + if (item && IS_ONELINE(item->flags)) + return; + + gchar *arg[3]; + arg[0] = "xdg-open"; + arg[1] = concat_path_file(g_dump_dir_name, column_name); + arg[2] = NULL; + g_free(column_name); + + g_spawn_sync(NULL, arg, NULL, + G_SPAWN_SEARCH_PATH | G_SPAWN_STDOUT_TO_DEV_NULL, + NULL, NULL, NULL, NULL, NULL, NULL); + + free(arg[1]); +} + static void append_item_to_ls_details(gpointer name, gpointer value, gpointer data) { crash_item *item = (crash_item*)value; @@ -1068,6 +1101,7 @@ void create_assistant() g_signal_connect(g_tb_approve_bt, "toggled", G_CALLBACK(on_bt_approve_toggle), NULL); g_signal_connect(g_btn_refresh, "clicked", G_CALLBACK(on_btn_refresh_clicked), NULL); + g_signal_connect(g_tv_details, "row-activated", G_CALLBACK(tv_details_edit_cb), NULL); /* init searching */ GtkTextBuffer *backtrace_buf = gtk_text_view_get_buffer(g_tv_backtrace); diff --git a/src/include/report/crash_data.h b/src/include/report/crash_data.h index 3854118a..2dfdb242 100644 --- a/src/include/report/crash_data.h +++ b/src/include/report/crash_data.h @@ -32,8 +32,12 @@ enum { CD_FLAG_TXT = (1 << 1), CD_FLAG_ISEDITABLE = (1 << 2), CD_FLAG_ISNOTEDITABLE = (1 << 3), + CD_FLAG_ONELINE = (1 << 4), }; +#define IS_TXT(flag) ((flag) & CD_FLAG_TXT) +#define IS_ONELINE(flag) ((flag) & CD_FLAG_ONELINE) + struct crash_item { char *content; unsigned flags; diff --git a/src/lib/crash_data.c b/src/lib/crash_data.c index 63b0a7a5..7f23c52f 100644 --- a/src/lib/crash_data.c +++ b/src/lib/crash_data.c @@ -233,10 +233,21 @@ void load_crash_data_from_dump_dir(crash_data_t *crash_data, struct dump_dir *dd content = dd_load_text(dd, short_name); } + int flags = 0; + + if (editable) + flags |= CD_FLAG_TXT | CD_FLAG_ISEDITABLE; + else + flags |= CD_FLAG_TXT | CD_FLAG_ISNOTEDITABLE; + + int oneline = strchr(content, '\n') == NULL; + if (oneline) + flags |= CD_FLAG_ONELINE; + add_to_crash_data_ext(crash_data, short_name, content, - (editable ? CD_FLAG_TXT + CD_FLAG_ISEDITABLE : CD_FLAG_TXT + CD_FLAG_ISNOTEDITABLE) + flags ); free(short_name); free(full_name); -- cgit