From ea44d84833942c6de84b4aa58ad594754a0a0ac7 Mon Sep 17 00:00:00 2001 From: Richard Wilson Date: Wed, 5 Jul 2006 16:50:35 +0000 Subject: Make adjust-back/forwards/up open content in a new window (implement 1431600) svn path=/trunk/netsurf/; revision=2717 --- desktop/browser.c | 2 +- riscos/gui.h | 10 ++++++--- riscos/menus.c | 12 +---------- riscos/window.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++++------ 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; +} -- cgit v1.2.3