Sharing code for the "Find" dialog in both surfer(1) and helper(1)

This commit is contained in:
Pierre Pronchery 2013-12-15 06:51:35 +01:00
parent 30e13017d6
commit 87e1811123
10 changed files with 166 additions and 100 deletions

View File

@ -63,6 +63,7 @@ dist:
$(PACKAGE)-$(VERSION)/src/project.conf \
$(PACKAGE)-$(VERSION)/src/common/Makefile \
$(PACKAGE)-$(VERSION)/src/common/conn.c \
$(PACKAGE)-$(VERSION)/src/common/find.c \
$(PACKAGE)-$(VERSION)/src/common/history.c \
$(PACKAGE)-$(VERSION)/src/common/url.c \
$(PACKAGE)-$(VERSION)/src/common/project.conf \

View File

@ -1,5 +1,6 @@
../src/callbacks.c
../src/common/conn.c
../src/common/find.c
../src/download.c
../src/ghtml-gtkhtml.c
../src/ghtml-webkit.c

View File

@ -38,7 +38,7 @@ surfer: $(surfer_OBJS)
download.o: download.c download.h ../config.h
$(CC) -D WITH_MAIN $(download_CFLAGS) -c download.c
surfer.o: surfer.c callbacks.h download.c download.h surfer.h ../config.h
surfer.o: surfer.c callbacks.h common/find.c download.c download.h surfer.h ../config.h
$(CC) $(surfer_CFLAGS) -c surfer.c
ghtml.o: ghtml.c ghtml.h ghtml-gtkhtml.c ghtml-gtkmozembed.c ghtml-gtktextview.c ghtml-webkit.c common/conn.c common/history.c common/url.c ../config.h

111
src/common/find.c Normal file
View File

@ -0,0 +1,111 @@
/* $Id$ */
/* Copyright (c) 2013 Pierre Pronchery <khorben@defora.org> */
/* This file is part of DeforaOS Desktop Surfer */
/* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. */
/* surfer_find */
static void _find_dialog(Surfer * surfer);
static void _on_find_activate(GtkWidget * widget, gpointer data);
static void _on_find_response(GtkWidget * widget, gint response, gpointer data);
void surfer_find(Surfer * surfer, char const * text)
{
if(surfer->fi_dialog == NULL)
_find_dialog(surfer);
gtk_widget_grab_focus(surfer->fi_text);
if(text != NULL)
gtk_entry_set_text(GTK_ENTRY(surfer->fi_text), text);
gtk_window_present(GTK_WINDOW(surfer->fi_dialog));
}
static void _find_dialog(Surfer * surfer)
{
GtkWidget * vbox;
GtkWidget * hbox;
GtkWidget * widget;
surfer->fi_dialog = gtk_dialog_new_with_buttons(_("Find text"),
GTK_WINDOW(surfer->window),
GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
GTK_STOCK_FIND, GTK_RESPONSE_ACCEPT, NULL);
#if GTK_CHECK_VERSION(2, 14, 0)
vbox = gtk_dialog_get_content_area(GTK_DIALOG(surfer->fi_dialog));
#else
vbox = GTK_DIALOG(surfer->fi_dialog)->vbox;
#endif
/* text */
hbox = gtk_hbox_new(FALSE, 0);
widget = gtk_label_new(_("Text:"));
gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, TRUE, 0);
surfer->fi_text = gtk_entry_new();
g_signal_connect(G_OBJECT(surfer->fi_text), "activate", G_CALLBACK(
_on_find_activate), surfer);
gtk_box_pack_start(GTK_BOX(hbox), surfer->fi_text, TRUE, TRUE, 4);
gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 4);
/* case-sensitive */
surfer->fi_case = gtk_check_button_new_with_label(_("Case-sensitive"));
gtk_box_pack_start(GTK_BOX(vbox), surfer->fi_case, TRUE, TRUE, 4);
/* search backwards */
surfer->fi_back = gtk_check_button_new_with_label(
_("Search backwards"));
gtk_box_pack_start(GTK_BOX(vbox), surfer->fi_back, TRUE, TRUE, 4);
/* wrap */
surfer->fi_wrap = gtk_check_button_new_with_label(_("Wrap"));
gtk_box_pack_start(GTK_BOX(vbox), surfer->fi_wrap, TRUE, TRUE, 4);
gtk_widget_show_all(vbox);
g_signal_connect(G_OBJECT(surfer->fi_dialog), "response", G_CALLBACK(
_on_find_response), surfer);
}
static void _on_find_activate(GtkWidget * widget, gpointer data)
{
Surfer * surfer = data;
GtkWidget * view;
char const * text;
gboolean sensitive;
gboolean backwards;
gboolean wrap;
if((view = surfer_get_view(surfer)) == NULL)
return;
if((text = gtk_entry_get_text(GTK_ENTRY(widget))) == NULL
|| strlen(text) == 0)
return;
sensitive = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
surfer->fi_case));
backwards = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
surfer->fi_back));
wrap = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
surfer->fi_wrap));
if(ghtml_find(view, text, sensitive, backwards, wrap) == TRUE)
return;
/* FIXME display this error on top of the text search box instead */
surfer_error(surfer, _("Text not found"), 0);
}
static void _on_find_response(GtkWidget * widget, gint response, gpointer data)
{
Surfer * surfer = data;
if(response != GTK_RESPONSE_ACCEPT)
{
gtk_widget_hide(widget);
if(response == GTK_RESPONSE_DELETE_EVENT)
surfer->fi_dialog = NULL;
return;
}
_on_find_activate(surfer->fi_text, surfer);
}

View File

@ -1 +1 @@
dist=Makefile,conn.c,history.c,url.c
dist=Makefile,conn.c,find.c,history.c,url.c

View File

@ -52,4 +52,4 @@ cppflags=-D PREFIX=\"$(PREFIX)\"
depends=surfer.h,../config.h
[surfer.c]
depends=callbacks.h,download.c,download.h,surfer.h,../config.h
depends=callbacks.h,common/find.c,download.c,download.h,surfer.h,../config.h

View File

@ -1123,100 +1123,7 @@ int surfer_error(Surfer * surfer, char const * message, int ret)
}
/* surfer_find */
static void _find_dialog(Surfer * surfer);
static void _on_find_activate(GtkWidget * widget, gpointer data);
static void _on_find_response(GtkWidget * widget, gint response, gpointer data);
void surfer_find(Surfer * surfer, char const * text)
{
if(surfer->fi_dialog == NULL)
_find_dialog(surfer);
gtk_widget_grab_focus(surfer->fi_text);
if(text != NULL)
gtk_entry_set_text(GTK_ENTRY(surfer->fi_text), text);
gtk_window_present(GTK_WINDOW(surfer->fi_dialog));
}
static void _find_dialog(Surfer * surfer)
{
GtkWidget * vbox;
GtkWidget * hbox;
GtkWidget * widget;
surfer->fi_dialog = gtk_dialog_new_with_buttons(_("Find text"),
GTK_WINDOW(surfer->window),
GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
GTK_STOCK_FIND, GTK_RESPONSE_ACCEPT, NULL);
#if GTK_CHECK_VERSION(2, 14, 0)
vbox = gtk_dialog_get_content_area(GTK_DIALOG(surfer->fi_dialog));
#else
vbox = GTK_DIALOG(surfer->fi_dialog)->vbox;
#endif
/* text */
hbox = gtk_hbox_new(FALSE, 0);
widget = gtk_label_new(_("Text:"));
gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, TRUE, 0);
surfer->fi_text = gtk_entry_new();
g_signal_connect(G_OBJECT(surfer->fi_text), "activate", G_CALLBACK(
_on_find_activate), surfer);
gtk_box_pack_start(GTK_BOX(hbox), surfer->fi_text, TRUE, TRUE, 4);
gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 4);
/* case-sensitive */
surfer->fi_case = gtk_check_button_new_with_label(_("Case-sensitive"));
gtk_box_pack_start(GTK_BOX(vbox), surfer->fi_case, TRUE, TRUE, 4);
/* search backwards */
surfer->fi_back = gtk_check_button_new_with_label(
_("Search backwards"));
gtk_box_pack_start(GTK_BOX(vbox), surfer->fi_back, TRUE, TRUE, 4);
/* wrap */
surfer->fi_wrap = gtk_check_button_new_with_label(_("Wrap"));
gtk_box_pack_start(GTK_BOX(vbox), surfer->fi_wrap, TRUE, TRUE, 4);
gtk_widget_show_all(vbox);
g_signal_connect(G_OBJECT(surfer->fi_dialog), "response", G_CALLBACK(
_on_find_response), surfer);
}
static void _on_find_activate(GtkWidget * widget, gpointer data)
{
Surfer * surfer = data;
GtkWidget * view;
char const * text;
gboolean sensitive;
gboolean backwards;
gboolean wrap;
if((view = surfer_get_view(surfer)) == NULL)
return;
if((text = gtk_entry_get_text(GTK_ENTRY(widget))) == NULL
|| strlen(text) == 0)
return;
sensitive = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
surfer->fi_case));
backwards = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
surfer->fi_back));
wrap = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
surfer->fi_wrap));
if(ghtml_find(view, text, sensitive, backwards, wrap) == TRUE)
return;
/* FIXME display this error on top of the text search box instead */
surfer_error(surfer, _("Text not found"), 0);
}
static void _on_find_response(GtkWidget * widget, gint response, gpointer data)
{
Surfer * surfer = data;
if(response != GTK_RESPONSE_ACCEPT)
{
gtk_widget_hide(widget);
if(response == GTK_RESPONSE_DELETE_EVENT)
surfer->fi_dialog = NULL;
return;
}
_on_find_activate(surfer->fi_text, surfer);
}
#include "common/find.c"
/* surfer_go_back */

View File

@ -24,7 +24,7 @@ helper_LDFLAGS = $(LDFLAGSF) $(LDFLAGS) `pkg-config --libs libDesktop webkit-1.0
helper: $(helper_OBJS) ../src/ghtml.o
$(CC) -o helper $(helper_OBJS) $(helper_LDFLAGS)
helper.o: helper.c ../src/ghtml.c ../src/surfer.h ../config.h
helper.o: helper.c ../src/common/find.c ../src/ghtml.c ../src/surfer.h ../config.h
$(CC) $(helper_CFLAGS) -c helper.c
clean:

View File

@ -69,6 +69,15 @@ struct _Surfer
GtkWidget * manual;
GtkWidget * view;
GtkToolItem * tb_fullscreen;
/* find */
GtkWidget * fi_dialog;
GtkWidget * fi_text;
GtkWidget * fi_case;
GtkWidget * fi_back;
GtkWidget * fi_wrap;
/* about */
GtkWidget * ab_window;
};
@ -89,9 +98,13 @@ static int _usage(void);
/* callbacks */
static void _helper_on_close(gpointer data);
#ifdef EMBEDDED
static void _helper_on_find(gpointer data);
#endif
static gboolean _helper_on_closex(gpointer data);
#ifndef EMBEDDED
static void _helper_on_edit_copy(gpointer data);
static void _helper_on_edit_find(gpointer data);
static void _helper_on_edit_select_all(gpointer data);
static void _helper_on_file_close(gpointer data);
static void _helper_on_file_open(gpointer data);
@ -124,6 +137,7 @@ static char const * _authors[] =
static const DesktopAccel _helper_accel[] =
{
{ G_CALLBACK(_helper_on_close), GDK_CONTROL_MASK, GDK_KEY_W },
{ G_CALLBACK(_helper_on_find), GDK_CONTROL_MASK, GDK_KEY_F },
{ G_CALLBACK(_helper_on_fullscreen), 0, GDK_KEY_F11 },
{ G_CALLBACK(_helper_on_open), GDK_CONTROL_MASK, GDK_KEY_O },
{ NULL, 0, 0 }
@ -153,6 +167,9 @@ static const DesktopMenu _menu_edit[] =
NULL,
# endif
GDK_CONTROL_MASK, GDK_KEY_A },
{ "", NULL, NULL, 0, 0 },
{ N_("_Find"), G_CALLBACK(_helper_on_edit_find), GTK_STOCK_FIND,
GDK_CONTROL_MASK, GDK_KEY_F },
{ NULL, NULL, NULL, 0, 0 }
};
@ -264,6 +281,7 @@ static Helper * _helper_new(void)
gtk_container_add(GTK_CONTAINER(helper->window), vbox);
gtk_widget_grab_focus(helper->view);
gtk_widget_show_all(helper->window);
helper->fi_dialog = NULL;
helper->ab_window = NULL;
return helper;
}
@ -362,6 +380,10 @@ static void _new_manual_package(Helper * helper, char const * manhtmldir,
/* helper_delete */
void _helper_delete(Helper * helper)
{
if(helper->ab_window != NULL)
gtk_widget_destroy(helper->ab_window);
if(helper->fi_dialog != NULL)
gtk_widget_destroy(helper->fi_dialog);
gtk_widget_destroy(helper->window);
object_delete(helper);
}
@ -566,6 +588,15 @@ static void _helper_on_edit_copy(gpointer data)
}
/* helper_on_edit_find */
static void _helper_on_edit_find(gpointer data)
{
Helper * helper = data;
surfer_find(helper, NULL);
}
/* helper_on_edit_select_all */
static void _helper_on_edit_select_all(gpointer data)
{
@ -595,6 +626,17 @@ static void _helper_on_file_open(gpointer data)
#endif
#ifdef EMBEDDED
/* helper_on_find */
static void _helper_on_find(gpointer data)
{
Helper * helper = data;
surfer_find(helper, NULL);
}
#endif
/* helper_on_fullscreen */
static void _helper_on_fullscreen(gpointer data)
{
@ -754,7 +796,7 @@ void surfer_delete(Surfer * surfer)
GtkWidget * surfer_get_view(Surfer * surfer)
{
/* FIXME remove from the API? */
return NULL;
return surfer->view;
}
@ -914,6 +956,10 @@ int surfer_error(Surfer * surfer, char const * message, int ret)
}
/* surfer_find */
#include "../src/common/find.c"
/* surfer_go_back */
gboolean surfer_go_back(Surfer * surfer)
{

View File

@ -18,4 +18,4 @@ depends=../src/ghtml.o
install=$(BINDIR)
[helper.c]
depends=../src/ghtml.c,../src/surfer.h,../config.h
depends=../src/common/find.c,../src/ghtml.c,../src/surfer.h,../config.h