From 08abaa721a8608452f1e0b8912b6bab9c9948744 Mon Sep 17 00:00:00 2001 From: Gabriele Barbero Date: Sat, 8 Nov 2025 23:53:14 +0100 Subject: [PATCH] libgimpwidgets: make GimpBrowser emit "stop-search" signal This commit enables GimpBrowser to emit the "stop-search" signal, originally emitted only by the internal GtkSearchEntry. It also connects this signal to all widgets embedding a GimpBrowser, so they can intercept it and close themselves. This restores the behaviour that existed before the GtkSearchEntry update --- libgimp/gimpprocbrowserdialog.c | 12 ++++++++++ libgimpwidgets/gimpbrowser.c | 28 ++++++++++++++++++++++++ plug-ins/common/plugin-browser.c | 17 +++++++------- plug-ins/filter-browser/filter-browser.c | 11 +++++----- 4 files changed, 54 insertions(+), 14 deletions(-) diff --git a/libgimp/gimpprocbrowserdialog.c b/libgimp/gimpprocbrowserdialog.c index 5cc1ac9877..70c082b287 100644 --- a/libgimp/gimpprocbrowserdialog.c +++ b/libgimp/gimpprocbrowserdialog.c @@ -96,6 +96,8 @@ static void browser_search (GimpBrowser *browser, const gchar *query_text, gint search_type, GimpProcBrowserDialog *dialog); +static void browser_stop_search (GimpBrowser *browser, + GimpProcBrowserDialog *dialog); G_DEFINE_TYPE (GimpProcBrowserDialog, gimp_proc_browser_dialog, GIMP_TYPE_DIALOG) @@ -163,6 +165,9 @@ gimp_proc_browser_dialog_init (GimpProcBrowserDialog *dialog) g_signal_connect (dialog->browser, "search", G_CALLBACK (browser_search), dialog); + g_signal_connect (dialog->browser, "stop-search", + G_CALLBACK (browser_stop_search), + dialog); /* list : list in a scrolled_win */ @@ -509,3 +514,10 @@ browser_search (GimpBrowser *browser, gimp_browser_show_message (browser, _("No matches")); } } + +static void +browser_stop_search (GimpBrowser *browser, + GimpProcBrowserDialog *dialog) +{ + gtk_widget_destroy (GTK_WIDGET (dialog)); +} diff --git a/libgimpwidgets/gimpbrowser.c b/libgimpwidgets/gimpbrowser.c index b5c496c988..e212aadd4b 100644 --- a/libgimpwidgets/gimpbrowser.c +++ b/libgimpwidgets/gimpbrowser.c @@ -50,6 +50,7 @@ enum { SEARCH, + STOP_SEARCH, LAST_SIGNAL }; @@ -79,6 +80,8 @@ static void gimp_browser_combo_changed (GtkComboBox *combo, GimpBrowser *browser); static void gimp_browser_entry_changed (GtkEntry *entry, GimpBrowser *browser); +static void gimp_browser_stop_search (GtkSearchEntry *entry, + GimpBrowser *browser); static gboolean gimp_browser_search_timeout (gpointer data); @@ -105,6 +108,21 @@ gimp_browser_class_init (GimpBrowserClass *klass) G_TYPE_STRING, G_TYPE_INT); + /** + * GimpBrowser::stop-search: + * @browser: the object which received the signal + * + * This signal is emitted when the search operation was stopped by user input. + */ + browser_signals[STOP_SEARCH] = + g_signal_new ("stop-search", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + object_class->dispose = gimp_browser_dispose; } @@ -138,6 +156,9 @@ gimp_browser_init (GimpBrowser *browser) g_signal_connect (browser->search_entry, "changed", G_CALLBACK (gimp_browser_entry_changed), browser); + g_signal_connect (browser->search_entry, "stop-search", + G_CALLBACK (gimp_browser_stop_search), + browser); /* count label */ @@ -409,6 +430,13 @@ gimp_browser_entry_changed (GtkEntry *entry, gimp_browser_queue_search (browser); } +static void +gimp_browser_stop_search (GtkSearchEntry *entry, + GimpBrowser *browser) +{ + g_signal_emit (browser, browser_signals[STOP_SEARCH], 0); +} + static gboolean gimp_browser_search_timeout (gpointer data) { diff --git a/plug-ins/common/plugin-browser.c b/plug-ins/common/plugin-browser.c index b8b0c2041f..728c5f1788 100644 --- a/plug-ins/common/plugin-browser.c +++ b/plug-ins/common/plugin-browser.c @@ -113,9 +113,7 @@ static GimpValueArray * browser_run (GimpProcedure *procedur gpointer run_data); static GtkWidget * browser_dialog_new (void); -static void browser_dialog_response (GtkWidget *widget, - gint response_id, - PluginBrowser *browser); +static void browser_dialog_quit (PluginBrowser *browser); static void browser_list_selection_changed (GtkTreeSelection *selection, PluginBrowser *browser); static void browser_tree_selection_changed (GtkTreeSelection *selection, @@ -563,9 +561,9 @@ browser_dialog_new (void) gtk_window_set_default_size (GTK_WINDOW (browser->dialog), DBL_WIDTH, DBL_HEIGHT); - g_signal_connect (browser->dialog, "response", - G_CALLBACK (browser_dialog_response), - browser); + g_signal_connect_swapped (browser->dialog, "response", + G_CALLBACK (browser_dialog_quit), + browser); browser->browser = gimp_browser_new (); gtk_container_set_border_width (GTK_CONTAINER (browser->browser), 12); @@ -576,6 +574,9 @@ browser_dialog_new (void) g_signal_connect (browser->browser, "search", G_CALLBACK (browser_search), browser); + g_signal_connect_swapped (browser->browser, "stop-search", + G_CALLBACK (browser_dialog_quit), + browser); /* left = notebook */ @@ -728,9 +729,7 @@ browser_dialog_new (void) } static void -browser_dialog_response (GtkWidget *widget, - gint response_id, - PluginBrowser *browser) +browser_dialog_quit (PluginBrowser *browser) { gtk_widget_destroy (browser->dialog); gtk_main_quit (); diff --git a/plug-ins/filter-browser/filter-browser.c b/plug-ins/filter-browser/filter-browser.c index 7217fe007f..c730d0f2be 100644 --- a/plug-ins/filter-browser/filter-browser.c +++ b/plug-ins/filter-browser/filter-browser.c @@ -694,9 +694,7 @@ filter_browser_search (GimpBrowser *gimp_browser, } static void -browser_dialog_response (GtkWidget *widget, - gint response_id, - FilterBrowserPrivate *browser) +browser_dialog_quit (FilterBrowserPrivate *browser) { gtk_widget_destroy (browser->dialog); g_list_free (browser->filters); @@ -733,8 +731,8 @@ filter_browser_run (GimpProcedure *procedure, gtk_window_set_default_size (GTK_WINDOW (browser->dialog), FILTER_BROWSER_WIDTH, FILTER_BROWSER_HEIGHT); - g_signal_connect (browser->dialog, "response", - G_CALLBACK (browser_dialog_response), browser); + g_signal_connect_swapped (browser->dialog, "response", + G_CALLBACK (browser_dialog_quit), browser); browser->browser = gimp_browser_new (); gimp_browser_add_search_types (GIMP_BROWSER (browser->browser), @@ -748,6 +746,9 @@ filter_browser_run (GimpProcedure *procedure, gtk_widget_show (browser->browser); g_signal_connect (browser->browser, "search", G_CALLBACK (filter_browser_search), browser); + g_signal_connect_swapped (browser->browser, "stop-search", + G_CALLBACK (browser_dialog_quit), + browser); scrolled_window = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window), GTK_SHADOW_IN);