diff options
author | Jorge Arellano Cid <jcid@dillo.org> | 2008-11-30 10:48:35 -0300 |
---|---|---|
committer | Jorge Arellano Cid <jcid@dillo.org> | 2008-11-30 10:48:35 -0300 |
commit | 58aaa5c9ee0a674a1a29f95c9fe047540fc44df1 (patch) | |
tree | a253ea845c2c905bffb9220175f14e880c9cb6f5 | |
parent | 163277cb82fa38a5e7a5b1728f5d9535efb2c921 (diff) |
- Set middle click to submit in a new TAB. (Helps to keep form data!)
-rw-r--r-- | ChangeLog | 1 | ||||
-rw-r--r-- | dw/fltkui.cc | 51 | ||||
-rw-r--r-- | dw/ui.cc | 16 | ||||
-rw-r--r-- | dw/ui.hh | 9 | ||||
-rw-r--r-- | src/form.cc | 114 | ||||
-rw-r--r-- | test/form.cc | 4 | ||||
-rw-r--r-- | test/form.hh | 4 |
7 files changed, 119 insertions, 80 deletions
@@ -17,6 +17,7 @@ dillo-2.1 - Set prefs.vw_fontname as deafult font for the UI. - Fix: recover page focus when clicking-out of a widget. - Fixed a segfault bug in the test/ directory. + - Set middle click to submit in a new TAB. (Helps to keep form data!) Patches: place (AKA corvid) +- Switched SSL-enabled to configure.in (./configure --enable-ssl). - Standardised the installation of dpid/dpidrc with auto* tools. diff --git a/dw/fltkui.cc b/dw/fltkui.cc index d3136090..9d9b8107 100644 --- a/dw/fltkui.cc +++ b/dw/fltkui.cc @@ -286,11 +286,47 @@ void FltkLabelButtonResource::sizeRequest (core::Requisition *requisition) } } +/* + * Get FLTK state and translate to dw + * + * TODO: find a good home for this and the fltkviewbase.cc original. + */ +static core::ButtonState getDwButtonState () +{ + int s1 = ::fltk::event_state (); + int s2 = (core::ButtonState)0; + + if(s1 & ::fltk::SHIFT) s2 |= core::SHIFT_MASK; + if(s1 & ::fltk::CTRL) s2 |= core::CONTROL_MASK; + if(s1 & ::fltk::ALT) s2 |= core::META_MASK; + if(s1 & ::fltk::BUTTON1) s2 |= core::BUTTON1_MASK; + if(s1 & ::fltk::BUTTON2) s2 |= core::BUTTON2_MASK; + if(s1 & ::fltk::BUTTON3) s2 |= core::BUTTON3_MASK; + + return (core::ButtonState)s2; +} + +static void setButtonEvent(dw::core::EventButton *event) +{ + event->xCanvas = ::fltk::event_x(); + event->yCanvas = ::fltk::event_y(); + event->state = getDwButtonState(); + event->button = ::fltk::event_button(); + event->numPressed = ::fltk::event_clicks() + 1; +} + void FltkLabelButtonResource::widgetCallback (::fltk::Widget *widget, void *data) { - if (widget->when () & ::fltk::WHEN_RELEASE) - ((FltkLabelButtonResource*)data)->emitActivate (); + if ((widget->when () & ::fltk::WHEN_RELEASE) && + ((::fltk::event_key() == ::fltk::ReturnKey) || + (::fltk::event_button() == ::fltk::LeftButton || + ::fltk::event_button() == ::fltk::MiddleButton))) { + FltkLabelButtonResource *lbr = (FltkLabelButtonResource*) data; + dw::core::EventButton event; + setButtonEvent(&event); + lbr->emitClicked(&event); + } } const char *FltkLabelButtonResource::getLabel () @@ -336,12 +372,15 @@ void FltkComplexButtonResource::widgetCallback (::fltk::Widget *widget, { FltkComplexButtonResource *res = (FltkComplexButtonResource*)data; - /* would be best not to send click pos. if the image could not be loaded */ - if (::fltk::event() == ::fltk::RELEASE && - ::fltk::event_button() == ::fltk::LeftButton) { + if (widget->when() == ::fltk::WHEN_RELEASE && + ((::fltk::event_key() == ::fltk::ReturnKey) || + (::fltk::event_button() == ::fltk::LeftButton || + ::fltk::event_button() == ::fltk::MiddleButton))) { res->click_x = ::fltk::event_x(); res->click_y = ::fltk::event_y(); - res->emitActivate (); + dw::core::EventButton event; + setButtonEvent(&event); + res->emitClicked(&event); } else { ((FltkViewBase*)res->lastFlatView)->handle(::fltk::event()); } @@ -211,21 +211,17 @@ bool ButtonResource::ClickedEmitter::emitToReceiver (lout::signal::Receiver { ((ClickedReceiver*)receiver) ->clicked ((ButtonResource*)((Pointer*)argv[0])->getValue (), - ((Integer*)argv[1])->getValue (), - ((Integer*)argv[2])->getValue (), - ((Integer*)argv[3])->getValue ()); + (EventButton*)((Pointer*)argv[1])->getValue()); return false; } void ButtonResource::ClickedEmitter::emitClicked (ButtonResource *resource, - int buttonNo, int x, int y) + EventButton *event) { - Integer i1 (buttonNo); - Integer i2 (x); - Integer i3 (y); - Pointer p (resource); - Object *argv[4] = { &p, &i1, &i2, &i3 }; - emitVoid (0, 4, argv); + Pointer p1 (resource); + Pointer p2 (event); + Object *argv[2] = { &p1, &p2 }; + emitVoid (0, 2, argv); } // ---------------------------------------------------------------------- @@ -334,8 +334,7 @@ public: class ClickedReceiver: public lout::signal::Receiver { public: - virtual void clicked (ButtonResource *resource, int buttonNo, int x, - int y) = 0; + virtual void clicked (ButtonResource *resource, EventButton *event) = 0; }; private: @@ -347,14 +346,14 @@ private: public: inline void connectClicked (ClickedReceiver *receiver) { connect (receiver); } - void emitClicked (ButtonResource *resource, int buttonNo, int x, int y); + void emitClicked (ButtonResource *resource, EventButton *event); }; ClickedEmitter clickedEmitter; protected: - inline void emitClicked (int buttonNo, int x, int y) { - return clickedEmitter.emitClicked (this, buttonNo, x, y); } + inline void emitClicked (EventButton *event) { + clickedEmitter.emitClicked (this, event); } public: inline void connectClicked (ClickedReceiver *receiver) { diff --git a/src/form.cc b/src/form.cc index 6f7979be..63d4ff83 100644 --- a/src/form.cc +++ b/src/form.cc @@ -75,8 +75,8 @@ class DilloHtmlForm { friend class DilloHtmlInput; DilloHtml *html; - void eventHandler(Resource *resource); - void submit(DilloHtmlInput *active_input); + void eventHandler(Resource *resource, EventButton *event); + void submit(DilloHtmlInput *active_input, EventButton *event); DilloUrl *buildQueryUrl(DilloHtmlInput *active_input); Dstr *buildQueryData(DilloHtmlInput *active_submit); char *makeMultipartBoundary(iconv_t char_encoder, @@ -128,7 +128,7 @@ class DilloHtmlReceiver: void activate (Resource *resource); void enter (Resource *resource); void leave (Resource *resource); - void clicked (ButtonResource *resource, int buttonNo, int x, int y); + void clicked (ButtonResource *resource, EventButton *event); }; class DilloHtmlInput { @@ -150,7 +150,7 @@ public: //BUG: for now everything is public private: void connectTo(DilloHtmlReceiver *form_receiver); - void activate(DilloHtmlForm *form, bool entry_input_submits); + void activate(DilloHtmlForm *form, int num_entry_fields,EventButton *event); void readFile(BrowserWindow *bw); public: @@ -947,14 +947,12 @@ DilloHtmlForm::~DilloHtmlForm () delete(form_receiver); } -void DilloHtmlForm::eventHandler(Resource *resource) +void DilloHtmlForm::eventHandler(Resource *resource, EventButton *event) { MSG("DilloHtmlForm::eventHandler\n"); DilloHtmlInput *input = getInput(resource); if (input) { - bool entry_input_submits = prefs.enterpress_forces_submit || - num_entry_fields == 1; - input->activate (this, entry_input_submits); + input->activate (this, num_entry_fields, event); } else { MSG("DilloHtmlForm::eventHandler: ERROR, input not found!\n"); } @@ -964,11 +962,21 @@ void DilloHtmlForm::eventHandler(Resource *resource) * Submit. * (Called by eventHandler()) */ -void DilloHtmlForm::submit(DilloHtmlInput *active_input) +void DilloHtmlForm::submit(DilloHtmlInput *active_input, EventButton *event) { DilloUrl *url = buildQueryUrl(active_input); if (url) { - a_Nav_push(html->bw, url); + if (event && event->button == 2) { + if (prefs.middle_click_opens_new_tab) { + int focus = prefs.focus_new_tab ? 1 : 0; + if (event->state == SHIFT_MASK) focus = !focus; + a_UIcmd_open_url_nt(html->bw, url, focus); + } else { + a_Nav_push_nw(html->bw, url); + } + } else { + a_Nav_push(html->bw, url); + } a_Url_free(url); } // /* now, make the rendered area have its focus back */ @@ -1479,7 +1487,7 @@ DilloHtmlInput *DilloHtmlForm::getRadioInput (const char *name) void DilloHtmlReceiver::activate (Resource *resource) { - form->eventHandler(resource); + form->eventHandler(resource, NULL); } /* @@ -1515,9 +1523,9 @@ void DilloHtmlReceiver::leave (Resource *resource) } void DilloHtmlReceiver::clicked (ButtonResource *resource, - int buttonNo, int x, int y) + EventButton *event) { -// form->eventHandler(resource, x, y); + form->eventHandler(resource, event); } /* @@ -1566,56 +1574,52 @@ DilloHtmlInput::~DilloHtmlInput () */ void DilloHtmlInput::connectTo(DilloHtmlReceiver *form_receiver) { - Resource *resource = NULL; - if (embed) - resource = embed->getResource (); - switch (type) { - case DILLO_HTML_INPUT_UNKNOWN: - case DILLO_HTML_INPUT_HIDDEN: - case DILLO_HTML_INPUT_CHECKBOX: - case DILLO_HTML_INPUT_RADIO: - case DILLO_HTML_INPUT_BUTTON: - case DILLO_HTML_INPUT_TEXTAREA: - case DILLO_HTML_INPUT_SELECT: - case DILLO_HTML_INPUT_SEL_LIST: - // do nothing - break; - case DILLO_HTML_INPUT_TEXT: - case DILLO_HTML_INPUT_PASSWORD: - case DILLO_HTML_INPUT_INDEX: - case DILLO_HTML_INPUT_SUBMIT: - case DILLO_HTML_INPUT_RESET: - case DILLO_HTML_INPUT_BUTTON_SUBMIT: - case DILLO_HTML_INPUT_BUTTON_RESET: - case DILLO_HTML_INPUT_IMAGE: - case DILLO_HTML_INPUT_FILE: - if (resource) - resource->connectActivate (form_receiver); - break; + Resource *resource; + if (embed && (resource = embed->getResource())) { + switch (type) { + case DILLO_HTML_INPUT_UNKNOWN: + case DILLO_HTML_INPUT_HIDDEN: + case DILLO_HTML_INPUT_CHECKBOX: + case DILLO_HTML_INPUT_RADIO: + case DILLO_HTML_INPUT_BUTTON: + case DILLO_HTML_INPUT_TEXTAREA: + case DILLO_HTML_INPUT_SELECT: + case DILLO_HTML_INPUT_SEL_LIST: + // do nothing + break; + case DILLO_HTML_INPUT_SUBMIT: + case DILLO_HTML_INPUT_RESET: + case DILLO_HTML_INPUT_BUTTON_SUBMIT: + case DILLO_HTML_INPUT_BUTTON_RESET: + case DILLO_HTML_INPUT_IMAGE: + case DILLO_HTML_INPUT_FILE: + ((ButtonResource *)resource)->connectClicked (form_receiver); + case DILLO_HTML_INPUT_TEXT: + case DILLO_HTML_INPUT_PASSWORD: + case DILLO_HTML_INPUT_INDEX: + resource->connectActivate (form_receiver); + break; + break; + } } } /* * Activate a form */ -void DilloHtmlInput::activate(DilloHtmlForm *form, bool entry_input_submits) +void DilloHtmlInput::activate(DilloHtmlForm *form, int num_entry_fields, + EventButton *event) { - switch (type) { - case DILLO_HTML_INPUT_TEXT: - case DILLO_HTML_INPUT_PASSWORD: - if (entry_input_submits) - form->submit (this); - break; - case DILLO_HTML_INPUT_FILE: + if (type == DILLO_HTML_INPUT_FILE) { readFile (form->html->bw); - break; - case DILLO_HTML_INPUT_RESET: - case DILLO_HTML_INPUT_BUTTON_RESET: - form->reset (); - break; - default: - form->submit (this); - break; + } else if (type == DILLO_HTML_INPUT_RESET || + type == DILLO_HTML_INPUT_BUTTON_RESET) { + form->reset(); + } else if ((type != DILLO_HTML_INPUT_TEXT && + type != DILLO_HTML_INPUT_PASSWORD) || + prefs.enterpress_forces_submit || + num_entry_fields == 1) { + form->submit(this, event); } } diff --git a/test/form.cc b/test/form.cc index b337a25b..ab9994a9 100644 --- a/test/form.cc +++ b/test/form.cc @@ -165,9 +165,9 @@ Form::FormClickedReceiver::~FormClickedReceiver () } void Form::FormClickedReceiver::clicked (ButtonResource *resource, - int buttonNo, int x, int y) + dw::core::EventButton *event) { - form->send (name, value, x, y); + form->send (name, value, event->xCanvas, event->yCanvas); } Form::Form () diff --git a/test/form.hh b/test/form.hh index a04460f4..76eae9fe 100644 --- a/test/form.hh +++ b/test/form.hh @@ -130,8 +130,8 @@ private: FormClickedReceiver (Form *form, const char *name, const char *value); ~FormClickedReceiver (); - void clicked (dw::core::ui::ButtonResource *resource, int buttonNo, - int x, int y); + void clicked(dw::core::ui::ButtonResource *resource, + dw::core::EventButton *event); }; lout::container::typed::List <ResourceDecorator> *resources; |