From 90bbe288b60402feb5d3d1b365d38092970d179e Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Tue, 17 Sep 2019 00:48:57 +0100 Subject: move search toolbar to be per tab and move implementation to one place --- frontends/gtk/search.c | 350 ++++++++++++++++++++++++++++++++++++------------- 1 file changed, 256 insertions(+), 94 deletions(-) (limited to 'frontends/gtk/search.c') diff --git a/frontends/gtk/search.c b/frontends/gtk/search.c index 6baf7f6ae..a75dc9474 100644 --- a/frontends/gtk/search.c +++ b/frontends/gtk/search.c @@ -21,6 +21,7 @@ * \file * Free text search (front component) */ + #include #include #include @@ -30,6 +31,7 @@ #include "utils/log.h" #include "utils/messages.h" #include "utils/nsurl.h" +#include "utils/nsoption.h" #include "netsurf/search.h" #include "netsurf/browser_window.h" #include "desktop/search.h" @@ -50,14 +52,14 @@ */ static void nsgtk_search_set_forward_state(bool active, struct gui_window *gw) { - if (gw != NULL && nsgtk_get_browser_window(gw) != NULL) { - struct nsgtk_scaffolding *g = nsgtk_get_scaffold(gw); - gtk_widget_set_sensitive( - GTK_WIDGET(nsgtk_scaffolding_search(g)->buttons[1]), - active); - } + struct gtk_search *search; + + search = nsgtk_window_get_search(gw); + + gtk_widget_set_sensitive(GTK_WIDGET(search->forward), active); } + /** * activate search back button in gui. * @@ -66,137 +68,297 @@ static void nsgtk_search_set_forward_state(bool active, struct gui_window *gw) */ static void nsgtk_search_set_back_state(bool active, struct gui_window *gw) { - if (gw != NULL && nsgtk_get_browser_window(gw) != NULL) { - struct nsgtk_scaffolding *g = nsgtk_get_scaffold(gw); - gtk_widget_set_sensitive(GTK_WIDGET(nsgtk_scaffolding_search( - g)->buttons[0]), active); - } + struct gtk_search *search; + + search = nsgtk_window_get_search(gw); + + gtk_widget_set_sensitive(GTK_WIDGET(search->back), active); } -/** connected to the search forward button */ -gboolean nsgtk_search_forward_button_clicked(GtkWidget *widget, gpointer data) +/** + * connected to the search forward button + */ +static gboolean +nsgtk_search_forward_button_clicked(GtkWidget *widget, gpointer data) { - struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data; - struct gui_window *gw = nsgtk_scaffolding_top_level(g); - struct browser_window *bw = nsgtk_get_browser_window(gw); - - assert(bw); - - search_flags_t flags = SEARCH_FLAG_FORWARDS | - (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( - nsgtk_scaffolding_search(g)->caseSens)) ? - SEARCH_FLAG_CASE_SENSITIVE : 0) | - (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( - nsgtk_scaffolding_search(g)->checkAll)) ? - SEARCH_FLAG_SHOWALL : 0); - - browser_window_search(bw, gw, flags, - gtk_entry_get_text(nsgtk_scaffolding_search(g)->entry)); + struct gtk_search *search; + struct browser_window *bw; + search_flags_t flags; + + search = (struct gtk_search *)data; + + bw = nsgtk_get_browser_window(search->gw); + + flags = SEARCH_FLAG_FORWARDS; + + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(search->caseSens))) { + flags |= SEARCH_FLAG_CASE_SENSITIVE; + } + + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(search->checkAll))) { + flags |= SEARCH_FLAG_SHOWALL; + } + + browser_window_search(bw, search->gw, flags, gtk_entry_get_text(search->entry)); + return TRUE; } -/** connected to the search back button */ - -gboolean nsgtk_search_back_button_clicked(GtkWidget *widget, gpointer data) +/** + * connected to the search back button + */ +static gboolean +nsgtk_search_back_button_clicked(GtkWidget *widget, gpointer data) { - struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data; - struct gui_window *gw = nsgtk_scaffolding_top_level(g); - struct browser_window *bw = nsgtk_get_browser_window(gw); - - assert(bw); - - search_flags_t flags = 0 |(gtk_toggle_button_get_active( - GTK_TOGGLE_BUTTON( - nsgtk_scaffolding_search(g)->caseSens)) ? - SEARCH_FLAG_CASE_SENSITIVE : 0) | - (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( - nsgtk_scaffolding_search(g)->checkAll)) ? - SEARCH_FLAG_SHOWALL : 0); - - browser_window_search(bw, gw, flags, - gtk_entry_get_text(nsgtk_scaffolding_search(g)->entry)); + struct gtk_search *search; + struct browser_window *bw; + search_flags_t flags; + + search = (struct gtk_search *)data; + + bw = nsgtk_get_browser_window(search->gw); + + flags = 0; + + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(search->caseSens))) { + flags |= SEARCH_FLAG_CASE_SENSITIVE; + } + + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(search->checkAll))) { + flags |= SEARCH_FLAG_SHOWALL; + } + + browser_window_search(bw, search->gw, flags, gtk_entry_get_text(search->entry)); + return TRUE; } -/** connected to the search close button */ - -gboolean nsgtk_search_close_button_clicked(GtkWidget *widget, gpointer data) +/** + * connected to the search close button + */ +static gboolean +nsgtk_search_close_button_clicked(GtkWidget *widget, gpointer data) { - struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data; - nsgtk_scaffolding_toggle_search_bar_visibility(g); - return TRUE; + struct gtk_search *search; + + search = (struct gtk_search *)data; + + nsgtk_search_toggle_visibility(search); + + return TRUE; } -/** connected to the search entry [typing] */ -gboolean nsgtk_search_entry_changed(GtkWidget *widget, gpointer data) +/** + * connected to the search entry [typing] + */ +static gboolean nsgtk_search_entry_changed(GtkWidget *widget, gpointer data) { - struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data; - struct gui_window *gw = nsgtk_scaffolding_top_level(g); - struct browser_window *bw = nsgtk_get_browser_window(gw); + struct gtk_search *search; + struct browser_window *bw; search_flags_t flags; - assert(bw != NULL); + search = (struct gtk_search *)data; - nsgtk_search_set_forward_state(true, gw); - nsgtk_search_set_back_state(true, gw); + nsgtk_search_set_forward_state(true, search->gw); + nsgtk_search_set_back_state(true, search->gw); - flags = SEARCH_FLAG_FORWARDS | - (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( - nsgtk_scaffolding_search(g)->caseSens)) ? - SEARCH_FLAG_CASE_SENSITIVE : 0) | - (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( - nsgtk_scaffolding_search(g)->checkAll)) ? - SEARCH_FLAG_SHOWALL : 0); + bw = nsgtk_get_browser_window(search->gw); + + flags = SEARCH_FLAG_FORWARDS; + + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(search->caseSens))) { + flags |= SEARCH_FLAG_CASE_SENSITIVE; + } + + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(search->checkAll))) { + flags |= SEARCH_FLAG_SHOWALL; + } + + browser_window_search(bw, search->gw, flags, gtk_entry_get_text(search->entry)); - browser_window_search(bw, gw, flags, - gtk_entry_get_text(nsgtk_scaffolding_search(g)->entry)); return TRUE; } -/** connected to the search entry [return key] */ - -gboolean nsgtk_search_entry_activate(GtkWidget *widget, gpointer data) +/** + * connected to the search entry [return key] + */ +static gboolean nsgtk_search_entry_activate(GtkWidget *widget, gpointer data) { - struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data; - struct gui_window *gw = nsgtk_scaffolding_top_level(g); - struct browser_window *bw = nsgtk_get_browser_window(gw); + struct gtk_search *search; + struct browser_window *bw; search_flags_t flags; - assert(bw); + search = (struct gtk_search *)data; + + nsgtk_search_set_forward_state(true, search->gw); + nsgtk_search_set_back_state(true, search->gw); + + bw = nsgtk_get_browser_window(search->gw); - flags = SEARCH_FLAG_FORWARDS | - (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( - nsgtk_scaffolding_search(g)->caseSens)) ? - SEARCH_FLAG_CASE_SENSITIVE : 0) | - (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( - nsgtk_scaffolding_search(g)->checkAll)) ? - SEARCH_FLAG_SHOWALL : 0); + flags = SEARCH_FLAG_FORWARDS; + + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(search->caseSens))) { + flags |= SEARCH_FLAG_CASE_SENSITIVE; + } + + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(search->checkAll))) { + flags |= SEARCH_FLAG_SHOWALL; + } + + browser_window_search(bw, search->gw, flags, gtk_entry_get_text(search->entry)); - browser_window_search(bw, gw, flags, - gtk_entry_get_text(nsgtk_scaffolding_search(g)->entry)); return FALSE; } -/** allows escape key to close search bar too */ - -gboolean +/** + * allows escape key to close search bar too + */ +static gboolean nsgtk_search_entry_key(GtkWidget *widget, GdkEventKey *event, gpointer data) { if (event->keyval == GDK_KEY(Escape)) { - struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data; - nsgtk_scaffolding_toggle_search_bar_visibility(g); + struct gtk_search *search; + search = (struct gtk_search *)data; + + nsgtk_search_toggle_visibility(search); } return FALSE; } - - static struct gui_search_table search_table = { .forward_state = (void *)nsgtk_search_set_forward_state, .back_state = (void *)nsgtk_search_set_back_state, }; struct gui_search_table *nsgtk_search_table = &search_table; + + +/* exported interface documented in gtk/scaffolding.h */ +nserror nsgtk_search_toggle_visibility(struct gtk_search *search) +{ + gboolean vis; + + g_object_get(G_OBJECT(search->bar), "visible", &vis, NULL); + if (vis) { + browser_window_search_clear(nsgtk_get_browser_window(search->gw)); + + gtk_widget_hide(GTK_WIDGET(search->bar)); + } else { + gtk_widget_show(GTK_WIDGET(search->bar)); + gtk_widget_grab_focus(GTK_WIDGET(search->entry)); + } + + return NSERROR_OK; +} + + +/* exported interface documented in gtk/search.h */ +nserror nsgtk_search_restyle(struct gtk_search *search) +{ + switch (nsoption_int(button_type)) { + + case 1: /* Small icons */ + gtk_toolbar_set_style(GTK_TOOLBAR(search->bar), + GTK_TOOLBAR_ICONS); + gtk_toolbar_set_icon_size(GTK_TOOLBAR(search->bar), + GTK_ICON_SIZE_SMALL_TOOLBAR); + break; + + case 2: /* Large icons */ + gtk_toolbar_set_style(GTK_TOOLBAR(search->bar), + GTK_TOOLBAR_ICONS); + gtk_toolbar_set_icon_size(GTK_TOOLBAR(search->bar), + GTK_ICON_SIZE_LARGE_TOOLBAR); + break; + + case 3: /* Large icons with text */ + gtk_toolbar_set_style(GTK_TOOLBAR(search->bar), + GTK_TOOLBAR_BOTH); + gtk_toolbar_set_icon_size(GTK_TOOLBAR(search->bar), + GTK_ICON_SIZE_LARGE_TOOLBAR); + break; + + case 4: /* Text icons only */ + gtk_toolbar_set_style(GTK_TOOLBAR(search->bar), + GTK_TOOLBAR_TEXT); + default: + break; + } + return NSERROR_OK; +} + + +/* exported interface documented in gtk/search.h */ +nserror +nsgtk_search_create(GtkBuilder *builder, + struct gtk_search **search_out, + struct gui_window *gw) +{ + struct gtk_search *search; + + search = malloc(sizeof(struct gtk_search)); + if (search == NULL) { + return NSERROR_NOMEM; + } + + search->gw = gw; + + search->bar = GTK_TOOLBAR(gtk_builder_get_object(builder, + "searchbar")); + search->entry = GTK_ENTRY(gtk_builder_get_object(builder, + "searchEntry")); + search->back = GTK_TOOL_BUTTON(gtk_builder_get_object(builder, + "searchBackButton")); + search->forward = GTK_TOOL_BUTTON(gtk_builder_get_object(builder, + "searchForwardButton")); + search->close = GTK_TOOL_BUTTON(gtk_builder_get_object(builder, + "closeSearchButton")); + search->checkAll = GTK_CHECK_BUTTON(gtk_builder_get_object(builder, + "checkAllSearch")); + search->caseSens = GTK_CHECK_BUTTON(gtk_builder_get_object(builder, + "caseSensButton")); + + g_signal_connect(search->forward, + "clicked", + G_CALLBACK(nsgtk_search_forward_button_clicked), + search); + + g_signal_connect(search->back, + "clicked", + G_CALLBACK(nsgtk_search_back_button_clicked), + search); + + g_signal_connect(search->entry, + "changed", + G_CALLBACK(nsgtk_search_entry_changed), + search); + + g_signal_connect(search->entry, + "activate", + G_CALLBACK(nsgtk_search_entry_activate), + search); + + g_signal_connect(search->entry, + "key-press-event", + G_CALLBACK(nsgtk_search_entry_key), + search); + + g_signal_connect(search->close, + "clicked", + G_CALLBACK(nsgtk_search_close_button_clicked), + search); + + g_signal_connect(search->caseSens, + "toggled", + G_CALLBACK(nsgtk_search_entry_changed), + search); + + nsgtk_search_restyle(search); + + *search_out = search; + + return NSERROR_OK; +} -- cgit v1.2.3