From ea79e85fcd109a5bf5f222cece8435305fc8626a Mon Sep 17 00:00:00 2001 From: Michael Drake Date: Sun, 9 Feb 2014 13:07:39 +0000 Subject: [PATCH] Clean up gui_window creation API. --- amiga/gui.c | 27 ++++++++++++-------------- atari/gui.c | 10 +++++----- atari/rootwin.c | 6 +++--- beos/window.cpp | 8 ++++---- cocoa/gui.m | 10 +++++----- desktop/browser.c | 19 +++++++++++++++--- desktop/browser.h | 10 ++++++++++ desktop/gui.h | 25 ++++++++++++++++++++++-- framebuffer/gui.c | 7 +++---- gtk/window.c | 15 ++++++++------- monkey/browser.c | 9 +++++---- riscos/window.c | 49 ++++++++++++++++++++--------------------------- windows/gui.c | 4 ++-- 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); @@ -1944,6 +1948,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) { diff --git a/desktop/browser.h b/desktop/browser.h index b0a5c506c..095360e5e 100644 --- a/desktop/browser.h +++ b/desktop/browser.h @@ -129,6 +129,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. * 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;