move search toolbar to be per tab and move implementation to one place

This commit is contained in:
Vincent Sanders 2019-09-17 00:48:57 +01:00 committed by Daniel Silverstone
parent 9bbc7eb9cb
commit a20fe23ce6
8 changed files with 345 additions and 288 deletions

View File

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

View File

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

View File

@ -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.
*

View File

@ -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
*/
static gboolean
nsgtk_search_forward_button_clicked(GtkWidget *widget, gpointer data)
{
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;
}
}
/** connected to the search forward button */
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(search->checkAll))) {
flags |= SEARCH_FLAG_SHOWALL;
}
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);
browser_window_search(bw, search->gw, flags, gtk_entry_get_text(search->entry));
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));
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));
return TRUE;
}
/** connected to the search close button */
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;
}
/** connected to the search entry [typing] */
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);
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 = 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));
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 close button
*/
static gboolean
nsgtk_search_close_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);
struct gtk_search *search;
search = (struct gtk_search *)data;
nsgtk_search_toggle_visibility(search);
return TRUE;
}
/**
* connected to the search entry [typing]
*/
static gboolean nsgtk_search_entry_changed(GtkWidget *widget, gpointer data)
{
struct gtk_search *search;
struct browser_window *bw;
search_flags_t flags;
assert(bw);
search = (struct gtk_search *)data;
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);
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;
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 entry [return key]
*/
static gboolean nsgtk_search_entry_activate(GtkWidget *widget, gpointer data)
{
struct gtk_search *search;
struct browser_window *bw;
search_flags_t flags;
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;
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;
}

View File

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

View File

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

View File

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

View File

@ -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
*