From ab7f3e31800ade0cec9c071e61cc001ee9470f69 Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Thu, 16 Oct 2014 09:41:50 +0100 Subject: 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 --- desktop/gui.h | 592 ------------------------------------------------ desktop/gui_clipboard.h | 63 ++++++ desktop/gui_download.h | 44 ++++ desktop/gui_factory.h | 39 ---- desktop/gui_fetch.h | 77 +++++++ desktop/gui_internal.h | 37 +++ desktop/gui_misc.h | 90 ++++++++ desktop/gui_search.h | 75 ++++++ desktop/gui_table.h | 124 ++++++++++ desktop/gui_utf8.h | 53 +++++ desktop/gui_window.h | 283 +++++++++++++++++++++++ desktop/netsurf.h | 12 +- 12 files changed, 855 insertions(+), 634 deletions(-) delete mode 100644 desktop/gui.h create mode 100644 desktop/gui_clipboard.h create mode 100644 desktop/gui_download.h delete mode 100644 desktop/gui_factory.h create mode 100644 desktop/gui_fetch.h create mode 100644 desktop/gui_internal.h create mode 100644 desktop/gui_misc.h create mode 100644 desktop/gui_search.h create mode 100644 desktop/gui_table.h create mode 100644 desktop/gui_utf8.h create mode 100644 desktop/gui_window.h 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 - * - * 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 . - */ - -/** \file - * Interface to platform-specific gui operation tables. - */ - -#ifndef _NETSURF_DESKTOP_GUI_H_ -#define _NETSURF_DESKTOP_GUI_H_ - -#include - -#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 + * + * 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 . + */ + +/** + * \file + * + * Interface to platform-specific clipboard operations. + */ + +#ifndef _NETSURF_DESKTOP_GUI_CLIPBOARD_H_ +#define _NETSURF_DESKTOP_GUI_CLIPBOARD_H_ + +#include + +#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 + * + * 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 . + */ + +/** + * \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_factory.h b/desktop/gui_factory.h deleted file mode 100644 index 3c8661577..000000000 --- a/desktop/gui_factory.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2014 vincent Sanders - * - * 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 . - */ - -/** \file - * Interface to gui interface factory - */ - -#ifndef _NETSURF_DESKTOP_GUI_FACTORY_H_ -#define _NETSURF_DESKTOP_GUI_FACTORY_H_ - -#include "desktop/gui.h" - -/** The global operation table */ -extern struct netsurf_table *guit; - -/** 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 - */ -nserror gui_factory_register(struct netsurf_table *gt); - -#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 + * + * 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 . + */ + +/** + * \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_internal.h b/desktop/gui_internal.h new file mode 100644 index 000000000..c54caa4c6 --- /dev/null +++ b/desktop/gui_internal.h @@ -0,0 +1,37 @@ +/* + * Copyright 2014 Vincent Sanders + * + * 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 . + */ + +/** + * \file + * + * Interface to core interface table. + * + * \note must not be used by frontends directly. + */ + +#ifndef _NETSURF_DESKTOP_GUI_INTERNAL_H_ +#define _NETSURF_DESKTOP_GUI_INTERNAL_H_ + +#include "desktop/gui_table.h" + +/** + * The global operation table. + */ +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 + * + * 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 . + */ + +/** + * \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 + * + * 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 . + */ + +/** + * \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 + * + * 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 . + */ + +/** + * \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 + * + * 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 . + */ + +/** + * \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 + * + * 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 . + */ + +/** + * \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 . */ +/** + * \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); -- cgit v1.2.3