diff options
-rw-r--r-- | walls.ui | 2 | ||||
-rw-r--r-- | window_main.c | 76 |
2 files changed, 78 insertions, 0 deletions
@@ -106,6 +106,8 @@ <object class="GtkTreeView" id="foldtree"> <property name="visible">True</property> <property name="can_focus">True</property> + <signal name="button_press_event" handler="on_foldtree_button_press_event"/> + <signal name="popup_menu" handler="on_foldtree_popup_menu"/> </object> </child> </object> diff --git a/window_main.c b/window_main.c index a550943..715da9c 100644 --- a/window_main.c +++ b/window_main.c @@ -437,6 +437,8 @@ gpointer add_dir_thread(gpointer data) { g_free(directory); + add_thread = NULL; + return NULL; } @@ -460,6 +462,80 @@ void on_add_dir_action_activate(GtkAction *action, gpointer user_data) { gtk_widget_destroy(dialog); } +void on_foldtree_update_activate(GtkMenuItem *menuitem, gpointer user_data) { + GtkTreeSelection *treeselection; + GtkTreeModel *model; + GtkTreeIter iter; + struct directory_t *dir; + GError *error; + + if(add_thread) return; + + treeselection = gtk_tree_view_get_selection(GTK_TREE_VIEW(foldtree)); + + if(gtk_tree_selection_get_selected(treeselection, &model, &iter)) { + browse_model_get_dir_record(model, &iter, &dir); + + add_thread = g_thread_create(add_dir_thread, g_strdup(dir->name), FALSE, &error); + + if(!add_thread) { + g_warning("%s", error->message); + g_error_free(error); + } + } +} + +inline static void foldtree_popup_add_items(GtkWidget *menu) { + GtkWidget *update; + GtkTreeSelection *selection; + + update = gtk_menu_item_new_with_label("Update"); + + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(foldtree)); + gtk_widget_set_sensitive(update, (gtk_tree_selection_count_selected_rows(selection) == 1 ? TRUE : FALSE)); + + gtk_menu_shell_append(GTK_MENU_SHELL(menu), update); + + g_signal_connect(G_OBJECT(update), "activate", G_CALLBACK(on_foldtree_update_activate), NULL); + + gtk_widget_show(update); +} + +static void do_foldtree_popup(GtkWidget *widget, GdkEventButton *event) { + GtkWidget *menu; + int button, event_time; + + menu = gtk_menu_new(); + g_signal_connect(menu, "selection-done", G_CALLBACK(gtk_widget_destroy), NULL); + + foldtree_popup_add_items(menu); + + if(event) { + button = event->button; + event_time = event->time; + } else { + button = 0; + event_time = gtk_get_current_event_time(); + } + + gtk_menu_attach_to_widget(GTK_MENU(menu), widget, NULL); + gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, button, event_time); +} + +gboolean on_foldtree_popup_menu(GtkWidget *widget, gpointer user_data) { + do_foldtree_popup(widget, NULL); + + return TRUE; +} + +gboolean on_foldtree_button_press_event(GtkWidget *widget, GdkEventButton *event) { + if(event->button == 3 && event->type == GDK_BUTTON_PRESS) { + do_foldtree_popup(widget, event); + return TRUE; + } + return FALSE; +} + /** * Callback for adding selected wallpapers to an array. */ |