From adc34761577a0508a3319af88273e3a6d1f0cb90 Mon Sep 17 00:00:00 2001 From: John Mark Bell Date: Sun, 21 Dec 2003 22:10:15 +0000 Subject: [project @ 2003-12-21 22:10:15 by jmb] Tidy up and integrate frames code. Still incomplete. svn path=/import/netsurf/; revision=439 --- desktop/browser.c | 69 ++++++-- desktop/browser.h | 8 +- riscos/frames.c | 435 ++++++++++++++++++++------------------------------ riscos/frames.h | 51 +++--- riscos/gui.c | 8 +- riscos/htmlinstance.c | 31 +++- riscos/plugin.c | 2 +- riscos/uri.c | 2 +- riscos/window.c | 2 +- 9 files changed, 284 insertions(+), 324 deletions(-) diff --git a/desktop/browser.c b/desktop/browser.c index 55485681f..b2a9c27d6 100644 --- a/desktop/browser.c +++ b/desktop/browser.c @@ -110,7 +110,7 @@ void browser_window_forward(struct browser_window* bw) } -struct browser_window* create_browser_window(int flags, int width, int height) +struct browser_window* create_browser_window(int flags, int width, int height, struct browser_window *parent) { struct browser_window* bw; bw = (struct browser_window*) xcalloc(1, sizeof(struct browser_window)); @@ -130,7 +130,20 @@ struct browser_window* create_browser_window(int flags, int width, int height) bw->url = NULL; bw->caret_callback = 0; - bw->window = gui_create_browser_window(bw); + bw->parent = parent; + + if (bw->parent != NULL) { + bw->parent->children = xrealloc(bw->parent->children, + (bw->parent->no_children+1) * + sizeof(struct browser_window)); + bw->parent->children[bw->parent->no_children] = bw; + bw->parent->no_children++; + + bw->window = NULL; /* This is filled in by frame_add_instance */ + } + else { + bw->window = gui_create_browser_window(bw); + } return bw; } @@ -141,26 +154,49 @@ void browser_window_set_status(struct browser_window* bw, const char* text) gui_window_set_status(bw->window, text); } -void browser_window_destroy(struct browser_window* bw) +void browser_window_destroy(struct browser_window* bw, bool self) { + unsigned int i; LOG(("bw = %p", bw)); assert(bw != 0); - if (bw->current_content != NULL) { - if (bw->current_content->status == CONTENT_STATUS_DONE) - content_remove_instance(bw->current_content, bw, 0, 0, 0, &bw->current_content_state); - content_remove_user(bw->current_content, browser_window_callback, bw, 0); - login_list_remove(bw->current_content->url); - } - if (bw->loading_content != NULL) { - content_remove_user(bw->loading_content, browser_window_callback, bw, 0); + if (bw->no_children == 0 && bw->parent != NULL) { /* leaf node -> delete */ + if (bw->current_content != NULL) { + if (bw->current_content->status == CONTENT_STATUS_DONE) + content_remove_instance(bw->current_content, bw, 0, 0, 0, &bw->current_content_state); + login_list_remove(bw->current_content->url); + } + xfree(bw->url); + xfree(bw); + + return; } - xfree(bw->url); - gui_window_destroy(bw->window); + for (i=0; i!=bw->no_children; i++) { /* non-leaf node -> kill children */ + browser_window_destroy(bw->children[i], true); + } - xfree(bw); + /* all children killed -> remove this node */ + if (self || bw->parent != NULL) { + if (bw->current_content != NULL) { + if (bw->current_content->status == CONTENT_STATUS_DONE) + content_remove_instance(bw->current_content, bw, 0, 0, 0, &bw->current_content_state); + content_remove_user(bw->current_content, browser_window_callback, bw, 0); + login_list_remove(bw->current_content->url); + } + if (bw->loading_content != NULL) { + content_remove_user(bw->loading_content, browser_window_callback, bw, 0); + } + xfree(bw->url); + gui_window_destroy(bw->window); + xfree(bw->children); + xfree(bw); + } + else { + bw->no_children = 0; + xfree(bw->children); + } LOG(("end")); } @@ -173,6 +209,9 @@ void browser_window_open_location_historical(struct browser_window* bw, assert(bw != 0 && url != 0); + if (bw->url != NULL) + browser_window_destroy(bw, false); + if ((li = login_list_get(url)) == NULL) { if (bw->current_content != NULL) { @@ -1186,7 +1225,7 @@ void browser_window_follow_link(struct browser_window* bw, char *url = url_join((char*) click_boxes[i].box->href, bw->url); struct browser_window* bw_new; bw_new = create_browser_window(browser_TITLE | browser_TOOLBAR - | browser_SCROLL_X_ALWAYS | browser_SCROLL_Y_ALWAYS, 640, 480); + | browser_SCROLL_X_ALWAYS | browser_SCROLL_Y_ALWAYS, 640, 480, NULL); gui_window_show(bw_new->window); browser_window_open_location(bw_new, url); free(url); diff --git a/desktop/browser.h b/desktop/browser.h index e507b5826..fd25299d8 100644 --- a/desktop/browser.h +++ b/desktop/browser.h @@ -54,6 +54,10 @@ struct browser_window void (*caret_callback)(struct browser_window *bw, char key, void *p); void *caret_p; + + struct browser_window *parent; + unsigned int no_children; + struct browser_window **children; }; @@ -88,8 +92,8 @@ struct box_selection /* public functions */ -struct browser_window* create_browser_window(int flags, int width, int height); -void browser_window_destroy(struct browser_window* bw); +struct browser_window* create_browser_window(int flags, int width, int height, struct browser_window *parent); +void browser_window_destroy(struct browser_window* bw, bool self); void browser_window_open_location(struct browser_window* bw, const char* url); void browser_window_open_location_historical(struct browser_window* bw, const char* url, char *post_urlenc, diff --git a/riscos/frames.c b/riscos/frames.c index 32e35ad6e..fa1db8c48 100644 --- a/riscos/frames.c +++ b/riscos/frames.c @@ -7,299 +7,202 @@ #include +#include "netsurf/desktop/browser.h" +#include "netsurf/desktop/gui.h" #include "netsurf/riscos/frames.h" -#ifndef TEST +#include "netsurf/riscos/gui.h" +/*#ifndef TEST # define NDEBUG -#endif +#endif*/ #include "netsurf/utils/log.h" #include "netsurf/utils/utils.h" -#ifdef TEST -# include -#endif - -static struct frame_list fl = {0, 0, &fl, &fl}; -static struct frame_list *flist = &fl; - -/* -------------------------------------------------------------------- * - * List handling stuff * - * -------------------------------------------------------------------- */ - -/** - * Adds a new frameset associated with a browser window to the list - */ -void frameset_add_to_list(struct browser_window *bw, struct frame *frame) { - - struct frame_list *nfl = xcalloc(1, sizeof(*nfl)); - - LOG(("adding %p to list", frame)); - nfl->frame = frame; - nfl->bw = bw; - nfl->prev = flist->prev; - nfl->next = flist; - flist->prev->next = nfl; - flist->prev = nfl; +#include "oslib/os.h" +#include "oslib/wimp.h" + +void frame_add_instance_to_list(struct content *c, struct browser_window *parent, struct content *page, struct box *box, struct object_params *params, void **state, struct browser_window *bw, gui_window *g); +void frame_remove_instance_from_list(struct content *c); +struct frame_list *frame_get_instance_from_list(struct content *c); + +void frame_add_instance(struct content *c, struct browser_window *parent, + struct content *page, struct box *box, + struct object_params *params, void **state) +{ + + wimp_window w; + struct browser_window *bw = NULL; + os_error *e; + gui_window *g = (gui_window*)xcalloc(1, sizeof(gui_window)); + + bw = create_browser_window(parent->flags, parent->format_width, + parent->format_height, parent); + + w.visible.x0 = 346; + w.visible.x1 = 370; + w.visible.y0 = 664; + w.visible.y1 = 610; + w.xscroll = w.yscroll = 0; + w.next = wimp_TOP; + w.flags = wimp_WINDOW_NEW_FORMAT | wimp_WINDOW_MOVEABLE; + w.title_fg = wimp_COLOUR_TRANSPARENT; + w.title_bg = wimp_COLOUR_WHITE; + w.work_fg = wimp_COLOUR_VERY_LIGHT_GREY; + w.work_bg = wimp_COLOUR_RED; + w.scroll_outer = wimp_COLOUR_DARK_GREY; + w.scroll_inner = wimp_COLOUR_MID_LIGHT_GREY; + w.highlight_bg = wimp_COLOUR_CREAM; + w.extra_flags = 0; + w.extent.x0 = 0; + w.extent.y0 = -8192; + w.extent.x1 = 8192; + w.extent.y1 = 0; + w.title_flags = wimp_ICON_HCENTRED | wimp_ICON_VCENTRED; + w.work_flags = wimp_BUTTON_CLICK << wimp_ICON_BUTTON_TYPE_SHIFT; + w.xmin = 1; + w.ymin = 0; + w.icon_count = 0; + + LOG(("Creating frame")); + + e = xwimp_create_window(&w, &g->window); + if (e) { + LOG(("%s", e->errmess)); + return; + } + + g->type = GUI_BROWSER_WINDOW; + g->data.browser.bw = bw; + g->data.browser.toolbar = 0; + g->redraw_safety = SAFE; + g->data.browser.reformat_pending = false; + g->data.browser.old_width = 0; + + bw->current_content = c; + bw->window = g; + + LOG(("Adding to list")); + + frame_add_instance_to_list(c, parent, page, box, params, state, bw, g); + + LOG(("Done")); } -/** - * Removes a frameset associated with a browser window to the list - */ -void frameset_remove_from_list(struct browser_window *bw) { +void frame_remove_instance(struct content *c, struct browser_window *bw, + struct content *page, struct box *box, + struct object_params *params, void **state) +{ + struct frame_list *f; - struct frame_list *temp = frameset_get_from_list(bw); - if(temp != NULL) { - delete_tree(temp->frame); - temp->prev->next = temp->next; - temp->next->prev = temp->prev; - xfree(temp); - } -} + f = frame_get_instance_from_list(c); -/** - * Retrieves a frameset from the list - * Returns a frame_list struct pointer or NULL is nothing is found - */ -struct frame_list *frameset_get_from_list(struct browser_window *bw) { - - struct frame_list *nfl; - - for(nfl = flist->next; (nfl != flist) && (nfl->bw != bw); - nfl = nfl->next) - ; - - if(nfl != flist) - return nfl; - - return NULL; + wimp_close_window(f->g->window); + wimp_delete_window(f->g->window); + frame_remove_instance_from_list(c); } -/** - * Retrieves a frame from the list/tree structure. - * Returns a frame struct pointer or NULL if nothing is found - */ -struct frame *frame_get_from_list(struct browser_window *bw, struct box *b, - bool strict) { - - struct frame_list *nfl; - struct frame *f=0; - - for(nfl = flist->next; (nfl != flist); nfl = nfl->next) { - LOG(("checking tree %p",nfl->frame)); - if ((f = get_frame_from_tree(nfl->frame, bw, b, strict))) { - LOG(("returning f: %p", f)); - return f; - } - } - - return NULL; +void frame_reshape_instance(struct content *c, struct browser_window *bw, + struct content *page, struct box *box, + struct object_params *params, void **state) +{ + + struct frame_list *f; + unsigned long x, y; + int x0, y1; + os_box b; + wimp_window_state s; + + LOG(("Reshaping frame")); + + f = frame_get_instance_from_list(c); + if (f == NULL) { + LOG(("Couldn't find frame")); + return; + } + + s.w = bw->window->window; + wimp_get_window_state(&s); + LOG(("ParentWindow: [(%d,%d),(%d,%d)]", s.visible.x0, s.visible.y0, + s.visible.x1, s.visible.y1)); + + x0 = s.visible.x0 - s.xscroll; + y1 = s.visible.y1 - s.yscroll; + + LOG(("%d,%d", x0, y1)); + + box_coords(box, &x, &y); + b.x0 = x0 + ((int)x << 1); + b.y1 = y1 - (((int)y << 1)); + b.x1 = (b.x0 + (box->width << 1)); + b.y0 = (b.y1 - (box->height << 1)); + + /*if(b.x1 > (s.visible.x1-s.xscroll)) { + b.x1 -= 16; + }*/ + s.w = f->g->window; + s.visible = b; + + LOG(("Opening frame window : [(%d,%d),(%d,%d)]",b.x0,b.y0,b.x1,b.y1)); + xwimp_open_window_nested((wimp_open*)&s, bw->window->window, 0); } -/* -------------------------------------------------------------------- * - * Tree handling stuff * - * -------------------------------------------------------------------- */ -/** - * Adds a new frame to the tree - * Creates a new tree if appropriate. - */ -void add_frame_to_tree (struct browser_window *parent_bw, struct box *box, - struct browser_window *bw, struct content *c, - char *name) { - - struct frame *nrf; - struct frame *parent; - struct frame *nf = xcalloc(1, sizeof(*nf)); - unsigned int i; - - /* get parent node */ - if ((parent = frame_get_from_list(parent_bw, box, false)) == NULL) { - - LOG(("no tree found - creating new")); - nrf = xcalloc(1, sizeof(*nrf)); - nrf->win = parent_bw; - nrf->box = (struct box*)-1; - nrf->c = 0; - nrf->name = xstrdup("_top"); - nrf->parent = 0; - nrf->no_children = 0; - nrf->children = xcalloc(0,1); - frameset_add_to_list(parent_bw, nrf); - parent = frame_get_from_list(parent_bw, (struct box*)-1, true); - } - - LOG(("got parent")); - nf->win = bw; - nf->box = box; - nf->c = c; - nf->name = xstrdup(name); - nf->parent = parent; - nf->no_children = 0; - - LOG(("adding frame to tree")); - i = parent->no_children; - parent->children = - xrealloc(parent->children, (i+1) * sizeof(struct frame)); - parent->children[i] = nf; - parent->no_children++; -} +static struct frame_list pl = {0, 0, 0, 0, 0, 0, 0, 0, &pl, &pl}; +static struct frame_list *plist = &pl; /** - * Retrieves a frame from the tree. - * If 'strict' is true, tests for both bw and box. Otherwise, just tests bw. - * Returns the frame or NULL. + * Adds a plugin instance to the list of plugin instances. */ -struct frame *get_frame_from_tree(struct frame *root, - struct browser_window *bw, - struct box *b, - bool strict) { - - int i; - - if (!root) { - LOG(("tree was empty")); - return NULL; /* empty tree */ - } - - if (strict) { - if (root->parent != 0) { /* has a parent node => check that */ - LOG(("(%p, %p),(%p, %p)", root->parent->win, bw, root->box, b)); - if (root->parent->win == bw && root->box == b) { /* found frame */ - LOG(("found frame %p", root)); - return root; - } - } - else { /* no parent node => check this one */ - LOG(("(%p, %p),(%p, %p)", root->win, bw, root->box, b)); - if (root->win == bw && root->box == b) { /* found frame */ - LOG(("found frame %p", root)); - return root; - } - } - } - else { - if (root->parent != 0) { /* has a parent node => check that */ - LOG(("(%p, %p),(%p, %p)", root->parent->win, bw, root->box, b)); - if (root->parent->win == bw) { /* found frame */ - LOG(("found frame %p", root)); - return root; - } - else if (root->win == bw) { - LOG(("adding as child of '%s'", root->name)); - return root; - } - } - else { /* no parent node => check this one */ - LOG(("(%p, %p),(%p, %p)", root->win, bw, root->box, b)); - if (root->win == bw) { /* found frame */ - LOG(("found frame %p", root)); - return root; - } - } - } - - if (root->no_children == 0) - return NULL; - - for (i=0; i!=root->no_children; i++) { /* not found so recurse */ - return get_frame_from_tree(root->children[i], bw, b, strict); - } - - return NULL; +void frame_add_instance_to_list(struct content *c, struct browser_window *parent, struct content *page, struct box *box, struct object_params *params, void **state, struct browser_window *bw, gui_window *g) { + + struct frame_list *npl = xcalloc(1, sizeof(*npl)); + + npl->c = c; + npl->parent = parent; + npl->page = page; + npl->box = box; + npl->params = params; + npl->state = state; + npl->bw = bw; + npl->g = g; + npl->prev = plist->prev; + npl->next = plist; + plist->prev->next = npl; + plist->prev = npl; + + LOG(("Added Frame %p", npl)); } /** - * Deletes a complete tree. + * Removes a plugin instance from the list of plugin instances */ -void delete_tree(struct frame *root) { - - int i; - - if (!root) return; /* empty tree */ - - if (root->no_children == 0) { /* leaf node => delete and return */ - LOG(("deleting '%s'", root->name)); - xfree(root->name); - xfree(root); - return; - } - - for (i=0; i!=root->no_children; i++) { /* non-leaf node - => kill children */ - delete_tree(root->children[i]); - } - - /* all children killed => remove this node */ - LOG(("deleting '%s'", root->name)); - xfree(root->name); - xfree(root); -} - +void frame_remove_instance_from_list(struct content *c) { + struct frame_list *temp = + frame_get_instance_from_list(c); + if(temp != NULL) { -#ifdef TEST -void traverse_tree(struct frame *root, int depth) { - - int i; - - if (!root) return; /* empty tree */ - - if (root->no_children == 0) { - for (i=0; i!=(depth+1); i++) - printf("\t"); - printf("frame: %p (%s)\n", root, root->name); - return; - } - else { - for(i=0; i!=(depth+1); i++) - printf("\t"); - printf("frame: %p (%s)\n", root, root->name); - } - - for (i=0; i!=root->no_children; i++) { /* not found so recurse */ - traverse_tree(root->children[i], (depth+1)); - } - - return; -} - -void dump_all_frame_moose(void) { - - struct frame_list *nfl; - - for (nfl=flist->next; nfl!=flist; nfl=nfl->next) { - printf("bw: %p\n", nfl->bw); - traverse_tree(nfl->frame, 0); - printf("\n"); - } + LOG(("Removed Frame %p", temp)); + temp->prev->next = temp->next; + temp->next->prev = temp->prev; + xfree(temp); + } } -int main (void) { - - struct frame *f; - - add_frame_to_tree(1, 1, 1, 3, "test"); - add_frame_to_tree(0, 2, 2, 5, "moo"); - add_frame_to_tree(0, 3, 3, 1, "moose"); - add_frame_to_tree(2, 4, 4, 2, "elk"); - - dump_all_frame_moose(); - - f = frame_get_from_list(1, 1, true); - if (f) - printf("%s: %d, %d\n", f->name, f->win, f->c); - else - printf("couldn't find 1,1\n"); +/** + * Retrieves an instance of a plugin from the list of plugin instances + * returns NULL if no instance is found + */ +struct frame_list *frame_get_instance_from_list(struct content *c) { - frameset_remove_from_list(1); + struct frame_list *npl; - f = frame_get_from_list(2, 4, true); - if (f) - printf("%s: %d, %d\n", f->name, f->win, f->c); - else - printf("couldn't find 2,4\n"); + for(npl = plist->next; (npl != plist) + && (npl->c != c); + npl = npl->next) + ; - dump_all_frame_moose(); + if(npl != plist) + return npl; - return 0; + return NULL; } -#endif diff --git a/riscos/frames.h b/riscos/frames.h index b83cf8e1a..e65044cc9 100644 --- a/riscos/frames.h +++ b/riscos/frames.h @@ -30,6 +30,8 @@ * * where the left frame is main.html with three sub frames (top, mid, end) * and the entire page is index.html with two sub frames (nav, main) + * + * This is hung off the browser window structure. */ #ifndef _NETSURF_RISCOS_FRAMES_H_ @@ -40,36 +42,29 @@ #include "netsurf/render/box.h" #include "netsurf/riscos/gui.h" -struct frame_list { - - struct frame *frame; /**< top most frame (ie root of tree) */ - struct browser_window *bw; /**< main window */ - struct frame_list *next; /**< next in list */ - struct frame_list *prev; /**< previous in list */ -}; +#include "oslib/wimp.h" -struct frame { +struct frame_list { - struct browser_window *win; /**< window in which this frame appears */ - struct box *box; /**< box in parent window containing this frame */ - struct content *c; /**< content of this frame */ - char *name; /**< name of this frame */ - struct frame *parent; /**< parent frame */ - unsigned int no_children; /**< number of children this frame has */ - struct frame **children; /**< child frames */ + struct content *c; + struct browser_window *parent; + struct content *page; + struct box *box; + struct object_params *params; + void **state; + struct browser_window *bw; + gui_window *g; + struct frame_list *next; + struct frame_list *prev; }; -void frameset_add_to_list(struct browser_window *bw, struct frame *frame); -void frameset_remove_from_list(struct browser_window *bw); -struct frame_list *frameset_get_from_list(struct browser_window *bw); -struct frame *frame_get_from_list(struct browser_window *bw, struct box *b, - bool strict); - -void add_frame_to_tree (struct browser_window *pbw, struct box *box, - struct browser_window *bw, struct content *c, - char *name); -struct frame *get_frame_from_tree(struct frame *root, - struct browser_window *bw, - struct box *b, bool strict); -void delete_tree(struct frame *root); +void frame_add_instance(struct content *c, struct browser_window *bw, + struct content *page, struct box *box, + struct object_params *params, void **state); +void frame_remove_instance(struct content *c, struct browser_window *bw, + struct content *page, struct box *box, + struct object_params *params, void **state); +void frame_reshape_instance(struct content *c, struct browser_window *bw, + struct content *page, struct box *box, + struct object_params *params, void **state); #endif diff --git a/riscos/gui.c b/riscos/gui.c index 4e64bca2a..96c80a42a 100644 --- a/riscos/gui.c +++ b/riscos/gui.c @@ -251,7 +251,7 @@ void gui_poll(bool active) case wimp_CLOSE_WINDOW_REQUEST : g = ro_lookup_gui_from_w(block.close.w); if (g != NULL) - browser_window_destroy(g->data.browser.bw); + browser_window_destroy(g->data.browser.bw, true); else ro_gui_dialog_close(&(block.close.w)); break; @@ -577,7 +577,7 @@ void ro_gui_icon_bar_click(wimp_pointer* pointer) { struct browser_window* bw; bw = create_browser_window(browser_TITLE | browser_TOOLBAR - | browser_SCROLL_X_ALWAYS | browser_SCROLL_Y_ALWAYS, 640, 480); + | browser_SCROLL_X_ALWAYS | browser_SCROLL_Y_ALWAYS, 640, 480, NULL); gui_window_show(bw->window); browser_window_open_location(bw, HOME_URL); wimp_set_caret_position(bw->window->data.browser.toolbar, @@ -844,7 +844,7 @@ void ro_msg_dataopen(wimp_message *message) /* create a new window with the file */ bw = create_browser_window(browser_TITLE | browser_TOOLBAR | - browser_SCROLL_X_ALWAYS | browser_SCROLL_Y_ALWAYS, 640, 480); + browser_SCROLL_X_ALWAYS | browser_SCROLL_Y_ALWAYS, 640, 480, NULL); gui_window_show(bw->window); url = ro_path_to_url(message->data.data_xfer.file_name); browser_window_open_location(bw, url); @@ -888,7 +888,7 @@ void ro_gui_open_help_page (void) struct browser_window *bw; bw = create_browser_window(browser_TITLE | browser_TOOLBAR | browser_SCROLL_X_ALWAYS | - browser_SCROLL_Y_ALWAYS, 640, 480); + browser_SCROLL_Y_ALWAYS, 640, 480, NULL); gui_window_show(bw->window); browser_window_open_location(bw, HELP_URL); wimp_set_caret_position(bw->window->data.browser.toolbar, diff --git a/riscos/htmlinstance.c b/riscos/htmlinstance.c index 78f6bdd57..e9ca0931e 100644 --- a/riscos/htmlinstance.c +++ b/riscos/htmlinstance.c @@ -4,7 +4,7 @@ * http://www.opensource.org/licenses/gpl-license * Copyright 2003 James Bursa */ - + #include "netsurf/content/content.h" #include "netsurf/desktop/browser.h" #include "netsurf/render/box.h" @@ -21,8 +21,13 @@ void html_add_instance(struct content *c, struct browser_window *bw, if (c->data.html.object[i].content == 0) continue; if (c->data.html.object[i].content->type == CONTENT_HTML) - LOG(("html object")); - content_add_instance(c->data.html.object[i].content, + frame_add_instance(c->data.html.object[i].content, + bw, c, + c->data.html.object[i].box, + c->data.html.object[i].box->object_params, + &c->data.html.object[i].box->object_state); + else + content_add_instance(c->data.html.object[i].content, bw, c, c->data.html.object[i].box, c->data.html.object[i].box->object_params, @@ -39,7 +44,14 @@ void html_reshape_instance(struct content *c, struct browser_window *bw, for (i = 0; i != c->data.html.object_count; i++) { if (c->data.html.object[i].content == 0) continue; - content_reshape_instance(c->data.html.object[i].content, + if (c->data.html.object[i].content->type == CONTENT_HTML) + frame_reshape_instance(c->data.html.object[i].content, + bw, c, + c->data.html.object[i].box, + c->data.html.object[i].box->object_params, + &c->data.html.object[i].box->object_state); + else + content_reshape_instance(c->data.html.object[i].content, bw, c, c->data.html.object[i].box, c->data.html.object[i].box->object_params, @@ -55,10 +67,17 @@ void html_remove_instance(struct content *c, struct browser_window *bw, for (i = 0; i != c->data.html.object_count; i++) { if (c->data.html.object[i].content == 0) continue; - content_remove_instance(c->data.html.object[i].content, + if (c->data.html.object[i].content->type == CONTENT_HTML) + frame_remove_instance(c->data.html.object[i].content, + bw, c, + c->data.html.object[i].box, + c->data.html.object[i].box->object_params, + &c->data.html.object[i].box->object_state); + else + content_remove_instance(c->data.html.object[i].content, bw, c, c->data.html.object[i].box, c->data.html.object[i].box->object_params, &c->data.html.object[i].box->object_state); } -} \ No newline at end of file +} diff --git a/riscos/plugin.c b/riscos/plugin.c index 0d8aac1c1..d480bf8fc 100644 --- a/riscos/plugin.c +++ b/riscos/plugin.c @@ -1290,7 +1290,7 @@ void plugin_url_access(wimp_message *message) { struct browser_window *bwnew; bwnew = create_browser_window(browser_TITLE | browser_TOOLBAR | browser_SCROLL_X_ALWAYS - | browser_SCROLL_Y_ALWAYS, 640, 480); + | browser_SCROLL_Y_ALWAYS, 640, 480, NULL); gui_window_show(bwnew->window); bwnew->url = xstrdup(url); browser_window_open_location(bwnew, url); diff --git a/riscos/uri.c b/riscos/uri.c index 54b856151..5494887ee 100644 --- a/riscos/uri.c +++ b/riscos/uri.c @@ -72,7 +72,7 @@ void ro_uri_message_received(uri_full_message_process* uri_message) } bw = create_browser_window(browser_TITLE | browser_TOOLBAR - | browser_SCROLL_X_ALWAYS | browser_SCROLL_Y_ALWAYS, 640, 480); + | browser_SCROLL_X_ALWAYS | browser_SCROLL_Y_ALWAYS, 640, 480, NULL); gui_window_show(bw->window); browser_window_open_location(bw, uri_requested); diff --git a/riscos/window.c b/riscos/window.c index fdfebb1f5..e6493ef94 100644 --- a/riscos/window.c +++ b/riscos/window.c @@ -701,7 +701,7 @@ bool ro_gui_window_keypress(gui_window *g, int key, bool toolbar) return true; case wimp_KEY_CONTROL + wimp_KEY_F2: /* Close window. */ - browser_window_destroy(g->data.browser.bw); + browser_window_destroy(g->data.browser.bw, true); return true; case wimp_KEY_RETURN: -- cgit v1.2.3