summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDenys Vlasenko <dvlasenk@redhat.com>2011-02-15 15:42:41 +0100
committerDenys Vlasenko <dvlasenk@redhat.com>2011-02-15 15:42:41 +0100
commit22de22a5c8a02c1c741c13626845983223222c70 (patch)
tree0681a57e7f1db9c3c96bda7d2f4cd09c73d9f456
parenta3f7479530cc6b95e8f37538357501be625e3fea (diff)
downloadabrt-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.c62
-rw-r--r--src/gui-gtk/abrt-gtk.h3
-rw-r--r--src/gui-gtk/main.c16
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);