summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Wilson <rjw@netsurf-browser.org>2006-07-05 16:50:35 +0000
committerRichard Wilson <rjw@netsurf-browser.org>2006-07-05 16:50:35 +0000
commitea44d84833942c6de84b4aa58ad594754a0a0ac7 (patch)
tree4bf5242b1738db2b322d7b32cc685d843d889afb
parenta102f34fa6fe25b928c0d27bcf7bae60c4906d95 (diff)
downloadnetsurf-ea44d84833942c6de84b4aa58ad594754a0a0ac7.tar.gz
netsurf-ea44d84833942c6de84b4aa58ad594754a0a0ac7.tar.bz2
Make adjust-back/forwards/up open content in a new window (implement 1431600)
svn path=/trunk/netsurf/; revision=2717
-rw-r--r--desktop/browser.c2
-rw-r--r--riscos/gui.h10
-rw-r--r--riscos/menus.c12
-rw-r--r--riscos/window.c62
4 files changed, 65 insertions, 21 deletions
diff --git a/desktop/browser.c b/desktop/browser.c
index 71af6caa3..ea3f9814f 100644
--- a/desktop/browser.c
+++ b/desktop/browser.c
@@ -1907,7 +1907,7 @@ void browser_form_submit(struct browser_window *bw, struct form *form,
}
if (new_window) {
- target = browser_window_create(NULL, bw, NULL, true);
+ target = browser_window_create(NULL, bw, NULL, false);
/* any error has already been reported */
if (!target)
return;
diff --git a/riscos/gui.h b/riscos/gui.h
index 6b1451df5..f7338c42d 100644
--- a/riscos/gui.h
+++ b/riscos/gui.h
@@ -116,7 +116,8 @@ void ro_gui_download_drag_end(wimp_dragged *drag);
void ro_gui_download_datasave_ack(wimp_message *message);
bool ro_gui_download_window_destroy(struct gui_download_window *dw, bool quit);
bool ro_gui_download_prequit(void);
-bool ro_gui_download_window_keypress(struct gui_download_window *dw, wimp_key *key);
+bool ro_gui_download_window_keypress(struct gui_download_window *dw,
+ wimp_key *key);
/* in 401login.c */
#ifdef WITH_AUTH
@@ -158,11 +159,14 @@ bool ro_gui_shift_pressed(void);
bool ro_gui_ctrl_pressed(void);
void ro_gui_window_scroll_end(struct gui_window *g, wimp_dragged *drag);
void ro_gui_window_set_scale(struct gui_window *g, float scale);
-void ro_gui_window_iconise(struct gui_window *g, wimp_full_message_window_info *wi);
+void ro_gui_window_iconise(struct gui_window *g,
+ wimp_full_message_window_info *wi);
+bool ro_gui_window_navigate_up(struct gui_window *g, const char *url);
/* in history.c */
void ro_gui_history_init(void);
-void ro_gui_history_open(struct browser_window *bw, struct history *history, bool pointer);
+void ro_gui_history_open(struct browser_window *bw, struct history *history,
+ bool pointer);
void ro_gui_history_mouse_at(wimp_pointer *pointer);
/* in hotlist.c */
diff --git a/riscos/menus.c b/riscos/menus.c
index 4e5cfc98a..bef46b201 100644
--- a/riscos/menus.c
+++ b/riscos/menus.c
@@ -1372,9 +1372,6 @@ bool ro_gui_menu_handle_action(wimp_w owner, menu_action action,
os_error *error;
char url[80];
const struct url_data *data;
- char *parent;
- url_func_result res;
- bool compare;
ro_gui_menu_get_window_details(owner, &g, &bw, &c, &t, &tree);
@@ -1526,14 +1523,7 @@ bool ro_gui_menu_handle_action(wimp_w owner, menu_action action,
case BROWSER_NAVIGATE_UP:
if ((!bw) || (!c))
return false;
- res = url_parent(c->url, &parent);
- if (res == URL_FUNC_OK) {
- res = url_compare(c->url, parent, &compare);
- if (!compare && (res == URL_FUNC_OK))
- browser_window_go(g->bw, parent, 0, true);
- free(parent);
- }
- return true;
+ return ro_gui_window_navigate_up(bw->window, c->url);
case BROWSER_NAVIGATE_RELOAD:
case BROWSER_NAVIGATE_RELOAD_ALL:
if (!bw)
diff --git a/riscos/window.c b/riscos/window.c
index 9ffc0dc20..255cee5c0 100644
--- a/riscos/window.c
+++ b/riscos/window.c
@@ -1374,6 +1374,7 @@ void ro_gui_window_mouse_at(struct gui_window *g, wimp_pointer *pointer)
bool ro_gui_toolbar_click(wimp_pointer *pointer)
{
struct gui_window *g = ro_gui_toolbar_lookup(pointer->w);
+ struct browser_window *new_bw;
/* toolbars in the options window have no gui_window */
if (!g)
@@ -1401,13 +1402,27 @@ bool ro_gui_toolbar_click(wimp_pointer *pointer)
*/
switch (pointer->i) {
case ICON_TOOLBAR_BACK:
- ro_gui_menu_handle_action(g->window,
- BROWSER_NAVIGATE_BACK, true);
+ if (pointer->buttons == wimp_CLICK_ADJUST) {
+ new_bw = browser_window_create(NULL,
+ g->bw, NULL, false);
+ ro_gui_menu_handle_action(new_bw->window->window,
+ BROWSER_NAVIGATE_BACK, true);
+ } else {
+ ro_gui_menu_handle_action(g->window,
+ BROWSER_NAVIGATE_BACK, true);
+ }
break;
case ICON_TOOLBAR_FORWARD:
- ro_gui_menu_handle_action(g->window,
- BROWSER_NAVIGATE_FORWARD, true);
+ if (pointer->buttons == wimp_CLICK_ADJUST) {
+ new_bw = browser_window_create(NULL,
+ g->bw, NULL, false);
+ ro_gui_menu_handle_action(new_bw->window->window,
+ BROWSER_NAVIGATE_FORWARD, true);
+ } else {
+ ro_gui_menu_handle_action(g->window,
+ BROWSER_NAVIGATE_FORWARD, true);
+ }
break;
case ICON_TOOLBAR_STOP:
@@ -1469,8 +1484,18 @@ bool ro_gui_toolbar_click(wimp_pointer *pointer)
BROWSER_PRINT, true);
break;
case ICON_TOOLBAR_UP:
- ro_gui_menu_handle_action(g->window,
- BROWSER_NAVIGATE_UP, true);
+ if (pointer->buttons == wimp_CLICK_ADJUST) {
+ if (g->bw && g->bw->current_content) {
+ new_bw = browser_window_create(NULL,
+ g->bw, NULL, false);
+ /* do it without loading the content into the new window */
+ ro_gui_window_navigate_up(new_bw->window,
+ g->bw->current_content->url);
+ }
+ } else {
+ ro_gui_menu_handle_action(g->window,
+ BROWSER_NAVIGATE_UP, true);
+ }
break;
case ICON_TOOLBAR_URL:
if (pointer->buttons & (wimp_DRAG_SELECT | wimp_DRAG_ADJUST)) {
@@ -3064,3 +3089,28 @@ void ro_gui_window_iconise(struct gui_window *g, wimp_full_message_window_info *
free(area);
}
+
+
+/**
+ * Navigate up one level
+ *
+ * \param g the gui_window to open the parent link in
+ * \param url the URL to open the parent of
+ */
+bool ro_gui_window_navigate_up(struct gui_window *g, const char *url) {
+ char *parent;
+ url_func_result res;
+ bool compare;
+
+ if (!g || (!g->bw))
+ return false;
+
+ res = url_parent(url, &parent);
+ if (res == URL_FUNC_OK) {
+ res = url_compare(url, parent, &compare);
+ if (!compare && (res == URL_FUNC_OK))
+ browser_window_go(g->bw, parent, 0, true);
+ free(parent);
+ }
+ return true;
+}