summaryrefslogtreecommitdiff
path: root/frontends/gtk
diff options
context:
space:
mode:
Diffstat (limited to 'frontends/gtk')
-rw-r--r--frontends/gtk/compat.h9
-rw-r--r--frontends/gtk/scaffolding.c159
-rw-r--r--frontends/gtk/scaffolding.h9
-rw-r--r--frontends/gtk/search.c350
-rw-r--r--frontends/gtk/search.h44
-rw-r--r--frontends/gtk/toolbar.c4
-rw-r--r--frontends/gtk/window.c29
-rw-r--r--frontends/gtk/window.h13
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 <http://www.gnu.org/licenses/>.
*/
-/** \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 */
@@ -1314,12 +1199,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)
{
if (gs == NULL) {
@@ -1346,26 +1225,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)
{
struct browser_window *bw;
@@ -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 <stdint.h>
#include <ctype.h>
#include <string.h>
@@ -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 <http://www.gnu.org/licenses/>.
*/
-#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 <netsurf-browser.org.MarkBenjamin@dfgh.net>
+ * Copyright 2019 Vincent Sanders <vince@netsurf-browser.org>
*
* 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 <stdlib.h>
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);
@@ -1468,6 +1480,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)
{
return g->bw;
@@ -1490,6 +1509,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)
{
return nsgtk_toolbar_item_activate(gw->toolbar, 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
*
@@ -94,6 +102,11 @@ 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
*
* \param gw The gui window handle