Sharing code for the "Find" dialog in both surfer(1) and helper(1)
This commit is contained in:
parent
30e13017d6
commit
87e1811123
1
Makefile
1
Makefile
|
@ -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 \
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
111
src/common/find.c
Normal 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);
|
||||
}
|
|
@ -1 +1 @@
|
|||
dist=Makefile,conn.c,history.c,url.c
|
||||
dist=Makefile,conn.c,find.c,history.c,url.c
|
||||
|
|
|
@ -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
|
||||
|
|
95
src/surfer.c
95
src/surfer.c
|
@ -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 */
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue
Block a user