Very nice! I was text search a lot. What about incremental searching as you type? I don't mind the title bar... Cheers, Johannes On Fri, Nov 16, 2007 at 04:22:01AM +0000, place wrote:
I'm not much of a drawing/gui person, but it's hard not being able to search pages, so I gave it a try (attached).
- If you hit ^Q on this window or the page source or page bugs windows, dillo will crash because it assumes it's closing a bw.
- I didn't want a title bar, and I didn't want it to be able to outlive its bw, but I didn't know what to do about it.
- If searching scrolls the window, highlighting isn't undone properly. (If you search for something like "a", the last instance on each line will remain highlighted)
*plays with it a bit more*
Maybe it's good to have a title bar after all. It's easier to move out of the way than the 0.8.x one was...
diff -pur dillo2/src/dialog.cc dillo2-cur/src/dialog.cc --- dillo2/src/dialog.cc 2007-11-07 05:03:53.000000000 +0000 +++ dillo2-cur/src/dialog.cc 2007-11-16 03:30:20.000000000 +0000 @@ -11,22 +11,26 @@
// UI dialogs
+#include <fltk/events.h> // for the unfortunate (temporary?) event key testing #include <fltk/Window.h> #include <fltk/ask.h> #include <fltk/file_chooser.h> #include <fltk/TextBuffer.h> +#include <fltk/Input.h> +#include <fltk/CheckButton.h> #include <fltk/ReturnButton.h> #include <fltk/TextDisplay.h>
#include "dialog.hh" #include "misc.h" +#include "uicmd.hh"
using namespace fltk;
/* - * Callback for the text window dialog. + * Close dialog window. */ -void text_window_cb(Widget *, void *vwin) +static void window_close_cb(Widget *, void *vwin) { Window *window = (Window*)vwin;
@@ -107,10 +111,91 @@ void a_Dialog_text_window(const char *tx td->buffer(text_buf);
ReturnButton *b = new ReturnButton (0, wh-bh, ww, bh, "Close"); - b->callback(text_window_cb, window); + b->callback(window_close_cb, window);
window->resizable(window); window->end(); window->show(); }
+/* + * Dialog to find text in page. + */ +class TextFinder : public Window { +public: + TextFinder(int ww, int wh, BrowserWindow *bw); + BrowserWindow *bw; + Input *i; + CheckButton *cb; + ReturnButton *findb; + Button *clrb; + Button *clsb; +}; + +/* + * Find next occurrence of input key + */ +static void findtext_search_cb(Widget *, void *vtf) +{ + TextFinder *tf = (TextFinder *)vtf; + const char *key = tf->i->value(); + bool case_sens = tf->cb->value(); + + /* + * Somehow fltk even regards the first loss of focus for the + * window as a WHEN_ENTER_KEY_ALWAYS event. + */ + int e = event_key(); + if ((e != ReturnKey) && (e != LeftButton)) + return; + + if (key[0] != '\0') + a_UIcmd_findtext_search(tf->bw, key, case_sens); + +} + +/* + * Reset search state + */ +static void findtext_clear_cb(Widget *, void *vtf) +{ + TextFinder *tf = (TextFinder *)vtf; + tf->i->value(""); + a_UIcmd_findtext_reset(tf->bw); +} + +/* + * Construct text search window + */ +TextFinder::TextFinder(int ww, int wh, BrowserWindow *bw) : + Window(ww, wh, "unwanted title") +{ + int button_width = 70, ih = 35, bh = 30, gap = 10; + + this->bw = bw; + + begin(); + i = new Input(0, 0, ww, ih); + i->when(WHEN_ENTER_KEY_ALWAYS); + i->callback(findtext_search_cb, this); + + cb = new CheckButton(0, ih, ww, wh-ih-bh, "Case-sensitive"); + + findb = new ReturnButton(gap, wh-bh, button_width, bh, "Find"); + findb->callback(findtext_search_cb, this); + + clrb = new Button(button_width+2*gap, wh-bh, button_width, bh, "Clear"); + clrb->callback(findtext_clear_cb, this); + + clsb = new Button(2*button_width+3*gap, wh-bh, button_width, bh, "Close"); + clsb->callback(window_close_cb, this); + end(); + + hotspot(i); // place input widget beneath the cursor +} + +void a_Dialog_findtext(BrowserWindow *bw) +{ + TextFinder *tf = new TextFinder(250, 90, bw); + tf->show(); +} diff -pur dillo2/src/dialog.hh dillo2-cur/src/dialog.hh --- dillo2/src/dialog.hh 2007-11-08 19:50:20.000000000 +0000 +++ dillo2-cur/src/dialog.hh 2007-11-16 03:00:01.000000000 +0000 @@ -1,6 +1,8 @@ #ifndef __DIALOG_HH__ #define __DIALOG_HH__
+#include "bw.h" + #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ @@ -14,7 +16,7 @@ const char *a_Dialog_save_file(const cha char *a_Dialog_open_file(const char *msg, const char *pattern, const char *fname); void a_Dialog_text_window(const char *txt, const char *title); - +void a_Dialog_findtext(BrowserWindow *bw);
#ifdef __cplusplus } diff -pur dillo2/src/menu.cc dillo2-cur/src/menu.cc --- dillo2/src/menu.cc 2007-11-14 22:07:49.000000000 +0000 +++ dillo2-cur/src/menu.cc 2007-11-16 02:09:24.000000000 +0000 @@ -115,7 +115,8 @@ static void Menu_add_bookmark_cb(Widget* */ static void Menu_find_text_cb(Widget* ) { - a_UIcmd_fullscreen_toggle(popup_bw); +// a_UIcmd_fullscreen_toggle(popup_bw); + a_UIcmd_findtext_dialog(popup_bw); }
/* diff -pur dillo2/src/uicmd.cc dillo2-cur/src/uicmd.cc --- dillo2/src/uicmd.cc 2007-11-14 22:07:49.000000000 +0000 +++ dillo2-cur/src/uicmd.cc 2007-11-16 03:03:19.000000000 +0000 @@ -696,3 +696,43 @@ void a_UIcmd_fullscreen_toggle(BrowserWi BW2UI(bw)->fullscreen_toggle(); }
+/* + * Open the text search dialog. + */ +void a_UIcmd_findtext_dialog(BrowserWindow *bw) +{ + a_Dialog_findtext(bw); +} + +/* + * Search for next occurrence of key. + */ +void a_UIcmd_findtext_search(BrowserWindow *bw, const char *key, int case_sens) +{ + Layout *l = (Layout *)bw->render_layout; + + switch (l->search(key, case_sens)) { + case FindtextState::RESTART: + a_UIcmd_set_msg(bw, "No further occurrences of \"%s\". " + "Restarting from the top.", key); + break; + case FindtextState::NOT_FOUND: + a_UIcmd_set_msg(bw, "\"%s\" not found.", key); + break; + case FindtextState::SUCCESS: + default: + a_UIcmd_set_msg(bw, ""); + } +} + +/* + * Reset text search state. + */ +void a_UIcmd_findtext_reset(BrowserWindow *bw) +{ + Layout *l = (Layout *)bw->render_layout; + l->resetSearch(); + + a_UIcmd_set_msg(bw, ""); +} + diff -pur dillo2/src/uicmd.hh dillo2-cur/src/uicmd.hh --- dillo2/src/uicmd.hh 2007-11-14 22:07:49.000000000 +0000 +++ dillo2-cur/src/uicmd.hh 2007-11-16 02:37:32.000000000 +0000 @@ -27,6 +27,9 @@ void a_UIcmd_search_dialog(void *vbw); void a_UIcmd_book(void *vbw); void a_UIcmd_add_bookmark(BrowserWindow *bw, const DilloUrl *url); void a_UIcmd_fullscreen_toggle(BrowserWindow *bw); +void a_UIcmd_findtext_dialog(BrowserWindow *bw); +void a_UIcmd_findtext_search(BrowserWindow *bw, const char *key, int case_sens); +void a_UIcmd_findtext_reset(BrowserWindow *bw); void a_UIcmd_page_popup(void *vbw, const DilloUrl *url, const char *bugs_txt, int prefs_load_images); void a_UIcmd_link_popup(void *vbw, const DilloUrl *url);
_______________________________________________ Dillo-dev mailing list Dillo-dev@dillo.org http://lists.auriga.wearlab.de/cgi-bin/mailman/listinfo/dillo-dev