aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJorge Arellano Cid <jcid@dillo.org>2011-03-15 09:28:45 -0300
committerJorge Arellano Cid <jcid@dillo.org>2011-03-15 09:28:45 -0300
commita39c454217025d86a3ee9ae42895adbe6bf249be (patch)
tree40b842f50589cd883b4a10e5087c2912805e3e39
parentb224c3e30c01837307922cd2402ef3e83896abc9 (diff)
Made the findbar operative again (it has tricks and workarounds)
-rw-r--r--src/findbar.cc23
-rw-r--r--src/menu.cc2
-rw-r--r--src/ui.cc52
-rw-r--r--src/ui.hh6
-rw-r--r--src/uicmd.cc17
-rw-r--r--src/uicmd.hh1
6 files changed, 74 insertions, 27 deletions
diff --git a/src/findbar.cc b/src/findbar.cc
index 2bda5452..cb0b345b 100644
--- a/src/findbar.cc
+++ b/src/findbar.cc
@@ -99,14 +99,13 @@ Findbar::Findbar(int width, int height) :
int gap = 2;
int border = 2;
int input_width = width - (2 * border + 4 * (button_width + gap));
- int x = border;
+ int x = 0;
Fl_Group::current(0);
height -= 2 * border;
- box(FL_PLASTIC_UP_BOX);
- Fl_Group::hide();
+ box(FL_THIN_UP_BOX);
hide_btn = new Fl_Button(x, border, 16, height, 0);
hideImg = new Fl_Pixmap(new_s_xpm);
@@ -114,6 +113,7 @@ Findbar::Findbar(int width, int height) :
x += 16 + gap;
hide_btn->callback(hide_cb, this);
hide_btn->clear_visible_focus();
+ hide_btn->box(FL_THIN_UP_BOX);
add(hide_btn);
i = new MyInput(x, border, input_width, height);
@@ -128,6 +128,7 @@ Findbar::Findbar(int width, int height) :
next_btn->shortcut(FL_Enter);
next_btn->callback(search_cb, this);
next_btn->clear_visible_focus();
+ next_btn->box(FL_THIN_UP_BOX);
add(next_btn);
prev_btn= new Fl_Button(x, border, button_width, height, "Previous");
@@ -135,6 +136,7 @@ Findbar::Findbar(int width, int height) :
prev_btn->shortcut(FL_SHIFT+FL_Enter);
prev_btn->callback(searchBackwards_cb, this);
prev_btn->clear_visible_focus();
+ prev_btn->box(FL_THIN_UP_BOX);
add(prev_btn);
check_btn = new Fl_Check_Button(x, border, 2*button_width, height,
@@ -182,7 +184,13 @@ int Findbar::handle(int event)
*/
void Findbar::show()
{
+ BrowserWindow *bw = a_UIcmd_get_bw_by_widget(this);
+ dReturn_if (bw == NULL);
+
+ // It takes more than just calling show() to do the trick
+ //a_UIcmd_findbar_toggle(bw, 1);
Fl_Group::show();
+
/* select text even if already focused */
i->take_focus();
i->position(i->size(), 0);
@@ -193,10 +201,13 @@ void Findbar::show()
*/
void Findbar::hide()
{
- BrowserWindow *bw;
+ BrowserWindow *bw = a_UIcmd_get_bw_by_widget(this);
+ dReturn_if (bw == NULL);
+ // It takes more than just calling hide() to do the trick
Fl_Group::hide();
- if ((bw = a_UIcmd_get_bw_by_widget(this)))
- a_UIcmd_findtext_reset(bw);
+ a_UIcmd_findbar_toggle(bw, 0);
+
+ a_UIcmd_findtext_reset(bw);
a_UIcmd_focus_main_area(bw);
}
diff --git a/src/menu.cc b/src/menu.cc
index 6c5835f8..0918ba51 100644
--- a/src/menu.cc
+++ b/src/menu.cc
@@ -156,7 +156,7 @@ static void Menu_add_bookmark_cb(Fl_Widget*, void* )
*/
static void Menu_find_text_cb(Fl_Widget*, void* )
{
- ((UI *)popup_bw->ui)->set_findbar_visibility(1);
+ ((UI *)popup_bw->ui)->findbar_toggle(1);
}
/*
diff --git a/src/ui.cc b/src/ui.cc
index e2de1a40..9026b822 100644
--- a/src/ui.cc
+++ b/src/ui.cc
@@ -110,7 +110,11 @@ int CustInput::handle(int e)
(k == FL_Up || k == FL_Down || k == FL_Left || k == FL_Right)) {
return 0;
} else if (e == FL_KEYBOARD) {
- if (modifier == FL_CTRL) {
+ if (k == FL_Escape && modifier == 0) {
+ // Let the parent group handle this Esc key
+ return 0;
+
+ } else if (modifier == FL_CTRL) {
if (k == 'l') {
// Make text selected when already focused.
position(size(), 0);
@@ -692,12 +696,13 @@ UI::UI(int x, int y, int ui_w, int ui_h, const char* label, const UI *cur_ui) :
MainIdx = TopGroup->find(Main);
// Find text bar
- //findbar = new Findbar(ui_w, 28);
- //TopGroup->add(findbar);
- Fl_Box *fb = new Fl_Box(0,0,0,fh, "F I N D B A R");
+ FindBarSpace = 1;
+ FindBar = new Findbar(ui_w, fh);
+ TopGroup->add(FindBar);
// Status Panel
make_status_bar(ui_w, ui_h);
+ TopGroup->add(StatusBar);
TopGroup->end();
@@ -710,10 +715,6 @@ UI::UI(int x, int y, int ui_w, int ui_h, const char* label, const UI *cur_ui) :
customize(0);
- // Hide findbar
- fb->hide();
- Main->size(Main->w(), Main->h()+fb->h());
-
if (Panelmode) {
//Panel->hide();
//StatusBar->hide();
@@ -759,8 +760,10 @@ int UI::handle(int event)
a_UIcmd_book(a_UIcmd_get_bw_by_widget(this));
ret = 1;
} else if (cmd == KEYS_FIND) {
- MSG("UI::handle ->KEYS_FIND\n");
- //set_findbar_visibility(1);
+ if (!FindBarSpace) {
+ findbar_toggle(1);
+ } else
+ FindBar->hide();
ret = 1;
} else if (cmd == KEYS_WEBSEARCH) {
a_UIcmd_search_dialog(a_UIcmd_get_bw_by_widget(this));
@@ -1094,13 +1097,30 @@ void UI::paste_url()
}
/*
- * Shows or hides the findbar of this window
+ * Ajust space for the findbar (if necessary) and show or remove it
*/
-void UI::set_findbar_visibility(bool visible)
+void UI::findbar_toggle(bool add)
{
- if (visible) {
- findbar->show();
- } else {
- findbar->hide();
+ /* WORKAROUND:
+ * This is tricky: As fltk-1.3 resizes hidden widgets (which it
+ * doesn't resize when visible!). We need to go through hoops to
+ * get the desired behaviour.
+ * Most probably this is a bug in FLTK and we have to report it.
+ */
+
+ if (add && !FindBarSpace) {
+ // show
+ Main->size(Main->w(), Main->h()-FindBar->h());
+ insert(*FindBar, StatusBar);
+ FindBar->show();
+ FindBarSpace = 1;
+ } else if (!add && FindBarSpace) {
+ // hide
+ Main->size(Main->w(), Main->h()+FindBar->h());
+ remove(FindBar);
+ FindBarSpace = 0;
}
+
+ // Main->redraw(); is not enough
+ redraw();
}
diff --git a/src/ui.hh b/src/ui.hh
index f5225357..c74b2056 100644
--- a/src/ui.hh
+++ b/src/ui.hh
@@ -127,14 +127,14 @@ class UI : public Fl_Pack {
CustProgressBox *PProg, *IProg;
Fl_Group *Panel, *Main;
Fl_Output *StatusOutput;
+ Findbar *FindBar;
- int MainIdx;
+ int FindBarSpace, MainIdx;
// Panel customization variables
int PanelSize, CuteColor, Small_Icons;
int p_xpos, p_ypos, bw, bh, mh, lh, nh, fh, sh, pw, lbl;
UIPanelmode Panelmode;
- Findbar *findbar;
int PointerOnLink;
Fl_Button *make_button(const char *label, Fl_Image *img,
Fl_Image*deimg, int b_n, int start = 0);
@@ -168,7 +168,7 @@ public:
void paste_url();
void set_panelmode(UIPanelmode mode);
UIPanelmode get_panelmode();
- void set_findbar_visibility(bool visible);
+ void findbar_toggle(bool add);
Fl_Widget *fullscreen_button() { return FullScreen; }
void fullscreen_toggle() { FullScreen->do_callback(); }
diff --git a/src/uicmd.cc b/src/uicmd.cc
index 08f9f70b..190b9e7e 100644
--- a/src/uicmd.cc
+++ b/src/uicmd.cc
@@ -142,7 +142,11 @@ int CustTabs::handle(int e)
UI *ui = (UI*)wizard()->value();
BrowserWindow *bw = a_UIcmd_get_bw_by_widget(ui);
KeysCommand_t cmd = Keys::getKeyCmd();
- if (cmd == KEYS_NOP) {
+ if (Fl::event_key() == FL_Escape) {
+ // Hide findbar if present
+ ui->findbar_toggle(0);
+ ret = 1;
+ } else if (cmd == KEYS_NOP) {
// Do nothing
} else if (cmd == KEYS_NEW_TAB) {
a_UIcmd_open_url_nt(bw, NULL, 1);
@@ -435,6 +439,9 @@ static BrowserWindow *UIcmd_tab_new(CustTabs *tabs, int focus)
// Copy the layout pointer into the bw data
new_bw->render_layout = (void*)layout;
+ // WORKAROUND: see findbar_toggle()
+ new_ui->findbar_toggle(0);
+
return new_bw;
}
@@ -1231,6 +1238,14 @@ void a_UIcmd_findtext_reset(BrowserWindow *bw)
}
/*
+ * Tell the UI to hide/show the findbar
+ */
+void a_UIcmd_findbar_toggle(BrowserWindow *bw, int on)
+{
+ BW2UI(bw)->findbar_toggle(on);
+}
+
+/*
* Focus the rendered area.
*/
void a_UIcmd_focus_main_area(BrowserWindow *bw)
diff --git a/src/uicmd.hh b/src/uicmd.hh
index c8fea9e7..65394ff2 100644
--- a/src/uicmd.hh
+++ b/src/uicmd.hh
@@ -39,6 +39,7 @@ void a_UIcmd_findtext_dialog(BrowserWindow *bw);
void a_UIcmd_findtext_search(BrowserWindow *bw,const char *key,int case_sens,
int backwards);
void a_UIcmd_findtext_reset(BrowserWindow *bw);
+void a_UIcmd_findbar_toggle(BrowserWindow *bw, int on);
void a_UIcmd_focus_main_area(BrowserWindow *bw);
void a_UIcmd_focus_location(void *vbw);
void a_UIcmd_page_popup(void *vbw, bool_t has_bugs, void *v_cssUrls);