move search toolbar to be per tab and move implementation to one place
This commit is contained in:
parent
9bbc7eb9cb
commit
a20fe23ce6
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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.
|
||||
*
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
*
|
||||
|
|
Loading…
Reference in New Issue