On Thu, 2009-08-27 at 12:12 +0100, Steve Fryatt wrote:
> On 26 Aug, John-Mark Bell  wrote in message
>   <1251291254.25111.5.ca...@duiker>:
> 
> > On Sat, 2009-08-22 at 18:05 +0930, Christopher Martin wrote:
> >
> > Thankyou for your offer.
> >
> > > So just how much work do you estimate will be required to align the WIMP
> > > development with the core?
> >
> > This is difficult to estimate. The RISC OS frontend is currently
> > blocking a merge of some useful functionality into the trunk, which is
> > part of the problem -- it's actively getting in the way of core
> > development now. I'd estimate that fixing this is a few hours work for
> > someone with the appropriate knowledge.
> 
> One thing that wasn't entirely clear to me was what was where in the various
> SVN branches (although I may have missed something, as I haven't had
> chance to spend long looking around what is on the NetSurf site).  Which
> branch(es) is the problem code in, and is there any priority as to what a RISC
> OS maintainer should be concentrating on looking at?

The current issues are in branches/paulblokus/treeview. I don't think
any of the remaining active branches need fixing for RISC OS.

I've attached a diff of some changes I made that represent the
beginnings of making the treeview stuff in the RO frontend more sane. It
doesn't compile, however, as the menus code (at least) has tendrils
everywhere. It's also missing a bunch of functionality (like any Wimp
bindings for the RO treeview widget; a skeleton is there, but not much
else). It may be simpler to ignore this, although it does give some
indication of the kind of API I envisage for the RO treeview widget
wrapper.

> (Apologies for not asking on IRC.  I've so far not had long enough spare in
> front of an internet-connected computer to make it worthwhile joining you on
> the channel, whereas I do pick up email fairly regularly in between other
> things.)

That's no problem.

> > > And do you already have plenty of offers from others with much time to
> > > spare?
> >
> > We've had a couple of offers. I've yet to see evidence of anyone doing
> > more than retrieving the existing sources from SVN and compiling them,
> > however.
> 
> I'm my case, that's pretty much all I've managed to do so far, although I have
> spent a few hours here and there reading through some of the source code
> from the trunk and trying to get my head around what goes where (the notes
> which you and others posted here have been very helpful with that, BTW, so
> thanks for them).

Do shout if there's anything else that's unclear.


J.
Index: riscos/dialog.c
===================================================================
--- riscos/dialog.c	(revision 9470)
+++ riscos/dialog.c	(working copy)
@@ -39,6 +39,7 @@
 #include "riscos/dialog.h"
 #include "riscos/global_history.h"
 #include "riscos/gui.h"
+#include "riscos/hotlist.h"
 #include "riscos/menus.h"
 #include "riscos/options.h"
 #include "riscos/save.h"
@@ -150,24 +151,6 @@
 	dialog_objinfo = ro_gui_dialog_create("objectinfo");
 	ro_gui_wimp_event_set_help_prefix(dialog_objinfo, "HelpObjInfo");
 
-	/* hotlist folder editing */
-	dialog_folder = ro_gui_dialog_create("new_folder");
-	ro_gui_wimp_event_register_text_field(dialog_folder, ICON_FOLDER_NAME);
-	ro_gui_wimp_event_register_cancel(dialog_folder, ICON_FOLDER_CANCEL);
-	ro_gui_wimp_event_register_ok(dialog_folder, ICON_FOLDER_OK,
-			ro_gui_hotlist_dialog_apply);
-	ro_gui_wimp_event_set_help_prefix(dialog_folder, "HelpHotFolder");
-
-	/* hotlist entry editing */
-	dialog_entry = ro_gui_dialog_create("new_entry");
-	ro_gui_wimp_event_register_text_field(dialog_entry, ICON_ENTRY_NAME);
-	ro_gui_wimp_event_register_menu_gright(dialog_entry, ICON_ENTRY_URL,
-			ICON_ENTRY_RECENT, url_suggest_menu);
-	ro_gui_wimp_event_register_cancel(dialog_entry, ICON_ENTRY_CANCEL);
-	ro_gui_wimp_event_register_ok(dialog_entry, ICON_ENTRY_OK,
-			ro_gui_hotlist_dialog_apply);
-	ro_gui_wimp_event_set_help_prefix(dialog_entry, "HelpHotEntry");
-
 	/* save as */
 	dialog_saveas = ro_gui_saveas_create("saveas");
 	ro_gui_wimp_event_register_button(dialog_saveas, ICON_SAVE_ICON,
Index: riscos/theme.c
===================================================================
--- riscos/theme.c	(revision 9470)
+++ riscos/theme.c	(working copy)
@@ -573,7 +573,6 @@
 bool ro_gui_theme_apply(struct theme_descriptor *descriptor)
 {
 	struct theme_descriptor *theme_previous;
-	struct treeview_window *tw;
 
 	/* check if the theme is already applied */
 	if (descriptor == theme_current)
@@ -588,15 +587,6 @@
 	/* apply the theme to all the current windows */
 	ro_gui_window_update_theme();
 
-	tw = ro_gui_hotlist_get();
-	ro_gui_tree_update_theme(tw->tree);
-
-	tw = ro_gui_global_history_get();
-	ro_gui_tree_update_theme(tw->tree);
-
-	tw = ro_gui_cookies_get();
-	ro_gui_tree_update_theme(tw->tree);
-
 	ro_gui_theme_close(theme_previous, false);
 	return true;
 }
@@ -953,14 +943,7 @@
 	 		ro_gui_wimp_event_register_mouse_click(toolbar->toolbar_handle,
 	 				ro_gui_toolbar_click);
 	 		break;
-		case THEME_HOTLIST_TOOLBAR:
-		case THEME_HOTLIST_EDIT_TOOLBAR:
-		case THEME_HISTORY_TOOLBAR:
-	  	case THEME_HISTORY_EDIT_TOOLBAR:
-		case THEME_COOKIES_TOOLBAR:
-	  	case THEME_COOKIES_EDIT_TOOLBAR:
-			ro_gui_wimp_event_register_mouse_click(toolbar->toolbar_handle,
-					ro_gui_tree_toolbar_click);
+		default:
 			break;
 	}
 
Index: riscos/sslcert.c
===================================================================
--- riscos/sslcert.c	(revision 9470)
+++ riscos/sslcert.c	(working copy)
@@ -35,6 +35,7 @@
 #include "desktop/gui.h"
 #include "desktop/tree.h"
 #include "riscos/dialog.h"
+#include "riscos/sslcert.h"
 #include "riscos/textarea.h"
 #include "riscos/treeview.h"
 #include "riscos/wimp.h"
@@ -47,36 +48,26 @@
 #define ICON_SSL_REJECT 3
 #define ICON_SSL_ACCEPT 4
 
-#define ICON_CERT_VERSION 3
-#define ICON_CERT_VALID_FROM 5
-#define ICON_CERT_TYPE 7
-#define ICON_CERT_VALID_TO 9
-#define ICON_CERT_SERIAL 11
-#define ICON_CERT_ISSUER 13
-#define ICON_CERT_SUBJECT 15
-
-static wimp_window *dialog_tree_template;
-static wimp_window *dialog_cert_template;
-
-static bool ro_gui_cert_click(wimp_pointer *pointer);
 static void ro_gui_cert_close(wimp_w w);
 static bool ro_gui_cert_apply(wimp_w w);
 
+static struct ro_sslcert
+{
+	ro_treeview *tv;
+	wimp_w w;
+} sslcert_window;
+
 /**
  * Load the cert window template
  */
 
 void ro_gui_cert_init(void)
 {
-	dialog_tree_template = ro_gui_dialog_load_template("tree");
-	dialog_cert_template = ro_gui_dialog_load_template("sslcert");
+	/** \todo Create certificate window */
 
-	dialog_tree_template->flags &= ~(wimp_WINDOW_MOVEABLE |
-			wimp_WINDOW_BACK_ICON |
-			wimp_WINDOW_CLOSE_ICON |
-			wimp_WINDOW_TITLE_ICON |
-			wimp_WINDOW_SIZE_ICON |
-			wimp_WINDOW_TOGGLE_ICON);
+	sslcert_window.tv = ro_treeview_create(sslcert_get_tree_flags());
+
+	/** \todo Connect event handlers */
 }
 
 /**
@@ -86,98 +77,21 @@
 void gui_cert_verify(struct browser_window *bw, struct content *c,
 		const struct ssl_cert_info *certs, unsigned long num)
 {
-	wimp_w ssl_w;
 	struct sslcert_session_data *data;
-	struct treeview_window sslcert_window;
-	wimp_window_state state;
-	wimp_icon_state istate;
-	os_error *error;
 
 	assert(bw && c && certs);
 
 	data = sslcert_create_session_data(num, bw, c->url);
 
-	/* create the SSL window */
-	error = xwimp_create_window(dialog_cert_template, &ssl_w);
-	if (error) {
-		LOG(("xwimp_create_window: 0x%x: %s",
-				error->errnum, error->errmess));
-		return;
-	}
+	sslcert_load_tree(ro_treeview_get_tree(sslcert_window.tv), certs, data);
 
-	sslcert_window.tree = sslcert_create_tree(&sslcert_window,
-			NULL, certs, data);
-
 	/* automated SSL window event handling */
-	ro_gui_wimp_event_set_user_data(ssl_w, data);
-	ro_gui_wimp_event_register_cancel(ssl_w, ICON_SSL_REJECT);
-	ro_gui_wimp_event_register_ok(ssl_w, ICON_SSL_ACCEPT, ro_gui_cert_apply);
-	ro_gui_dialog_open_persistent(bw->window->window, ssl_w, false);
-
-	/* create a tree window (styled as a list) */
-	error = xwimp_create_window(dialog_tree_template,
-			&sslcert_window.window);
-	if (error) {
-		ro_gui_cert_close(ssl_w);
-		LOG(("xwimp_create_window: 0x%x: %s",
-				error->errnum, error->errmess));
-		return;
-	}
-
-	/* automated treeview event handling */
-	ro_gui_wimp_event_set_user_data(sslcert_window.window,
-			sslcert_window.tree);
-	ro_gui_wimp_event_register_keypress(sslcert_window.window,
-			ro_gui_tree_keypress);
-	ro_gui_wimp_event_register_redraw_window(sslcert_window.window,
-			ro_gui_tree_redraw);
-	ro_gui_wimp_event_register_open_window(sslcert_window.window,
-			ro_gui_tree_open);
-	ro_gui_wimp_event_register_close_window(sslcert_window.window,
-			ro_gui_wimp_event_finalise);
-	ro_gui_wimp_event_register_mouse_click(sslcert_window.window,
-			ro_gui_cert_click);
-
-	/* nest the tree window inside the pane window */
-	state.w = ssl_w;
-	error = xwimp_get_window_state(&state);
-	if (error) {
-		ro_gui_cert_close(ssl_w);
-		LOG(("xwimp_get_window_state: 0x%x: %s",
-				error->errnum, error->errmess));
-		return;
-	}
-
-	istate.w = ssl_w;
-	istate.i = ICON_SSL_PANE;
-	error = xwimp_get_icon_state(&istate);
-	if (error) {
-		ro_gui_cert_close(ssl_w);
-		LOG(("xwimp_get_icon_state: 0x%x: %s",
-				error->errnum, error->errmess));
-		return;
-	}
-	state.w = sslcert_window.window;
-	state.visible.x1 = state.visible.x0 + istate.icon.extent.x1 - 20 -
-			ro_get_vscroll_width(sslcert_window.window);
-	state.visible.x0 += istate.icon.extent.x0 + 20;
-	state.visible.y0 = state.visible.y1 + istate.icon.extent.y0 + 20;
-	state.visible.y1 += istate.icon.extent.y1 - 32;
-	error = xwimp_open_window_nested(PTR_WIMP_OPEN(&state), ssl_w,
-			wimp_CHILD_LINKS_PARENT_VISIBLE_BOTTOM_OR_LEFT
-					<< wimp_CHILD_XORIGIN_SHIFT |
-			wimp_CHILD_LINKS_PARENT_VISIBLE_TOP_OR_RIGHT
-					<< wimp_CHILD_YORIGIN_SHIFT |
-			wimp_CHILD_LINKS_PARENT_VISIBLE_BOTTOM_OR_LEFT
-					<< wimp_CHILD_LS_EDGE_SHIFT |
-			wimp_CHILD_LINKS_PARENT_VISIBLE_BOTTOM_OR_LEFT
-					<< wimp_CHILD_RS_EDGE_SHIFT);
-	if (error) {
-		ro_gui_cert_close(ssl_w);
-		LOG(("xwimp_open_window_nested: 0x%x: %s",
-				error->errnum, error->errmess));
-		return;
-	}
+	ro_gui_wimp_event_set_user_data(sslcert_window.w, data);
+	ro_gui_wimp_event_register_cancel(sslcert_window.w, ICON_SSL_REJECT);
+	ro_gui_wimp_event_register_ok(sslcert_window.w, ICON_SSL_ACCEPT, 
+			ro_gui_cert_apply);
+	ro_gui_dialog_open_persistent(bw->window->window, sslcert_window.w, 
+			false);
 }
 
 
@@ -187,20 +101,12 @@
 void ro_gui_cert_close(wimp_w w)
 {
 	struct sslcert_session_data *s;
-	os_error *error;
 
 	s = (struct sslcert_session_data *)ro_gui_wimp_event_get_user_data(w);
 
 	sslcert_reject(s);
 
 	ro_gui_dialog_close(w);
-	error = xwimp_delete_window(w);
-	if (error) {
-		LOG(("xwimp_delete_window: 0x%x:%s",
-			error->errnum, error->errmess));
-		warn_user("WimpError", error->errmess);
-	}
-
 }
 
 /**
@@ -217,12 +123,3 @@
 	return true;
 }
 
-bool ro_gui_cert_click(wimp_pointer *pointer)
-{
-	struct tree *tree;
-
-	tree = (struct tree *)ro_gui_wimp_event_get_user_data(pointer->w);
-	ro_gui_tree_click(pointer, tree);
-	return true;
-}
-
Index: riscos/global_history.c
===================================================================
--- riscos/global_history.c	(revision 9470)
+++ riscos/global_history.c	(working copy)
@@ -45,59 +45,39 @@
 #include "utils/url.h"
 #include "utils/utils.h"
 
-static bool ro_gui_global_history_click(wimp_pointer *pointer);
+/* The history window */
+static struct ro_global_history_window 
+{
+	ro_treeview *tv;
+	struct toolbar *toolbar;
+	wimp_w w;
+} global_history_window;
 
-/* The history window, toolbar and plot origins */
-struct treeview_window global_history_window;
-
 /**
  * Initialise global history tree
  */
 void ro_gui_global_history_initialise(void)
 {
-	/* create our window */
-	global_history_window.window = ro_gui_dialog_create("tree");
-	ro_gui_set_window_title(global_history_window.window,
-			messages_get("GlobalHistory"));
-	ro_gui_wimp_event_register_redraw_window(global_history_window.window,
-			ro_gui_tree_redraw);
-	ro_gui_wimp_event_register_open_window(global_history_window.window,
-			ro_gui_tree_open);
-	ro_gui_wimp_event_register_mouse_click(global_history_window.window,
-			ro_gui_global_history_click);
+	/** \todo Create window */
 
-	/* Create our toolbar */
+	/* Create treeview */
+	global_history_window.tv = 
+			ro_treeview_create(history_global_get_tree_flags());
+
+	/* Create & attach toolbar */
 	global_history_window.toolbar = ro_gui_theme_create_toolbar(NULL,
 			THEME_HISTORY_TOOLBAR);
-	if (global_history_window.toolbar)
+	if (global_history_window.toolbar != NULL) {
 		ro_gui_theme_attach_toolbar(global_history_window.toolbar,
-				global_history_window.window);
+				global_history_window.w);
+	}
 
-	global_history_window.tree =
-			history_global_initialise(&global_history_window,
-					NULL);
+	history_global_initialise(
+			ro_treeview_get_tree(global_history_window.tv));
 }
 
 
 /**
- * Respond to a mouse click
- *
- * \param pointer  the pointer state
- * \return true to indicate click handled
- */
-bool ro_gui_global_history_click(wimp_pointer *pointer)
-{
-	ro_gui_tree_click(pointer, global_history_window.tree);
-	if (pointer->buttons == wimp_CLICK_MENU)
-		ro_gui_menu_create(global_history_menu, pointer->pos.x,
-				pointer->pos.y, pointer->w);
-	else
-		ro_gui_menu_prepare_action(pointer->w, TREE_SELECTION, false);
-	return true;
-}
-
-
-/**
  * Check if a particular window handle is the global history window
  *
  * \param window  the window in question
@@ -105,19 +85,9 @@
  */
 bool ro_gui_global_history_check_window(wimp_w window)
 {
-	if (global_history_window.window == window)
+	if (global_history_window.w == window)
 		return true;
 	else
 		return false;
 }
 
-
-/**
- * Get pointer to the cookie treeview_window
- *
- * \return  pointer to the treeview_window
- */
-struct treeview_window* ro_gui_global_history_get(void)
-{
-	return &global_history_window;
-}
Index: riscos/sslcert.h
===================================================================
--- riscos/sslcert.h	(revision 0)
+++ riscos/sslcert.h	(revision 0)
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2006 Richard Wilson <[email protected]>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/** \file
+ * SSL certificate viewer (interface).
+ */
+
+#ifndef _NETSURF_RISCOS_SSLCERT_H_
+#define _NETSURF_RISCOS_SSLCERT_H_
+
+void ro_gui_cert_init(void);
+void ro_gui_cert_open(struct tree *tree, struct node *node);
+
+#endif
Index: riscos/global_history.h
===================================================================
--- riscos/global_history.h	(revision 9470)
+++ riscos/global_history.h	(working copy)
@@ -28,7 +28,7 @@
 void ro_gui_global_history_initialise(void);
 void ro_gui_global_history_save(void);
 bool ro_gui_global_history_check_window(wimp_w window);
-struct treeview_window* ro_gui_global_history_get(void);
 
+void ro_gui_global_history_open(void);
 
 #endif
Index: riscos/hotlist.c
===================================================================
--- riscos/hotlist.c	(revision 9470)
+++ riscos/hotlist.c	(working copy)
@@ -33,6 +33,7 @@
 #include "desktop/hotlist.h"
 #include "desktop/tree.h"
 #include "riscos/dialog.h"
+#include "riscos/hotlist.h"
 #include "riscos/menus.h"
 #include "riscos/options.h"
 #include "riscos/theme.h"
@@ -44,63 +45,38 @@
 #include "utils/utils.h"
 #include "utils/url.h"
 
-static bool ro_gui_hotlist_click(wimp_pointer *pointer);
+/* The hotlist window */
+static struct ro_hotlist_window 
+{
+	ro_treeview *tv;
+	struct toolbar *toolbar;
+	wimp_w w;
+} hotlist_window;
 
-
-/* The hotlist window, toolbar and plot origins */
-struct treeview_window hotlist_window;
-
 /**
  * Initialise global history tree
  */
 void ro_gui_hotlist_initialise(void)
 {
-	/* create our window */
-	hotlist_window.window = ro_gui_dialog_create("tree");
-	ro_gui_set_window_title(hotlist_window.window,
-			messages_get("Hotlist"));
-	ro_gui_wimp_event_register_redraw_window(hotlist_window.window,
-			ro_gui_tree_redraw);
-	ro_gui_wimp_event_register_open_window(hotlist_window.window,
-			ro_gui_tree_open);
-	ro_gui_wimp_event_register_mouse_click(hotlist_window.window,
-			ro_gui_hotlist_click);
+	/** \todo Create window */
 
-	hotlist_window.tree = hotlist_initialise(&hotlist_window,
-			NULL, option_hotlist_path);
+	/* Create treeview */
+	hotlist_window.tv = ro_treeview_create(hotlist_get_tree_flags());
 
-	ro_gui_wimp_event_set_user_data(hotlist_window.window,
-			hotlist_window.tree);
-	ro_gui_wimp_event_register_keypress(hotlist_window.window,
-			ro_gui_tree_keypress);
+	hotlist_initialise(ro_treeview_get_tree(hotlist_window.tv),
+			option_hotlist_path);
 
 	/* Create our toolbar */
 	hotlist_window.toolbar = ro_gui_theme_create_toolbar(NULL,
 			THEME_HOTLIST_TOOLBAR);
-	if (hotlist_window.toolbar)
+	if (hotlist_window.toolbar != NULL) {
 		ro_gui_theme_attach_toolbar(hotlist_window.toolbar,
-				hotlist_window.window);
+				hotlist_window.w);
+	}
 }
 
 
 /**
- * Respond to a mouse click
- *
- * \param pointer  the pointer state
- */
-bool ro_gui_hotlist_click(wimp_pointer *pointer)
-{
-	ro_gui_tree_click(pointer, hotlist_window.tree);
-	if (pointer->buttons == wimp_CLICK_MENU)
-		ro_gui_menu_create(hotlist_menu, pointer->pos.x,
-				pointer->pos.y, pointer->w);
-	else
-		ro_gui_menu_prepare_action(pointer->w, TREE_SELECTION, false);
-	return true;
-}
-
-
-/**
  * Check if a particular window handle is the hotlist window
  *
  * \param window  the window in question
@@ -108,13 +84,13 @@
  */
 bool ro_gui_hotlist_check_window(wimp_w window)
 {
-	if (hotlist_window.window == window)
+	if (hotlist_window.w == window)
 		return true;
 	else
 		return false;
 }
 
-
+#if 0
 /**
  * Handle URL dropped on hotlist
  *
@@ -133,14 +109,4 @@
 				&x, &y);
 	hotlist_add_page_xy(url, x, y);
 }
-
-
-/**
- * Get pointer to the hotlist treeview_window
- *
- * \return  pointer to the treeview_window
- */
-struct treeview_window* ro_gui_hotlist_get(void)
-{
-	return &hotlist_window;
-}
+#endif
Index: riscos/hotlist.h
===================================================================
--- riscos/hotlist.h	(revision 0)
+++ riscos/hotlist.h	(revision 0)
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2006 Richard Wilson <[email protected]>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/** \file
+ * Hotlist (interface).
+ */
+
+#ifndef _NETSURF_RISCOS_HOTLIST_H_
+#define _NETSURF_RISCOS_HOTLIST_H_
+
+void ro_gui_hotlist_initialise(void);
+void ro_gui_hotlist_save(void);
+bool ro_gui_hotlist_check_window(wimp_w window);
+
+void ro_gui_hotlist_open(void);
+
+#endif
Index: riscos/cookies.c
===================================================================
--- riscos/cookies.c	(revision 9470)
+++ riscos/cookies.c	(working copy)
@@ -44,57 +44,36 @@
 #include "utils/url.h"
 #include "utils/utils.h"
 
-static bool ro_gui_cookies_click(wimp_pointer *pointer);
+/* The cookies window */
+static struct ro_cookies_window {
+	ro_treeview *tv;
+	struct toolbar *toolbar;
+	wimp_w w;
+} cookies_window;
 
-/* The history window, toolbar and plot origins */
-struct treeview_window cookies_window;
-
 /**
  * Initialise cookies tree
  */
 void ro_gui_cookies_initialise(void)
 {
-	/* create our window */
-	cookies_window.window = ro_gui_dialog_create("tree");
-	ro_gui_set_window_title(cookies_window.window,
-			messages_get("Cookies"));
-	ro_gui_wimp_event_register_redraw_window(cookies_window.window,
-			ro_gui_tree_redraw);
-	ro_gui_wimp_event_register_open_window(cookies_window.window,
-			ro_gui_tree_open);
-	ro_gui_wimp_event_register_mouse_click(cookies_window.window,
-			ro_gui_cookies_click);
+	/** \todo Create window */
 
-	/* Create our toolbar */
+	/* Create treeview */
+	cookies_window.tv = ro_treeview_create(cookies_get_tree_flags());
+
+	/* Create & attach toolbar */
 	cookies_window.toolbar = ro_gui_theme_create_toolbar(NULL,
 			THEME_COOKIES_TOOLBAR);
-	if (cookies_window.toolbar)
-		ro_gui_theme_attach_toolbar(cookies_window.toolbar,
-				cookies_window.window);
+	if (cookies_window.toolbar != NULL) {
+		ro_gui_theme_attach_toolbar(cookies_window.toolbar, 
+				cookies_window.w);
+	}
 
-	cookies_window.tree = cookies_initialise(&cookies_window, NULL);
+	cookies_initialise(ro_treeview_get_tree(cookies_window.tv));
 }
 
 
 /**
- * Respond to a mouse click
- *
- * \param pointer  the pointer state
- * \return true to indicate click handled
- */
-bool ro_gui_cookies_click(wimp_pointer *pointer)
-{
-	ro_gui_tree_click(pointer, cookies_window.tree);
-	if (pointer->buttons == wimp_CLICK_MENU)
-		ro_gui_menu_create(cookies_menu, pointer->pos.x,
-				pointer->pos.y, pointer->w);
-	else
-		ro_gui_menu_prepare_action(pointer->w, TREE_SELECTION, false);
-	return true;
-}
-
-
-/**
  * Check if a particular window handle is the cookies window
  *
  * \param window  the window in question
@@ -102,19 +81,9 @@
  */
 bool ro_gui_cookies_check_window(wimp_w window)
 {
-	if (cookies_window.window == window)
+	if (cookies_window.w == window)
 		return true;
 	else
 		return false;
 }
 
-
-/**
- * Get pointer to the cookie treeview_window
- *
- * \return  pointer to the treeview_window
- */
-struct treeview_window* ro_gui_cookies_get(void)
-{
-	return &cookies_window;
-}
Index: riscos/cookies.h
===================================================================
--- riscos/cookies.h	(revision 9470)
+++ riscos/cookies.h	(working copy)
@@ -25,6 +25,7 @@
 
 void ro_gui_cookies_initialise(void);
 bool ro_gui_cookies_check_window(wimp_w window);
-struct treeview_window* ro_gui_cookies_get(void);
 
+void ro_gui_cookies_open(void);
+
 #endif
Index: riscos/gui.c
===================================================================
--- riscos/gui.c	(revision 9470)
+++ riscos/gui.c	(working copy)
@@ -501,9 +501,6 @@
 	/* Done with the templates file */
 	wimp_close_template();
 
-	/* Initialise tree views (must be after UI sprites are loaded) */
-	ro_gui_tree_initialise();
-
 	/* Create Iconbar icon */
 	ro_gui_icon_bar_create();
 
@@ -1263,11 +1260,11 @@
 			break;
 
 		case GUI_DRAG_TREE_SELECT:
-			ro_gui_tree_selection_drag_end(drag);
+//			ro_gui_tree_selection_drag_end(drag);
 			break;
 
 		case GUI_DRAG_TREE_MOVE:
-			ro_gui_tree_move_drag_end(drag);
+//			ro_gui_tree_move_drag_end(drag);
 			break;
 
 		case GUI_DRAG_TOOLBAR_CONFIG:
@@ -1534,9 +1531,9 @@
 
 	if (g) {
 		browser_window_go(g->bw, url, 0, true);
-	} else if (ro_gui_hotlist_check_window(message->data.data_xfer.w)) {
-		/* Drop URL into hotlist */
-		ro_gui_hotlist_url_drop(message, url);
+//	} else if (ro_gui_hotlist_check_window(message->data.data_xfer.w)) {
+//		/* Drop URL into hotlist */
+//		ro_gui_hotlist_url_drop(message, url);
 	} else {
 		browser_window_create(url, 0, 0, true, false);
 	}
Index: riscos/gui.h
===================================================================
--- riscos/gui.h	(revision 9470)
+++ riscos/gui.h	(working copy)
@@ -135,10 +135,6 @@
 /* in 401login.c */
 void ro_gui_401login_init(void);
 
-/* in sslcert.c */
-void ro_gui_cert_init(void);
-void ro_gui_cert_open(struct tree *tree, struct node *node);
-
 /* in window.c */
 void ro_gui_window_quit(void);
 /* void ro_gui_window_close_all(void); */
@@ -177,16 +173,6 @@
 		bool pointer);
 void ro_gui_history_mouse_at(wimp_pointer *pointer);
 
-/* in hotlist.c */
-void ro_gui_hotlist_initialise(void);
-void ro_gui_hotlist_save(void);
-void ro_gui_hotlist_prepare_folder_dialog(struct node *node);
-void ro_gui_hotlist_prepare_entry_dialog(struct node *node);
-bool ro_gui_hotlist_dialog_apply(wimp_w w);
-bool ro_gui_hotlist_check_window(wimp_w window);
-void ro_gui_hotlist_url_drop(wimp_message *message, const char *url);
-struct treeview_window* ro_gui_hotlist_get(void);
-
 /* in filetype.c */
 int ro_content_filetype(struct content *content);
 int ro_content_filetype_from_type(content_type type);
Index: riscos/treeview.c
===================================================================
--- riscos/treeview.c	(revision 9470)
+++ riscos/treeview.c	(working copy)
@@ -56,16 +56,78 @@
 #define wimp_KEY_END wimp_KEY_COPY
 #endif
 
-#define TREE_EXPAND 0
-#define TREE_COLLAPSE 1
+/** \todo Ugh! */
+const char tree_directory_icon_name[] = "directory.png";
+const char tree_content_icon_name[] = "content.png";
 
+struct ro_treeview
+{
+	struct tree *tree;
+	wimp_w w;
+};
 
-static bool ro_gui_tree_initialise_sprite(const char *name, int number);
-static void ro_gui_tree_launch_selected_node(struct tree *tree, struct node *node, bool all);
-static bool ro_gui_tree_launch_node(struct tree *tree, struct node *node);
-static void tree_handle_node_changed_callback(void *p);
+static void ro_treeview_redraw_request(int x, int y, int width, int height,
+		void *pw);
+static void ro_treeview_resized(struct tree *tree, int width, int height,
+		void *pw);
+static void ro_treeview_scroll_visible(int y, int height, void *pw);
+static void ro_treeview_get_window_dimensions(int *width, int *height, 
+		void *pw);
 
+static const struct treeview_table ro_tree_callbacks = {
+	ro_treeview_redraw_request,
+	ro_treeview_resized,
+	ro_treeview_scroll_visible,
+	ro_treeview_get_window_dimensions
+};
 
+ro_treeview *ro_treeview_create(unsigned int flags)
+{
+	ro_treeview *tv;
+
+	tv = malloc(sizeof(ro_treeview));
+	if (tv == NULL)
+		return NULL;
+
+	tv->tree = tree_create(flags, &ro_tree_callbacks, tv);
+	if (tv->tree == NULL) {
+		free(tv);
+		return NULL;
+	}
+
+	/** \todo Create WIMP window */
+
+//	ro_gui_wimp_event_register_redraw_window(tv->w, ro_treeview_redraw);
+//	ro_gui_wimp_event_register_open_window(tv->w, ro_treeview_open);
+//	ro_gui_wimp_event_register_mouse_click(tv->w, ro_treeview_mouse_click);
+//	ro_gui_wimp_event_register_keypress(tv->w, ro_treeview_keypress);
+	ro_gui_wimp_event_set_user_data(tv->w, tv);
+
+	return tv;
+}
+
+void ro_treeview_destroy(ro_treeview *tv)
+{
+	/** \todo Deregister event handlers? */
+
+	/** \todo Destroy WIMP window */
+
+	tree_delete(tv->tree);
+
+	free(tv);
+}
+
+struct tree *ro_treeview_get_tree(ro_treeview *tv)
+{
+	return tv->tree;
+}
+
+wimp_w ro_treeview_get_window(ro_treeview *tv)
+{
+	return tv->w;
+}
+
+#if 0
 /* an array of sprite addresses for Tinct */
 static char *ro_gui_tree_sprites[2];
 
@@ -1057,3 +1119,4 @@
 	if (!ro_gui_wimp_sprite_exists(buffer))
 		sprintf(buffer, "%s", "small_xxx");
 }
+#endif
Index: riscos/treeview.h
===================================================================
--- riscos/treeview.h	(revision 9470)
+++ riscos/treeview.h	(working copy)
@@ -24,44 +24,16 @@
 #define _NETSURF_RISCOS_TREEVIEW_H_
 
 #include <stdbool.h>
-#include "oslib/osspriteop.h"
-#include "oslib/wimp.h"
+#include <oslib/wimp.h>
+
 #include "desktop/tree.h"
-#include "image/bitmap.h"
 
-#define TREE_TEXT_HEIGHT 40
-#define TREE_SPRITE_WIDTH 40	/* text plus sprite entries only */
+typedef struct ro_treeview ro_treeview;
 
-struct node_sprite {
-	osspriteop_area *area;
-	char name[12];
-	char expanded_name[12];
-};
+ro_treeview *ro_treeview_create(unsigned int flags);
+void ro_treeview_destroy(ro_treeview *tv);
 
-struct treeview_window {
-	wimp_w window;
-	struct toolbar *toolbar;
-	struct tree *tree;
-};
+struct tree *ro_treeview_get_tree(ro_treeview *tv);
+wimp_w ro_treeview_get_window(ro_treeview *tv);
 
-bool ro_gui_tree_initialise(void);
-void ro_gui_tree_redraw(wimp_draw *redraw);
-bool ro_gui_tree_click(wimp_pointer *pointer, struct tree *tree);
-void ro_gui_tree_menu_closed(struct tree *tree);
-bool ro_gui_tree_toolbar_click(wimp_pointer* pointer);
-void ro_gui_tree_stop_edit(struct tree *tree);
-void ro_gui_tree_open(wimp_open *open);
-void ro_gui_tree_show(struct tree *tree);
-bool ro_gui_tree_keypress(wimp_key *key);
-void ro_gui_tree_selection_drag_end(wimp_dragged *drag);
-void ro_gui_tree_move_drag_end(wimp_dragged *drag);
-void ro_gui_tree_launch_selected(struct tree *tree);
-void ro_gui_tree_start_edit(struct tree *tree, struct node_element *element,
-		wimp_pointer *pointer);
-void ro_gui_tree_scroll_visible(struct tree *tree, struct node_element *element);
-void ro_gui_tree_get_tree_coordinates(struct tree *tree, int x, int y,
-		int *tree_x, int *tree_y);
-int ro_gui_tree_help(int x, int y);
-void ro_gui_tree_update_theme(struct tree *tree);
-
 #endif
Index: riscos/menus.c
===================================================================
--- riscos/menus.c	(revision 9470)
+++ riscos/menus.c	(working copy)
@@ -48,6 +48,7 @@
 #include "riscos/gui.h"
 #include "riscos/global_history.h"
 #include "riscos/help.h"
+#include "riscos/hotlist.h"
 #include "riscos/menus.h"
 #include "riscos/options.h"
 #include "riscos/save.h"
@@ -106,7 +107,7 @@
 		bool ticked);
 static void ro_gui_menu_get_window_details(wimp_w w, struct gui_window **g,
 		struct browser_window **bw, struct content **content,
-		struct toolbar **toolbar, struct tree **tree,
+		struct toolbar **toolbar,
 		bool *is_cookies, bool *is_hotlist, bool *is_global_history);
 static int ro_gui_menu_get_checksum(void);
 static bool ro_gui_menu_prepare_url_suggest(void);
@@ -610,7 +611,6 @@
 	struct browser_window *bw;
 	struct content *c;
 	struct toolbar *t;
-	struct tree *tree;
 	os_error *error;
 	bool is_cookies, is_hotlist, is_global_history;
 
@@ -623,16 +623,13 @@
 			warn_user("MenuError", error->errmess);
 		}
 		ro_gui_menu_get_window_details(current_menu_window,
-				&g, &bw, &c, &t, &tree,
+				&g, &bw, &c, &t,
 				&is_cookies, &is_hotlist,
 				&is_global_history);
 		current_menu = NULL;
 
 		if (cleanup) {
 		  	ro_gui_wimp_event_menus_closed();
-
-			if (tree)
-				ro_gui_tree_menu_closed(tree);
 		}
 	}
 
@@ -824,7 +821,7 @@
  */
 void ro_gui_menu_refresh_toolbar(struct toolbar *toolbar)
 {
-	struct treeview_window *treeview_window;
+//	struct treeview_window *treeview_window;
 
 	assert(toolbar);
 
@@ -833,24 +830,24 @@
 	if (toolbar->type == THEME_BROWSER_TOOLBAR) {
 		gui_window_update_extent(ro_gui_window_lookup(
 				current_menu_window));
-	} else if (toolbar->type == THEME_HOTLIST_TOOLBAR) {
-		treeview_window = ro_gui_hotlist_get();
-		/* TODO: FIX THIS */
-		/* tree_resized(treeview_window->tree); */
-		xwimp_force_redraw(treeview_window->window,
-				0,-16384, 16384, 16384);
-	} else if (toolbar->type == THEME_HISTORY_TOOLBAR) {
-		treeview_window = ro_gui_global_history_get();
-		/* TODO: FIX THIS */
-		/* tree_resized(treeview_window->tree); */
-		xwimp_force_redraw(treeview_window->window,
-				0,-16384, 16384, 16384);
-	} else if (toolbar->type == THEME_COOKIES_TOOLBAR) {
-		treeview_window = ro_gui_cookies_get();
-		/* TODO: FIX THIS */
-		/* tree_resized(treeview_window->tree); */
-		xwimp_force_redraw(treeview_window->window,
-				0,-16384, 16384, 16384);
+//	} else if (toolbar->type == THEME_HOTLIST_TOOLBAR) {
+//		treeview_window = ro_gui_hotlist_get();
+//		/* TODO: FIX THIS */
+//		/* tree_resized(treeview_window->tree); */
+//		xwimp_force_redraw(treeview_window->window,
+//				0,-16384, 16384, 16384);
+//	} else if (toolbar->type == THEME_HISTORY_TOOLBAR) {
+//		treeview_window = ro_gui_global_history_get();
+//		/* TODO: FIX THIS */
+//		/* tree_resized(treeview_window->tree); */
+//		xwimp_force_redraw(treeview_window->window,
+//				0,-16384, 16384, 16384);
+//	} else if (toolbar->type == THEME_COOKIES_TOOLBAR) {
+//		treeview_window = ro_gui_cookies_get();
+//		/* TODO: FIX THIS */
+//		/* tree_resized(treeview_window->tree); */
+//		xwimp_force_redraw(treeview_window->window,
+//				0,-16384, 16384, 16384);
 	}
 }
 
@@ -1470,18 +1467,16 @@
 bool ro_gui_menu_handle_action(wimp_w owner, menu_action action,
 		bool windows_at_pointer)
 {
-	struct treeview_window *treeview_window;
 	wimp_window_state state;
 	struct gui_window *g = NULL;
 	struct browser_window *bw = NULL;
 	struct content *c = NULL;
 	struct toolbar *t = NULL;
-	struct tree *tree = NULL;
 	os_error *error;
 	char url[80];
 	bool is_cookies, is_hotlist, is_global_history;
 
-	ro_gui_menu_get_window_details(owner, &g, &bw, &c, &t, &tree,
+	ro_gui_menu_get_window_details(owner, &g, &bw, &c, &t,
 			&is_cookies, &is_hotlist, &is_global_history);
 
 	switch (action) {
@@ -1516,26 +1511,22 @@
 						windows_at_pointer);
 			return true;
 		case HISTORY_SHOW_GLOBAL:
-			treeview_window = ro_gui_global_history_get();
-			ro_gui_tree_show(treeview_window->tree);
+			ro_gui_global_history_open();
 			return true;
 
 		/* hotlist actions */
 		case HOTLIST_ADD_URL:
-			treeview_window = ro_gui_hotlist_get();
-			if ((!treeview_window->tree) || (!c) || (!c->url))
+			if (c == NULL || c->url == NULL)
 				return false;
 			hotlist_add_page(c->url);
 			return true;
 		case HOTLIST_SHOW:
-			treeview_window = ro_gui_hotlist_get();
-			ro_gui_tree_show(treeview_window->tree);
+			ro_gui_hotlist_open();
 			return true;
 
 		/* cookies actions */
 		case COOKIES_SHOW:
-			treeview_window = ro_gui_cookies_get();
-			ro_gui_tree_show(treeview_window->tree);
+			ro_gui_cookies_open();
 			return true;
 
 		case COOKIES_DELETE:
@@ -1936,13 +1927,10 @@
 void ro_gui_menu_prepare_action(wimp_w owner, menu_action action,
 		bool windows)
 {
-	struct treeview_window *treeview_window;
 	struct gui_window *g;
 	struct browser_window *bw;
 	struct content *c;
 	struct toolbar *t;
-	struct tree *tree;
-	struct node *node;
 	bool result = false;
 	int checksum = 0;
 	os_error *error;
@@ -1951,7 +1939,7 @@
 	bool compare;
 	bool is_cookies, is_hotlist, is_global_history;
 
-	ro_gui_menu_get_window_details(owner, &g, &bw, &c, &t, &tree,
+	ro_gui_menu_get_window_details(owner, &g, &bw, &c, &t,
 			&is_cookies, &is_hotlist, &is_global_history);
 	if (current_menu_open)
 		checksum = ro_gui_menu_get_checksum();
@@ -1978,45 +1966,13 @@
 				!(c || history_back_available(bw->history) ||
 				history_forward_available(bw->history))));
 			break;
-		case HISTORY_SHOW_GLOBAL:
-			treeview_window = ro_gui_global_history_get();
-			ro_gui_menu_set_entry_shaded(current_menu, action,
-					!treeview_window);
-			break;
 
 		/* hotlist actions */
 		case HOTLIST_ADD_URL:
-			treeview_window = ro_gui_hotlist_get();
 			ro_gui_menu_set_entry_shaded(current_menu, action,
-					(!c || !treeview_window));
+					c == NULL);
 			break;
-		case HOTLIST_SHOW:
-			treeview_window = ro_gui_hotlist_get();
-			ro_gui_menu_set_entry_shaded(current_menu, action,
-					!treeview_window);
-			if ((t) && (!t->editor) &&
-					(t->type == THEME_BROWSER_TOOLBAR))
-				ro_gui_set_icon_shaded_state(
-						t->toolbar_handle,
-						ICON_TOOLBAR_BOOKMARK,
-						!treeview_window);
-			break;
 
-		/* cookies actions */
-		case COOKIES_SHOW:
-			treeview_window = ro_gui_cookies_get();
-			node = tree_get_root(treeview_window->tree);
-			ro_gui_menu_set_entry_shaded(current_menu, action,
-					!treeview_window->tree);
-			break;
-		case COOKIES_DELETE:
-			treeview_window = ro_gui_cookies_get();
-			node = tree_get_root(treeview_window->tree);
-			ro_gui_menu_set_entry_shaded(current_menu, action,
-					!(treeview_window->tree &&
-					tree_node_get_child(node)));
-			break;
-
 		/* page actions */
 		case BROWSER_PAGE:
 			ro_gui_menu_set_entry_shaded(current_menu,
@@ -2276,12 +2232,12 @@
 						c->url, c->title);
 			break;
 		case HOTLIST_EXPORT:
-			if ((tree) && (windows))
+			if (windows)
 				ro_gui_save_prepare(GUI_SAVE_HOTLIST_EXPORT_HTML,
 						NULL, NULL, NULL, NULL);
 			break;
 		case HISTORY_EXPORT:
-			if ((tree) && (windows))
+			if (windows)
 				ro_gui_save_prepare(GUI_SAVE_HISTORY_EXPORT_HTML,
 						NULL, NULL, NULL, NULL);
 			break;
@@ -2422,93 +2378,6 @@
 					option_window_screen_width == 0);
 			break;
 
-		/* tree actions */
-		case TREE_NEW_FOLDER:
-			ro_gui_hotlist_prepare_folder_dialog(NULL);
-			break;
-		case TREE_NEW_LINK:
-			ro_gui_hotlist_prepare_entry_dialog(NULL);
-			break;
-		case TREE_EXPAND_ALL:
-		case TREE_EXPAND_FOLDERS:
-		case TREE_EXPAND_LINKS:
-		case TREE_COLLAPSE_ALL:
-		case TREE_COLLAPSE_FOLDERS:
-		case TREE_COLLAPSE_LINKS:
-			if (tree) {
-				node = tree_get_root(tree);
-				if (node == NULL)
-					break;
-				ro_gui_menu_set_entry_shaded(current_menu,
-						action,
-						!tree_node_get_child(node));
-
-				if ((t) && (!t->editor) && (t->type !=
-						THEME_BROWSER_TOOLBAR)) {
-					ro_gui_set_icon_shaded_state(
-							t->toolbar_handle,
-							ICON_TOOLBAR_EXPAND,
-							!tree_node_get_child(
-								node));
-					ro_gui_set_icon_shaded_state(
-							t->toolbar_handle,
-							ICON_TOOLBAR_OPEN,
-							!tree_node_get_child(
-								node));
-				}
-			}
-			break;
-		case TREE_SELECTION:
-			if (!tree)
-				break;
-			node = tree_get_root(tree);
-			if (node == NULL)
-				break;
-			result = tree_node_has_selection(node);
-			ro_gui_menu_set_entry_shaded(current_menu,
-					action, !result);
-			if ((t) && (!t->editor) &&
-					(t->type != THEME_BROWSER_TOOLBAR)) {
-				ro_gui_set_icon_shaded_state(
-						t->toolbar_handle,
-						ICON_TOOLBAR_DELETE, !result);
-				ro_gui_set_icon_shaded_state(
-						t->toolbar_handle,
-						ICON_TOOLBAR_LAUNCH, !result);
-			}
-			break;
-		case TREE_SELECTION_EDIT:
-			if (!tree)
-				break;
-			node = tree_get_root(tree);
-			if (node == NULL)
-				break;
-			node = tree_get_selected_node(node);
-			ro_gui_menu_set_entry_shaded(current_menu,
-					action, !result);
-			break;
-		case TREE_SELECTION_LAUNCH:
-		case TREE_SELECTION_DELETE:
-		case TREE_CLEAR_SELECTION:
-			if (!tree)
-				break;
-			node = tree_get_root(tree);
-			if (node == NULL)
-				break;
-			result = tree_node_has_selection(node);
-			ro_gui_menu_set_entry_shaded(current_menu,
-					action, !result);
-			break;
-		case TREE_SELECT_ALL:
-			if (!tree)
-				break;
-			node = tree_get_root(tree);
-			if (node == NULL)
-				break;
-			ro_gui_menu_set_entry_shaded(current_menu, action,
-					!tree_node_get_child(node));
-			break;
-
 		/* toolbar actions */
 		case TOOLBAR_BUTTONS:
 			ro_gui_menu_set_entry_shaded(current_menu,
@@ -2561,11 +2430,9 @@
  */
 void ro_gui_menu_get_window_details(wimp_w w, struct gui_window **g,
 		struct browser_window **bw, struct content **content,
-		struct toolbar **toolbar, struct tree **tree,
+		struct toolbar **toolbar,
 		bool *is_cookies, bool *is_hotlist, bool *is_global_history)
 {
-	struct treeview_window *treeview_window;
-
 	*is_cookies = false;
 	*is_hotlist = false;
 	*is_global_history = false;
@@ -2577,27 +2444,19 @@
 		*toolbar = (*g)->toolbar;
 		if (*bw)
 			*content = (*bw)->current_content;
-		*tree = NULL;
 	} else {
 		*bw = NULL;
 		*content = NULL;
 		if (ro_gui_hotlist_check_window(w)) {
 			*is_hotlist = true;
-			treeview_window = ro_gui_hotlist_get();
-			*tree = treeview_window->tree;
-			*toolbar = treeview_window->toolbar;
+//			*toolbar = treeview_window->toolbar;
 		} else if (ro_gui_global_history_check_window(w)) {
 			*is_global_history = true;
-			treeview_window = ro_gui_global_history_get();
-			*tree = treeview_window->tree;
-			*toolbar = treeview_window->toolbar;
+//			*toolbar = treeview_window->toolbar;
 		} else if (ro_gui_cookies_check_window(w)) {
 			*is_cookies = true;
-			treeview_window = ro_gui_cookies_get();
-			*tree = treeview_window->tree;
-			*toolbar = treeview_window->toolbar;
+//			*toolbar = treeview_window->toolbar;
 		} else {
-			*tree = NULL;
 			*toolbar = NULL;
 		}
 	}
Index: riscos/help.c
===================================================================
--- riscos/help.c	(revision 9470)
+++ riscos/help.c	(working copy)
@@ -31,6 +31,7 @@
 #include "riscos/cookies.h"
 #include "riscos/global_history.h"
 #include "riscos/gui.h"
+#include "riscos/hotlist.h"
 #include "riscos/help.h"
 #include "riscos/menus.h"
 #include "riscos/options.h"

Reply via email to