From 0c0f057659e013427e499994c674d94ba986a89e Mon Sep 17 00:00:00 2001 From: Nick Treleaven Date: Tue, 8 Oct 2019 14:46:16 +0100 Subject: [PATCH 1/6] Use gtk_widget_show_all in show_tab_bar_popup_menu --- src/notebook.c | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/notebook.c b/src/notebook.c index a6f9d54372..9e9c8de4b9 100644 --- a/src/notebook.c +++ b/src/notebook.c @@ -465,16 +465,13 @@ static void show_tab_bar_popup_menu(GdkEventButton *event, GeanyDocument *doc) /* clear the old menu items */ gtk_container_foreach(GTK_CONTAINER(menu), (GtkCallback) gtk_widget_destroy, NULL); - ui_menu_add_document_items(GTK_MENU(menu), document_get_current(), G_CALLBACK(tab_bar_menu_activate_cb)); menu_item = gtk_separator_menu_item_new(); - gtk_widget_show(menu_item); gtk_container_add(GTK_CONTAINER(menu), menu_item); menu_item = ui_image_menu_item_new(GTK_STOCK_OPEN, _("Open in New _Window")); - gtk_widget_show(menu_item); gtk_container_add(GTK_CONTAINER(menu), menu_item); g_signal_connect(menu_item, "activate", G_CALLBACK(on_open_in_new_window_activate), doc); @@ -483,32 +480,28 @@ static void show_tab_bar_popup_menu(GdkEventButton *event, GeanyDocument *doc) gtk_widget_set_sensitive(menu_item, FALSE); menu_item = gtk_separator_menu_item_new(); - gtk_widget_show(menu_item); gtk_container_add(GTK_CONTAINER(menu), menu_item); menu_item = gtk_image_menu_item_new_from_stock(GTK_STOCK_CLOSE, NULL); - gtk_widget_show(menu_item); gtk_container_add(GTK_CONTAINER(menu), menu_item); g_signal_connect(menu_item, "activate", G_CALLBACK(notebook_tab_close_clicked_cb), doc); gtk_widget_set_sensitive(GTK_WIDGET(menu_item), (doc != NULL)); menu_item = ui_image_menu_item_new(GTK_STOCK_CLOSE, _("Close Ot_her Documents")); - gtk_widget_show(menu_item); gtk_container_add(GTK_CONTAINER(menu), menu_item); g_signal_connect(menu_item, "activate", G_CALLBACK(on_close_other_documents1_activate), doc); gtk_widget_set_sensitive(GTK_WIDGET(menu_item), (doc != NULL)); menu_item = ui_image_menu_item_new(GTK_STOCK_CLOSE, _("Close Documents to the _Right")); - gtk_widget_show(menu_item); gtk_container_add(GTK_CONTAINER(menu), menu_item); g_signal_connect(menu_item, "activate", G_CALLBACK(on_close_documents_right_activate), doc); gtk_widget_set_sensitive(GTK_WIDGET(menu_item), doc != NULL && has_tabs_on_right(doc)); menu_item = ui_image_menu_item_new(GTK_STOCK_CLOSE, _("C_lose All")); - gtk_widget_show(menu_item); gtk_container_add(GTK_CONTAINER(menu), menu_item); g_signal_connect(menu_item, "activate", G_CALLBACK(on_close_all1_activate), NULL); + gtk_widget_show_all(menu); gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, event->button, event->time); } From ed7f71eef6c4364fb79a88a5e84a453243c4a355 Mon Sep 17 00:00:00 2001 From: Nick Treleaven Date: Tue, 8 Oct 2019 15:57:07 +0100 Subject: [PATCH 2/6] Add *Documents in _Folder* notebook menu --- src/callbacks.c | 3 +-- src/notebook.c | 60 +++++++++++++++++++++++++++++++++++++++++++++---- src/sidebar.c | 1 - 3 files changed, 57 insertions(+), 7 deletions(-) diff --git a/src/callbacks.c b/src/callbacks.c index 75d087098c..fdbb3e1787 100644 --- a/src/callbacks.c +++ b/src/callbacks.c @@ -1692,13 +1692,12 @@ static void on_search1_activate(GtkMenuItem *menuitem, gpointer user_data) * if user_data is set, it is the GeanyDocument to keep */ void on_close_other_documents1_activate(GtkMenuItem *menuitem, gpointer user_data) { - guint i; GeanyDocument *cur_doc = user_data; if (cur_doc == NULL) cur_doc = document_get_current(); - for (i = 0; i < documents_array->len; i++) + for (guint i = 0; i < documents_array->len; i++) { GeanyDocument *doc = documents[i]; diff --git a/src/notebook.c b/src/notebook.c index 9e9c8de4b9..8d144c65fc 100644 --- a/src/notebook.c +++ b/src/notebook.c @@ -438,6 +438,7 @@ static gboolean has_tabs_on_right(GeanyDocument *doc) } +// simple implementation (vs. close all which doesn't close documents if cancelled) static void on_close_documents_right_activate(GtkMenuItem *menuitem, GeanyDocument *doc) { g_return_if_fail(has_tabs_on_right(doc)); @@ -455,9 +456,46 @@ static void on_close_documents_right_activate(GtkMenuItem *menuitem, GeanyDocume } +// simple implementation (vs. close all which doesn't close documents if cancelled) +static void close_folder_action(GeanyDocument *cur_doc, gboolean other_folders) +{ + if (cur_doc == NULL) + cur_doc = document_get_current(); + if (!cur_doc->real_path) + return; + + gchar *dir = g_dirname(cur_doc->real_path); + guint i; + + foreach_document(i) + { + GeanyDocument *doc = documents[i]; + + if (!doc->real_path) + continue; + if (other_folders && g_str_has_prefix(doc->real_path, dir)) + continue; + if (!other_folders && !g_str_has_prefix(doc->real_path, dir)) + continue; + if (! document_close(doc)) + break; + } + g_free(dir); +} + +static void on_close_folder(GtkMenuItem *menuitem, gpointer user_data) +{ + close_folder_action(user_data, FALSE); +} + +static void on_close_other_folders(GtkMenuItem *menuitem, gpointer user_data) +{ + close_folder_action(user_data, TRUE); +} + static void show_tab_bar_popup_menu(GdkEventButton *event, GeanyDocument *doc) { - GtkWidget *menu_item; + GtkWidget *menu_item, *sub; static GtkWidget *menu = NULL; if (menu == NULL) @@ -476,8 +514,22 @@ static void show_tab_bar_popup_menu(GdkEventButton *event, GeanyDocument *doc) g_signal_connect(menu_item, "activate", G_CALLBACK(on_open_in_new_window_activate), doc); /* disable if not on disk */ - if (doc == NULL || !doc->real_path) - gtk_widget_set_sensitive(menu_item, FALSE); + gtk_widget_set_sensitive(menu_item, doc && doc->real_path); + + menu_item = ui_image_menu_item_new(GTK_STOCK_DIRECTORY, _("Documents in _Folder")); + gtk_container_add(GTK_CONTAINER(menu), menu_item); + sub = gtk_menu_new(); + gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), sub); + gtk_widget_set_sensitive(menu_item, doc && doc->real_path); + + menu_item = gtk_image_menu_item_new_from_stock(GTK_STOCK_CLOSE, NULL); + gtk_container_add(GTK_CONTAINER(sub), menu_item); + g_signal_connect(menu_item, "activate", + G_CALLBACK(on_close_folder), doc); + + menu_item = ui_image_menu_item_new(GTK_STOCK_CLOSE, _("Close Ot_her Documents")); + gtk_container_add(GTK_CONTAINER(sub), menu_item); + g_signal_connect(menu_item, "activate", G_CALLBACK(on_close_other_folders), doc); menu_item = gtk_separator_menu_item_new(); gtk_container_add(GTK_CONTAINER(menu), menu_item); @@ -497,7 +549,7 @@ static void show_tab_bar_popup_menu(GdkEventButton *event, GeanyDocument *doc) g_signal_connect(menu_item, "activate", G_CALLBACK(on_close_documents_right_activate), doc); gtk_widget_set_sensitive(GTK_WIDGET(menu_item), doc != NULL && has_tabs_on_right(doc)); - menu_item = ui_image_menu_item_new(GTK_STOCK_CLOSE, _("C_lose All")); + menu_item = ui_image_menu_item_new(GEANY_STOCK_CLOSE_ALL, _("C_lose All")); gtk_container_add(GTK_CONTAINER(menu), menu_item); g_signal_connect(menu_item, "activate", G_CALLBACK(on_close_all1_activate), NULL); diff --git a/src/sidebar.c b/src/sidebar.c index 6032fb77cb..e43f8f404b 100644 --- a/src/sidebar.c +++ b/src/sidebar.c @@ -857,7 +857,6 @@ static void on_openfiles_document_action(GtkMenuItem *menuitem, gpointer user_da while (i >= 0 && gtk_tree_model_iter_nth_child(model, &child, &iter, i)) { gtk_tree_model_get(model, &child, DOCUMENTS_DOCUMENT, &doc, -1); - document_action(doc, action); i--; } From 17fe55029eb73bc9b925917b64d91cc119918110 Mon Sep 17 00:00:00 2001 From: Nick Treleaven Date: Tue, 8 Oct 2019 16:03:27 +0100 Subject: [PATCH 3/6] Remove unnecessary casts --- src/notebook.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/notebook.c b/src/notebook.c index 8d144c65fc..856e7a2c9c 100644 --- a/src/notebook.c +++ b/src/notebook.c @@ -537,17 +537,17 @@ static void show_tab_bar_popup_menu(GdkEventButton *event, GeanyDocument *doc) menu_item = gtk_image_menu_item_new_from_stock(GTK_STOCK_CLOSE, NULL); gtk_container_add(GTK_CONTAINER(menu), menu_item); g_signal_connect(menu_item, "activate", G_CALLBACK(notebook_tab_close_clicked_cb), doc); - gtk_widget_set_sensitive(GTK_WIDGET(menu_item), (doc != NULL)); + gtk_widget_set_sensitive(menu_item, (doc != NULL)); menu_item = ui_image_menu_item_new(GTK_STOCK_CLOSE, _("Close Ot_her Documents")); gtk_container_add(GTK_CONTAINER(menu), menu_item); g_signal_connect(menu_item, "activate", G_CALLBACK(on_close_other_documents1_activate), doc); - gtk_widget_set_sensitive(GTK_WIDGET(menu_item), (doc != NULL)); + gtk_widget_set_sensitive(menu_item, (doc != NULL)); menu_item = ui_image_menu_item_new(GTK_STOCK_CLOSE, _("Close Documents to the _Right")); gtk_container_add(GTK_CONTAINER(menu), menu_item); g_signal_connect(menu_item, "activate", G_CALLBACK(on_close_documents_right_activate), doc); - gtk_widget_set_sensitive(GTK_WIDGET(menu_item), doc != NULL && has_tabs_on_right(doc)); + gtk_widget_set_sensitive(menu_item, doc != NULL && has_tabs_on_right(doc)); menu_item = ui_image_menu_item_new(GEANY_STOCK_CLOSE_ALL, _("C_lose All")); gtk_container_add(GTK_CONTAINER(menu), menu_item); From e2a098a4e15a93c744b228fdd4a2eb3a25ea3a3a Mon Sep 17 00:00:00 2001 From: Nick Treleaven Date: Tue, 8 Oct 2019 16:25:18 +0100 Subject: [PATCH 4/6] Iterate in tab order for close folder items --- src/notebook.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/notebook.c b/src/notebook.c index 856e7a2c9c..602d8f83a6 100644 --- a/src/notebook.c +++ b/src/notebook.c @@ -465,11 +465,10 @@ static void close_folder_action(GeanyDocument *cur_doc, gboolean other_folders) return; gchar *dir = g_dirname(cur_doc->real_path); - guint i; - foreach_document(i) + for (gint i = 0; i < gtk_notebook_get_n_pages(GTK_NOTEBOOK(main_widgets.notebook)); i++) { - GeanyDocument *doc = documents[i]; + GeanyDocument *doc = document_get_from_page(i); if (!doc->real_path) continue; @@ -479,6 +478,7 @@ static void close_folder_action(GeanyDocument *cur_doc, gboolean other_folders) continue; if (! document_close(doc)) break; + i--; // cancel next increment after close } g_free(dir); } From b33d7a81e1e4e6f9b0dfd4cc894400f8142a2907 Mon Sep 17 00:00:00 2001 From: Nick Treleaven Date: Wed, 9 Oct 2019 14:03:36 +0100 Subject: [PATCH 5/6] g_dirname is deprecated --- src/notebook.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/notebook.c b/src/notebook.c index 602d8f83a6..a4b156ce39 100644 --- a/src/notebook.c +++ b/src/notebook.c @@ -464,7 +464,7 @@ static void close_folder_action(GeanyDocument *cur_doc, gboolean other_folders) if (!cur_doc->real_path) return; - gchar *dir = g_dirname(cur_doc->real_path); + gchar *dir = g_path_get_dirname(cur_doc->real_path); for (gint i = 0; i < gtk_notebook_get_n_pages(GTK_NOTEBOOK(main_widgets.notebook)); i++) { From 07bdb07af839a3f93426fc1a08fb22e55391a469 Mon Sep 17 00:00:00 2001 From: Nick Treleaven Date: Wed, 9 Oct 2019 14:06:26 +0100 Subject: [PATCH 6/6] Revert whitespace change --- src/sidebar.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/sidebar.c b/src/sidebar.c index e43f8f404b..6032fb77cb 100644 --- a/src/sidebar.c +++ b/src/sidebar.c @@ -857,6 +857,7 @@ static void on_openfiles_document_action(GtkMenuItem *menuitem, gpointer user_da while (i >= 0 && gtk_tree_model_iter_nth_child(model, &child, &iter, i)) { gtk_tree_model_get(model, &child, DOCUMENTS_DOCUMENT, &doc, -1); + document_action(doc, action); i--; }