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/compat.h | 9 +- frontends/gtk/scaffolding.c | 159 +------------------- frontends/gtk/scaffolding.h | 9 -- frontends/gtk/search.c | 350 ++++++++++++++++++++++++++++++++------------ frontends/gtk/search.h | 44 ++++-- frontends/gtk/toolbar.c | 4 +- frontends/gtk/window.c | 29 +++- frontends/gtk/window.h | 13 ++ 8 files changed, 337 insertions(+), 280 deletions(-) diff --git a/frontends/gtk/compat.h b/frontends/gtk/compat.h index 8ef2ed505..3b2f55094 100644 --- a/frontends/gtk/compat.h +++ b/frontends/gtk/compat.h @@ -16,7 +16,8 @@ * along with this program. If not, see . */ -/** \file +/** + * \file * Compatibility functions for older GTK versions (interface) */ @@ -40,9 +41,6 @@ #define NSGTK_STOCK_CANCEL "_Cancel" #define NSGTK_STOCK_CLEAR "edit-clear" #define NSGTK_STOCK_CLOSE "window-close" -#define NSGTK_STOCK_FIND "edit-find" -#define NSGTK_STOCK_GO_BACK "go-previous" -#define NSGTK_STOCK_GO_FORWARD "go-next" #define NSGTK_STOCK_HOME "go-home" #define NSGTK_STOCK_INFO "dialog-information" #define NSGTK_STOCK_REFRESH "view-refresh" @@ -57,9 +55,6 @@ #define NSGTK_STOCK_CANCEL GTK_STOCK_CANCEL #define NSGTK_STOCK_CLEAR GTK_STOCK_CLEAR #define NSGTK_STOCK_CLOSE GTK_STOCK_CLOSE -#define NSGTK_STOCK_FIND GTK_STOCK_FIND -#define NSGTK_STOCK_GO_BACK GTK_STOCK_GO_BACK -#define NSGTK_STOCK_GO_FORWARD GTK_STOCK_GO_FORWARD #define NSGTK_STOCK_HOME GTK_STOCK_HOME #define NSGTK_STOCK_INFO GTK_STOCK_INFO #define NSGTK_STOCK_REFRESH GTK_STOCK_REFRESH diff --git a/frontends/gtk/scaffolding.c b/frontends/gtk/scaffolding.c index f0b4f9ba5..b86b9147d 100644 --- a/frontends/gtk/scaffolding.c +++ b/frontends/gtk/scaffolding.c @@ -27,7 +27,6 @@ #include "netsurf/browser_window.h" #include "desktop/browser_history.h" #include "desktop/hotlist.h" -#include "desktop/search.h" #include "gtk/compat.h" #include "gtk/warn.h" @@ -40,7 +39,6 @@ #include "gtk/window.h" #include "gtk/completion.h" #include "gtk/tabs.h" -#include "gtk/search.h" #include "gtk/resources.h" #include "gtk/scaffolding.h" @@ -76,9 +74,6 @@ struct nsgtk_scaffolding { /** tab widget holding displayed pages */ GtkNotebook *notebook; - /** In page text search context */ - struct gtk_search *search; - /** menu bar hierarchy */ struct nsgtk_bar_submenu *menu_bar; @@ -591,7 +586,8 @@ static gboolean nsgtk_on_find_activate_menu(GtkMenuItem *widget, gpointer data) { struct nsgtk_scaffolding *g = (struct nsgtk_scaffolding *)data; - nsgtk_scaffolding_toggle_search_bar_visibility(g); + nsgtk_window_search_toggle(g->top_level); + return TRUE; } @@ -1081,7 +1077,7 @@ static nserror nsgtk_menus_create(struct nsgtk_scaffolding *gs) gs->menu_bar = nsgtk_menu_bar_create(menushell, group); - /* toolbar URL bar menu bar search bar signal handlers */ + /* toolbar URL bar menu bar signal handlers */ g_signal_connect(gs->menu_bar->edit_submenu->edit, "show", G_CALLBACK(nsgtk_window_edit_menu_shown), @@ -1109,119 +1105,8 @@ static nserror nsgtk_menus_create(struct nsgtk_scaffolding *gs) } -/** - * update search toolbar size and style - */ -static nserror nsgtk_search_update(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; -} - -/** - * create text search context - */ -static nserror -nsgtk_search_create(GtkBuilder *builder, struct gtk_search **search_out) -{ - struct gtk_search *search; - - search = malloc(sizeof(struct gtk_search)); - if (search == NULL) { - return NSERROR_NOMEM; - } - - search->bar = GTK_TOOLBAR(gtk_builder_get_object(builder, "searchbar")); - search->entry = GTK_ENTRY(gtk_builder_get_object(builder,"searchEntry")); - - search->buttons[0] = GTK_TOOL_BUTTON(gtk_builder_get_object( - builder,"searchBackButton")); - search->buttons[1] = GTK_TOOL_BUTTON(gtk_builder_get_object( - builder,"searchForwardButton")); - search->buttons[2] = 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")); - - nsgtk_search_update(search); - - *search_out = search; - - return NSERROR_OK; -} - -/** - * connect signals to search bar - */ -static nserror nsgtk_search_connect_signals(struct nsgtk_scaffolding *gs) -{ - g_signal_connect(gs->search->buttons[1], - "clicked", - G_CALLBACK(nsgtk_search_forward_button_clicked), - gs); - - g_signal_connect(gs->search->buttons[0], - "clicked", - G_CALLBACK(nsgtk_search_back_button_clicked), - gs); - g_signal_connect(gs->search->entry, - "changed", - G_CALLBACK(nsgtk_search_entry_changed), - gs); - g_signal_connect(gs->search->entry, - "activate", - G_CALLBACK(nsgtk_search_entry_activate), - gs); - - g_signal_connect(gs->search->entry, - "key-press-event", - G_CALLBACK(nsgtk_search_entry_key), - gs); - - g_signal_connect(gs->search->buttons[2], - "clicked", - G_CALLBACK(nsgtk_search_close_button_clicked), - gs); - - g_signal_connect(gs->search->caseSens, - "toggled", - G_CALLBACK(nsgtk_search_entry_changed), - gs); - - return NSERROR_OK; -} /* exported function documented in gtk/scaffolding.h */ @@ -1313,12 +1198,6 @@ GtkWidget *nsgtk_scaffolding_urlbar(struct nsgtk_scaffolding *g) } -/* exported interface documented in gtk/scaffolding.h */ -struct gtk_search *nsgtk_scaffolding_search(struct nsgtk_scaffolding *g) -{ - return g->search; -} - /* exported interface documented in gtk/scaffolding.h */ GtkMenuBar *nsgtk_scaffolding_menu_bar(struct nsgtk_scaffolding *gs) { @@ -1345,26 +1224,6 @@ struct gui_window *nsgtk_scaffolding_top_level(struct nsgtk_scaffolding *g) } -/* exported interface documented in gtk/scaffolding.h */ -void nsgtk_scaffolding_toggle_search_bar_visibility(struct nsgtk_scaffolding *g) -{ - gboolean vis; - struct browser_window *bw = nsgtk_get_browser_window(g->top_level); - - g_object_get(G_OBJECT(g->search->bar), "visible", &vis, NULL); - if (vis) { - if (bw != NULL) { - browser_window_search_clear(bw); - } - - gtk_widget_hide(GTK_WIDGET(g->search->bar)); - } else { - gtk_widget_show(GTK_WIDGET(g->search->bar)); - gtk_widget_grab_focus(GTK_WIDGET(g->search->entry)); - } -} - - /* exported interface documented in gtk/scaffolding.h */ void nsgtk_scaffolding_set_top_level(struct gui_window *gw) { @@ -1387,9 +1246,6 @@ void nsgtk_scaffolding_set_top_level(struct gui_window *gw) /* Synchronise the history (will also update the URL bar) */ scaffolding_update_context(sc); - /* clear effects of potential searches */ - browser_window_search_clear(bw); - /* Ensure the window's title bar is updated */ nsgtk_scaffolding_set_title(gw, browser_window_get_title(bw)); } @@ -1589,15 +1445,6 @@ struct nsgtk_scaffolding *nsgtk_new_scaffolding(struct gui_window *toplevel) gs); - /* local page text search */ - res = nsgtk_search_create(gs->builder, &gs->search); - if (res != NSERROR_OK) { - free(gs); - return NULL; - } - - nsgtk_search_connect_signals(gs); - res = nsgtk_menus_create(gs); if (res != NSERROR_OK) { free(gs); diff --git a/frontends/gtk/scaffolding.h b/frontends/gtk/scaffolding.h index 28fa6ec25..c30c58534 100644 --- a/frontends/gtk/scaffolding.h +++ b/frontends/gtk/scaffolding.h @@ -29,15 +29,6 @@ struct gui_search_web_table; struct nsurl; -struct gtk_search { - GtkToolbar *bar; - GtkEntry *entry; - GtkToolButton *buttons[3]; /* back, forward, */ - GtkCheckButton *checkAll; - GtkCheckButton *caseSens; -}; - - /** * create a new scaffolding for a window. * 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; +} diff --git a/frontends/gtk/search.h b/frontends/gtk/search.h index 716a60d9e..b242c86ea 100644 --- a/frontends/gtk/search.h +++ b/frontends/gtk/search.h @@ -16,25 +16,47 @@ * along with this program. If not, see . */ -#ifndef _NETSURF_GTK_SEARCH_H_ -#define _NETSURF_GTK_SEARCH_H_ - /** * \file * free text page search for gtk interfaces */ +#ifndef NETSURF_GTK_SEARCH_H_ +#define NETSURF_GTK_SEARCH_H_ + extern struct gui_search_table *nsgtk_search_table; struct nsgtk_scaffolding; -void nsgtk_search_bar_toggle_visibility(struct nsgtk_scaffolding * g); -gboolean nsgtk_search_entry_changed(GtkWidget *widget, gpointer data); -gboolean nsgtk_search_entry_activate(GtkWidget *widget, gpointer data); -gboolean nsgtk_search_entry_key(GtkWidget *widget, GdkEventKey *event, gpointer data); -gboolean nsgtk_search_forward_button_clicked(GtkWidget *widget, gpointer data); -gboolean nsgtk_search_back_button_clicked(GtkWidget *widget, gpointer data); -gboolean nsgtk_search_close_button_clicked(GtkWidget *widget, gpointer data); +struct gtk_search { + GtkToolbar *bar; + GtkEntry *entry; + GtkToolButton *back; + GtkToolButton *forward; + GtkToolButton *close; + GtkCheckButton *checkAll; + GtkCheckButton *caseSens; + + struct gui_window *gw; +}; + +/** + * create text search context + * + * \param builder the gtk builder containing the search toolbar + * \param search_out search context result + * \return NSERROR_OK and search_out updated + */ +nserror nsgtk_search_create(GtkBuilder *builder, struct gtk_search **search_out, struct gui_window *gw); + +/** + * update search toolbar size and style + */ +nserror nsgtk_search_restyle(struct gtk_search *search); + +/** + * toggle search bar visibility + */ +nserror nsgtk_search_toggle_visibility(struct gtk_search *search); - #endif diff --git a/frontends/gtk/toolbar.c b/frontends/gtk/toolbar.c index 8d6c09281..0d868a0ba 100644 --- a/frontends/gtk/toolbar.c +++ b/frontends/gtk/toolbar.c @@ -1,5 +1,5 @@ /* - * Copyright 2009 Mark Benjamin + * Copyright 2019 Vincent Sanders * * This file is part of NetSurf, http://www.netsurf-browser.org/ * @@ -18,7 +18,7 @@ /** * \file - * implementatio of toolbar to control browsing context + * implementation of toolbar to control browsing context */ #include diff --git a/frontends/gtk/window.c b/frontends/gtk/window.c index 647f15fcb..a8badc488 100644 --- a/frontends/gtk/window.c +++ b/frontends/gtk/window.c @@ -62,6 +62,7 @@ #include "gtk/bitmap.h" #include "gtk/gdk.h" #include "gtk/resources.h" +#include "gtk/search.h" #include "gtk/window.h" static GtkWidget *select_menu; @@ -99,6 +100,9 @@ struct gui_window { /** controls toolbar context */ struct nsgtk_toolbar *toolbar; + /** search toolbar context */ + struct gtk_search *search; + /** The top level container (tabBox) */ GtkWidget *container; @@ -779,6 +783,7 @@ gui_window_create(struct browser_window *bw, g->input_method = gtk_im_multicontext_new(); + /* create toolbar */ res = nsgtk_toolbar_create(tab_builder, bw_from_gw, g, &g->toolbar); if (res != NSERROR_OK) { free(g); @@ -786,6 +791,13 @@ gui_window_create(struct browser_window *bw, return NULL; } + /* local page text search toolbar */ + res = nsgtk_search_create(tab_builder, &g->search, g); + if (res != NSERROR_OK) { + free(g); + g_object_unref(tab_builder); + return NULL; + } /* set a default favicon */ g_object_ref(favicon_pixbuf); @@ -1467,6 +1479,13 @@ struct nsgtk_scaffolding *nsgtk_get_scaffold(struct gui_window *g) } +/* exported interface documented in window.h */ +struct gtk_search *nsgtk_window_get_search(struct gui_window *gw) +{ + return gw->search; +} + + /* exported interface documented in window.h */ struct browser_window *nsgtk_get_browser_window(struct gui_window *g) { @@ -1488,6 +1507,14 @@ GtkLayout *nsgtk_window_get_layout(struct gui_window *g) } +/* exported interface documented in window.h */ +nserror +nsgtk_window_search_toggle(struct gui_window *gw) +{ + return nsgtk_search_toggle_visibility(gw->search); +} + + /* exported interface documented in window.h */ nserror nsgtk_window_item_activate(struct gui_window *gw, nsgtk_toolbar_button itemid) @@ -1511,7 +1538,7 @@ nserror nsgtk_window_update_all(void) for (gw = window_list; gw != NULL; gw = gw->next) { nsgtk_tab_options_changed(nsgtk_scaffolding_notebook(gw->scaffold)); nsgtk_toolbar_restyle(gw->toolbar); - /** \todo update search bar */ + nsgtk_search_restyle(gw->search); browser_window_schedule_reformat(gw->bw); } return NSERROR_OK; diff --git a/frontends/gtk/window.h b/frontends/gtk/window.h index 9d8d16e8b..69b1cdc68 100644 --- a/frontends/gtk/window.h +++ b/frontends/gtk/window.h @@ -85,6 +85,14 @@ void nsgtk_window_destroy_browser(struct gui_window *gw); */ unsigned long nsgtk_window_get_signalhandler(struct gui_window *gw, int i); + +/** + * toggle search visibility + * + * \param gw gui window handle + */ +nserror nsgtk_window_search_toggle(struct gui_window *gw); + /** * get gtk layout from gui handle * @@ -93,6 +101,11 @@ unsigned long nsgtk_window_get_signalhandler(struct gui_window *gw, int i); GtkLayout *nsgtk_window_get_layout(struct gui_window *gw); +/** + * get search from window handle + */ +struct gtk_search *nsgtk_window_get_search(struct gui_window *gw); + /** * activate the handler for a item in a toolbar of a gui window * -- cgit v1.2.3