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
This commit is contained in:
Gabriele Barbero 2025-11-08 23:53:14 +01:00
parent 24a69df9ab
commit 08abaa721a
4 changed files with 54 additions and 14 deletions

View file

@ -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));
}

View file

@ -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)
{

View file

@ -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 ();

View file

@ -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);