Mercurial > dillo_port1.3
changeset 459:ddf513f18af5
- Set middle click to submit in a new TAB. (Helps to keep form data!)
author | Jorge Arellano Cid <jcid@dillo.org> |
---|---|
date | Sun, 30 Nov 2008 10:48:35 -0300 |
parents | 32363eb05dfc |
children | 049ecedd288c |
files | ChangeLog dw/fltkui.cc dw/ui.cc dw/ui.hh src/form.cc test/form.cc test/form.hh |
diffstat | 7 files changed, 119 insertions(+), 80 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog Fri Nov 28 15:31:45 2008 -0300 +++ b/ChangeLog Sun Nov 30 10:48:35 2008 -0300 @@ -17,6 +17,7 @@ - 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.
--- a/dw/fltkui.cc Fri Nov 28 15:31:45 2008 -0300 +++ b/dw/fltkui.cc Sun Nov 30 10:48:35 2008 -0300 @@ -286,11 +286,47 @@ } } +/* + * 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 @@ { 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()); }
--- a/dw/ui.cc Fri Nov 28 15:31:45 2008 -0300 +++ b/dw/ui.cc Sun Nov 30 10:48:35 2008 -0300 @@ -211,21 +211,17 @@ { ((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); } // ----------------------------------------------------------------------
--- a/dw/ui.hh Fri Nov 28 15:31:45 2008 -0300 +++ b/dw/ui.hh Sun Nov 30 10:48:35 2008 -0300 @@ -334,8 +334,7 @@ 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 @@ 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) {
--- a/src/form.cc Fri Nov 28 15:31:45 2008 -0300 +++ b/src/form.cc Sun Nov 30 10:48:35 2008 -0300 @@ -75,8 +75,8 @@ 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 @@ 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 @@ 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 @@ 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 @@ * 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 @@ void DilloHtmlReceiver::activate (Resource *resource) { - form->eventHandler(resource); + form->eventHandler(resource, NULL); } /* @@ -1515,9 +1523,9 @@ } 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 @@ */ 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); } }
--- a/test/form.cc Fri Nov 28 15:31:45 2008 -0300 +++ b/test/form.cc Sun Nov 30 10:48:35 2008 -0300 @@ -165,9 +165,9 @@ } 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 ()
--- a/test/form.hh Fri Nov 28 15:31:45 2008 -0300 +++ b/test/form.hh Sun Nov 30 10:48:35 2008 -0300 @@ -130,8 +130,8 @@ 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;