summaryrefslogtreecommitdiff
path: root/gtk/resources.c
diff options
context:
space:
mode:
Diffstat (limited to 'gtk/resources.c')
-rw-r--r--gtk/resources.c600
1 files changed, 0 insertions, 600 deletions
diff --git a/gtk/resources.c b/gtk/resources.c
deleted file mode 100644
index dfe3d3dad..000000000
--- a/gtk/resources.c
+++ /dev/null
@@ -1,600 +0,0 @@
-/*
- * Copyright 2015 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
- * Implementation of gtk builtin resource handling.
- *
- * This presents a unified interface to the rest of the codebase to
- * obtain resources. Note this is not anything to do with the resource
- * scheme handling beyond possibly providing the underlying data.
- *
- */
-
-#include <stdlib.h>
-#include <string.h>
-#include <gtk/gtk.h>
-
-#include "utils/log.h"
-#include "utils/filepath.h"
-
-#include "gtk/compat.h"
-#include "gtk/resources.h"
-
-/** log contents of gresource /org/netsource */
-#ifdef WITH_GRESOURCE
-#define SHOW_GRESOURCE
-#undef SHOW_GRESOURCE
-#endif
-
-#ifdef WITH_BUILTIN_PIXBUF
-#ifdef __GNUC__
-extern const guint8 menu_cursor_pixdata[] __attribute__ ((__aligned__ (4)));
-extern const guint8 favicon_pixdata[] __attribute__ ((__aligned__ (4)));
-extern const guint8 netsurf_pixdata[] __attribute__ ((__aligned__ (4)));
-#else
-extern const guint8 menu_cursor_pixdata[];
-extern const guint8 favicon_pixdata[];
-extern const guint8 netsurf_pixdata[];
-#endif
-#endif
-
-/** type of resource entry */
-enum nsgtk_resource_type_e {
- NSGTK_RESOURCE_FILE, /**< entry is a file on disc */
- NSGTK_RESOURCE_GLIB, /**< entry is a gresource accessed by path */
- NSGTK_RESOURCE_DIRECT, /**< entry is a gresource accesed by gbytes */
- NSGTK_RESOURCE_INLINE, /**< entry is compiled in accessed by pointer */
-};
-
-/** resource entry */
-struct nsgtk_resource_s {
- const char *name;
- unsigned int len;
- enum nsgtk_resource_type_e type;
- char *path;
-};
-
-#define RES_ENTRY(name) { name, sizeof((name)) - 1, NSGTK_RESOURCE_FILE, NULL }
-
-/** resources that are used for gtk builder */
-static struct nsgtk_resource_s ui_resource[] = {
- RES_ENTRY("netsurf"),
- RES_ENTRY("tabcontents"),
- RES_ENTRY("password"),
- RES_ENTRY("login"),
- RES_ENTRY("ssl"),
- RES_ENTRY("toolbar"),
- RES_ENTRY("downloads"),
- RES_ENTRY("history"),
- RES_ENTRY("options"),
- RES_ENTRY("hotlist"),
- RES_ENTRY("cookies"),
- RES_ENTRY("viewdata"),
- RES_ENTRY("warning"),
- { NULL, 0, NSGTK_RESOURCE_FILE, NULL },
-};
-
-/** resources that are used as pixbufs */
-static struct nsgtk_resource_s pixbuf_resource[] = {
- RES_ENTRY("favicon.png"),
- RES_ENTRY("netsurf.xpm"),
- RES_ENTRY("menu_cursor.png"),
- RES_ENTRY("arrow_down_8x32.png"),
- RES_ENTRY("throbber/throbber0.png"),
- RES_ENTRY("throbber/throbber1.png"),
- RES_ENTRY("throbber/throbber2.png"),
- RES_ENTRY("throbber/throbber3.png"),
- RES_ENTRY("throbber/throbber4.png"),
- RES_ENTRY("throbber/throbber5.png"),
- RES_ENTRY("throbber/throbber6.png"),
- RES_ENTRY("throbber/throbber7.png"),
- RES_ENTRY("throbber/throbber8.png"),
- { NULL, 0, NSGTK_RESOURCE_FILE, NULL },
-};
-
-/** resources that are used for direct data access */
-static struct nsgtk_resource_s direct_resource[] = {
- RES_ENTRY("welcome.html"),
- RES_ENTRY("credits.html"),
- RES_ENTRY("licence.html"),
- RES_ENTRY("maps.html"),
- RES_ENTRY("default.css"),
- RES_ENTRY("adblock.css"),
- RES_ENTRY("internal.css"),
- RES_ENTRY("quirks.css"),
- RES_ENTRY("netsurf.png"),
- RES_ENTRY("default.ico"),
- RES_ENTRY("icons/arrow-l.png"),
- RES_ENTRY("icons/content.png"),
- RES_ENTRY("icons/directory2.png"),
- RES_ENTRY("icons/directory.png"),
- RES_ENTRY("icons/hotlist-add.png"),
- RES_ENTRY("icons/hotlist-rmv.png"),
- RES_ENTRY("icons/search.png"),
- RES_ENTRY("languages"),
- RES_ENTRY("Messages"),
- { NULL, 0, NSGTK_RESOURCE_FILE, NULL },
-};
-
-
-/* exported interface documented in gtk/resources.h */
-GdkCursor *nsgtk_create_menu_cursor(void)
-{
- GdkCursor *cursor = NULL;
- GdkPixbuf *pixbuf;
- nserror res;
-
- res = nsgdk_pixbuf_new_from_resname("menu_cursor.png", &pixbuf);
- if (res == NSERROR_OK) {
- cursor = gdk_cursor_new_from_pixbuf(gdk_display_get_default(),
- pixbuf, 0, 3);
- g_object_unref(pixbuf);
- }
-
- return cursor;
-}
-
-
-/**
- * locate a resource
- *
- * The way GTK accesses resource files has changed greatly between
- * releases. This initilises the interface that hides all the
- * implementation details from the rest of the code.
- *
- * If the GResource is not enabled or the item cannot be found in the
- * compiled in resources the files will be loaded directly from disc
- * instead.
- *
- * \param respath A string vector containing the valid resource search paths
- * \param resource A resource entry to initialise
- */
-static nserror
-init_resource(char **respath, struct nsgtk_resource_s *resource)
-{
- char *resname;
-#ifdef WITH_GRESOURCE
- int resnamelen;
- gboolean present;
- const gchar * const *langv;
- int langc = 0;
-
- langv = g_get_language_names();
-
- while (langv[langc] != NULL) {
- resnamelen = snprintf(NULL, 0,
- "/org/netsurf/%s/%s",
- langv[langc], resource->name);
-
- resname = malloc(resnamelen + 1);
- if (resname == NULL) {
- return NSERROR_NOMEM;
- }
- snprintf(resname, resnamelen + 1,
- "/org/netsurf/%s/%s",
- langv[langc], resource->name);
-
- present = g_resources_get_info(resname,
- G_RESOURCE_LOOKUP_FLAGS_NONE,
- NULL, NULL, NULL);
- if (present == TRUE) {
- /* found an entry in the resources */
- resource->path = resname;
- resource->type = NSGTK_RESOURCE_GLIB;
- LOG("Found gresource path %s", resource->path);
- return NSERROR_OK;
- }
- /*LOG("gresource \"%s\" not found", resname);*/
- free(resname);
-
- langc++;
- }
- resnamelen = snprintf(NULL, 0, "/org/netsurf/%s", resource->name);
-
- resname = malloc(resnamelen + 1);
- if (resname == NULL) {
- return NSERROR_NOMEM;
- }
- snprintf(resname, resnamelen + 1, "/org/netsurf/%s", resource->name);
-
- present = g_resources_get_info(resname,
- G_RESOURCE_LOOKUP_FLAGS_NONE,
- NULL, NULL, NULL);
- if (present == TRUE) {
- /* found an entry in the resources */
- resource->path = resname;
- resource->type = NSGTK_RESOURCE_GLIB;
- LOG("Found gresource path %s", resource->path);
- return NSERROR_OK;
- }
- /*LOG("gresource \"%s\" not found", resname);*/
- free(resname);
-
-#endif
-
- resname = filepath_find(respath, resource->name);
- if (resname == NULL) {
- LOG("Unable to find resource %s on resource path",
- resource->name);
- return NSERROR_NOT_FOUND;
- }
-
- /* found an entry on the path */
- resource->path = resname;
- resource->type = NSGTK_RESOURCE_FILE;
-
- LOG("Found file resource path %s", resource->path);
- return NSERROR_OK;
-}
-
-/**
- * locate and setup a direct resource
- *
- * Direct resources have general type of NSGTK_RESOURCE_GLIB but have
- * g_resources_lookup_data() applied and the result stored so the data
- * can be directly accessed without additional processing.
- *
- * \param respath A string vector containing the valid resource search paths
- * \param resource A resource entry to initialise
- */
-static nserror
-init_direct_resource(char **respath, struct nsgtk_resource_s *resource)
-{
- nserror res;
-
- res = init_resource(respath, resource);
-
-#ifdef WITH_GRESOURCE
- if ((res == NSERROR_OK) &&
- (resource->type == NSGTK_RESOURCE_GLIB)) {
- /* found gresource we can convert */
- GBytes *data;
-
- data = g_resources_lookup_data(resource->path,
- G_RESOURCE_LOOKUP_FLAGS_NONE,
- NULL);
- if (data != NULL) {
- resource->type = NSGTK_RESOURCE_DIRECT;
- resource->path = (char *)data;
- }
- }
-#endif
-
- return res;
-}
-
-/**
- * locate a pixbuf resource
- *
- * Pixbuf resources can be compiled inline
- *
- * \param respath A string vector containing the valid resource search paths
- * \param resource A resource entry to initialise
- */
-static nserror
-init_pixbuf_resource(char **respath, struct nsgtk_resource_s *resource)
-{
-#ifdef WITH_BUILTIN_PIXBUF
- if (strncmp(resource->name, "menu_cursor.png", resource->len) == 0) {
- resource->path = (char *)&menu_cursor_pixdata[0];
- resource->type = NSGTK_RESOURCE_INLINE;
- LOG("Found builtin for %s", resource->name);
- return NSERROR_OK;
- }
-
- if (strncmp(resource->name, "netsurf.xpm", resource->len) == 0) {
- resource->path = (char *)&netsurf_pixdata[0];
- resource->type = NSGTK_RESOURCE_INLINE;
- LOG("Found builtin for %s", resource->name);
- return NSERROR_OK;
- }
-
- if (strncmp(resource->name, "favicon.png", resource->len) == 0) {
- resource->path = (char *)&favicon_pixdata[0];
- resource->type = NSGTK_RESOURCE_INLINE;
- LOG("Found builtin for %s", resource->name);
- return NSERROR_OK;
- }
-#endif
- return init_resource(respath, resource);
-}
-
-/**
- * locate a ui resource
- *
- * UI resources need their resource name changing to account for gtk versions
- *
- * \param respath A string vector containing the valid resource search paths
- * \param ui_res A resource entry to initialise
- */
-static nserror init_ui_resource(char **respath, struct nsgtk_resource_s *ui_res)
-{
-#if GTK_CHECK_VERSION(3,0,0)
- int gtkv = 3;
-#else
- int gtkv = 2;
-#endif
- int resnamelen;
- char *resname;
- struct nsgtk_resource_s resource;
- nserror res;
-
- resnamelen = ui_res->len + 10; /* allow for the expanded ui name */
-
- resname = malloc(resnamelen);
- if (resname == NULL) {
- return NSERROR_NOMEM;
- }
- snprintf(resname, resnamelen, "%s.gtk%d.ui", ui_res->name, gtkv);
- resource.name = resname;
- resource.len = ui_res->len;
- resource.path = NULL;
-
- res = init_resource(respath, &resource);
-
- ui_res->path = resource.path;
- ui_res->type = resource.type;
-
- free(resname);
-
- return res;
-}
-
-/**
- * Find a resource entry by name.
- *
- * \param resname The resource name to match.
- * \param resource The list of resources entries to search.
- */
-static struct nsgtk_resource_s *
-find_resource_from_name(const char *resname, struct nsgtk_resource_s *resource)
-{
- /* find resource from name */
- while ((resource->name != NULL) &&
- ((resname[0] != resource->name[0]) ||
- (strncmp(resource->name, resname, resource->len) != 0))) {
- resource++;
- }
- return resource;
-}
-
-#ifdef SHOW_GRESOURCE
-/**
- * Debug dump of all resources compile din via GResource.
- */
-static void list_gresource(void)
-{
- const char *nspath = "/org/netsurf";
- char **reslist;
- char **cur;
- GError* gerror = NULL;
- reslist = g_resources_enumerate_children(nspath,
- G_RESOURCE_LOOKUP_FLAGS_NONE,
- &gerror);
- if (gerror) {
- LOG("gerror %s", gerror->message);
- g_error_free(gerror);
-
- } else {
- cur = reslist;
- while (cur != NULL && *cur != NULL) {
- LOG("gres %s", *cur);
- cur++;
- }
- g_strfreev(reslist);
- }
-}
-#endif
-
-/**
- * Initialise UI resource table
- *
- */
-/* exported interface documented in gtk/resources.h */
-nserror nsgtk_init_resources(char **respath)
-{
- struct nsgtk_resource_s *resource;
- nserror res;
-
-#ifdef SHOW_GRESOURCE
- list_gresource();
-#endif
-
- /* iterate the ui resource table and initialise all its members */
- resource = &ui_resource[0];
- while (resource->name != NULL) {
- res = init_ui_resource(respath, resource);
- if (res != NSERROR_OK) {
- return res;
- }
- resource++;
- }
-
- /* iterate the pixbuf resource table and initialise all its members */
- resource = &pixbuf_resource[0];
- while (resource->name != NULL) {
- res = init_pixbuf_resource(respath, resource);
- if (res != NSERROR_OK) {
- return res;
- }
- resource++;
- }
-
- /* iterate the direct resource table and initialise all its members */
- resource = &direct_resource[0];
- while (resource->name != NULL) {
- res = init_direct_resource(respath, resource);
- if (res != NSERROR_OK) {
- return res;
- }
- resource++;
- }
-
- return NSERROR_OK;
-}
-
-
-/* exported interface documented in gtk/resources.h */
-nserror
-nsgdk_pixbuf_new_from_resname(const char *resname, GdkPixbuf **pixbuf_out)
-{
- struct nsgtk_resource_s *resource;
- GdkPixbuf *new_pixbuf = NULL;
- GError* error = NULL;
-
- resource = find_resource_from_name(resname, &pixbuf_resource[0]);
- if (resource->name == NULL) {
- return NSERROR_NOT_FOUND;
- }
-
- switch (resource->type) {
- case NSGTK_RESOURCE_FILE:
- new_pixbuf = gdk_pixbuf_new_from_file(resource->path, &error);
- break;
-
- case NSGTK_RESOURCE_GLIB:
-#ifdef WITH_GRESOURCE
- new_pixbuf = gdk_pixbuf_new_from_resource(resource->path, &error);
-#endif
- break;
-
- case NSGTK_RESOURCE_INLINE:
-#ifdef WITH_BUILTIN_PIXBUF
- new_pixbuf = gdk_pixbuf_new_from_inline(-1, (const guint8 *)resource->path, FALSE, &error);
-#endif
- break;
-
- case NSGTK_RESOURCE_DIRECT:
- /* pixbuf resources are not currently direct */
- break;
- }
-
- if (new_pixbuf == NULL) {
- if (error != NULL) {
- LOG("Unable to create pixbuf from file for %s with path %s \"%s\"",
- resource->name, resource->path, error->message);
- g_error_free(error);
- } else {
- LOG("Unable to create pixbuf from file for %s with path %s",
- resource->name, resource->path);
- }
- return NSERROR_INIT_FAILED;
- }
- *pixbuf_out = new_pixbuf;
-
- return NSERROR_OK;
-}
-
-/* exported interface documented in gtk/resources.h */
-nserror
-nsgtk_builder_new_from_resname(const char *resname, GtkBuilder **builder_out)
-{
- GtkBuilder *new_builder;
- struct nsgtk_resource_s *ui_res;
- GError* error = NULL;
-
- ui_res = find_resource_from_name(resname, &ui_resource[0]);
- if (ui_res->name == NULL) {
- return NSERROR_NOT_FOUND;
- }
-
- new_builder = gtk_builder_new();
-
- if (ui_res->type == NSGTK_RESOURCE_FILE) {
- if (!gtk_builder_add_from_file(new_builder,
- ui_res->path,
- &error)) {
- LOG("Unable to add UI builder from file for %s with path %s \"%s\"",
- ui_res->name, ui_res->path, error->message);
- g_error_free(error);
- g_object_unref(G_OBJECT(new_builder));
- return NSERROR_INIT_FAILED;
- }
- } else {
- if (!nsgtk_builder_add_from_resource(new_builder,
- ui_res->path,
- &error)) {
- LOG("Unable to add UI builder from resource for %s with path %s \"%s\"",
- ui_res->name, ui_res->path, error->message);
- g_error_free(error);
- g_object_unref(G_OBJECT(new_builder));
- return NSERROR_INIT_FAILED;
- }
- }
-
- *builder_out = new_builder;
-
- return NSERROR_OK;
-}
-
-/* exported interface documented in gtk/resources.h */
-nserror
-nsgtk_data_from_resname(const char *resname,
- const uint8_t ** data_out,
- size_t *data_size_out)
-{
-#ifdef WITH_GRESOURCE
- struct nsgtk_resource_s *resource;
- GBytes *data;
- const gchar *buffer;
- gsize buffer_length;
-
- resource = find_resource_from_name(resname, &direct_resource[0]);
- if ((resource->name == NULL) ||
- (resource->type != NSGTK_RESOURCE_DIRECT)) {
- return NSERROR_NOT_FOUND;
- }
-
- data = (GBytes *)resource->path;
-
- buffer_length = 0;
- buffer = g_bytes_get_data(data, &buffer_length);
-
- if (buffer == NULL) {
- return NSERROR_NOMEM;
- }
-
- *data_out = (const uint8_t *)buffer;
- *data_size_out = (size_t)buffer_length;
-
- return NSERROR_OK;
-#else
- /** \todo consider adding compiled inline resources for things
- * other than pixbufs.
- */
- return NSERROR_NOT_FOUND;
-#endif
-}
-
-/* exported interface documented in gtk/resources.h */
-nserror
-nsgtk_path_from_resname(const char *resname, const char **path_out)
-{
- struct nsgtk_resource_s *resource;
-
- resource = find_resource_from_name(resname, &direct_resource[0]);
- if ((resource->name == NULL) ||
- (resource->type != NSGTK_RESOURCE_FILE)) {
- return NSERROR_NOT_FOUND;
- }
-
- *path_out = (const char *)resource->path;
-
- return NSERROR_OK;
-}