summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Wilson <rjw@netsurf-browser.org>2006-07-05 01:23:25 +0000
committerRichard Wilson <rjw@netsurf-browser.org>2006-07-05 01:23:25 +0000
commita102f34fa6fe25b928c0d27bcf7bae60c4906d95 (patch)
tree0479a70740cc5c0527b7c7799ae2eaa615898216
parentcd59d27008420b5a6337c1fcef230b8f3b628c0e (diff)
downloadnetsurf-a102f34fa6fe25b928c0d27bcf7bae60c4906d95.tar.gz
netsurf-a102f34fa6fe25b928c0d27bcf7bae60c4906d95.tar.bz2
Make adjust-clicking submit open a new window (fix 1430135)
svn path=/trunk/netsurf/; revision=2716
-rw-r--r--desktop/browser.c34
-rw-r--r--desktop/browser.h6
-rw-r--r--desktop/textinput.c2
-rw-r--r--riscos/window.c8
4 files changed, 35 insertions, 15 deletions
diff --git a/desktop/browser.c b/desktop/browser.c
index 2f4860aec..71af6caa3 100644
--- a/desktop/browser.c
+++ b/desktop/browser.c
@@ -100,7 +100,7 @@ static void browser_window_scroll_box(struct browser_window *bw,
* \param referer The referring uri
*/
-void browser_window_create(const char *url, struct browser_window *clone,
+struct browser_window *browser_window_create(const char *url, struct browser_window *clone,
char *referer, bool history_add)
{
struct browser_window *bw;
@@ -109,7 +109,7 @@ void browser_window_create(const char *url, struct browser_window *clone,
if ((bw = malloc(sizeof *bw)) == NULL) {
warn_user("NoMemory", 0);
- return;
+ return NULL;
}
bw->current_content = NULL;
@@ -133,10 +133,12 @@ void browser_window_create(const char *url, struct browser_window *clone,
bw->download = false;
if ((bw->window = gui_create_browser_window(bw, clone)) == NULL) {
free(bw);
- return;
+ return NULL;
}
bw->refresh_interval = -1;
- browser_window_go(bw, url, referer, history_add);
+ if (url)
+ browser_window_go(bw, url, referer, history_add);
+ return bw;
}
@@ -966,7 +968,10 @@ void browser_window_mouse_action_html(struct browser_window *bw,
pointer = GUI_POINTER_POINT;
if (mouse & BROWSER_MOUSE_CLICK_1)
browser_form_submit(bw, gadget->form,
- gadget);
+ gadget, false);
+ else if (mouse & BROWSER_MOUSE_CLICK_2)
+ browser_form_submit(bw, gadget->form,
+ gadget, true);
} else {
status = messages_get("FormBadSubmit");
}
@@ -1887,10 +1892,11 @@ gui_pointer_shape get_pointer_shape(css_cursor cursor)
*/
void browser_form_submit(struct browser_window *bw, struct form *form,
- struct form_control *submit_button)
+ struct form_control *submit_button, bool new_window)
{
char *data = 0, *url = 0;
struct form_successful_control *success;
+ struct browser_window *target;
assert(form);
assert(bw->current_content->type == CONTENT_HTML);
@@ -1899,6 +1905,15 @@ void browser_form_submit(struct browser_window *bw, struct form *form,
warn_user("NoMemory", 0);
return;
}
+
+ if (new_window) {
+ target = browser_window_create(NULL, bw, NULL, true);
+ /* any error has already been reported */
+ if (!target)
+ return;
+ } else {
+ target = bw;
+ }
switch (form->method) {
case method_GET:
@@ -1911,6 +1926,7 @@ void browser_form_submit(struct browser_window *bw, struct form *form,
url = calloc(1, strlen(form->action) + strlen(data) + 2);
if (!url) {
form_free_successful(success);
+ free(data);
warn_user("NoMemory", 0);
return;
}
@@ -1920,7 +1936,7 @@ void browser_form_submit(struct browser_window *bw, struct form *form,
else {
sprintf(url, "%s?%s", form->action, data);
}
- browser_window_go(bw, url, bw->current_content->url,
+ browser_window_go(target, url, bw->current_content->url,
true);
break;
@@ -1931,13 +1947,13 @@ void browser_form_submit(struct browser_window *bw, struct form *form,
warn_user("NoMemory", 0);
return;
}
- browser_window_go_post(bw, form->action, data, 0,
+ browser_window_go_post(target, form->action, data, 0,
true, bw->current_content->url,
false);
break;
case method_POST_MULTIPART:
- browser_window_go_post(bw, form->action, 0, success,
+ browser_window_go_post(target, form->action, 0, success,
true, bw->current_content->url,
false);
break;
diff --git a/desktop/browser.h b/desktop/browser.h
index 516ba7394..7bc985a40 100644
--- a/desktop/browser.h
+++ b/desktop/browser.h
@@ -123,8 +123,8 @@ typedef enum {
extern struct browser_window *current_redraw_browser;
-void browser_window_create(const char *url, struct browser_window *clone,
- char *referer, bool history_add);
+struct browser_window * browser_window_create(const char *url,
+ struct browser_window *clone, char *referer, bool history_add);
void browser_window_go(struct browser_window *bw, const char *url,
char *referer, bool history_add);
void browser_window_go_post(struct browser_window *bw, const char *url,
@@ -150,7 +150,7 @@ void browser_window_form_select(struct browser_window *bw,
struct form_control *control, int item);
void browser_redraw_box(struct content *c, struct box *box);
void browser_form_submit(struct browser_window *bw, struct form *form,
- struct form_control *submit_button);
+ struct form_control *submit_button, bool new_window);
void browser_window_redraw_rect(struct browser_window *bw, int x, int y,
int width, int height);
diff --git a/desktop/textinput.c b/desktop/textinput.c
index a941cc86b..32d36d9dc 100644
--- a/desktop/textinput.c
+++ b/desktop/textinput.c
@@ -922,7 +922,7 @@ void browser_window_input_callback(struct browser_window *bw,
case 10:
case 13: /* Return/Enter hit */
if (form)
- browser_form_submit(bw, form, 0);
+ browser_form_submit(bw, form, 0, false);
return;
case 11: { /* Shift + Tab */
diff --git a/riscos/window.c b/riscos/window.c
index 34ba908a5..9ffc0dc20 100644
--- a/riscos/window.c
+++ b/riscos/window.c
@@ -1352,8 +1352,12 @@ void ro_gui_window_mouse_at(struct gui_window *g, wimp_pointer *pointer)
if (error) {
LOG(("xwimp_get_window_state: 0x%x: %s",
error->errnum, error->errmess));
- warn_user("WimpError", error->errmess);
- return;
+/*
+ * the WIMP sometimes fails to realise the pointer has left a NetSurf window
+ * so we get an error -- there is no gain from telling the user about this
+ *
+ * warn_user("WimpError", error->errmess);
+*/ return;
}
x = window_x_units(pointer->pos.x, &state) / 2 / g->option.scale;