summaryrefslogtreecommitdiff
path: root/desktop
diff options
context:
space:
mode:
authorVincent Sanders <vince@kyllikki.org>2014-10-16 09:41:50 +0100
committerVincent Sanders <vince@kyllikki.org>2014-10-16 22:33:43 +0100
commitab7f3e31800ade0cec9c071e61cc001ee9470f69 (patch)
tree683abf5132e18fb62454d3c0a4afa548827e5722 /desktop
parent9d3c2b18c4ad5229cfb931f81be75a5978f300cd (diff)
downloadnetsurf-ab7f3e31800ade0cec9c071e61cc001ee9470f69.tar.gz
netsurf-ab7f3e31800ade0cec9c071e61cc001ee9470f69.tar.bz2
Split up graphical user interface operations table headers
This is the initial part of a series which splits up the API interface definitions for the frontends removing a great deal of unnecessary file inclusion and further isolates the fronted API usage from the core
Diffstat (limited to 'desktop')
-rw-r--r--desktop/gui.h592
-rw-r--r--desktop/gui_clipboard.h63
-rw-r--r--desktop/gui_download.h44
-rw-r--r--desktop/gui_fetch.h77
-rw-r--r--desktop/gui_internal.h (renamed from desktop/gui_factory.h)28
-rw-r--r--desktop/gui_misc.h90
-rw-r--r--desktop/gui_search.h75
-rw-r--r--desktop/gui_table.h124
-rw-r--r--desktop/gui_utf8.h53
-rw-r--r--desktop/gui_window.h283
-rw-r--r--desktop/netsurf.h12
11 files changed, 831 insertions, 610 deletions
diff --git a/desktop/gui.h b/desktop/gui.h
deleted file mode 100644
index 83e857474..000000000
--- a/desktop/gui.h
+++ /dev/null
@@ -1,592 +0,0 @@
-/*
- * Copyright 2014 Vincent Sanders <vince@netsurf-browser.org>
- *
- * 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
- * Interface to platform-specific gui operation tables.
- */
-
-#ifndef _NETSURF_DESKTOP_GUI_H_
-#define _NETSURF_DESKTOP_GUI_H_
-
-#include <stddef.h>
-
-#include "utils/types.h"
-#include "utils/errors.h"
-#include "desktop/plot_style.h"
-#include "desktop/mouse.h"
-
-typedef enum gui_save_type {
- GUI_SAVE_SOURCE,
- GUI_SAVE_DRAW,
- GUI_SAVE_PDF,
- GUI_SAVE_TEXT,
- GUI_SAVE_COMPLETE,
- GUI_SAVE_OBJECT_ORIG,
- GUI_SAVE_OBJECT_NATIVE,
- GUI_SAVE_LINK_URI,
- GUI_SAVE_LINK_URL,
- GUI_SAVE_LINK_TEXT,
- GUI_SAVE_HOTLIST_EXPORT_HTML,
- GUI_SAVE_HISTORY_EXPORT_HTML,
- GUI_SAVE_TEXT_SELECTION,
- GUI_SAVE_CLIPBOARD_CONTENTS
-} gui_save_type;
-
-typedef enum {
- GDRAGGING_NONE,
- GDRAGGING_SCROLLBAR,
- GDRAGGING_SELECTION,
- 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;
-struct form_control;
-struct ssl_cert_info;
-struct hlcache_handle;
-struct download_context;
-struct nsurl;
-struct gui_file_table;
-struct gui_llcache_table;
-struct gui_search_web_table;
-
-typedef struct nsnsclipboard_styles {
- size_t start; /**< Start of run */
-
- plot_font_style_t style; /**< Style to give text run */
-} nsclipboard_styles;
-
-/**
- * Graphical user interface window function table.
- *
- * function table implementing window operations
- */
-struct gui_window_table {
-
- /* Mandantory entries */
-
- /**
- * 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 flag is 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
- *
- * \param gw The gui window to destroy.
- */
- void (*destroy)(struct gui_window *gw);
-
- /**
- * Force a redraw of the entire contents of a window.
- *
- * @todo this API should be merged with update.
- *
- * \param g gui_window to redraw
- */
- void (*redraw)(struct gui_window *g);
-
- /**
- * Redraw an area of a window.
- *
- * \param g gui_window
- * \param rect area to redraw
- */
- void (*update)(struct gui_window *g, const struct rect *rect);
-
- /**
- * Get the scroll position of a browser window.
- *
- * \param g gui_window
- * \param sx receives x ordinate of point at top-left of window
- * \param sy receives y ordinate of point at top-left of window
- * \return true iff successful
- */
- bool (*get_scroll)(struct gui_window *g, int *sx, int *sy);
-
- /**
- * Set the scroll position of a browser window.
- *
- * \param g gui_window to scroll
- * \param sx point to place at top-left of window
- * \param sy point to place at top-left of window
- */
- void (*set_scroll)(struct gui_window *g, int sx, int sy);
-
- /**
- * Find the current dimensions of a browser window's content area.
- *
- * @todo The implementations of this are buggy and its only
- * used from frames code.
- *
- * \param g gui_window to measure
- * \param width receives width of window
- * \param height receives height of window
- * \param scaled whether to return scaled values
- */
- void (*get_dimensions)(struct gui_window *g, int *width, int *height, bool scaled);
-
- /**
- * Update the extent of the inside of a browser window to that of the
- * current content.
- *
- * @todo this is used to update scroll bars does it need
- * renaming? some frontends (windows) do not even implement it.
- *
- * \param g gui_window to update the extent of
- */
- void (*update_extent)(struct gui_window *g);
-
- /**
- * Reformat a window.
- *
- * This is used to perform reformats when the page contents
- * require reformating. The reformat is requested using
- * browser_window_schedule_reformat and occours via a scheduled
- * callback hence from top level context.
- *
- * \param g gui_window to reformat.
- */
- void (*reformat)(struct gui_window *g);
-
-
- /* Optional entries */
-
- /**
- * Set the title of a window.
- *
- * \param g window to update
- * \param title new window title
- */
- void (*set_title)(struct gui_window *g, const char *title);
-
- /**
- * Set the navigation url.
- *
- * \param gw window to update.
- * \param url The url to use as icon.
- */
- void (*set_url)(struct gui_window *gw, const char *url);
-
- /**
- * Set a favicon for a gui window.
- *
- * \param gw window to update.
- * \param icon handle to object to use as icon.
- */
- void (*set_icon)(struct gui_window *gw, struct hlcache_handle *icon);
-
- /**
- * Set the status bar of a browser window.
- *
- * \param g gui_window to update
- * \param text new status text
- */
- void (*set_status)(struct gui_window *g, const char *text);
-
- /**
- * Change mouse pointer shape
- */
- void (*set_pointer)(struct gui_window *g, gui_pointer_shape shape);
-
- /**
- * Place the caret in a browser window.
- *
- * \param g window with caret
- * \param x coordinates of caret
- * \param y coordinates of caret
- * \param height height of caret
- * \param clip clip rectangle, or NULL if none
- */
- void (*place_caret)(struct gui_window *g, int x, int y, int height, const struct rect *clip);
-
- /**
- * Remove the caret, if present.
- *
- * \param g window with caret
- */
- void (*remove_caret)(struct gui_window *g);
-
- /** start the navigation throbber. */
- void (*start_throbber)(struct gui_window *g);
-
- /** stop the navigation throbber. */
- void (*stop_throbber)(struct gui_window *g);
-
- /** start a drag operation within a window */
- bool (*drag_start)(struct gui_window *g, gui_drag_type type, const struct rect *rect);
-
- /** save link operation */
- void (*save_link)(struct gui_window *g, const char *url, const char *title);
-
- /**
- * Scrolls the specified area of a browser window into view.
- *
- * @todo investigate if this can be merged with set_scroll
- * which is what the default implementation used by most
- * toolkits uses.
- *
- * \param g gui_window to scroll
- * \param x0 left point to ensure visible
- * \param y0 bottom point to ensure visible
- * \param x1 right point to ensure visible
- * \param y1 top point to ensure visible
- */
- void (*scroll_visible)(struct gui_window *g, int x0, int y0, int x1, int y1);
-
- /**
- * Starts drag scrolling of a browser window
- *
- * \param g the window to scroll
- */
- bool (*scroll_start)(struct gui_window *g);
-
- /**
- * Called when the gui_window has new content.
- *
- * \param g the gui_window that has new content
- */
- void (*new_content)(struct gui_window *g);
-
- /**
- * Called when file chooser gadget is activated
- */
- void (*file_gadget_open)(struct gui_window *g, struct hlcache_handle *hl, struct form_control *gadget);
-
- /** object dragged to window*/
- void (*drag_save_object)(struct gui_window *g, struct hlcache_handle *c, gui_save_type type);
-
- /** drag selection save */
- void (*drag_save_selection)(struct gui_window *g, const char *selection);
-
- /** selection started */
- void (*start_selection)(struct gui_window *g);
-};
-
-
-/**
- * function table for download windows.
- */
-struct gui_download_table {
- struct gui_download_window *(*create)(struct download_context *ctx, struct gui_window *parent);
-
- nserror (*data)(struct gui_download_window *dw, const char *data, unsigned int size);
-
- void (*error)(struct gui_download_window *dw, const char *error_msg);
-
- void (*done)(struct gui_download_window *dw);
-};
-
-
-/**
- * function table for clipboard operations.
- */
-struct gui_clipboard_table {
- /**
- * Core asks front end for clipboard contents.
- *
- * \param buffer UTF-8 text, allocated by front end, ownership yeilded to core
- * \param length Byte length of UTF-8 text in buffer
- */
- void (*get)(char **buffer, size_t *length);
-
- /**
- * Core tells front end to put given text in clipboard
- *
- * \param buffer UTF-8 text, owned by core
- * \param length Byte length of UTF-8 text in buffer
- * \param styles Array of styles given to text runs, owned by core, or NULL
- * \param n_styles Number of text run styles in array
- */
- void (*set)(const char *buffer, size_t length, nsclipboard_styles styles[], int n_styles);
-};
-
-
-/**
- * function table for fetcher operations
- */
-struct gui_fetch_table {
- /* Mandantory entries */
-
- /**
- * Determine the MIME type of a local file.
- *
- * @note used in file fetcher
- *
- * \param unix_path Unix style path to file on disk
- * \return Pointer to MIME type string (should not be freed) -
- * invalidated on next call to fetch_filetype.
- */
- const char *(*filetype)(const char *unix_path);
-
- /* Optional entries */
-
- /**
- * Callback to translate resource to full url.
- *
- * @note used in resource fetcher
- *
- * Transforms a resource: path into a full URL. The returned URL
- * is used as the target for a redirect. The caller takes ownership of
- * the returned nsurl including unrefing it when finished with it.
- *
- * \param path The path of the resource to locate.
- * \return A string containing the full URL of the target object or
- * NULL if no suitable resource can be found.
- */
- struct nsurl* (*get_resource_url)(const char *path);
-
- /**
- * Find a MIME type for a local file
- *
- * @note only used in curl fetcher on RISC OS otherwise its a
- * strdup of filetype.
- *
- * \param ro_path RISC OS style path to file on disk
- * \return MIME type string (on heap, caller should free), or NULL
- */
- char *(*mimetype)(const char *ro_path);
-
-};
-
-
-/**
- * User interface utf8 characterset conversion routines.
- */
-struct gui_utf8_table {
- /**
- * Convert a UTF-8 encoded string into the system local encoding
- *
- * \param string The string to convert
- * \param len The length (in bytes) of the string, or 0
- * \param result Pointer to location in which to store result
- * \return An nserror code
- */
- nserror (*utf8_to_local)(const char *string, size_t len, char **result);
-
- /**
- * Convert a string encoded in the system local encoding to UTF-8
- *
- * \param string The string to convert
- * \param len The length (in bytes) of the string, or 0
- * \param result Pointer to location in which to store result
- * \return An nserror code
- */
- nserror (*local_to_utf8)(const char *string, size_t len, char **result);
-};
-
-/**
- * function table for page text search.
- */
-struct gui_search_table {
- /**
- * Change the displayed search status.
- *
- * \param found search pattern matched in text
- * \param p gui private data pointer provided with search callbacks
- */
- void (*status)(bool found, void *p);
-
- /**
- * display hourglass while searching.
- *
- * \param active start/stop indicator
- * \param p gui private data pointer provided with search callbacks
- */
- void (*hourglass)(bool active, void *p);
-
- /**
- * add search string to recent searches list
- * front has full liberty how to implement the bare notification;
- * core gives no guarantee of the integrity of the string
- *
- * \param string search pattern
- * \param p gui private data pointer provided with search callbacks
- */
- void (*add_recent)(const char *string, void *p);
-
- /**
- * activate search forwards button in gui
- *
- * \param active activate/inactivate
- * \param p gui private data pointer provided with search callbacks
- */
- void (*forward_state)(bool active, void *p);
-
- /**
- * activate search back button in gui
- *
- * \param active activate/inactivate
- * \param p gui private data pointer provided with search callbacks
- */
- void (*back_state)(bool active, void *p);
-};
-
-/**
- * Graphical user interface browser misc function table.
- *
- * function table implementing GUI interface to miscelaneous browser
- * functionality
- */
-struct gui_browser_table {
- /* Mandantory entries */
-
- /**
- * Schedule a callback.
- *
- * \param t interval before the callback should be made in ms or
- * negative value to remove any existing callback.
- * \param callback callback function
- * \param p user parameter passed to callback function
- * \return NSERROR_OK on sucess or appropriate error on faliure
- *
- * The callback function will be called as soon as possible
- * after the timeout has elapsed.
- *
- * Additional calls with the same callback and user parameter will
- * reset the callback time to the newly specified value.
- *
- */
- nserror (*schedule)(int t, void (*callback)(void *p), void *p);
-
- /* Optional entries */
-
- /**
- * called to allow the gui to cleanup.
- */
- void (*quit)(void);
-
- /**
- * core has no fetcher for url
- */
- nserror (*launch_url)(struct nsurl *url);
-
- /**
- * create a form select menu
- *
- * \param g gui window containing form control
- * \param control form control of type GADGET_SELECT
- */
- void (*create_form_select_menu)(struct gui_window *g,
- struct form_control *control);
-
- /**
- * verify certificate
- */
- void (*cert_verify)(struct nsurl *url, const struct ssl_cert_info *certs, unsigned long num, nserror (*cb)(bool proceed, void *pw), void *cbpw);
-
- /**
- * Prompt user for login
- */
- void (*login)(struct nsurl *url, const char *realm,
- nserror (*cb)(bool proceed, void *pw), void *cbpw);
-
-};
-
-/**
- * NetSurf operation function table
- *
- * Function table implementing interface operations for the browser core.
- */
-struct netsurf_table {
-
- /**
- * Browser table.
- *
- * Provides miscellaneous browser functionality. The table
- * is mandantory and must be provided.
- */
- struct gui_browser_table *browser;
-
- /** Window table */
- struct gui_window_table *window;
-
- /** Download table */
- struct gui_download_table *download;
-
- /** Clipboard table */
- struct gui_clipboard_table *clipboard;
-
- /** Fetcher table */
- struct gui_fetch_table *fetch;
-
- /**
- * File table
- *
- * Provides file and filename operations to the core. The
- * table is optional and may be NULL in which case the default
- * posix compliant operations will be used.
- */
- struct gui_file_table *file;
-
- /**
- * UTF8 table.
- *
- * Provides for conversion between the gui local character
- * encoding and utf8. The table optional and may be NULL which
- * implies the local encoding is utf8.
- */
- struct gui_utf8_table *utf8;
-
- /**
- * Page search table.
- *
- * Provides routines for the interactive text search on a page.
- */
- struct gui_search_table *search;
-
- /**
- * Web search table.
- *
- * Used by the web search provider system. The table is
- * optional and may be NULL which uses the default empty
- * implementation.
- */
- struct gui_search_web_table *search_web;
-
- /**
- * Low level cache table.
- *
- * Used by the low level cache to push objects to persistant
- * storage. The table is optional and may be NULL which
- * uses the default implementation.
- */
- struct gui_llcache_table *llcache;
-};
-
-
-#endif
diff --git a/desktop/gui_clipboard.h b/desktop/gui_clipboard.h
new file mode 100644
index 000000000..8933e3099
--- /dev/null
+++ b/desktop/gui_clipboard.h
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2014 Vincent Sanders <vince@netsurf-browser.org>
+ *
+ * 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
+ *
+ * Interface to platform-specific clipboard operations.
+ */
+
+#ifndef _NETSURF_DESKTOP_GUI_CLIPBOARD_H_
+#define _NETSURF_DESKTOP_GUI_CLIPBOARD_H_
+
+#include <stddef.h>
+
+#include "utils/types.h"
+#include "utils/errors.h"
+#include "desktop/plot_style.h"
+
+typedef struct nsnsclipboard_styles {
+ size_t start; /**< Start of run */
+
+ plot_font_style_t style; /**< Style to give text run */
+} nsclipboard_styles;
+
+/**
+ * function table for clipboard operations.
+ */
+struct gui_clipboard_table {
+ /**
+ * Core asks front end for clipboard contents.
+ *
+ * \param buffer UTF-8 text, allocated by front end, ownership yeilded to core
+ * \param length Byte length of UTF-8 text in buffer
+ */
+ void (*get)(char **buffer, size_t *length);
+
+ /**
+ * Core tells front end to put given text in clipboard
+ *
+ * \param buffer UTF-8 text, owned by core
+ * \param length Byte length of UTF-8 text in buffer
+ * \param styles Array of styles given to text runs, owned by core, or NULL
+ * \param n_styles Number of text run styles in array
+ */
+ void (*set)(const char *buffer, size_t length, nsclipboard_styles styles[], int n_styles);
+};
+
+#endif
diff --git a/desktop/gui_download.h b/desktop/gui_download.h
new file mode 100644
index 000000000..55e115d52
--- /dev/null
+++ b/desktop/gui_download.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2014 Vincent Sanders <vince@netsurf-browser.org>
+ *
+ * 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
+ *
+ * Interface to platform-specific download operations.
+ */
+
+#ifndef _NETSURF_DESKTOP_GUI_DOWNLOAD_H_
+#define _NETSURF_DESKTOP_GUI_DOWNLOAD_H_
+
+struct gui_window;
+struct download_context;
+
+/**
+ * function table for download windows.
+ */
+struct gui_download_table {
+ struct gui_download_window *(*create)(struct download_context *ctx, struct gui_window *parent);
+
+ nserror (*data)(struct gui_download_window *dw, const char *data, unsigned int size);
+
+ void (*error)(struct gui_download_window *dw, const char *error_msg);
+
+ void (*done)(struct gui_download_window *dw);
+};
+
+#endif
diff --git a/desktop/gui_fetch.h b/desktop/gui_fetch.h
new file mode 100644
index 000000000..46d31e0f4
--- /dev/null
+++ b/desktop/gui_fetch.h
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2014 Vincent Sanders <vince@netsurf-browser.org>
+ *
+ * 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
+ *
+ * Interface to platform-specific fetcher operations.
+ */
+
+#ifndef _NETSURF_DESKTOP_GUI_FETCH_H_
+#define _NETSURF_DESKTOP_GUI_FETCH_H_
+
+struct nsurl;
+
+/**
+ * function table for fetcher operations.
+ */
+struct gui_fetch_table {
+ /* Mandantory entries */
+
+ /**
+ * Determine the MIME type of a local file.
+ *
+ * @note used in file fetcher
+ *
+ * \param unix_path Unix style path to file on disk
+ * \return Pointer to MIME type string (should not be freed) -
+ * invalidated on next call to fetch_filetype.
+ */
+ const char *(*filetype)(const char *unix_path);
+
+ /* Optional entries */
+
+ /**
+ * Callback to translate resource to full url.
+ *
+ * @note used in resource fetcher
+ *
+ * Transforms a resource: path into a full URL. The returned URL
+ * is used as the target for a redirect. The caller takes ownership of
+ * the returned nsurl including unrefing it when finished with it.
+ *
+ * \param path The path of the resource to locate.
+ * \return A string containing the full URL of the target object or
+ * NULL if no suitable resource can be found.
+ */
+ struct nsurl* (*get_resource_url)(const char *path);
+
+ /**
+ * Find a MIME type for a local file
+ *
+ * @note only used in curl fetcher on RISC OS otherwise its a
+ * strdup of filetype.
+ *
+ * \param ro_path RISC OS style path to file on disk
+ * \return MIME type string (on heap, caller should free), or NULL
+ */
+ char *(*mimetype)(const char *ro_path);
+
+};
+
+#endif
diff --git a/desktop/gui_factory.h b/desktop/gui_internal.h
index 3c8661577..c54caa4c6 100644
--- a/desktop/gui_factory.h
+++ b/desktop/gui_internal.h
@@ -1,5 +1,5 @@
/*
- * Copyright 2014 vincent Sanders <vince@netsurf-browser.org>
+ * Copyright 2014 Vincent Sanders <vince@netsurf-browser.org>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
@@ -16,24 +16,22 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/** \file
- * Interface to gui interface factory
+/**
+ * \file
+ *
+ * Interface to core interface table.
+ *
+ * \note must not be used by frontends directly.
*/
-#ifndef _NETSURF_DESKTOP_GUI_FACTORY_H_
-#define _NETSURF_DESKTOP_GUI_FACTORY_H_
-
-#include "desktop/gui.h"
+#ifndef _NETSURF_DESKTOP_GUI_INTERNAL_H_
+#define _NETSURF_DESKTOP_GUI_INTERNAL_H_
-/** The global operation table */
-extern struct netsurf_table *guit;
+#include "desktop/gui_table.h"
-/** register and verify global operation table
- *
- * @param gt The global table to register
- * @return NSERROR_OK on success or error code on faliure. On faliure
- * global table will not be initialised
+/**
+ * The global operation table.
*/
-nserror gui_factory_register(struct netsurf_table *gt);
+extern struct netsurf_table *guit;
#endif
diff --git a/desktop/gui_misc.h b/desktop/gui_misc.h
new file mode 100644
index 000000000..5c47668e3
--- /dev/null
+++ b/desktop/gui_misc.h
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2014 Vincent Sanders <vince@netsurf-browser.org>
+ *
+ * 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
+ *
+ * Interface to platform-specific miscellaneous browser operation table.
+ */
+
+#ifndef _NETSURF_DESKTOP_GUI_MISC_H_
+#define _NETSURF_DESKTOP_GUI_MISC_H_
+
+struct form_control;
+struct gui_window;
+struct ssl_cert_info;
+struct nsurl;
+
+/**
+ * Graphical user interface browser misc function table.
+ *
+ * function table implementing GUI interface to miscelaneous browser
+ * functionality
+ */
+struct gui_browser_table {
+ /* Mandantory entries */
+
+ /**
+ * Schedule a callback.
+ *
+ * \param t interval before the callback should be made in ms or
+ * negative value to remove any existing callback.
+ * \param callback callback function
+ * \param p user parameter passed to callback function
+ * \return NSERROR_OK on sucess or appropriate error on faliure
+ *
+ * The callback function will be called as soon as possible
+ * after the timeout has elapsed.
+ *
+ * Additional calls with the same callback and user parameter will
+ * reset the callback time to the newly specified value.
+ *
+ */
+ nserror (*schedule)(int t, void (*callback)(void *p), void *p);
+
+ /* Optional entries */
+
+ /**
+ * called to allow the gui to cleanup.
+ */
+ void (*quit)(void);
+
+ /**
+ * core has no fetcher for url
+ */
+ nserror (*launch_url)(struct nsurl *url);
+
+ /**
+ * create a form select menu
+ */
+ void (*create_form_select_menu)(struct gui_window *gw, struct form_control *control);
+
+ /**
+ * verify certificate
+ */
+ void (*cert_verify)(struct nsurl *url, const struct ssl_cert_info *certs, unsigned long num, nserror (*cb)(bool proceed, void *pw), void *cbpw);
+
+ /**
+ * Prompt user for login
+ */
+ void (*login)(struct nsurl *url, const char *realm,
+ nserror (*cb)(bool proceed, void *pw), void *cbpw);
+
+};
+
+#endif
diff --git a/desktop/gui_search.h b/desktop/gui_search.h
new file mode 100644
index 000000000..0b02ac8bb
--- /dev/null
+++ b/desktop/gui_search.h
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2014 Vincent Sanders <vince@netsurf-browser.org>
+ *
+ * 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
+ *
+ * Interface to platform-specific search operations.
+ */
+
+#ifndef _NETSURF_DESKTOP_GUI_SEARCH_H_
+#define _NETSURF_DESKTOP_GUI_SEARCH_H_
+
+/**
+ * function table for page text search.
+ */
+struct gui_search_table {
+ /**
+ * Change the displayed search status.
+ *
+ * \param found search pattern matched in text
+ * \param p gui private data pointer provided with search callbacks
+ */
+ void (*status)(bool found, void *p);
+
+ /**
+ * display hourglass while searching.
+ *
+ * \param active start/stop indicator
+ * \param p gui private data pointer provided with search callbacks
+ */
+ void (*hourglass)(bool active, void *p);
+
+ /**
+ * add search string to recent searches list
+ * front has full liberty how to implement the bare notification;
+ * core gives no guarantee of the integrity of the string
+ *
+ * \param string search pattern
+ * \param p gui private data pointer provided with search callbacks
+ */
+ void (*add_recent)(const char *string, void *p);
+
+ /**
+ * activate search forwards button in gui
+ *
+ * \param active activate/inactivate
+ * \param p gui private data pointer provided with search callbacks
+ */
+ void (*forward_state)(bool active, void *p);
+
+ /**
+ * activate search back button in gui
+ *
+ * \param active activate/inactivate
+ * \param p gui private data pointer provided with search callbacks
+ */
+ void (*back_state)(bool active, void *p);
+};
+
+#endif
diff --git a/desktop/gui_table.h b/desktop/gui_table.h
new file mode 100644
index 000000000..10f2bf17a
--- /dev/null
+++ b/desktop/gui_table.h
@@ -0,0 +1,124 @@
+/*
+ * Copyright 2014 Vincent Sanders <vince@netsurf-browser.org>
+ *
+ * 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
+ * top level interface table.
+ *
+ * \note This should probably not be included directly but rather
+ * through netsurf.h or gui_internal.h
+ */
+
+#ifndef _NETSURF_DESKTOP_GUI_TABLE_H_
+#define _NETSURF_DESKTOP_GUI_TABLE_H_
+
+struct gui_browser_table;
+struct gui_window_table;
+struct gui_download_table;
+struct gui_clipboard_table;
+struct gui_fetch_table;
+struct gui_file_table;
+struct gui_utf8_table;
+struct gui_search_table;
+struct gui_search_web_table;
+struct gui_llcache_table;
+
+/**
+ * NetSurf operation function table
+ *
+ * Function table implementing interface operations for the browser core.
+ */
+struct netsurf_table {
+
+ /**
+ * Browser table.
+ *
+ * Provides miscellaneous browser functionality. The table
+ * is mandantory and must be provided.
+ */
+ struct gui_browser_table *browser;
+
+ /**
+ * Window table.
+ *
+ * Provides all operations which affect a frontends display window.
+ */
+ struct gui_window_table *window;
+
+ /**
+ * Download table.
+ *
+ * operations table for the download windows.
+ */
+ struct gui_download_table *download;
+
+ /**
+ * Clipboard table.
+ */
+ struct gui_clipboard_table *clipboard;
+
+ /**
+ * Fetcher table
+ */
+ struct gui_fetch_table *fetch;
+
+ /**
+ * File table
+ *
+ * Provides file and filename operations to the core. The
+ * table is optional and may be NULL in which case the default
+ * posix compliant operations will be used.
+ */
+ struct gui_file_table *file;
+
+ /**
+ * UTF8 table.
+ *
+ * Provides for conversion between the gui local character
+ * encoding and utf8. The table optional and may be NULL which
+ * implies the local encoding is utf8.
+ */
+ struct gui_utf8_table *utf8;
+
+ /**
+ * Page search table.
+ *
+ * Provides routines for the interactive text search on a page.
+ */
+ struct gui_search_table *search;
+
+ /**
+ * Web search table.
+ *
+ * Used by the web search provider system. The table is
+ * optional and may be NULL which uses the default empty
+ * implementation.
+ */
+ struct gui_search_web_table *search_web;
+
+ /**
+ * Low level cache table.
+ *
+ * Used by the low level cache to push objects to persistant
+ * storage. The table is optional and may be NULL which
+ * uses the default implementation.
+ */
+ struct gui_llcache_table *llcache;
+};
+
+#endif
diff --git a/desktop/gui_utf8.h b/desktop/gui_utf8.h
new file mode 100644
index 000000000..c40c4c1b3
--- /dev/null
+++ b/desktop/gui_utf8.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2014 Vincent Sanders <vince@netsurf-browser.org>
+ *
+ * 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
+ *
+ * Interface to platform-specific utf8 operations.
+ */
+
+#ifndef _NETSURF_DESKTOP_GUI_UTF8_H_
+#define _NETSURF_DESKTOP_GUI_UTF8_H_
+
+/**
+ * User interface utf8 characterset conversion routines.
+ */
+struct gui_utf8_table {
+ /**
+ * Convert a UTF-8 encoded string into the system local encoding
+ *
+ * \param string The string to convert
+ * \param len The length (in bytes) of the string, or 0
+ * \param result Pointer to location in which to store result
+ * \return An nserror code
+ */
+ nserror (*utf8_to_local)(const char *string, size_t len, char **result);
+
+ /**
+ * Convert a string encoded in the system local encoding to UTF-8
+ *
+ * \param string The string to convert
+ * \param len The length (in bytes) of the string, or 0
+ * \param result Pointer to location in which to store result
+ * \return An nserror code
+ */
+ nserror (*local_to_utf8)(const char *string, size_t len, char **result);
+};
+
+#endif
diff --git a/desktop/gui_window.h b/desktop/gui_window.h
new file mode 100644
index 000000000..e38923dbb
--- /dev/null
+++ b/desktop/gui_window.h
@@ -0,0 +1,283 @@
+/*
+ * Copyright 2014 Vincent Sanders <vince@netsurf-browser.org>
+ *
+ * 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
+ *
+ * Interface to platform-specific graphical user interface window
+ * operations.
+ */
+
+#ifndef _NETSURF_DESKTOP_GUI_WINDOW_H_
+#define _NETSURF_DESKTOP_GUI_WINDOW_H_
+
+typedef enum gui_save_type {
+ GUI_SAVE_SOURCE,
+ GUI_SAVE_DRAW,
+ GUI_SAVE_PDF,
+ GUI_SAVE_TEXT,
+ GUI_SAVE_COMPLETE,
+ GUI_SAVE_OBJECT_ORIG,
+ GUI_SAVE_OBJECT_NATIVE,
+ GUI_SAVE_LINK_URI,
+ GUI_SAVE_LINK_URL,
+ GUI_SAVE_LINK_TEXT,
+ GUI_SAVE_HOTLIST_EXPORT_HTML,
+ GUI_SAVE_HISTORY_EXPORT_HTML,
+ GUI_SAVE_TEXT_SELECTION,
+ GUI_SAVE_CLIPBOARD_CONTENTS
+} gui_save_type;
+
+typedef enum {
+ GDRAGGING_NONE,
+ GDRAGGING_SCROLLBAR,
+ GDRAGGING_SELECTION,
+ 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 browser_window;
+struct form_control;
+struct rect;
+struct hlcache_handle;
+
+/**
+ * Graphical user interface window function table.
+ *
+ * function table implementing window operations
+ */
+struct gui_window_table {
+
+ /* Mandantory entries */
+
+ /**
+ * 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 flag is 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
+ *
+ * \param gw The gui window to destroy.
+ */
+ void (*destroy)(struct gui_window *gw);
+
+ /**
+ * Force a redraw of the entire contents of a window.
+ *
+ * @todo this API should be merged with update.
+ *
+ * \param g gui_window to redraw
+ */
+ void (*redraw)(struct gui_window *g);
+
+ /**
+ * Redraw an area of a window.
+ *
+ * \param g gui_window
+ * \param rect area to redraw
+ */
+ void (*update)(struct gui_window *g, const struct rect *rect);
+
+ /**
+ * Get the scroll position of a browser window.
+ *
+ * \param g gui_window
+ * \param sx receives x ordinate of point at top-left of window
+ * \param sy receives y ordinate of point at top-left of window
+ * \return true iff successful
+ */
+ bool (*get_scroll)(struct gui_window *g, int *sx, int *sy);
+
+ /**
+ * Set the scroll position of a browser window.
+ *
+ * \param g gui_window to scroll
+ * \param sx point to place at top-left of window
+ * \param sy point to place at top-left of window
+ */
+ void (*set_scroll)(struct gui_window *g, int sx, int sy);
+
+ /**
+ * Find the current dimensions of a browser window's content area.
+ *
+ * @todo The implementations of this are buggy and its only
+ * used from frames code.
+ *
+ * \param g gui_window to measure
+ * \param width receives width of window
+ * \param height receives height of window
+ * \param scaled whether to return scaled values
+ */
+ void (*get_dimensions)(struct gui_window *g, int *width, int *height, bool scaled);
+
+ /**
+ * Update the extent of the inside of a browser window to that of the
+ * current content.
+ *
+ * @todo this is used to update scroll bars does it need
+ * renaming? some frontends (windows) do not even implement it.
+ *
+ * \param g gui_window to update the extent of
+ */
+ void (*update_extent)(struct gui_window *g);
+
+ /**
+ * Reformat a window.
+ *
+ * This is used to perform reformats when the page contents
+ * require reformating. The reformat is requested using
+ * browser_window_schedule_reformat and occours via a scheduled
+ * callback hence from top level context.
+ *
+ * \param g gui_window to reformat.
+ */
+ void (*reformat)(struct gui_window *g);
+
+
+ /* Optional entries */
+
+ /**
+ * Set the title of a window.
+ *
+ * \param g window to update
+ * \param title new window title
+ */
+ void (*set_title)(struct gui_window *g, const char *title);
+
+ /**
+ * Set the navigation url.
+ *
+ * \param gw window to update.
+ * \param url The url to use as icon.
+ */
+ void (*set_url)(struct gui_window *gw, const char *url);
+
+ /**
+ * Set a favicon for a gui window.
+ *
+ * \param gw window to update.
+ * \param icon handle to object to use as icon.
+ */
+ void (*set_icon)(struct gui_window *gw, struct hlcache_handle *icon);
+
+ /**
+ * Set the status bar of a browser window.
+ *
+ * \param g gui_window to update
+ * \param text new status text
+ */
+ void (*set_status)(struct gui_window *g, const char *text);
+
+ /**
+ * Change mouse pointer shape
+ */
+ void (*set_pointer)(struct gui_window *g, gui_pointer_shape shape);
+
+ /**
+ * Place the caret in a browser window.
+ *
+ * \param g window with caret
+ * \param x coordinates of caret
+ * \param y coordinates of caret
+ * \param height height of caret
+ * \param clip clip rectangle, or NULL if none
+ */
+ void (*place_caret)(struct gui_window *g, int x, int y, int height, const struct rect *clip);
+
+ /**
+ * Remove the caret, if present.
+ *
+ * \param g window with caret
+ */
+ void (*remove_caret)(struct gui_window *g);
+
+ /** start the navigation throbber. */
+ void (*start_throbber)(struct gui_window *g);
+
+ /** stop the navigation throbber. */
+ void (*stop_throbber)(struct gui_window *g);
+
+ /** start a drag operation within a window */
+ bool (*drag_start)(struct gui_window *g, gui_drag_type type, const struct rect *rect);
+
+ /** save link operation */
+ void (*save_link)(struct gui_window *g, const char *url, const char *title);
+
+ /**
+ * Scrolls the specified area of a browser window into view.
+ *
+ * @todo investigate if this can be merged with set_scroll
+ * which is what the default implementation used by most
+ * toolkits uses.
+ *
+ * \param g gui_window to scroll
+ * \param x0 left point to ensure visible
+ * \param y0 bottom point to ensure visible
+ * \param x1 right point to ensure visible
+ * \param y1 top point to ensure visible
+ */
+ void (*scroll_visible)(struct gui_window *g, int x0, int y0, int x1, int y1);
+
+ /**
+ * Starts drag scrolling of a browser window
+ *
+ * \param g the window to scroll
+ */
+ bool (*scroll_start)(struct gui_window *g);
+
+ /**
+ * Called when the gui_window has new content.
+ *
+ * \param g the gui_window that has new content
+ */
+ void (*new_content)(struct gui_window *g);
+
+ /**
+ * Called when file chooser gadget is activated
+ */
+ void (*file_gadget_open)(struct gui_window *g, struct hlcache_handle *hl, struct form_control *gadget);
+
+ /** object dragged to window*/
+ void (*drag_save_object)(struct gui_window *g, struct hlcache_handle *c, gui_save_type type);
+
+ /** drag selection save */
+ void (*drag_save_selection)(struct gui_window *g, const char *selection);
+
+ /** selection started */
+ void (*start_selection)(struct gui_window *g);
+};
+
+#endif
diff --git a/desktop/netsurf.h b/desktop/netsurf.h
index 45a445747..3ce8f3bab 100644
--- a/desktop/netsurf.h
+++ b/desktop/netsurf.h
@@ -16,18 +16,24 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+/**
+ * \file
+ *
+ * NetSurf core interface registration, construction and destruction.
+ */
+
#ifndef _NETSURF_DESKTOP_NETSURF_H_
#define _NETSURF_DESKTOP_NETSURF_H_
#include "utils/errors.h"
-
-struct netsurf_table;
+#include "desktop/gui_table.h"
/**
* Register operation table.
*
* @param table NetSurf operations table.
- * @return NSERROR_OK on success or error code on faliure.
+ * @return NSERROR_OK on success or error code on faliure. On faliure
+ * global table will not be initialised.
*/
nserror netsurf_register(struct netsurf_table *table);