From 87e18111238575b7578f6bb4d2899d4325fd49e0 Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Sun, 15 Dec 2013 06:51:35 +0100 Subject: [PATCH] Sharing code for the "Find" dialog in both surfer(1) and helper(1) --- Makefile | 1 + po/POTFILES | 1 + src/Makefile | 2 +- src/common/find.c | 111 ++++++++++++++++++++++++++++++++++++++++ src/common/project.conf | 2 +- src/project.conf | 2 +- src/surfer.c | 95 +--------------------------------- tools/Makefile | 2 +- tools/helper.c | 48 ++++++++++++++++- tools/project.conf | 2 +- 10 files changed, 166 insertions(+), 100 deletions(-) create mode 100644 src/common/find.c diff --git a/Makefile b/Makefile index 79adaa3..cf0db34 100644 --- a/Makefile +++ b/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 \ diff --git a/po/POTFILES b/po/POTFILES index e1a1244..ad9fa84 100644 --- a/po/POTFILES +++ b/po/POTFILES @@ -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 diff --git a/src/Makefile b/src/Makefile index 1cef2c9..504ca59 100644 --- a/src/Makefile +++ b/src/Makefile @@ -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 diff --git a/src/common/find.c b/src/common/find.c new file mode 100644 index 0000000..fd91989 --- /dev/null +++ b/src/common/find.c @@ -0,0 +1,111 @@ +/* $Id$ */ +/* Copyright (c) 2013 Pierre Pronchery */ +/* 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 . */ + + + +/* 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); +} diff --git a/src/common/project.conf b/src/common/project.conf index d6e54bc..ca25e07 100644 --- a/src/common/project.conf +++ b/src/common/project.conf @@ -1 +1 @@ -dist=Makefile,conn.c,history.c,url.c +dist=Makefile,conn.c,find.c,history.c,url.c diff --git a/src/project.conf b/src/project.conf index ab46ee9..aeca797 100644 --- a/src/project.conf +++ b/src/project.conf @@ -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 diff --git a/src/surfer.c b/src/surfer.c index 1bf63e0..04b26d6 100644 --- a/src/surfer.c +++ b/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 */ diff --git a/tools/Makefile b/tools/Makefile index 93cea1c..e83a115 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -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: diff --git a/tools/helper.c b/tools/helper.c index 484a2be..dc25a32 100644 --- a/tools/helper.c +++ b/tools/helper.c @@ -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) { diff --git a/tools/project.conf b/tools/project.conf index 07ae5fd..9106b2d 100644 --- a/tools/project.conf +++ b/tools/project.conf @@ -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