summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--amiga/gui.c27
-rw-r--r--atari/gui.c10
-rwxr-xr-xatari/rootwin.c6
-rw-r--r--beos/window.cpp8
-rw-r--r--cocoa/gui.m10
-rw-r--r--desktop/browser.c19
-rw-r--r--desktop/browser.h10
-rw-r--r--desktop/gui.h25
-rw-r--r--framebuffer/gui.c7
-rw-r--r--gtk/window.c15
-rw-r--r--monkey/browser.c9
-rw-r--r--riscos/window.c49
-rw-r--r--windows/gui.c4
13 files changed, 117 insertions, 82 deletions
diff --git a/amiga/gui.c b/amiga/gui.c
index 16ca57e13..100dad415 100644
--- a/amiga/gui.c
+++ b/amiga/gui.c
@@ -3225,8 +3225,8 @@ nserror ami_gui_new_blank_tab(struct gui_window_2 *gwin)
static struct gui_window *
gui_window_create(struct browser_window *bw,
- struct browser_window *clone,
- bool new_tab)
+ struct gui_window *existing,
+ gui_window_create_flags flags)
{
struct gui_window *g = NULL;
bool closegadg=TRUE;
@@ -3250,15 +3250,12 @@ gui_window_create(struct browser_window *bw,
if (nsoption_bool(resize_with_contents)) idcmp_sizeverify = 0;
bw->scale = 1.0;
- if(clone)
+ if(existing)
{
- if(clone->window)
- {
- curx=clone->window->shared->win->LeftEdge;
- cury=clone->window->shared->win->TopEdge;
- curw=clone->window->shared->win->Width;
- curh=clone->window->shared->win->Height;
- }
+ curx=existing->shared->win->LeftEdge;
+ cury=existing->shared->win->TopEdge;
+ curw=existing->shared->win->Width;
+ curh=existing->shared->win->Height;
}
g = AllocVecTags(sizeof(struct gui_window), AVT_ClearWithValue, 0, TAG_DONE);
@@ -3272,9 +3269,9 @@ gui_window_create(struct browser_window *bw,
NewList(&g->dllist);
g->deferred_rects = NewObjList();
- if(new_tab && clone)
+ if((flags & GW_CREATE_TAB) && existing)
{
- g->shared = clone->window->shared;
+ g->shared = existing->shared;
g->tab = g->shared->next_tab;
if((g->shared->tabs == 1) && (nsoption_bool(tab_always_show) == false))
@@ -3299,10 +3296,10 @@ gui_window_create(struct browser_window *bw,
{
struct Node *insert_after = clone->window->tab_node;
- if(clone->window->last_new_tab)
- insert_after = clone->window->last_new_tab;
+ if(existing->last_new_tab)
+ insert_after = existing->last_new_tab;
Insert(&g->shared->tab_list, g->tab_node, insert_after);
- clone->window->last_new_tab = g->tab_node;
+ existing->last_new_tab = g->tab_node;
}
RefreshSetGadgetAttrs((struct Gadget *)g->shared->objects[GID_TABS],
diff --git a/atari/gui.c b/atari/gui.c
index afd3be57b..e43aecbcf 100644
--- a/atari/gui.c
+++ b/atari/gui.c
@@ -211,11 +211,11 @@ static void gui_poll(bool active)
static struct gui_window *
gui_window_create(struct browser_window *bw,
- struct browser_window *clone,
- bool new_tab) {
+ struct gui_window *existing,
+ gui_window_create_flags flags) {
struct gui_window *gw=NULL;
- LOG(( "gw: %p, BW: %p, clone %p, tab: %d\n" , gw, bw, clone,
- (int)new_tab
+ LOG(( "gw: %p, BW: %p, existing %p, flags: %d\n" , gw, bw, existing,
+ (int)flags
));
gw = calloc(1, sizeof(struct gui_window));
@@ -223,7 +223,7 @@ gui_window_create(struct browser_window *bw,
return NULL;
LOG(("new window: %p, bw: %p\n", gw, bw));
- window_create(gw, bw, clone, WIDGET_STATUSBAR|WIDGET_TOOLBAR|WIDGET_RESIZE\
+ window_create(gw, bw, existing, WIDGET_STATUSBAR|WIDGET_TOOLBAR|WIDGET_RESIZE\
|WIDGET_SCROLL);
if (gw->root->win) {
GRECT pos = {
diff --git a/atari/rootwin.c b/atari/rootwin.c
index 8942263ad..be9846f1b 100755
--- a/atari/rootwin.c
+++ b/atari/rootwin.c
@@ -230,7 +230,7 @@ static short handle_event(GUIWIN *win, EVMULT_OUT *ev_out, short msg[8])
int window_create(struct gui_window * gw,
struct browser_window * bw,
- struct browser_window * clone,
+ struct gui_window * existing,
unsigned long inflags)
{
int err = 0;
@@ -294,8 +294,8 @@ int window_create(struct gui_window * gw,
assert(gw->browser);
gw->browser->bw = bw;
- if(clone)
- gw->browser->bw->scale = clone->scale;
+ if(existing)
+ gw->browser->bw->scale = existing->browser->bw->scale;
else
gw->browser->bw->scale = 1;
diff --git a/beos/window.cpp b/beos/window.cpp
index 230279305..8975c1871 100644
--- a/beos/window.cpp
+++ b/beos/window.cpp
@@ -337,8 +337,8 @@ float nsbeos_get_scale_for_gui(struct gui_window *g)
/* Create a gui_window */
static struct gui_window *gui_window_create(struct browser_window *bw,
- struct browser_window *clone,
- bool new_tab)
+ struct gui_window *existing,
+ gui_window_create_flags flags)
{
struct gui_window *g; /**< what we're creating to return */
@@ -353,8 +353,8 @@ static struct gui_window *gui_window_create(struct browser_window *bw,
g->bw = bw;
g->mouse.state = 0;
g->current_pointer = GUI_POINTER_DEFAULT;
- if (clone != NULL)
- bw->scale = clone->scale;
+ if (existing != NULL)
+ bw->scale = existing->bw->scale;
else
bw->scale = (float) nsoption_int(scale) / 100;
diff --git a/cocoa/gui.m b/cocoa/gui.m
index 416849d84..b78220ef6 100644
--- a/cocoa/gui.m
+++ b/cocoa/gui.m
@@ -64,21 +64,21 @@ static void gui_poll(bool active)
struct browser_window;
static struct gui_window *gui_window_create(struct browser_window *bw,
- struct browser_window *clone,
- bool new_tab)
+ struct gui_window *existing,
+ gui_window_create_flags flags)
{
BrowserWindowController *window = nil;
- if (clone != NULL) {
+ if (existing != NULL) {
bw->scale = clone->scale;
- window = [(BrowserViewController *)(clone->window) windowController];
+ window = [(BrowserViewController *)(existing) windowController];
} else {
bw->scale = (float) nsoption_int(scale) / 100;
}
BrowserViewController *result = [[BrowserViewController alloc] initWithBrowser: bw];
- if (!new_tab || nil == window) {
+ if (!(flags & GW_CREATE_TAB) || nil == window) {
window = [[[BrowserWindowController alloc] init] autorelease];
[[window window] makeKeyAndOrderFront: nil];
}
diff --git a/desktop/browser.c b/desktop/browser.c
index 4fdfce52d..5a6cfc727 100644
--- a/desktop/browser.c
+++ b/desktop/browser.c
@@ -699,7 +699,6 @@ browser_window_create(enum browser_window_nav_flags flags,
struct browser_window **ret_bw)
{
struct browser_window *bw;
- struct browser_window *top;
/* caller must provide window to clone or be adding to history */
assert(clone ||
@@ -730,9 +729,14 @@ browser_window_create(enum browser_window_nav_flags flags,
/* gui window */
/* from the front end's pov, it clones the top level browser window,
* so find that. */
- top = browser_window_get_root(clone);
+ clone = browser_window_get_root(clone);
- bw->window = guit->window->create(bw, top, ((flags & BROWSER_WINDOW_TAB) != 0));
+ bw->window = guit->window->create(bw,
+ (clone != NULL) ? clone->window : NULL,
+ ((flags & BROWSER_WINDOW_TAB) ?
+ GW_CREATE_TAB : GW_CREATE_NONE) |
+ ((clone != NULL) ?
+ GW_CREATE_CLONE : GW_CREATE_NONE));
if (bw->window == NULL) {
browser_window_destroy(bw);
@@ -1945,6 +1949,15 @@ nsurl * browser_window_get_url(struct browser_window *bw)
/* Exported interface, documented in browser.h */
+struct history * browser_window_get_history(struct browser_window *bw)
+{
+ assert(bw != NULL);
+
+ return bw->history;
+}
+
+
+/* Exported interface, documented in browser.h */
bool browser_window_has_content(struct browser_window *bw)
{
assert(bw != NULL);
diff --git a/desktop/browser.h b/desktop/browser.h
index b0a5c506c..095360e5e 100644
--- a/desktop/browser.h
+++ b/desktop/browser.h
@@ -130,6 +130,16 @@ nserror browser_window_navigate(struct browser_window *bw,
nsurl * browser_window_get_url(struct browser_window *bw);
/**
+ * Get a browser window's history object.
+ *
+ * \param bw browser window
+ * \return pointer browser window's history object
+ *
+ * Clients need history object to make use of the history_* functions.
+ */
+struct history * browser_window_get_history(struct browser_window *bw);
+
+/**
* Get a browser window's content extents.
*
* \param bw browser window
diff --git a/desktop/gui.h b/desktop/gui.h
index 162b51cd3..85f1265bb 100644
--- a/desktop/gui.h
+++ b/desktop/gui.h
@@ -54,6 +54,12 @@ typedef enum {
GDRAGGING_OTHER
} gui_drag_type;
+typedef enum {
+ GW_CREATE_NONE = 0, /* New window */
+ GW_CREATE_CLONE = (1 << 0), /* Clone existing window */
+ GW_CREATE_TAB = (1 << 1) /* In same window as existing */
+} gui_window_create_flags;
+
struct gui_window;
struct gui_download_window;
struct browser_window;
@@ -77,8 +83,23 @@ struct gui_window_table {
/* Mandantory entries */
- /** create a gui window for a browsing context */
- struct gui_window *(*create)(struct browser_window *bw, struct browser_window *clone, bool new_tab);
+ /**
+ * Create and open a gui window for a browsing context.
+ *
+ * \param bw bw to create gui_window for
+ * \param existing an existing gui_window, may be NULL
+ * \param flags flags for gui window creation
+ * \return gui window, or NULL on error
+ *
+ * If GW_CREATE_CLONE or GW_CREATE_TAB flags are set, existing is
+ * non-NULL.
+ *
+ * Front end's gui_window must include a reference to the
+ * browser window passed in the bw param.
+ */
+ struct gui_window *(*create)(struct browser_window *bw,
+ struct gui_window *existing,
+ gui_window_create_flags flags);
/** destroy previously created gui window */
void (*destroy)(struct gui_window *g);
diff --git a/framebuffer/gui.c b/framebuffer/gui.c
index 2cceba9c5..dc81a577f 100644
--- a/framebuffer/gui.c
+++ b/framebuffer/gui.c
@@ -1507,8 +1507,8 @@ create_normal_browser_window(struct gui_window *gw, int furniture_width)
static struct gui_window *
gui_window_create(struct browser_window *bw,
- struct browser_window *clone,
- bool new_tab)
+ struct gui_window *existing,
+ gui_window_create_flags flags)
{
struct gui_window *gw;
@@ -1517,8 +1517,7 @@ gui_window_create(struct browser_window *bw,
if (gw == NULL)
return NULL;
- /* seems we need to associate the gui window with the underlying
- * browser window
+ /* associate the gui window with the underlying browser window
*/
gw->bw = bw;
diff --git a/gtk/window.c b/gtk/window.c
index be2049fb9..038622d19 100644
--- a/gtk/window.c
+++ b/gtk/window.c
@@ -663,8 +663,8 @@ static void window_destroy(GtkWidget *widget, gpointer data)
/* Core interface documented in desktop/gui.h to create a gui_window */
static struct gui_window *
gui_window_create(struct browser_window *bw,
- struct browser_window *clone,
- bool new_tab)
+ struct gui_window *existing,
+ gui_window_create_flags flags)
{
struct gui_window *g; /**< what we're creating to return */
GError* error = NULL;
@@ -693,16 +693,17 @@ gui_window_create(struct browser_window *bw,
g->bw = bw;
g->mouse.state = 0;
g->current_pointer = GUI_POINTER_DEFAULT;
- if (clone != NULL) {
- bw->scale = clone->scale;
+ if (flags & GW_CREATE_CLONE) {
+ assert(existing != NULL);
+ bw->scale = existing->bw->scale;
} else {
bw->scale = nsoption_int(scale) / 100;
}
/* attach scaffold */
- if (new_tab) {
- assert(clone != NULL);
- g->scaffold = clone->window->scaffold;
+ if (flags & GW_CREATE_TAB) {
+ assert(existing != NULL);
+ g->scaffold = existing->scaffold;
} else {
/* Now construct and attach a scaffold */
g->scaffold = nsgtk_new_scaffolding(g);
diff --git a/monkey/browser.c b/monkey/browser.c
index 85e25d9ea..9be06dc68 100644
--- a/monkey/browser.c
+++ b/monkey/browser.c
@@ -89,8 +89,8 @@ monkey_kill_browser_windows(void)
static struct gui_window *
gui_window_create(struct browser_window *bw,
- struct browser_window *clone,
- bool new_tab)
+ struct gui_window *existing,
+ gui_window_create_flags flags)
{
struct gui_window *ret = calloc(sizeof(*ret), 1);
if (ret == NULL)
@@ -102,8 +102,9 @@ gui_window_create(struct browser_window *bw,
ret->width = 800;
ret->height = 600;
- fprintf(stdout, "WINDOW NEW WIN %u FOR %p CLONE %p NEWTAB %s\n",
- ret->win_num, bw, clone, new_tab ? "TRUE" : "FALSE");
+ fprintf(stdout, "WINDOW NEW WIN %u FOR %p EXISTING %p NEWTAB %s CLONE %s\n",
+ ret->win_num, bw, existing, flags & GW_CREATE_TAB ? "TRUE" : "FALSE",
+ flags & GW_CREATE_CLONE ? "TRUE" : "FALSE");
fprintf(stdout, "WINDOW SIZE WIN %u WIDTH %d HEIGHT %d\n",
ret->win_num, ret->width, ret->height);
diff --git a/riscos/window.c b/riscos/window.c
index 37a5e7b1d..f638b349d 100644
--- a/riscos/window.c
+++ b/riscos/window.c
@@ -152,8 +152,9 @@ static void ro_gui_window_update_theme(void *data, bool ok);
static bool ro_gui_window_import_text(struct gui_window *g,
const char *filename);
-static void ro_gui_window_clone_options(struct browser_window *new_bw,
- struct browser_window *old_bw);
+static void ro_gui_window_clone_options(
+ struct gui_window *new_gui,
+ struct gui_window *old_gui);
static bool ro_gui_window_prepare_form_select_menu(struct browser_window *bw,
struct form_control *control);
@@ -400,14 +401,15 @@ static void gui_window_place_caret(struct gui_window *g, int x, int y, int heigh
/**
* Create and open a new browser window.
*
- * \param bw The browser window structure to update
- * \param clone The browser window to clone options from, or NULL for default
- * \param new_tab Determines if new browser context should be a tab or window.
- * \return A gui window, or NULL on error and error reported
+ * \param bw bw to create gui_window for
+ * \param existing an existing gui_window, may be NULL
+ * \param flags flags for gui window creation
+ * \return gui window, or NULL on error
*/
static struct gui_window *gui_window_create(struct browser_window *bw,
- struct browser_window *clone, bool new_tab)
+ struct gui_window *existing,
+ gui_window_create_flags flags)
{
int screen_width, screen_height, win_width, win_height, scroll_width;
static int window_count = 2;
@@ -416,7 +418,6 @@ static struct gui_window *gui_window_create(struct browser_window *bw,
os_error *error;
bool open_centred = true;
struct gui_window *g;
- struct browser_window *top;
g = malloc(sizeof *g);
if (!g) {
@@ -433,9 +434,10 @@ static struct gui_window *gui_window_create(struct browser_window *bw,
g->iconise_icon = -1;
/* Set the window position */
- if (clone && clone->window && nsoption_bool(window_size_clone)) {
- for (top = clone; top->parent; top = top->parent);
- state.w = top->window->window;
+ if (existing != NULL &&
+ flags & GW_CREATE_CLONE &&
+ nsoption_bool(window_size_clone)) {
+ state.w = existing->window;
error = xwimp_get_window_state(&state);
if (error) {
LOG(("xwimp_get_window_state: 0x%x: %s",
@@ -594,7 +596,8 @@ static struct gui_window *gui_window_create(struct browser_window *bw,
/* Set the window options */
bw->window = g;
- ro_gui_window_clone_options(bw, clone);
+ bw->scale = ((float)nsoption_int(scale)) / 100;
+ ro_gui_window_clone_options(g, existing);
ro_gui_window_update_toolbar_buttons(g);
/* Open the window at the top of the stack */
@@ -4634,29 +4637,19 @@ bool ro_gui_window_import_text(struct gui_window *g, const char *filename)
/**
* Clones a browser window's options.
*
- * \param new_bw the new browser window
- * \param old_bw the browser window to clone from, or NULL for default
+ * \param new_gui the new gui window
+ * \param old_gui the gui window to clone from, or NULL for default
*/
-void ro_gui_window_clone_options(struct browser_window *new_bw,
- struct browser_window *old_bw)
+void ro_gui_window_clone_options(
+ struct gui_window *new_gui,
+ struct gui_window *old_gui)
{
- struct gui_window *old_gui = NULL;
- struct gui_window *new_gui;
-
- assert(new_bw);
-
- /* Get our GUIs
- */
- new_gui = new_bw->window;
-
- if (old_bw)
- old_gui = old_bw->window;
+ assert(new_gui);
/* Clone the basic options
*/
if (!old_gui) {
- new_bw->scale = ((float)nsoption_int(scale)) / 100;
new_gui->option.buffer_animations = nsoption_bool(buffer_animations);
new_gui->option.buffer_everything = nsoption_bool(buffer_everything);
} else {
diff --git a/windows/gui.c b/windows/gui.c
index ee8b4ed1f..46a557ada 100644
--- a/windows/gui.c
+++ b/windows/gui.c
@@ -1232,8 +1232,8 @@ static HWND nsws_window_create(struct gui_window *gw)
*/
static struct gui_window *
gui_window_create(struct browser_window *bw,
- struct browser_window *clone,
- bool new_tab)
+ struct gui_window *existing,
+ gui_window_create_flags flags)
{
struct gui_window *gw;