summaryrefslogtreecommitdiff
path: root/desktop
diff options
context:
space:
mode:
authorMichael Drake <tlsa@netsurf-browser.org>2008-11-29 00:24:09 +0000
committerMichael Drake <tlsa@netsurf-browser.org>2008-11-29 00:24:09 +0000
commit0bdff384163e6c9fc5998f305cdfb78a8189043e (patch)
tree0a6f8e4a77cb507fa96d5e18ec6066e8dc5005e6 /desktop
parentd7bc286801b3fc1dfe7347314d122894274c7013 (diff)
downloadnetsurf-0bdff384163e6c9fc5998f305cdfb78a8189043e.tar.gz
netsurf-0bdff384163e6c9fc5998f305cdfb78a8189043e.tar.bz2
Move tab opening logic to same place as new window opening. Make option for "Tabbed browsing", which is enabled by default. Someone who knows how to work glade could add the "Tabbed browsing" option to the choices dialogue. When a link is opened in a new tab, don't change tab.
svn path=/trunk/netsurf/; revision=5816
Diffstat (limited to 'desktop')
-rw-r--r--desktop/browser.c66
-rw-r--r--desktop/options.c122
-rw-r--r--desktop/options.h1
3 files changed, 119 insertions, 70 deletions
diff --git a/desktop/browser.c b/desktop/browser.c
index b4e5d4485..59e6e7a35 100644
--- a/desktop/browser.c
+++ b/desktop/browser.c
@@ -98,7 +98,8 @@ static void browser_window_destroy_internal(struct browser_window *bw);
static void browser_window_set_scale_internal(struct browser_window *bw,
float scale);
static struct browser_window *browser_window_find_target(
- struct browser_window *bw, const char *target, bool new_window);
+ struct browser_window *bw, const char *target,
+ browser_mouse_state mouse);
static void browser_window_find_target_internal(struct browser_window *bw,
const char *target, int depth, struct browser_window *page,
int *rdepth, struct browser_window **bw_target);
@@ -1073,8 +1074,8 @@ void browser_window_set_scale_internal(struct browser_window *bw, float scale)
* \param new_window always return a new window (ie 'Open Link in New Window')
*/
-struct browser_window *browser_window_find_target(struct browser_window *bw, const char *target,
- bool new_window)
+struct browser_window *browser_window_find_target(struct browser_window *bw,
+ const char *target, browser_mouse_state mouse)
{
struct browser_window *bw_target;
struct browser_window *top;
@@ -1088,21 +1089,62 @@ struct browser_window *browser_window_find_target(struct browser_window *bw, con
if (!target)
target = TARGET_SELF;
- /* allow the simple case of target="_blank" to be ignored if requested */
- if ((!new_window) && (!option_target_blank)) {
+ /* allow the simple case of target="_blank" to be ignored if requested
+ */
+ if ((!(mouse & BROWSER_MOUSE_CLICK_2)) &&
+ (!((mouse & BROWSER_MOUSE_CLICK_2) &&
+ (mouse & BROWSER_MOUSE_MOD_2))) &&
+ (!option_target_blank)) {
+ /* not a mouse button 2 click
+ * not a mouse button 1 click with ctrl pressed
+ * configured to ignore target="_blank" */
if ((target == TARGET_BLANK) || (!strcasecmp(target, "_blank")))
return bw;
}
/* handle reserved keywords */
- if ((new_window) || ((target == TARGET_BLANK) || (!strcasecmp(target, "_blank")))) {
+ if (((option_button_2_tab) && (mouse & BROWSER_MOUSE_CLICK_2)) ||
+ ((!option_button_2_tab) &&
+ ((mouse & BROWSER_MOUSE_CLICK_1) &&
+ (mouse & BROWSER_MOUSE_MOD_2))) ||
+ ((option_button_2_tab) && ((target == TARGET_BLANK) ||
+ (!strcasecmp(target, "_blank"))))) {
+ /* open in new tab if:
+ * - button_2 opens in new tab and button_2 was pressed
+ * OR
+ * - button_2 doesn't open in new tabs and button_1 was
+ * pressed with ctrl held
+ * OR
+ * - button_2 opens in new tab and the link target is "_blank"
+ */
+ bw_target = browser_window_create(NULL, bw, NULL, false, true);
+ if (!bw_target)
+ return bw;
+ return bw_target;
+ } else if (((!option_button_2_tab) &&
+ (mouse & BROWSER_MOUSE_CLICK_2)) ||
+ ((option_button_2_tab) &&
+ ((mouse & BROWSER_MOUSE_CLICK_1) &&
+ (mouse & BROWSER_MOUSE_MOD_2))) ||
+ ((!option_button_2_tab) && ((target == TARGET_BLANK) ||
+ (!strcasecmp(target, "_blank"))))) {
+ /* open in new window if:
+ * - button_2 doesn't open in new tabs and button_2 was pressed
+ * OR
+ * - button_2 opens in new tab and button_1 was pressed with
+ * ctrl held
+ * OR
+ * - button_2 doesn't open in new tabs and the link target is
+ * "_blank"
+ */
bw_target = browser_window_create(NULL, bw, NULL, false, false);
if (!bw_target)
return bw;
return bw_target;
} else if ((target == TARGET_SELF) || (!strcasecmp(target, "_self"))) {
return bw;
- } else if ((target == TARGET_PARENT) || (!strcasecmp(target, "_parent"))) {
+ } else if ((target == TARGET_PARENT) ||
+ (!strcasecmp(target, "_parent"))) {
if (bw->parent)
return bw->parent;
return bw;
@@ -1539,10 +1581,6 @@ void browser_window_mouse_action_html(struct browser_window *bw,
/* force download of link */
browser_window_go_post(bw, url, 0, 0, false,
c->url, true, true, 0);
- } else if (mouse & BROWSER_MOUSE_CLICK_1 &&
- mouse & BROWSER_MOUSE_MOD_2) {
- /* open link in new tab */
- browser_window_create(url, bw, c->url, true, true);
} else if (mouse & BROWSER_MOUSE_CLICK_2 &&
mouse & BROWSER_MOUSE_MOD_1) {
free(browser_window_href_content.url);
@@ -1648,13 +1686,11 @@ void browser_window_mouse_action_html(struct browser_window *bw,
switch (action) {
case ACTION_SUBMIT:
browser_form_submit(bw,
- browser_window_find_target(bw, target,
- (mouse & BROWSER_MOUSE_CLICK_2)),
+ browser_window_find_target(bw, target, mouse),
gadget->form, gadget);
break;
case ACTION_GO:
- browser_window_go(browser_window_find_target(bw, target,
- (mouse & BROWSER_MOUSE_CLICK_2)),
+ browser_window_go(browser_window_find_target(bw, target, mouse),
url, c->url, true);
break;
case ACTION_NONE:
diff --git a/desktop/options.c b/desktop/options.c
index d8812dfb9..6cf6dcf04 100644
--- a/desktop/options.c
+++ b/desktop/options.c
@@ -186,6 +186,9 @@ bool option_suppress_curl_debug = true;
/** Whether to allow target="_blank" */
bool option_target_blank = true;
+/** Whether second mouse button opens in new tab */
+bool option_button_2_tab = true;
+
EXTRA_OPTION_DEFINE
@@ -194,64 +197,73 @@ struct {
enum { OPTION_BOOL, OPTION_INTEGER, OPTION_STRING } type;
void *p;
} option_table[] = {
- { "http_proxy", OPTION_BOOL, &option_http_proxy },
- { "http_proxy_host", OPTION_STRING, &option_http_proxy_host },
- { "http_proxy_port", OPTION_INTEGER, &option_http_proxy_port },
- { "http_proxy_auth", OPTION_INTEGER, &option_http_proxy_auth },
- { "http_proxy_auth_user", OPTION_STRING, &option_http_proxy_auth_user },
- { "http_proxy_auth_pass", OPTION_STRING, &option_http_proxy_auth_pass },
- { "font_size", OPTION_INTEGER, &option_font_size },
- { "font_min_size", OPTION_INTEGER, &option_font_min_size },
- { "font_sans", OPTION_STRING, &option_font_sans },
- { "font_serif", OPTION_STRING, &option_font_serif },
- { "font_mono", OPTION_STRING, &option_font_mono },
- { "font_cursive", OPTION_STRING, &option_font_cursive },
- { "font_fantasy", OPTION_STRING, &option_font_fantasy },
- { "accept_language", OPTION_STRING, &option_accept_language },
- { "accept_charset", OPTION_STRING, &option_accept_charset },
- { "memory_cache_size", OPTION_INTEGER, &option_memory_cache_size },
- { "disc_cache_age", OPTION_INTEGER, &option_disc_cache_age },
- { "block_advertisements", OPTION_BOOL, &option_block_ads },
- { "minimum_gif_delay", OPTION_INTEGER, &option_minimum_gif_delay },
- { "send_referer", OPTION_BOOL, &option_send_referer },
- { "animate_images", OPTION_BOOL, &option_animate_images },
- { "expire_url", OPTION_INTEGER, &option_expire_url },
- { "font_default", OPTION_INTEGER, &option_font_default },
- { "ca_bundle", OPTION_STRING, &option_ca_bundle },
- { "ca_path", OPTION_STRING, &option_ca_path },
- { "cookie_file", OPTION_STRING, &option_cookie_file },
- { "cookie_jar", OPTION_STRING, &option_cookie_jar },
- { "homepage_url", OPTION_STRING, &option_homepage_url },
- { "url_suggestion", OPTION_BOOL, &option_url_suggestion },
- { "window_x", OPTION_INTEGER, &option_window_x },
- { "window_y", OPTION_INTEGER, &option_window_y },
- { "window_width", OPTION_INTEGER, &option_window_width },
- { "window_height", OPTION_INTEGER, &option_window_height },
- { "window_screen_width", OPTION_INTEGER, &option_window_screen_width },
- { "window_screen_height",OPTION_INTEGER, &option_window_screen_height },
- { "toolbar_status_size", OPTION_INTEGER, &option_toolbar_status_width },
- { "scale", OPTION_INTEGER, &option_scale },
- { "incremental_reflow", OPTION_BOOL, &option_incremental_reflow },
- { "min_reflow_period", OPTION_INTEGER, &option_min_reflow_period },
+ { "http_proxy", OPTION_BOOL, &option_http_proxy },
+ { "http_proxy_host", OPTION_STRING, &option_http_proxy_host },
+ { "http_proxy_port", OPTION_INTEGER, &option_http_proxy_port },
+ { "http_proxy_auth", OPTION_INTEGER, &option_http_proxy_auth },
+ { "http_proxy_auth_user",
+ OPTION_STRING, &option_http_proxy_auth_user },
+ { "http_proxy_auth_pass",
+ OPTION_STRING, &option_http_proxy_auth_pass },
+ { "font_size", OPTION_INTEGER, &option_font_size },
+ { "font_min_size", OPTION_INTEGER, &option_font_min_size },
+ { "font_sans", OPTION_STRING, &option_font_sans },
+ { "font_serif", OPTION_STRING, &option_font_serif },
+ { "font_mono", OPTION_STRING, &option_font_mono },
+ { "font_cursive", OPTION_STRING, &option_font_cursive },
+ { "font_fantasy", OPTION_STRING, &option_font_fantasy },
+ { "accept_language", OPTION_STRING, &option_accept_language },
+ { "accept_charset", OPTION_STRING, &option_accept_charset },
+ { "memory_cache_size", OPTION_INTEGER, &option_memory_cache_size },
+ { "disc_cache_age", OPTION_INTEGER, &option_disc_cache_age },
+ { "block_advertisements",
+ OPTION_BOOL, &option_block_ads },
+ { "minimum_gif_delay", OPTION_INTEGER, &option_minimum_gif_delay },
+ { "send_referer", OPTION_BOOL, &option_send_referer },
+ { "animate_images", OPTION_BOOL, &option_animate_images },
+ { "expire_url", OPTION_INTEGER, &option_expire_url },
+ { "font_default", OPTION_INTEGER, &option_font_default },
+ { "ca_bundle", OPTION_STRING, &option_ca_bundle },
+ { "ca_path", OPTION_STRING, &option_ca_path },
+ { "cookie_file", OPTION_STRING, &option_cookie_file },
+ { "cookie_jar", OPTION_STRING, &option_cookie_jar },
+ { "homepage_url", OPTION_STRING, &option_homepage_url },
+ { "url_suggestion", OPTION_BOOL, &option_url_suggestion },
+ { "window_x", OPTION_INTEGER, &option_window_x },
+ { "window_y", OPTION_INTEGER, &option_window_y },
+ { "window_width", OPTION_INTEGER, &option_window_width },
+ { "window_height", OPTION_INTEGER, &option_window_height },
+ { "window_screen_width",
+ OPTION_INTEGER, &option_window_screen_width },
+ { "window_screen_height",
+ OPTION_INTEGER, &option_window_screen_height },
+ { "toolbar_status_size",
+ OPTION_INTEGER, &option_toolbar_status_width },
+ { "scale", OPTION_INTEGER, &option_scale },
+ { "incremental_reflow", OPTION_BOOL, &option_incremental_reflow },
+ { "min_reflow_period", OPTION_INTEGER, &option_min_reflow_period },
/* Fetcher options */
- { "max_fetchers", OPTION_INTEGER, &option_max_fetchers },
+ { "max_fetchers", OPTION_INTEGER, &option_max_fetchers },
{ "max_fetchers_per_host",
- OPTION_INTEGER, &option_max_fetchers_per_host },
+ OPTION_INTEGER, &option_max_fetchers_per_host },
{ "max_cached_fetch_handles",
- OPTION_INTEGER, &option_max_cached_fetch_handles },
- { "suppress_curl_debug", OPTION_BOOL, &option_suppress_curl_debug },
- { "target_blank",
- OPTION_BOOL, &option_target_blank },
- { "margin_top", OPTION_INTEGER, &option_margin_top},
- { "margin_bottom", OPTION_INTEGER, &option_margin_bottom},
- { "margin_left", OPTION_INTEGER, &option_margin_left},
- { "margin_right", OPTION_INTEGER, &option_margin_right},
- { "export_scale", OPTION_INTEGER, &option_export_scale},
- { "suppress_images", OPTION_BOOL, &option_suppress_images},
- { "remove_backgrounds", OPTION_BOOL, &option_remove_backgrounds},
- { "enable_loosening", OPTION_BOOL, &option_enable_loosening},
- { "enable_PDF_compression", OPTION_BOOL, &option_enable_PDF_compression},
- { "enable_PDF_password", OPTION_BOOL, &option_enable_PDF_password},
+ OPTION_INTEGER, &option_max_cached_fetch_handles },
+ { "suppress_curl_debug",OPTION_BOOL, &option_suppress_curl_debug },
+ { "target_blank", OPTION_BOOL, &option_target_blank },
+ { "button_2_tab", OPTION_BOOL, &option_button_2_tab },
+ /* PDF / Print options*/
+ { "margin_top", OPTION_INTEGER, &option_margin_top},
+ { "margin_bottom", OPTION_INTEGER, &option_margin_bottom},
+ { "margin_left", OPTION_INTEGER, &option_margin_left},
+ { "margin_right", OPTION_INTEGER, &option_margin_right},
+ { "export_scale", OPTION_INTEGER, &option_export_scale},
+ { "suppress_images", OPTION_BOOL, &option_suppress_images},
+ { "remove_backgrounds", OPTION_BOOL, &option_remove_backgrounds},
+ { "enable_loosening", OPTION_BOOL, &option_enable_loosening},
+ { "enable_PDF_compression",
+ OPTION_BOOL, &option_enable_PDF_compression},
+ { "enable_PDF_password",
+ OPTION_BOOL, &option_enable_PDF_password},
EXTRA_OPTION_TABLE
};
diff --git a/desktop/options.h b/desktop/options.h
index cb238b93a..85ba13b7b 100644
--- a/desktop/options.h
+++ b/desktop/options.h
@@ -71,6 +71,7 @@ extern char *option_cookie_file;
extern char *option_cookie_jar;
extern char *option_homepage_url;
extern bool option_target_blank;
+extern bool option_button_2_tab;
extern bool option_url_suggestion;
extern int option_window_x;
extern int option_window_y;