diff options
author | Denys Vlasenko <dvlasenk@redhat.com> | 2011-02-15 15:42:41 +0100 |
---|---|---|
committer | Denys Vlasenko <dvlasenk@redhat.com> | 2011-02-15 15:42:41 +0100 |
commit | 22de22a5c8a02c1c741c13626845983223222c70 (patch) | |
tree | 0681a57e7f1db9c3c96bda7d2f4cd09c73d9f456 | |
parent | a3f7479530cc6b95e8f37538357501be625e3fea (diff) | |
download | abrt-22de22a5c8a02c1c741c13626845983223222c70.tar.gz abrt-22de22a5c8a02c1c741c13626845983223222c70.tar.xz abrt-22de22a5c8a02c1c741c13626845983223222c70.zip |
abrt-gtk: refresh the list after deletion
Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
-rw-r--r-- | src/gui-gtk/abrt-gtk.c | 62 | ||||
-rw-r--r-- | src/gui-gtk/abrt-gtk.h | 3 | ||||
-rw-r--r-- | src/gui-gtk/main.c | 16 |
3 files changed, 64 insertions, 17 deletions
diff --git a/src/gui-gtk/abrt-gtk.c b/src/gui-gtk/abrt-gtk.c index 47e0277b..12c55240 100644 --- a/src/gui-gtk/abrt-gtk.c +++ b/src/gui-gtk/abrt-gtk.c @@ -4,7 +4,8 @@ #include "abrt_dbus.h" #include "abrt-gtk.h" -static GtkListStore *dumps_list_store; +static GtkListStore *s_dumps_list_store; +static GtkWidget *s_treeview; enum { @@ -39,8 +40,8 @@ void add_directory_to_dirlist(const char *dirname) char *hostname = dd_load_text(dd, FILENAME_HOSTNAME); GtkTreeIter iter; - gtk_list_store_append(dumps_list_store, &iter); - gtk_list_store_set(dumps_list_store, &iter, + gtk_list_store_append(s_dumps_list_store, &iter); + gtk_list_store_set(s_dumps_list_store, &iter, COLUMN_REPORTED, reported, COLUMN_APPLICATION, executable, COLUMN_HOSTNAME, hostname, @@ -103,16 +104,25 @@ static gint on_key_press_event_cb(GtkTreeView *treeview, GdkEventKey *key, gpoin if (dd->locked) /* it is not readonly */ { dd_delete(dd); - return TRUE; + goto deleted_ok; } dd_close(dd); } /* Ask abrtd to do it for us */ - connect_to_abrtd_and_call_DeleteDebugDump(dump_dir_name); - -//TODO: refresh the list of crashes - + if (connect_to_abrtd_and_call_DeleteDebugDump(dump_dir_name) == 0) + { + deleted_ok: + gtk_list_store_remove(s_dumps_list_store, &iter); + } + else + { + /* Strange. Deletion did not succeed. Someone else deleted it? + * Rescan the whole list */ + gtk_list_store_clear(s_dumps_list_store); + scan_dirs_and_add_to_dirlist(); + sanitize_cursor(); + } } } @@ -186,25 +196,47 @@ GtkWidget *create_main_window(void) gtk_container_add(GTK_CONTAINER(main_window), scroll_win); /* tree view inside scrolled region */ - GtkWidget *treeview = gtk_tree_view_new(); - add_columns(GTK_TREE_VIEW(treeview)); - gtk_container_add(GTK_CONTAINER(scroll_win), treeview); + s_treeview = gtk_tree_view_new(); + add_columns(GTK_TREE_VIEW(s_treeview)); + gtk_container_add(GTK_CONTAINER(scroll_win), s_treeview); /* Create data store for the list and attach it */ - dumps_list_store = gtk_list_store_new(NUM_COLUMNS, G_TYPE_STRING, /* reported */ + s_dumps_list_store = gtk_list_store_new(NUM_COLUMNS, G_TYPE_STRING, /* reported */ G_TYPE_STRING, /* executable */ G_TYPE_STRING, /* hostname */ G_TYPE_STRING, /* time */ G_TYPE_INT, /* unix time - used for sort */ G_TYPE_STRING);/* dump dir path */ - gtk_tree_view_set_model(GTK_TREE_VIEW(treeview), GTK_TREE_MODEL(dumps_list_store)); + gtk_tree_view_set_model(GTK_TREE_VIEW(s_treeview), GTK_TREE_MODEL(s_dumps_list_store)); /* Double click/Enter handler */ - g_signal_connect(treeview, "row-activated", G_CALLBACK(on_row_activated_cb), NULL); + g_signal_connect(s_treeview, "row-activated", G_CALLBACK(on_row_activated_cb), NULL); /* Delete handler */ - g_signal_connect(treeview, "key-press-event", G_CALLBACK(on_key_press_event_cb), NULL); + g_signal_connect(s_treeview, "key-press-event", G_CALLBACK(on_key_press_event_cb), NULL); /* Quit when user closes the main window */ g_signal_connect(main_window, "destroy", gtk_main_quit, NULL); return main_window; } + +void sanitize_cursor(void) +{ + GtkTreePath *path; + gtk_tree_view_get_cursor(GTK_TREE_VIEW(s_treeview), &path, /* GtkTreeViewColumn** */ NULL); + if (path) + { + /* Cursor exists already */ + gtk_tree_path_free(path); + return; + } + + GtkTreeIter iter; + if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(s_dumps_list_store), &iter)) + { + /* We have at least one element, put cursor on it */ + path = gtk_tree_model_get_path(GTK_TREE_MODEL(s_dumps_list_store), &iter); + gtk_tree_view_set_cursor(GTK_TREE_VIEW(s_treeview), path, + /* GtkTreeViewColumn *focus_column */ NULL, /* start_editing */ false); + gtk_tree_path_free(path); + } +} diff --git a/src/gui-gtk/abrt-gtk.h b/src/gui-gtk/abrt-gtk.h index bf25cf71..7c197ceb 100644 --- a/src/gui-gtk/abrt-gtk.h +++ b/src/gui-gtk/abrt-gtk.h @@ -1,2 +1,5 @@ GtkWidget *create_main_window(void); void add_directory_to_dirlist(const char *dirname); +void sanitize_cursor(void); + +void scan_dirs_and_add_to_dirlist(); diff --git a/src/gui-gtk/main.c b/src/gui-gtk/main.c index b18f854f..aa05a22a 100644 --- a/src/gui-gtk/main.c +++ b/src/gui-gtk/main.c @@ -5,6 +5,8 @@ #define PROGNAME "abrt-gtk" +static char **s_dirs; + static void scan_directory_and_add_to_dirlist(const char *path) { DIR *dp = opendir(path); @@ -30,6 +32,13 @@ static void scan_directory_and_add_to_dirlist(const char *path) closedir(dp); } +void scan_dirs_and_add_to_dirlist(void) +{ + char **argv = s_dirs; + while (*argv) + scan_directory_and_add_to_dirlist(*argv++); +} + int main(int argc, char **argv) { /* I18n */ @@ -68,11 +77,14 @@ int main(int argc, char **argv) default_dirs[1] = concat_path_file(home, ".abrt/spool"); argv = (char**)default_dirs; } - while (*argv) - scan_directory_and_add_to_dirlist(*argv++); + s_dirs = argv; + + scan_dirs_and_add_to_dirlist(); gtk_widget_show_all(main_window); + sanitize_cursor(); + /* Prevent zombies when we spawn wizard */ signal(SIGCHLD, SIG_IGN); |