diff options
author | Nikola Pajkovsky <npajkovs@redhat.com> | 2011-03-09 12:31:03 +0100 |
---|---|---|
committer | Nikola Pajkovsky <npajkovs@redhat.com> | 2011-03-09 13:19:53 +0100 |
commit | 97db1f93f59091fc85624b618e7cec1ac3d48169 (patch) | |
tree | 4eb6a0c1f983f5010c9057ce03f80be943946d66 | |
parent | e08fa6fbd01c6ae7e03762168f8e9b9803cb8eeb (diff) | |
download | abrt-97db1f93f59091fc85624b618e7cec1ac3d48169.tar.gz abrt-97db1f93f59091fc85624b618e7cec1ac3d48169.tar.xz abrt-97db1f93f59091fc85624b618e7cec1ac3d48169.zip |
view details in extrenal editor for multiline non-binary files
Signed-off-by: Nikola Pajkovsky <npajkovs@redhat.com>
-rw-r--r-- | src/gui-wizard-gtk/wizard.c | 34 | ||||
-rw-r--r-- | src/include/report/crash_data.h | 4 | ||||
-rw-r--r-- | src/lib/crash_data.c | 13 |
3 files changed, 50 insertions, 1 deletions
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); |