diff options
author | Vincent Sanders <vince@kyllikki.org> | 2014-03-18 22:32:52 +0000 |
---|---|---|
committer | Vincent Sanders <vince@kyllikki.org> | 2014-03-18 22:32:52 +0000 |
commit | 4d4d74c8cd1a77a46cbe0816cf6150f8b4980947 (patch) | |
tree | cdc747443b58963a17b2844da25c7b2fab9deb99 | |
parent | fec9f916b640b8ffc18b7ff9f9d04fd742b32ad1 (diff) | |
download | netsurf-4d4d74c8cd1a77a46cbe0816cf6150f8b4980947.tar.gz netsurf-4d4d74c8cd1a77a46cbe0816cf6150f8b4980947.tar.bz2 |
move page search gui callbacks to their own operations table
-rw-r--r-- | amiga/gui.c | 1 | ||||
-rwxr-xr-x | amiga/search.c | 24 | ||||
-rwxr-xr-x | amiga/search.h | 2 | ||||
-rw-r--r-- | atari/gui.c | 1 | ||||
-rw-r--r-- | atari/search.c | 19 | ||||
-rw-r--r-- | atari/search.h | 3 | ||||
-rw-r--r-- | cocoa/NetsurfApp.m | 2 | ||||
-rw-r--r-- | cocoa/SearchWindowController.h | 2 | ||||
-rw-r--r-- | cocoa/SearchWindowController.m | 9 | ||||
-rw-r--r-- | content/content.c | 11 | ||||
-rw-r--r-- | content/content.h | 5 | ||||
-rw-r--r-- | content/content_protected.h | 6 | ||||
-rw-r--r-- | desktop/gui.h | 54 | ||||
-rw-r--r-- | desktop/gui_factory.c | 68 | ||||
-rw-r--r-- | desktop/search.c | 63 | ||||
-rw-r--r-- | desktop/search.h | 56 | ||||
-rw-r--r-- | gtk/gui.c | 2 | ||||
-rw-r--r-- | gtk/scaffolding.c | 14 | ||||
-rw-r--r-- | gtk/search.c | 78 | ||||
-rw-r--r-- | gtk/search.h | 21 | ||||
-rw-r--r-- | render/html_interaction.c | 12 | ||||
-rw-r--r-- | render/html_internal.h | 3 | ||||
-rw-r--r-- | render/search.c | 67 | ||||
-rw-r--r-- | render/search.h | 3 | ||||
-rw-r--r-- | render/textplain.c | 8 | ||||
-rw-r--r-- | riscos/gui.c | 1 | ||||
-rw-r--r-- | riscos/gui.h | 1 | ||||
-rw-r--r-- | riscos/search.c | 42 |
28 files changed, 276 insertions, 302 deletions
diff --git a/amiga/gui.c b/amiga/gui.c index 69b3c8db5..0af7a1ac8 100644 --- a/amiga/gui.c +++ b/amiga/gui.c @@ -5167,6 +5167,7 @@ int main(int argc, char** argv) .download = amiga_download_table, .fetch = &amiga_fetch_table, .utf8 = amiga_utf8_table, + .search = amiga_search_table, }; /* Open popupmenu.library just to check the version. diff --git a/amiga/search.c b/amiga/search.c index 17a2d453c..53754145a 100755 --- a/amiga/search.c +++ b/amiga/search.c @@ -69,14 +69,15 @@ static void ami_search_add_recent(const char *string, void *p); static void ami_search_set_forward_state(bool active, void *p); static void ami_search_set_back_state(bool active, void *p); -static struct gui_search_callbacks ami_search_callbacks = { - ami_search_set_forward_state, - ami_search_set_back_state, +static struct gui_search_table search_table = { ami_search_set_status, ami_search_set_hourglass, - ami_search_add_recent + ami_search_add_recent, + ami_search_set_forward_state, + ami_search_set_back_state, }; +struct gui_search_table *amiga_search_table = &search_table; /** * Change the displayed search status. @@ -90,8 +91,6 @@ void ami_search_open(struct gui_window *gwin) if(fwin) { browser_window_search_clear(fwin->gwin->shared->bw); - ami_search_set_forward_state(true, NULL); - ami_search_set_back_state(true, NULL); fwin->gwin->shared->searchwin = NULL; fwin->gwin = gwin; gwin->shared->searchwin = fwin; @@ -177,8 +176,6 @@ void ami_search_open(struct gui_window *gwin) void ami_search_close(void) { browser_window_search_clear(fwin->gwin->shared->bw); - ami_search_set_forward_state(true, NULL); - ami_search_set_back_state(true, NULL); fwin->gwin->shared->searchwin = NULL; DisposeObject(fwin->objects[OID_MAIN]); DelObject(fwin->node); @@ -201,12 +198,7 @@ BOOL ami_search_event(void) switch(result & WMHI_GADGETMASK) { case GID_SEARCHSTRING: - browser_window_search_clear( - fwin->gwin->shared->bw); - ami_search_set_forward_state( - true, NULL); - ami_search_set_back_state( - true, NULL); + browser_window_search_clear(fwin->gwin->shared->bw); RefreshSetGadgetAttrs((struct Gadget *)fwin->objects[GID_PREV], fwin->win, NULL, @@ -226,7 +218,7 @@ BOOL ami_search_event(void) ami_search_flags(); browser_window_search( fwin->gwin->shared->bw, - &ami_search_callbacks, NULL, + NULL, flags, ami_search_string()); ActivateWindow(fwin->gwin->shared->win); break; @@ -237,7 +229,7 @@ BOOL ami_search_event(void) ami_search_flags(); browser_window_search( fwin->gwin->shared->bw, - &ami_search_callbacks, NULL, + NULL, flags, ami_search_string()); ActivateWindow(fwin->gwin->shared->win); break; diff --git a/amiga/search.h b/amiga/search.h index fde730280..ce5ae7c21 100755 --- a/amiga/search.h +++ b/amiga/search.h @@ -28,6 +28,8 @@ struct find_window { struct gui_window *gwin; }; +struct gui_search_table *amiga_search_table; + void ami_search_open(struct gui_window *gwin); BOOL ami_search_event(void); void ami_search_close(void); diff --git a/atari/gui.c b/atari/gui.c index d83864497..4e077bdab 100644 --- a/atari/gui.c +++ b/atari/gui.c @@ -1112,6 +1112,7 @@ int main(int argc, char** argv) .download = atari_download_table, .fetch = &atari_fetch_table, .utf8 = atari_utf8_table, + .search = atari_search_table, }; /* @todo logging file descriptor update belongs in a nslog_init callback */ diff --git a/atari/search.c b/atari/search.c index 6d8f53bec..f73a04a97 100644 --- a/atari/search.c +++ b/atari/search.c @@ -53,13 +53,16 @@ static void nsatari_search_add_recent(const char *string, void *p); void nsatari_search_set_forward_state(bool active, void *p);
void nsatari_search_set_back_state(bool active, void *p);
-static struct gui_search_callbacks nsatari_search_callbacks = {
- nsatari_search_set_forward_state,
- nsatari_search_set_back_state,
- nsatari_search_set_status,
- nsatari_search_set_hourglass,
- nsatari_search_add_recent
-};
+static struct gui_search_table search_table = { + nsatari_search_set_status, + nsatari_search_set_hourglass, + nsatari_search_add_recent, + nsatari_search_set_forward_state, + nsatari_search_set_back_state, +}; + +struct gui_search_table *atari_search_table = &search_table; + /**
@@ -282,7 +285,7 @@ void nsatari_search_perform(struct s_search_form_session *s, OBJECT *obj, else
s->state.flags &= (~SEARCH_FLAG_FORWARDS); - browser_window_search(s->bw, &nsatari_search_callbacks, s,
+ browser_window_search(s->bw, s,
s->state.flags,
gemtk_obj_get_text(obj, TOOLBAR_TB_SRCH));
diff --git a/atari/search.h b/atari/search.h index 00671e4a7..984fd3704 100644 --- a/atari/search.h +++ b/atari/search.h @@ -49,6 +49,9 @@ typedef struct s_search_form_session * SEARCH_FORM_SESSION; struct s_search_form_session * nsatari_search_session_create(OBJECT * obj, struct browser_window *bw); + +struct gui_search_table *atari_search_table; + void nsatari_search_session_destroy(struct s_search_form_session *s); void nsatari_search_perform(struct s_search_form_session *s, OBJECT *obj, search_flags_t f); diff --git a/cocoa/NetsurfApp.m b/cocoa/NetsurfApp.m index a1f1564ee..cab06a688 100644 --- a/cocoa/NetsurfApp.m +++ b/cocoa/NetsurfApp.m @@ -21,6 +21,7 @@ #import "cocoa/gui.h" #import "cocoa/plotter.h" #import "cocoa/DownloadWindowController.h" +#import "cocoa/SearchWindowController.h" #import "cocoa/selection.h" #import "cocoa/fetch.h" @@ -190,6 +191,7 @@ int main( int argc, char **argv ) .clipboard = cocoa_clipboard_table, .download = cocoa_download_table, .fetch = cocoa_fetch_table, + .search = cocoa_search_table, }; cocoa_autorelease(); diff --git a/cocoa/SearchWindowController.h b/cocoa/SearchWindowController.h index a1aac2e3f..896983b30 100644 --- a/cocoa/SearchWindowController.h +++ b/cocoa/SearchWindowController.h @@ -49,4 +49,6 @@ typedef enum { - (void) search: (SearchDirection)direction; +struct gui_search_table *cocoa_search_table; + @end diff --git a/cocoa/SearchWindowController.m b/cocoa/SearchWindowController.m index 06147fa1a..5d48145f4 100644 --- a/cocoa/SearchWindowController.m +++ b/cocoa/SearchWindowController.m @@ -26,14 +26,13 @@ static void cocoa_search_set_back( bool active, void *p ); static void cocoa_search_set_forward( bool active, void *p ); -static struct gui_search_callbacks cocoa_search_callbacks = { +static struct gui_search_table search_table = { .forward_state = cocoa_search_set_forward, .back_state = cocoa_search_set_back, - .status = NULL, - .hourglass = NULL, - .add_recent = NULL }; +struct gui_search_table *cocoa_search_table = &search_table; + @implementation SearchWindowController @synthesize caseSensitive; @@ -76,7 +75,7 @@ static struct gui_search_callbacks cocoa_search_callbacks = { if (selectAll) flags |= SEARCH_FLAG_SHOWALL; struct browser_window *bw = [browser browser]; - browser_window_search( bw, &cocoa_search_callbacks, self, flags, [searchString UTF8String] ); + browser_window_search( bw, self, flags, [searchString UTF8String] ); } - (IBAction) searchStringDidChange: (id) sender; diff --git a/content/content.c b/content/content.c index 93b6b8f5a..87dcfa226 100644 --- a/content/content.c +++ b/content/content.c @@ -838,15 +838,15 @@ bool content_drop_file_at_point(struct hlcache_handle *h, } -void content_search(struct hlcache_handle *h, - struct gui_search_callbacks *gui_callbacks, void *gui_data, +void content_search(struct hlcache_handle *h, void *context, search_flags_t flags, const char *string) { struct content *c = hlcache_handle_get_content(h); assert(c != 0); - if (c->handler->search != NULL) - c->handler->search(c, gui_callbacks, gui_data, flags, string); + if (c->handler->search != NULL) { + c->handler->search(c, context, flags, string); + } } @@ -855,8 +855,9 @@ void content_search_clear(struct hlcache_handle *h) struct content *c = hlcache_handle_get_content(h); assert(c != 0); - if (c->handler->search_clear != NULL) + if (c->handler->search_clear != NULL) { c->handler->search_clear(c); + } } diff --git a/content/content.h b/content/content.h index 91a6ae9df..a2d07926c 100644 --- a/content/content.h +++ b/content/content.h @@ -266,10 +266,11 @@ bool content_scroll_at_point(struct hlcache_handle *h, int x, int y, int scrx, int scry); bool content_drop_file_at_point(struct hlcache_handle *h, int x, int y, char *file); -void content_search(struct hlcache_handle *h, - struct gui_search_callbacks *gui_callbacks, void *gui_data, + +void content_search(struct hlcache_handle *h, void *context, search_flags_t flags, const char *string); void content_search_clear(struct hlcache_handle *h); + void content_debug_dump(struct hlcache_handle *h, FILE *f); struct content_rfc5988_link *content_find_rfc5988_link(struct hlcache_handle *c, lwc_string *rel); diff --git a/content/content_protected.h b/content/content_protected.h index 57ce35775..f5448c803 100644 --- a/content/content_protected.h +++ b/content/content_protected.h @@ -73,10 +73,8 @@ struct content_handler { int scrx, int scry); bool (*drop_file_at_point)(struct content *c, int x, int y, char *file); - void (*search)(struct content *c, - struct gui_search_callbacks *gui_callbacks, - void *gui_data, search_flags_t flags, - const char *string); + void (*search)(struct content *c, void *context, search_flags_t flags, + const char *string); void (*search_clear)(struct content *c); void (*debug_dump)(struct content *c, FILE *f); nserror (*clone)(const struct content *old, struct content **newc); diff --git a/desktop/gui.h b/desktop/gui.h index 361c6bdf4..317a73337 100644 --- a/desktop/gui.h +++ b/desktop/gui.h @@ -422,6 +422,52 @@ struct gui_utf8_table { nserror (*local_to_utf8)(const char *string, size_t len, char **result); }; +/** + * function table for page text search. + */ +struct gui_search_table { + /** + * Change the displayed search status. + * + * \param found search pattern matched in text + * \param p gui private data pointer provided with search callbacks + */ + void (*status)(bool found, void *p); + + /** + * display hourglass while searching. + * + * \param active start/stop indicator + * \param p gui private data pointer provided with search callbacks + */ + void (*hourglass)(bool active, void *p); + + /** + * add search string to recent searches list + * front has full liberty how to implement the bare notification; + * core gives no guarantee of the integrity of the string + * + * \param string search pattern + * \param p gui private data pointer provided with search callbacks + */ + void (*add_recent)(const char *string, void *p); + + /** + * activate search forwards button in gui + * + * \param active activate/inactivate + * \param p gui private data pointer provided with search callbacks + */ + void (*forward_state)(bool active, void *p); + + /** + * activate search back button in gui + * + * \param active activate/inactivate + * \param p gui private data pointer provided with search callbacks + */ + void (*back_state)(bool active, void *p); +}; /** * Graphical user interface browser misc function table. @@ -528,6 +574,14 @@ struct gui_table { * implies the local encoding is utf8. */ struct gui_utf8_table *utf8; + + /** + * + * Page search table. + * + * Provides routines for the interactive text search on a page. + */ + struct gui_search_table *search; }; diff --git a/desktop/gui_factory.c b/desktop/gui_factory.c index 638abfd96..ecedf417b 100644 --- a/desktop/gui_factory.c +++ b/desktop/gui_factory.c @@ -343,6 +343,62 @@ static nserror verify_utf8_register(struct gui_utf8_table *gut) return NSERROR_OK; } +static void gui_default_status(bool found, void *p) +{ +} + +static void gui_default_hourglass(bool active, void *p) +{ +} + +static void gui_default_add_recent(const char *string, void *p) +{ +} + +static void gui_default_forward_state(bool active, void *p) +{ +} + +static void gui_default_back_state(bool active, void *p) +{ +} + +static struct gui_search_table default_search_table = { + .status = gui_default_status, + .hourglass = gui_default_hourglass, + .add_recent = gui_default_add_recent, + .forward_state = gui_default_forward_state, + .back_state = gui_default_back_state, +}; + +/** verify search table is valid */ +static nserror verify_search_register(struct gui_search_table *gst) +{ + /* check table is present */ + if (gst == NULL) { + return NSERROR_BAD_PARAMETER; + } + + /* fill in the optional entries with defaults */ + if (gst->status == NULL) { + gst->status = default_search_table.status; + } + if (gst->hourglass == NULL) { + gst->hourglass = default_search_table.hourglass; + } + if (gst->add_recent == NULL) { + gst->add_recent = default_search_table.add_recent; + } + if (gst->forward_state == NULL) { + gst->forward_state = default_search_table.forward_state; + } + if (gst->back_state == NULL) { + gst->back_state = default_search_table.back_state; + } + + return NSERROR_OK; +} + static nsurl *gui_default_get_resource_url(const char *path) { return NULL; @@ -525,7 +581,7 @@ nserror gui_factory_register(struct gui_table *gt) /* utf8 table */ if (gt->utf8 == NULL) { - /* set default clipboard table */ + /* set default utf8 table */ gt->utf8 = &default_utf8_table; } err = verify_utf8_register(gt->utf8); @@ -533,6 +589,16 @@ nserror gui_factory_register(struct gui_table *gt) return err; } + /* search table */ + if (gt->search == NULL) { + /* set default search table */ + gt->search = &default_search_table; + } + err = verify_search_register(gt->search); + if (err != NSERROR_OK) { + return err; + } + guit = gt; return NSERROR_OK; diff --git a/desktop/search.c b/desktop/search.c index 4a02f6b7c..201d416dd 100644 --- a/desktop/search.c +++ b/desktop/search.c @@ -21,66 +21,27 @@ /** \file * Free text search (core) */ -#include "utils/config.h" -#include <ctype.h> -#include <string.h> -#include <dom/dom.h> #include "content/content.h" -#include "content/hlcache.h" + #include "desktop/browser_private.h" -#include "utils/nsoption.h" #include "desktop/search.h" -#include "desktop/selection.h" -#include "render/box.h" -#include "render/html.h" -#include "render/search.h" -#include "render/textplain.h" -#include "utils/config.h" -#include "utils/log.h" -#include "utils/messages.h" -#include "utils/url.h" -#include "utils/utils.h" - - - -/** - * Starts or continues an existing search. - * - * \param bw the browser_window to search - * \param callbacks callbacks vtable to update frontend according to results - * \param gui_data a pointer returned to the callbacks - * \param flags search flags - * \param string string to search for - */ -void browser_window_search(struct browser_window *bw, - struct gui_search_callbacks *gui_callbacks, void *gui_data, +/* exported function documented in desktop/search.h */ +void browser_window_search(struct browser_window *bw, void *context, search_flags_t flags, const char *string) { - assert(gui_callbacks != NULL); - - if (bw == NULL || bw->current_content == NULL) - return; - - content_search(bw->current_content, gui_callbacks, gui_data, - flags, string); + if ((bw != NULL) && + (bw->current_content != NULL)) { + content_search(bw->current_content, context, flags, string); + } } - -/** - * Clear up a search. Frees any memory used by the search - * - * \param bw the browser_window to search - * \param callbacks callbacks vtable to update frontend according to results - * \param gui_data a pointer returned to the callbacks - * \param flags search flags - * \param string string to search for - */ +/* exported function documented in desktop/search.h */ void browser_window_search_clear(struct browser_window *bw) { - if (bw == NULL || bw->current_content == NULL) - return; - - content_search_clear(bw->current_content); + if ((bw != NULL) && + (bw->current_content != NULL)) { + content_search_clear(bw->current_content); + } } diff --git a/desktop/search.h b/desktop/search.h index 8440ce982..254acde99 100644 --- a/desktop/search.h +++ b/desktop/search.h @@ -33,54 +33,24 @@ typedef enum { } search_flags_t; /** - * Change the displayed search status. - * \param found search pattern matched in text - * \param p gui private data pointer provided with search callbacks - */ -typedef void (*gui_search_status)(bool found, void *p); - -/** - * display hourglass while searching - * \param active start/stop indicator - * \param p gui private data pointer provided with search callbacks - */ -typedef void (*gui_search_hourglass)(bool active, void *p); - -/** - * add search string to recent searches list - * front has full liberty how to implement the bare notification; - * core gives no guarantee of the integrity of the const char * - * \param string search pattern - * \param p gui private data pointer provided with search callbacks - */ -typedef void (*gui_search_add_recent)(const char *string, void *p); - -/** - * activate search forwards button in gui - * \param active activate/inactivate - * \param p gui private data pointer provided with search callbacks + * Starts or continues an existing search. + * + * \param bw The browser_window to search. + * \param context A context pointer passed to the callbacks. + * \param flags Flags controlling the search operation. + * \param string The string being searched for. */ -typedef void (*gui_search_forward_state)(bool active, void *p); +void browser_window_search(struct browser_window *bw, void *context, search_flags_t flags, const char *string); /** - * activate search back button in gui - * \param active activate/inactivate - * \param p gui private data pointer provided with search callbacks + * Clear up a search. + * + * Frees any memory used by the search. + * + * \param bw The browser window to clean up the search for. + * \param context A context pointer passed to the callbacks. */ -typedef void (*gui_search_back_state)(bool active, void *p); - -struct gui_search_callbacks { - gui_search_forward_state forward_state; - gui_search_back_state back_state; - gui_search_status status; - gui_search_hourglass hourglass; - gui_search_add_recent add_recent; -}; - -void browser_window_search(struct browser_window *bw, - struct gui_search_callbacks *gui_callbacks, void *gui_data, - search_flags_t flags, const char *string); void browser_window_search_clear(struct browser_window *bw); #endif @@ -69,6 +69,7 @@ #include "gtk/window.h" #include "gtk/schedule.h" #include "gtk/selection.h" +#include "gtk/search.h" #include "render/form.h" #include "utils/filepath.h" @@ -1015,6 +1016,7 @@ int main(int argc, char** argv) .clipboard = nsgtk_clipboard_table, .download = nsgtk_download_table, .fetch = nsgtk_fetch_table, + .search = nsgtk_search_table, }; /* check home directory is available */ diff --git a/gtk/scaffolding.c b/gtk/scaffolding.c index 51d395102..c5dd524ff 100644 --- a/gtk/scaffolding.c +++ b/gtk/scaffolding.c @@ -1385,9 +1385,6 @@ MULTIHANDLER(reload) /* clear potential search effects */ browser_window_search_clear(bw); - nsgtk_search_set_forward_state(true, g->top_level); - nsgtk_search_set_back_state(true, g->top_level); - browser_window_reload(bw, true); return TRUE; @@ -1404,9 +1401,6 @@ MULTIHANDLER(back) /* clear potential search effects */ browser_window_search_clear(bw); - nsgtk_search_set_forward_state(true, g->top_level); - nsgtk_search_set_back_state(true, g->top_level); - browser_window_history_back(bw, false); nsgtk_window_update_back_forward(g); @@ -1424,9 +1418,6 @@ MULTIHANDLER(forward) /* clear potential search effects */ browser_window_search_clear(bw); - nsgtk_search_set_forward_state(true, g->top_level); - nsgtk_search_set_back_state(true, g->top_level); - browser_window_history_forward(bw, false); nsgtk_window_update_back_forward(g); @@ -2399,8 +2390,6 @@ void nsgtk_scaffolding_toggle_search_bar_visibility(nsgtk_scaffolding *g) if (bw != NULL) { browser_window_search_clear(bw); } - nsgtk_search_set_forward_state(true, g->top_level); - nsgtk_search_set_back_state(true, g->top_level); gtk_widget_hide(GTK_WIDGET(g->search->bar)); } else { @@ -2438,9 +2427,6 @@ void nsgtk_scaffolding_set_top_level(struct gui_window *gw) /* clear effects of potential searches */ browser_window_search_clear(bw); - nsgtk_search_set_forward_state(true, gw); - nsgtk_search_set_back_state(true, gw); - nsgtk_scaffolding_set_icon(gw); /* Ensure the window's title bar is updated */ diff --git a/gtk/search.c b/gtk/search.c index f340bfad2..44f9ddeb6 100644 --- a/gtk/search.c +++ b/gtk/search.c @@ -25,10 +25,6 @@ #include <string.h> #include <gdk/gdkkeysyms.h> -#include "gtk/compat.h" -#include "gtk/search.h" -#include "gtk/scaffolding.h" -#include "gtk/window.h" #include "utils/config.h" #include "content/content.h" #include "content/hlcache.h" @@ -40,41 +36,18 @@ #include "utils/messages.h" #include "utils/utils.h" -/** -* Change the displayed search status. -* \param found search pattern matched in text -* \param p the pointer sent to search_verify_new() / search_create_context() -*/ - -static void nsgtk_search_set_status(bool found, void *p) -{ -} - -/** -* display hourglass while searching -* \param active start/stop indicator -* \param p the pointer sent to search_verify_new() / search_create_context() -*/ - -static void nsgtk_search_set_hourglass(bool active, void *p) -{ -} +#include "gtk/compat.h" +#include "gtk/search.h" +#include "gtk/scaffolding.h" +#include "gtk/window.h" /** -* add search string to recent searches list -* front is at liberty how to implement the bare notification -* should normally store a strdup() of the string; -* core gives no guarantee of the integrity of the const char * -* \param string search pattern -* \param p the pointer sent to search_verify_new() / search_create_context() -*/ - -static void nsgtk_search_add_recent(const char *string, void *p) -{ -} - -/* exported function documented in gtk/search.h */ -void nsgtk_search_set_forward_state(bool active, struct gui_window *gw) + * activate search forwards button in gui. + * + * \param active activate/inactivate + * \param p the pointer sent to search_verify_new() / search_create_context() + */ +static void nsgtk_search_set_forward_state(bool active, struct gui_window *gw) { if (gw != NULL && nsgtk_get_browser_window(gw) != NULL) { struct gtk_scaffolding *g = nsgtk_get_scaffold(gw); @@ -84,8 +57,13 @@ void nsgtk_search_set_forward_state(bool active, struct gui_window *gw) } } -/* exported function documented in gtk/search.h */ -void nsgtk_search_set_back_state(bool active, struct gui_window *gw) +/** + * activate search back button in gui. + * + * \param active activate/inactivate + * \param p the pointer sent to search_verify_new() / search_create_context() + */ +static void nsgtk_search_set_back_state(bool active, struct gui_window *gw) { if (gw != NULL && nsgtk_get_browser_window(gw) != NULL) { struct gtk_scaffolding *g = nsgtk_get_scaffold(gw); @@ -94,14 +72,6 @@ void nsgtk_search_set_back_state(bool active, struct gui_window *gw) } } -static struct gui_search_callbacks nsgtk_search_callbacks = { - (void *)nsgtk_search_set_forward_state, - (void *)nsgtk_search_set_back_state, - nsgtk_search_set_status, - nsgtk_search_set_hourglass, - nsgtk_search_add_recent -}; - /** connected to the search forward button */ gboolean nsgtk_search_forward_button_clicked(GtkWidget *widget, gpointer data) @@ -120,7 +90,7 @@ gboolean nsgtk_search_forward_button_clicked(GtkWidget *widget, gpointer data) nsgtk_scaffolding_search(g)->checkAll)) ? SEARCH_FLAG_SHOWALL : 0); - browser_window_search(bw, &nsgtk_search_callbacks, (void *)gw, flags, + browser_window_search(bw, gw, flags, gtk_entry_get_text(nsgtk_scaffolding_search(g)->entry)); return TRUE; } @@ -143,7 +113,7 @@ gboolean nsgtk_search_back_button_clicked(GtkWidget *widget, gpointer data) nsgtk_scaffolding_search(g)->checkAll)) ? SEARCH_FLAG_SHOWALL : 0); - browser_window_search(bw, &nsgtk_search_callbacks, (void *)gw, flags, + browser_window_search(bw, gw, flags, gtk_entry_get_text(nsgtk_scaffolding_search(g)->entry)); return TRUE; } @@ -178,7 +148,7 @@ gboolean nsgtk_search_entry_changed(GtkWidget *widget, gpointer data) nsgtk_scaffolding_search(g)->checkAll)) ? SEARCH_FLAG_SHOWALL : 0); - browser_window_search(bw, &nsgtk_search_callbacks, (void *)gw, flags, + browser_window_search(bw, gw, flags, gtk_entry_get_text(nsgtk_scaffolding_search(g)->entry)); return TRUE; } @@ -201,7 +171,7 @@ gboolean nsgtk_search_entry_activate(GtkWidget *widget, gpointer data) nsgtk_scaffolding_search(g)->checkAll)) ? SEARCH_FLAG_SHOWALL : 0); - browser_window_search(bw, &nsgtk_search_callbacks, (void *)gw, flags, + browser_window_search(bw, gw, flags, gtk_entry_get_text(nsgtk_scaffolding_search(g)->entry)); return FALSE; } @@ -249,3 +219,9 @@ gboolean nsgtk_websearch_clear(GtkWidget *widget, GdkEventFocus *f, +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; diff --git a/gtk/search.h b/gtk/search.h index 8a8054478..470ebb3fd 100644 --- a/gtk/search.h +++ b/gtk/search.h @@ -19,8 +19,9 @@ #ifndef _NETSURF_GTK_SEARCH_H_ #define _NETSURF_GTK_SEARCH_H_ -#include <gtk/gtk.h> -#include "gtk/scaffolding.h" +struct gui_search_table *nsgtk_search_table; + +struct gtk_scaffolding; void nsgtk_search_bar_toggle_visibility(struct gtk_scaffolding * g); gboolean nsgtk_search_entry_changed(GtkWidget *widget, gpointer data); @@ -31,21 +32,5 @@ gboolean nsgtk_search_back_button_clicked(GtkWidget *widget, gpointer data); gboolean nsgtk_search_close_button_clicked(GtkWidget *widget, gpointer data); gboolean nsgtk_websearch_activate(GtkWidget *widget, gpointer data); gboolean nsgtk_websearch_clear(GtkWidget *widget, GdkEventFocus *f, gpointer data); - -/** - * activate search forwards button in gui. - * - * \param active activate/inactivate - * \param p the pointer sent to search_verify_new() / search_create_context() - */ -void nsgtk_search_set_forward_state(bool active, struct gui_window *gw); - -/** - * activate search back button in gui. - * - * \param active activate/inactivate - * \param p the pointer sent to search_verify_new() / search_create_context() - */ -void nsgtk_search_set_back_state(bool active, struct gui_window *gw); #endif diff --git a/render/html_interaction.c b/render/html_interaction.c index a2baf2d39..ce2f78c96 100644 --- a/render/html_interaction.c +++ b/render/html_interaction.c @@ -1072,13 +1072,11 @@ bool html_keypress(struct content *c, uint32_t key) * Handle search. * * \param c content of type HTML - * \param gui_callbacks vtable for updating front end - * \param gui_data front end private data + * \param context front end private data * \param flags search flags * \param string search string */ -void html_search(struct content *c, - struct gui_search_callbacks *gui_callbacks, void *gui_data, +void html_search(struct content *c, void *context, search_flags_t flags, const char *string) { html_content *html = (html_content *)c; @@ -1103,8 +1101,7 @@ void html_search(struct content *c, html->search = NULL; } - html->search = search_create_context(c, CONTENT_HTML, - gui_callbacks, gui_data); + html->search = search_create_context(c, CONTENT_HTML, context); if (html->search == NULL) return; @@ -1135,8 +1132,9 @@ void html_search_clear(struct content *c) free(html->search_string); html->search_string = NULL; - if (html->search != NULL) + if (html->search != NULL) { search_destroy_context(html->search); + } html->search = NULL; } diff --git a/render/html_internal.h b/render/html_internal.h index e7768e39f..05a085e22 100644 --- a/render/html_internal.h +++ b/render/html_internal.h @@ -254,8 +254,7 @@ void html_mouse_action(struct content *c, struct browser_window *bw, bool html_keypress(struct content *c, uint32_t key); void html_overflow_scroll_callback(void *client_data, struct scrollbar_msg_data *scrollbar_data); -void html_search(struct content *c, - struct gui_search_callbacks *gui_callbacks, void *gui_data, +void html_search(struct content *c, void *context, search_flags_t flags, const char *string); void html_search_clear(struct content *c); diff --git a/render/search.c b/render/search.c index 46ec7d1fc..3bec9e199 100644 --- a/render/search.c +++ b/render/search.c @@ -21,27 +21,26 @@ /** \file * Free text search (core) */ -#include "utils/config.h" #include <ctype.h> #include <string.h> - #include <dom/dom.h> +#include "utils/config.h" +#include "utils/log.h" +#include "utils/messages.h" +#include "utils/url.h" +#include "utils/utils.h" #include "content/content.h" #include "content/hlcache.h" #include "desktop/selection.h" +#include "desktop/gui_factory.h" + #include "render/box.h" #include "render/html.h" #include "render/html_internal.h" #include "render/search.h" #include "render/textplain.h" -#include "utils/config.h" -#include "utils/log.h" -#include "utils/messages.h" -#include "utils/url.h" -#include "utils/utils.h" - #ifndef NOF_ELEMENTS #define NOF_ELEMENTS(array) (sizeof(array)/sizeof(*(array))) @@ -62,7 +61,6 @@ struct list_entry { }; struct search_context { - struct gui_search_callbacks *gui; void *gui_p; struct content *c; struct list_entry *found; @@ -76,8 +74,7 @@ struct search_context { /* Exported function documented in search.h */ struct search_context * search_create_context(struct content *c, - content_type type, struct gui_search_callbacks *callbacks, - void *gui_data) + content_type type, void *gui_data) { struct search_context *context; struct list_entry *search_head; @@ -114,7 +111,6 @@ struct search_context * search_create_context(struct content *c, context->newsearch = true; context->c = c; context->is_html = (type == CONTENT_HTML) ? true : false; - context->gui = callbacks; context->gui_p = gui_data; return context; @@ -468,8 +464,7 @@ static void search_text(const char *string, int string_len, context->string[string_len] = '\0'; } - if ((context->gui != NULL) && (context->gui->hourglass != NULL)) - context->gui->hourglass(true, context->gui_p); + guit->search->hourglass(true, context->gui_p); if (context->is_html == true) { res = find_occurrences_html(string, string_len, @@ -481,14 +476,10 @@ static void search_text(const char *string, int string_len, if (!res) { free_matches(context); - if ((context->gui != NULL) && - (context->gui->hourglass != NULL)) - context->gui->hourglass(false, context->gui_p); + guit->search->hourglass(false, context->gui_p); return; } - if ((context->gui != NULL) && - (context->gui->hourglass != NULL)) - context->gui->hourglass(false, context->gui_p); + guit->search->hourglass(false, context->gui_p); context->prev_case_sens = case_sensitive; @@ -507,20 +498,14 @@ static void search_text(const char *string, int string_len, } } - if (context->gui == NULL) - return; - if (context->gui->status != NULL) - context->gui->status((context->current != NULL), - context->gui_p); + guit->search->status((context->current != NULL), context->gui_p); search_show_all(showall, context); - if (context->gui->back_state != NULL) - context->gui->back_state((context->current != NULL) && + guit->search->back_state((context->current != NULL) && (context->current->prev != NULL), context->gui_p); - if (context->gui->forward_state != NULL) - context->gui->forward_state((context->current != NULL) && + guit->search->forward_state((context->current != NULL) && (context->current->next != NULL), context->gui_p); @@ -557,13 +542,12 @@ void search_step(struct search_context *context, search_flags_t flags, int string_len; int i = 0; - if ((context == NULL) || (context->gui == NULL)) { + if (context == NULL) { warn_user("SearchError", 0); return; } - if (context->gui->add_recent != NULL) - context->gui->add_recent(string, context->gui_p); + guit->search->add_recent(string, context->gui_p); string_len = strlen(string); for (i = 0; i < string_len; i++) @@ -572,12 +556,10 @@ void search_step(struct search_context *context, search_flags_t flags, if (i >= string_len) { union content_msg_data msg_data; free_matches(context); - if (context->gui->status != NULL) - context->gui->status(true, context->gui_p); - if (context->gui->back_state != NULL) - context->gui->back_state(false, context->gui_p); - if (context->gui->forward_state != NULL) - context->gui->forward_state(false, context->gui_p); + + guit->search->status(true, context->gui_p); + guit->search->back_state(false, context->gui_p); + guit->search->forward_state(false, context->gui_p); msg_data.scroll.area = false; msg_data.scroll.x0 = 0; @@ -653,11 +635,14 @@ void search_destroy_context(struct search_context *context) { assert(context != NULL); - if ((context->string != NULL) && (context->gui != NULL) && - (context->gui->add_recent != NULL)) { - context->gui->add_recent(context->string, context->gui_p); + if (context->string != NULL) { + guit->search->add_recent(context->string, context->gui_p); free(context->string); } + + guit->search->forward_state(true, context->gui_p); + guit->search->back_state(true, context->gui_p); + free_matches(context); free(context); } diff --git a/render/search.h b/render/search.h index 43c93b3ab..a8354e77e 100644 --- a/render/search.h +++ b/render/search.h @@ -36,8 +36,7 @@ struct search_context; * \return true for success */ struct search_context * search_create_context(struct content *c, - content_type type, struct gui_search_callbacks *callbacks, - void *gui_data); + content_type type, void *context); /** * Ends the search process, invalidating all state diff --git a/render/textplain.c b/render/textplain.c index b459efc6c..e08a04575 100644 --- a/render/textplain.c +++ b/render/textplain.c @@ -112,8 +112,7 @@ static void textplain_mouse_track(struct content *c, struct browser_window *bw, static void textplain_mouse_action(struct content *c, struct browser_window *bw, browser_mouse_state mouse, int x, int y); static bool textplain_keypress(struct content *c, uint32_t key); -static void textplain_search(struct content *c, - struct gui_search_callbacks *gui_callbacks, void *gui_data, +static void textplain_search(struct content *c, void *gui_data, search_flags_t flags, const char *string); static void textplain_search_clear(struct content *c); static void textplain_reformat(struct content *c, int width, int height); @@ -760,8 +759,7 @@ bool textplain_keypress(struct content *c, uint32_t key) * \param flags search flags * \param string search string */ -void textplain_search(struct content *c, - struct gui_search_callbacks *gui_callbacks, void *gui_data, +void textplain_search(struct content *c, void *gui_data, search_flags_t flags, const char *string) { textplain_content *text = (textplain_content *) c; @@ -787,7 +785,7 @@ void textplain_search(struct content *c, } text->search = search_create_context(c, CONTENT_TEXTPLAIN, - gui_callbacks, gui_data); + gui_data); if (text->search == NULL) return; diff --git a/riscos/gui.c b/riscos/gui.c index 59a0138e7..4f9856b83 100644 --- a/riscos/gui.c +++ b/riscos/gui.c @@ -2387,6 +2387,7 @@ int main(int argc, char** argv) .download = riscos_download_table, .fetch = &riscos_fetch_table, .utf8 = riscos_utf8_table, + .search = riscos_search_table, }; /* Consult NetSurf$Logging environment variable to decide if logging diff --git a/riscos/gui.h b/riscos/gui.h index 3ea0c0b72..548d030a8 100644 --- a/riscos/gui.h +++ b/riscos/gui.h @@ -203,6 +203,7 @@ nserror riscos_schedule(int t, void (*callback)(void *p), void *p); /* in search.c */ void ro_gui_search_init(void); void ro_gui_search_prepare(struct browser_window *g); +struct gui_search_table *riscos_search_table; /* in print.c */ void ro_gui_print_init(void); diff --git a/riscos/search.c b/riscos/search.c index 3d3b7ba4a..230edc2e4 100644 --- a/riscos/search.c +++ b/riscos/search.c @@ -76,14 +76,16 @@ static void ro_gui_search_set_status(bool found, void *p); static void ro_gui_search_set_hourglass(bool active, void *p); static void ro_gui_search_add_recent(const char *string, void *p); -static struct gui_search_callbacks ro_gui_search_callbacks = { - ro_gui_search_set_forward_state, - ro_gui_search_set_back_state, +static struct gui_search_table search_table = { ro_gui_search_set_status, ro_gui_search_set_hourglass, - ro_gui_search_add_recent + ro_gui_search_add_recent, + ro_gui_search_set_forward_state, + ro_gui_search_set_back_state, }; +struct gui_search_table *riscos_search_table = &search_table; + void ro_gui_search_init(void) { dialog_search = ro_gui_dialog_create("search"); @@ -122,8 +124,7 @@ bool ro_gui_search_next(wimp_w w) search_data.search_insert = true; search_flags_t flags = SEARCH_FLAG_FORWARDS | ro_gui_search_update_flags(); - browser_window_search(search_data.search_window, - &ro_gui_search_callbacks, NULL, flags, + browser_window_search(search_data.search_window, NULL, flags, ro_gui_get_icon_string(dialog_search, ICON_SEARCH_TEXT)); return false; @@ -163,8 +164,7 @@ bool ro_gui_search_click(wimp_pointer *pointer) search_data.search_insert = true; flags = ~SEARCH_FLAG_FORWARDS & ro_gui_search_update_flags(); - browser_window_search(search_data.search_window, - &ro_gui_search_callbacks, NULL, + browser_window_search(search_data.search_window, NULL, flags, ro_gui_get_icon_string(dialog_search, ICON_SEARCH_TEXT)); @@ -172,8 +172,7 @@ bool ro_gui_search_click(wimp_pointer *pointer) case ICON_SEARCH_CASE_SENSITIVE: flags = SEARCH_FLAG_FORWARDS | ro_gui_search_update_flags(); - browser_window_search(search_data.search_window, - &ro_gui_search_callbacks, NULL, + browser_window_search(search_data.search_window, NULL, flags, ro_gui_get_icon_string(dialog_search, ICON_SEARCH_TEXT)); @@ -182,8 +181,7 @@ bool ro_gui_search_click(wimp_pointer *pointer) flags = ro_gui_get_icon_selected_state( pointer->w, pointer->i) ? SEARCH_FLAG_SHOWALL : SEARCH_FLAG_NONE; - browser_window_search(search_data.search_window, - &ro_gui_search_callbacks, NULL, + browser_window_search(search_data.search_window, NULL, flags, ro_gui_get_icon_string(dialog_search, ICON_SEARCH_TEXT)); @@ -313,8 +311,7 @@ bool ro_gui_search_keypress(wimp_key *key) case 1: { flags = ro_gui_search_update_flags() ^ SEARCH_FLAG_SHOWALL; - browser_window_search(search_data.search_window, - &ro_gui_search_callbacks, NULL, + browser_window_search(search_data.search_window, NULL, flags, ro_gui_get_icon_string(dialog_search, ICON_SEARCH_TEXT)); @@ -327,8 +324,7 @@ bool ro_gui_search_keypress(wimp_key *key) ICON_SEARCH_CASE_SENSITIVE, !state); flags = SEARCH_FLAG_FORWARDS | ro_gui_search_update_flags(); - browser_window_search(search_data.search_window, - &ro_gui_search_callbacks, NULL, + browser_window_search(search_data.search_window, NULL, flags, ro_gui_get_icon_string(dialog_search, ICON_SEARCH_TEXT)); @@ -337,8 +333,7 @@ bool ro_gui_search_keypress(wimp_key *key) search_data.search_insert = true; flags = ~SEARCH_FLAG_FORWARDS & ro_gui_search_update_flags(); - browser_window_search(search_data.search_window, - &ro_gui_search_callbacks, NULL, + browser_window_search(search_data.search_window, NULL, flags, ro_gui_get_icon_string(dialog_search, ICON_SEARCH_TEXT)); @@ -347,8 +342,7 @@ bool ro_gui_search_keypress(wimp_key *key) search_data.search_insert = true; flags = SEARCH_FLAG_FORWARDS | ro_gui_search_update_flags(); - browser_window_search(search_data.search_window, - &ro_gui_search_callbacks, NULL, + browser_window_search(search_data.search_window, NULL, flags, ro_gui_get_icon_string(dialog_search, ICON_SEARCH_TEXT)); @@ -360,10 +354,6 @@ bool ro_gui_search_keypress(wimp_key *key) * a new search */ browser_window_search_clear( search_data.search_window); - ro_gui_search_set_forward_state(true, - search_data.search_window); - ro_gui_search_set_back_state(true, - search_data.search_window); search_data.search_insert = true; } if (key->c == 8 || /* backspace */ @@ -376,7 +366,7 @@ bool ro_gui_search_keypress(wimp_key *key) ro_gui_search_set_back_state(true, search_data.search_window); browser_window_search(search_data.search_window, - &ro_gui_search_callbacks, NULL, + NULL, flags, ro_gui_get_icon_string( dialog_search, @@ -396,8 +386,6 @@ bool ro_gui_search_keypress(wimp_key *key) void ro_gui_search_end(wimp_w w) { browser_window_search_clear(search_data.search_window); - ro_gui_search_set_forward_state(true, search_data.search_window); - ro_gui_search_set_back_state(true, search_data.search_window); } /** |