diff options
-rw-r--r-- | dw/fltkviewport.cc | 23 | ||||
-rw-r--r-- | dw/fltkviewport.hh | 3 | ||||
-rw-r--r-- | src/ui.cc | 32 | ||||
-rw-r--r-- | src/uicmd.cc | 1 |
4 files changed, 32 insertions, 27 deletions
diff --git a/dw/fltkviewport.cc b/dw/fltkviewport.cc index 75c4e569..992df22b 100644 --- a/dw/fltkviewport.cc +++ b/dw/fltkviewport.cc @@ -23,6 +23,7 @@ #include <FL/Fl.H> #include <FL/fl_draw.H> +#include <FL/names.h> #include <stdio.h> #include "../lout/msg.h" @@ -64,6 +65,7 @@ FltkViewport::FltkViewport (int X, int Y, int W, int H, const char *label): vscrollbar->hide(); add (vscrollbar); + hasDragScroll = 1; scrollX = scrollY = scrollDX = scrollDY = 0; horScrolling = verScrolling = dragScrolling = 0; @@ -223,7 +225,7 @@ void FltkViewport::draw () int FltkViewport::handle (int event) { - _MSG("FltkViewport::handle %d\n", event); + _MSG("FltkViewport::handle %s\n", fl_eventnames[event]); switch(event) { case FL_KEYBOARD: @@ -249,13 +251,18 @@ int FltkViewport::handle (int event) } else if (hscrollbar->visible() && Fl::event_inside(hscrollbar)) { if (hscrollbar->handle(event)) horScrolling = 1; - } else if (FltkWidgetView::handle (event) == 0 && - Fl::event_button() == FL_MIDDLE_MOUSE) { - /* pass event so that middle click can open link in new window */ - dragScrolling = 1; - dragX = Fl::event_x(); - dragY = Fl::event_y(); - setCursor (core::style::CURSOR_MOVE); + } else if (FltkWidgetView::handle(event) == 0 && + Fl::event_button() == FL_MIDDLE_MOUSE) { + if (!hasDragScroll) { + /* let the parent widget handle it... */ + return 0; + } else { + /* receive FL_DRAG and FL_RELEASE */ + dragScrolling = 1; + dragX = Fl::event_x(); + dragY = Fl::event_y(); + setCursor (core::style::CURSOR_MOVE); + } } return 1; break; diff --git a/dw/fltkviewport.hh b/dw/fltkviewport.hh index 080d0f59..3df1dccb 100644 --- a/dw/fltkviewport.hh +++ b/dw/fltkviewport.hh @@ -21,7 +21,7 @@ private: int scrollX, scrollY; int scrollDX, scrollDY; - int dragScrolling, dragX, dragY; + int hasDragScroll, dragScrolling, dragX, dragY; int horScrolling, verScrolling; Fl_Scrollbar *vscrollbar, *hscrollbar; @@ -70,6 +70,7 @@ public: void setGadgetOrientation (bool hscrollbarVisible, bool vscrollbarVisible, GadgetOrientation gadgetOrientation); + void setDragScroll (bool enable) { hasDragScroll = enable ? 1 : 0; } void addGadget (Fl_Widget *gadget); }; @@ -23,6 +23,7 @@ #include <FL/Fl.H> #include <FL/Fl_Pixmap.H> #include <FL/Fl_Box.H> +#include <FL/names.h> // Include image data #include "pixmaps.h" @@ -780,7 +781,7 @@ UI::~UI() */ int UI::handle(int event) { - _MSG("UI::handle event=%d (%d,%d)\n", event, Fl::event_x(), Fl::event_y()); + _MSG("UI::handle event=%s\n", fl_eventnames[event]); int ret = 0; if (event == FL_KEYBOARD) { @@ -840,28 +841,23 @@ int UI::handle(int event) a_UIcmd_file_popup(a_UIcmd_get_bw_by_widget(this), FileButton); ret = 1; } - } -#if 0 - } else if (event == FL_PUSH) { - if (prefs.middle_click_drags_page == 0 && - Fl::event_button() == FL_MIDDLE_MOUSE && - !a_UIcmd_pointer_on_link(a_UIcmd_get_bw_by_widget(this))) { - if (Main->contains(Fl::belowmouse())) { - /* Offer the event to Main's children (form widgets) */ - /* TODO: Try just offering it to Fl::belowmouse() */ - ret = ((Fl_Group *)Main)->Fl_Group::handle(event); - } - if (!ret) { - /* middle click was not on a link or a form widget */ - paste_url(); - ret = 1; - } + } else if (event == FL_RELEASE) { + if (Fl::event_button() == FL_MIDDLE_MOUSE && + prefs.middle_click_drags_page == 0) { + /* nobody claimed the event; try paste */ + paste_url(); + ret = 1; } } -#endif + if (!ret) { ret = Fl_Group::handle(event); } + if (!ret && event == FL_PUSH && !prefs.middle_click_drags_page) { + /* nobody claimed FL_PUSH: ask for FL_RELEASE, + * which is necessary for middle-click paste URL) */ + ret = 1; + } return ret; } diff --git a/src/uicmd.cc b/src/uicmd.cc index 5e30d72b..5b90385b 100644 --- a/src/uicmd.cc +++ b/src/uicmd.cc @@ -438,6 +438,7 @@ static BrowserWindow *UIcmd_tab_new(CustTabs *tabs, UI *old_ui, int focus) FltkViewport *viewport = new FltkViewport (0, 0, 0, 1); viewport->box(FL_NO_BOX); viewport->setBufferedDrawing (prefs.buffered_drawing ? true : false); + viewport->setDragScroll (prefs.middle_click_drags_page ? true : false); layout->attachView (viewport); new_ui->set_render_layout(viewport); viewport->setScrollStep((int) rint(28.0 * prefs.font_factor)); |