summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNikola Pajkovsky <npajkovs@redhat.com>2011-03-09 12:31:03 +0100
committerNikola Pajkovsky <npajkovs@redhat.com>2011-03-09 13:19:53 +0100
commit97db1f93f59091fc85624b618e7cec1ac3d48169 (patch)
tree4eb6a0c1f983f5010c9057ce03f80be943946d66
parente08fa6fbd01c6ae7e03762168f8e9b9803cb8eeb (diff)
downloadabrt-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.c34
-rw-r--r--src/include/report/crash_data.h4
-rw-r--r--src/lib/crash_data.c13
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);