| File: | frontends/gtk/resources.c |
| Warning: | line 367, column 15 Assigned value is garbage or undefined |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
| 1 | /* | |||
| 2 | * Copyright 2015 Vincent Sanders <vince@netsurf-browser.org> | |||
| 3 | * | |||
| 4 | * This file is part of NetSurf, http://www.netsurf-browser.org/ | |||
| 5 | * | |||
| 6 | * NetSurf is free software; you can redistribute it and/or modify | |||
| 7 | * it under the terms of the GNU General Public License as published by | |||
| 8 | * the Free Software Foundation; version 2 of the License. | |||
| 9 | * | |||
| 10 | * NetSurf is distributed in the hope that it will be useful, | |||
| 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
| 13 | * GNU General Public License for more details. | |||
| 14 | * | |||
| 15 | * You should have received a copy of the GNU General Public License | |||
| 16 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
| 17 | */ | |||
| 18 | ||||
| 19 | /** | |||
| 20 | * \file | |||
| 21 | * Implementation of gtk builtin resource handling. | |||
| 22 | * | |||
| 23 | * This presents a unified interface to the rest of the codebase to | |||
| 24 | * obtain resources. Note this is not anything to do with the resource | |||
| 25 | * scheme handling beyond possibly providing the underlying data. | |||
| 26 | * | |||
| 27 | */ | |||
| 28 | ||||
| 29 | #include <stdlib.h> | |||
| 30 | #include <string.h> | |||
| 31 | #include <gtk1/gtk1.h> | |||
| 32 | ||||
| 33 | #include "utils/log.h" | |||
| 34 | #include "utils/filepath.h" | |||
| 35 | ||||
| 36 | #include "gtk/compat.h" | |||
| 37 | #include "gtk/resources.h" | |||
| 38 | ||||
| 39 | /** log contents of gresource /org/netsource */ | |||
| 40 | #ifdef WITH_GRESOURCE1 | |||
| 41 | #define SHOW_GRESOURCE | |||
| 42 | #undef SHOW_GRESOURCE | |||
| 43 | #endif | |||
| 44 | ||||
| 45 | #ifdef WITH_BUILTIN_PIXBUF | |||
| 46 | #ifdef __GNUC__4 | |||
| 47 | extern const guint8 menu_cursor_pixdata[] __attribute__ ((__aligned__ (4))); | |||
| 48 | extern const guint8 favicon_pixdata[] __attribute__ ((__aligned__ (4))); | |||
| 49 | extern const guint8 netsurf_pixdata[] __attribute__ ((__aligned__ (4))); | |||
| 50 | #else | |||
| 51 | extern const guint8 menu_cursor_pixdata[]; | |||
| 52 | extern const guint8 favicon_pixdata[]; | |||
| 53 | extern const guint8 netsurf_pixdata[]; | |||
| 54 | #endif | |||
| 55 | #endif | |||
| 56 | ||||
| 57 | /** type of resource entry */ | |||
| 58 | enum nsgtk_resource_type_e { | |||
| 59 | NSGTK_RESOURCE_FILE, /**< entry is a file on disc */ | |||
| 60 | NSGTK_RESOURCE_GLIB, /**< entry is a gresource accessed by path */ | |||
| 61 | NSGTK_RESOURCE_DIRECT, /**< entry is a gresource accesed by gbytes */ | |||
| 62 | NSGTK_RESOURCE_INLINE, /**< entry is compiled in accessed by pointer */ | |||
| 63 | }; | |||
| 64 | ||||
| 65 | /** resource entry */ | |||
| 66 | struct nsgtk_resource_s { | |||
| 67 | const char *name; | |||
| 68 | unsigned int len; | |||
| 69 | enum nsgtk_resource_type_e type; | |||
| 70 | char *path; | |||
| 71 | }; | |||
| 72 | ||||
| 73 | #define RES_ENTRY(name){ name, sizeof((name)) - 1, NSGTK_RESOURCE_FILE, ((void*)0) } { name, sizeof((name)) - 1, NSGTK_RESOURCE_FILE, NULL((void*)0) } | |||
| 74 | ||||
| 75 | /** resources that are used for gtk builder */ | |||
| 76 | static struct nsgtk_resource_s ui_resource[] = { | |||
| 77 | RES_ENTRY("netsurf"){ "netsurf", sizeof(("netsurf")) - 1, NSGTK_RESOURCE_FILE, (( void*)0) }, | |||
| 78 | RES_ENTRY("tabcontents"){ "tabcontents", sizeof(("tabcontents")) - 1, NSGTK_RESOURCE_FILE , ((void*)0) }, | |||
| 79 | RES_ENTRY("password"){ "password", sizeof(("password")) - 1, NSGTK_RESOURCE_FILE, ( (void*)0) }, | |||
| 80 | RES_ENTRY("toolbar"){ "toolbar", sizeof(("toolbar")) - 1, NSGTK_RESOURCE_FILE, (( void*)0) }, | |||
| 81 | RES_ENTRY("downloads"){ "downloads", sizeof(("downloads")) - 1, NSGTK_RESOURCE_FILE , ((void*)0) }, | |||
| 82 | RES_ENTRY("globalhistory"){ "globalhistory", sizeof(("globalhistory")) - 1, NSGTK_RESOURCE_FILE , ((void*)0) }, | |||
| 83 | RES_ENTRY("localhistory"){ "localhistory", sizeof(("localhistory")) - 1, NSGTK_RESOURCE_FILE , ((void*)0) }, | |||
| 84 | RES_ENTRY("options"){ "options", sizeof(("options")) - 1, NSGTK_RESOURCE_FILE, (( void*)0) }, | |||
| 85 | RES_ENTRY("hotlist"){ "hotlist", sizeof(("hotlist")) - 1, NSGTK_RESOURCE_FILE, (( void*)0) }, | |||
| 86 | RES_ENTRY("cookies"){ "cookies", sizeof(("cookies")) - 1, NSGTK_RESOURCE_FILE, (( void*)0) }, | |||
| 87 | RES_ENTRY("viewdata"){ "viewdata", sizeof(("viewdata")) - 1, NSGTK_RESOURCE_FILE, ( (void*)0) }, | |||
| 88 | RES_ENTRY("warning"){ "warning", sizeof(("warning")) - 1, NSGTK_RESOURCE_FILE, (( void*)0) }, | |||
| 89 | RES_ENTRY("pageinfo"){ "pageinfo", sizeof(("pageinfo")) - 1, NSGTK_RESOURCE_FILE, ( (void*)0) }, | |||
| 90 | { NULL((void*)0), 0, NSGTK_RESOURCE_FILE, NULL((void*)0) }, | |||
| 91 | }; | |||
| 92 | ||||
| 93 | /** resources that are used as pixbufs */ | |||
| 94 | static struct nsgtk_resource_s pixbuf_resource[] = { | |||
| 95 | RES_ENTRY("favicon.png"){ "favicon.png", sizeof(("favicon.png")) - 1, NSGTK_RESOURCE_FILE , ((void*)0) }, | |||
| 96 | RES_ENTRY("netsurf.xpm"){ "netsurf.xpm", sizeof(("netsurf.xpm")) - 1, NSGTK_RESOURCE_FILE , ((void*)0) }, | |||
| 97 | RES_ENTRY("menu_cursor.png"){ "menu_cursor.png", sizeof(("menu_cursor.png")) - 1, NSGTK_RESOURCE_FILE , ((void*)0) }, | |||
| 98 | RES_ENTRY("icons/local-history.png"){ "icons/local-history.png", sizeof(("icons/local-history.png" )) - 1, NSGTK_RESOURCE_FILE, ((void*)0) }, | |||
| 99 | RES_ENTRY("icons/show-cookie.png"){ "icons/show-cookie.png", sizeof(("icons/show-cookie.png")) - 1, NSGTK_RESOURCE_FILE, ((void*)0) }, | |||
| 100 | RES_ENTRY("icons/24x24/actions/page-info-insecure.png"){ "icons/24x24/actions/page-info-insecure.png", sizeof(("icons/24x24/actions/page-info-insecure.png" )) - 1, NSGTK_RESOURCE_FILE, ((void*)0) }, | |||
| 101 | RES_ENTRY("icons/24x24/actions/page-info-internal.png"){ "icons/24x24/actions/page-info-internal.png", sizeof(("icons/24x24/actions/page-info-internal.png" )) - 1, NSGTK_RESOURCE_FILE, ((void*)0) }, | |||
| 102 | RES_ENTRY("icons/24x24/actions/page-info-local.png"){ "icons/24x24/actions/page-info-local.png", sizeof(("icons/24x24/actions/page-info-local.png" )) - 1, NSGTK_RESOURCE_FILE, ((void*)0) }, | |||
| 103 | RES_ENTRY("icons/24x24/actions/page-info-secure.png"){ "icons/24x24/actions/page-info-secure.png", sizeof(("icons/24x24/actions/page-info-secure.png" )) - 1, NSGTK_RESOURCE_FILE, ((void*)0) }, | |||
| 104 | RES_ENTRY("icons/24x24/actions/page-info-warning.png"){ "icons/24x24/actions/page-info-warning.png", sizeof(("icons/24x24/actions/page-info-warning.png" )) - 1, NSGTK_RESOURCE_FILE, ((void*)0) }, | |||
| 105 | RES_ENTRY("icons/48x48/actions/page-info-insecure.png"){ "icons/48x48/actions/page-info-insecure.png", sizeof(("icons/48x48/actions/page-info-insecure.png" )) - 1, NSGTK_RESOURCE_FILE, ((void*)0) }, | |||
| 106 | RES_ENTRY("icons/48x48/actions/page-info-internal.png"){ "icons/48x48/actions/page-info-internal.png", sizeof(("icons/48x48/actions/page-info-internal.png" )) - 1, NSGTK_RESOURCE_FILE, ((void*)0) }, | |||
| 107 | RES_ENTRY("icons/48x48/actions/page-info-local.png"){ "icons/48x48/actions/page-info-local.png", sizeof(("icons/48x48/actions/page-info-local.png" )) - 1, NSGTK_RESOURCE_FILE, ((void*)0) }, | |||
| 108 | RES_ENTRY("icons/48x48/actions/page-info-secure.png"){ "icons/48x48/actions/page-info-secure.png", sizeof(("icons/48x48/actions/page-info-secure.png" )) - 1, NSGTK_RESOURCE_FILE, ((void*)0) }, | |||
| 109 | RES_ENTRY("icons/48x48/actions/page-info-warning.png"){ "icons/48x48/actions/page-info-warning.png", sizeof(("icons/48x48/actions/page-info-warning.png" )) - 1, NSGTK_RESOURCE_FILE, ((void*)0) }, | |||
| 110 | RES_ENTRY("throbber/throbber0.png"){ "throbber/throbber0.png", sizeof(("throbber/throbber0.png") ) - 1, NSGTK_RESOURCE_FILE, ((void*)0) }, | |||
| 111 | RES_ENTRY("throbber/throbber1.png"){ "throbber/throbber1.png", sizeof(("throbber/throbber1.png") ) - 1, NSGTK_RESOURCE_FILE, ((void*)0) }, | |||
| 112 | RES_ENTRY("throbber/throbber2.png"){ "throbber/throbber2.png", sizeof(("throbber/throbber2.png") ) - 1, NSGTK_RESOURCE_FILE, ((void*)0) }, | |||
| 113 | RES_ENTRY("throbber/throbber3.png"){ "throbber/throbber3.png", sizeof(("throbber/throbber3.png") ) - 1, NSGTK_RESOURCE_FILE, ((void*)0) }, | |||
| 114 | RES_ENTRY("throbber/throbber4.png"){ "throbber/throbber4.png", sizeof(("throbber/throbber4.png") ) - 1, NSGTK_RESOURCE_FILE, ((void*)0) }, | |||
| 115 | RES_ENTRY("throbber/throbber5.png"){ "throbber/throbber5.png", sizeof(("throbber/throbber5.png") ) - 1, NSGTK_RESOURCE_FILE, ((void*)0) }, | |||
| 116 | RES_ENTRY("throbber/throbber6.png"){ "throbber/throbber6.png", sizeof(("throbber/throbber6.png") ) - 1, NSGTK_RESOURCE_FILE, ((void*)0) }, | |||
| 117 | RES_ENTRY("throbber/throbber7.png"){ "throbber/throbber7.png", sizeof(("throbber/throbber7.png") ) - 1, NSGTK_RESOURCE_FILE, ((void*)0) }, | |||
| 118 | RES_ENTRY("throbber/throbber8.png"){ "throbber/throbber8.png", sizeof(("throbber/throbber8.png") ) - 1, NSGTK_RESOURCE_FILE, ((void*)0) }, | |||
| 119 | { NULL((void*)0), 0, NSGTK_RESOURCE_FILE, NULL((void*)0) }, | |||
| 120 | }; | |||
| 121 | ||||
| 122 | /** resources that are used for direct data access */ | |||
| 123 | static struct nsgtk_resource_s direct_resource[] = { | |||
| 124 | RES_ENTRY("welcome.html"){ "welcome.html", sizeof(("welcome.html")) - 1, NSGTK_RESOURCE_FILE , ((void*)0) }, | |||
| 125 | RES_ENTRY("credits.html"){ "credits.html", sizeof(("credits.html")) - 1, NSGTK_RESOURCE_FILE , ((void*)0) }, | |||
| 126 | RES_ENTRY("licence.html"){ "licence.html", sizeof(("licence.html")) - 1, NSGTK_RESOURCE_FILE , ((void*)0) }, | |||
| 127 | RES_ENTRY("default.css"){ "default.css", sizeof(("default.css")) - 1, NSGTK_RESOURCE_FILE , ((void*)0) }, | |||
| 128 | RES_ENTRY("adblock.css"){ "adblock.css", sizeof(("adblock.css")) - 1, NSGTK_RESOURCE_FILE , ((void*)0) }, | |||
| 129 | RES_ENTRY("internal.css"){ "internal.css", sizeof(("internal.css")) - 1, NSGTK_RESOURCE_FILE , ((void*)0) }, | |||
| 130 | RES_ENTRY("quirks.css"){ "quirks.css", sizeof(("quirks.css")) - 1, NSGTK_RESOURCE_FILE , ((void*)0) }, | |||
| 131 | RES_ENTRY("netsurf.png"){ "netsurf.png", sizeof(("netsurf.png")) - 1, NSGTK_RESOURCE_FILE , ((void*)0) }, | |||
| 132 | RES_ENTRY("default.ico"){ "default.ico", sizeof(("default.ico")) - 1, NSGTK_RESOURCE_FILE , ((void*)0) }, | |||
| 133 | RES_ENTRY("icons/arrow-l.png"){ "icons/arrow-l.png", sizeof(("icons/arrow-l.png")) - 1, NSGTK_RESOURCE_FILE , ((void*)0) }, | |||
| 134 | RES_ENTRY("icons/content.png"){ "icons/content.png", sizeof(("icons/content.png")) - 1, NSGTK_RESOURCE_FILE , ((void*)0) }, | |||
| 135 | RES_ENTRY("icons/directory2.png"){ "icons/directory2.png", sizeof(("icons/directory2.png")) - 1 , NSGTK_RESOURCE_FILE, ((void*)0) }, | |||
| 136 | RES_ENTRY("icons/directory.png"){ "icons/directory.png", sizeof(("icons/directory.png")) - 1, NSGTK_RESOURCE_FILE, ((void*)0) }, | |||
| 137 | RES_ENTRY("icons/hotlist-add.png"){ "icons/hotlist-add.png", sizeof(("icons/hotlist-add.png")) - 1, NSGTK_RESOURCE_FILE, ((void*)0) }, | |||
| 138 | RES_ENTRY("icons/hotlist-rmv.png"){ "icons/hotlist-rmv.png", sizeof(("icons/hotlist-rmv.png")) - 1, NSGTK_RESOURCE_FILE, ((void*)0) }, | |||
| 139 | RES_ENTRY("icons/search.png"){ "icons/search.png", sizeof(("icons/search.png")) - 1, NSGTK_RESOURCE_FILE , ((void*)0) }, | |||
| 140 | RES_ENTRY("languages"){ "languages", sizeof(("languages")) - 1, NSGTK_RESOURCE_FILE , ((void*)0) }, | |||
| 141 | RES_ENTRY("accelerators"){ "accelerators", sizeof(("accelerators")) - 1, NSGTK_RESOURCE_FILE , ((void*)0) }, | |||
| 142 | RES_ENTRY("Messages"){ "Messages", sizeof(("Messages")) - 1, NSGTK_RESOURCE_FILE, ( (void*)0) }, | |||
| 143 | { NULL((void*)0), 0, NSGTK_RESOURCE_FILE, NULL((void*)0) }, | |||
| 144 | }; | |||
| 145 | ||||
| 146 | ||||
| 147 | /* exported interface documented in gtk/resources.h */ | |||
| 148 | GdkCursor *nsgtk_create_menu_cursor(void) | |||
| 149 | { | |||
| 150 | GdkCursor *cursor = NULL((void*)0); | |||
| 151 | GdkPixbuf *pixbuf; | |||
| 152 | nserror res; | |||
| 153 | ||||
| 154 | res = nsgdk_pixbuf_new_from_resname("menu_cursor.png", &pixbuf); | |||
| 155 | if (res == NSERROR_OK) { | |||
| 156 | cursor = gdk_cursor_new_from_pixbuf(gdk_display_get_default(), | |||
| 157 | pixbuf, 0, 3); | |||
| 158 | g_object_unref(pixbuf); | |||
| 159 | } | |||
| 160 | ||||
| 161 | return cursor; | |||
| 162 | } | |||
| 163 | ||||
| 164 | ||||
| 165 | /** | |||
| 166 | * locate a resource | |||
| 167 | * | |||
| 168 | * The way GTK accesses resource files has changed greatly between | |||
| 169 | * releases. This initilises the interface that hides all the | |||
| 170 | * implementation details from the rest of the code. | |||
| 171 | * | |||
| 172 | * If the GResource is not enabled or the item cannot be found in the | |||
| 173 | * compiled in resources the files will be loaded directly from disc | |||
| 174 | * instead. | |||
| 175 | * | |||
| 176 | * \param respath A string vector containing the valid resource search paths | |||
| 177 | * \param resource A resource entry to initialise | |||
| 178 | */ | |||
| 179 | static nserror | |||
| 180 | init_resource(char **respath, struct nsgtk_resource_s *resource) | |||
| 181 | { | |||
| 182 | char *resname; | |||
| 183 | #ifdef WITH_GRESOURCE1 | |||
| 184 | int resnamelen; | |||
| 185 | gboolean present; | |||
| 186 | const gchar * const *langv; | |||
| 187 | int langc = 0; | |||
| 188 | ||||
| 189 | langv = g_get_language_names(); | |||
| 190 | ||||
| 191 | /* look for resource under per language paths */ | |||
| 192 | while (langv[langc] != NULL((void*)0)) { | |||
| 193 | /* allocate and fill a full resource name path buffer */ | |||
| 194 | resnamelen = snprintf(NULL((void*)0), 0, | |||
| 195 | "/org/netsurf/%s/%s", | |||
| 196 | langv[langc], resource->name); | |||
| 197 | resname = malloc(resnamelen + 1); | |||
| 198 | if (resname == NULL((void*)0)) { | |||
| 199 | return NSERROR_NOMEM; | |||
| 200 | } | |||
| 201 | snprintf(resname, resnamelen + 1, | |||
| 202 | "/org/netsurf/%s/%s", | |||
| 203 | langv[langc], resource->name); | |||
| 204 | ||||
| 205 | /* check if resource is present */ | |||
| 206 | present = g_resources_get_info(resname, | |||
| 207 | G_RESOURCE_LOOKUP_FLAGS_NONE, | |||
| 208 | NULL((void*)0), NULL((void*)0), NULL((void*)0)); | |||
| 209 | if (present == TRUE(!(0))) { | |||
| 210 | /* found an entry in the resources */ | |||
| 211 | resource->path = resname; | |||
| 212 | resource->type = NSGTK_RESOURCE_GLIB; | |||
| 213 | NSLOG(netsurf, INFO, "Found gresource path %s",do { if (NSLOG_LEVEL_INFO >= NSLOG_LEVEL_VERBOSE) { static nslog_entry_context_t _nslog_ctx = { &__nslog_category_netsurf , NSLOG_LEVEL_INFO, "frontends/gtk/resources.c", sizeof("frontends/gtk/resources.c" ) - 1, __PRETTY_FUNCTION__, sizeof(__PRETTY_FUNCTION__) - 1, 214 , }; nslog__log(&_nslog_ctx, "Found gresource path %s", resource ->path); } } while(0) | |||
| 214 | resource->path)do { if (NSLOG_LEVEL_INFO >= NSLOG_LEVEL_VERBOSE) { static nslog_entry_context_t _nslog_ctx = { &__nslog_category_netsurf , NSLOG_LEVEL_INFO, "frontends/gtk/resources.c", sizeof("frontends/gtk/resources.c" ) - 1, __PRETTY_FUNCTION__, sizeof(__PRETTY_FUNCTION__) - 1, 214 , }; nslog__log(&_nslog_ctx, "Found gresource path %s", resource ->path); } } while(0); | |||
| 215 | return NSERROR_OK; | |||
| 216 | } | |||
| 217 | NSLOG(netsurf, DEEPDEBUG,do { if (NSLOG_LEVEL_DEEPDEBUG >= NSLOG_LEVEL_VERBOSE) { static nslog_entry_context_t _nslog_ctx = { &__nslog_category_netsurf , NSLOG_LEVEL_DEEPDEBUG, "frontends/gtk/resources.c", sizeof( "frontends/gtk/resources.c") - 1, __PRETTY_FUNCTION__, sizeof (__PRETTY_FUNCTION__) - 1, 218, }; nslog__log(&_nslog_ctx , "gresource \"%s\" not found", resname); } } while(0) | |||
| 218 | "gresource \"%s\" not found", resname)do { if (NSLOG_LEVEL_DEEPDEBUG >= NSLOG_LEVEL_VERBOSE) { static nslog_entry_context_t _nslog_ctx = { &__nslog_category_netsurf , NSLOG_LEVEL_DEEPDEBUG, "frontends/gtk/resources.c", sizeof( "frontends/gtk/resources.c") - 1, __PRETTY_FUNCTION__, sizeof (__PRETTY_FUNCTION__) - 1, 218, }; nslog__log(&_nslog_ctx , "gresource \"%s\" not found", resname); } } while(0); | |||
| 219 | free(resname); | |||
| 220 | ||||
| 221 | langc++; | |||
| 222 | } | |||
| 223 | ||||
| 224 | /* allocate and fill a full resource name path buffer with no language*/ | |||
| 225 | resnamelen = snprintf(NULL((void*)0), 0, "/org/netsurf/%s", resource->name); | |||
| 226 | resname = malloc(resnamelen + 1); | |||
| 227 | if (resname == NULL((void*)0)) { | |||
| 228 | return NSERROR_NOMEM; | |||
| 229 | } | |||
| 230 | snprintf(resname, resnamelen + 1, "/org/netsurf/%s", resource->name); | |||
| 231 | ||||
| 232 | present = g_resources_get_info(resname, | |||
| 233 | G_RESOURCE_LOOKUP_FLAGS_NONE, | |||
| 234 | NULL((void*)0), NULL((void*)0), NULL((void*)0)); | |||
| 235 | if (present == TRUE(!(0))) { | |||
| 236 | /* found an entry in the resources */ | |||
| 237 | resource->path = resname; | |||
| 238 | resource->type = NSGTK_RESOURCE_GLIB; | |||
| 239 | NSLOG(netsurf, INFO, "Found gresource path %s",do { if (NSLOG_LEVEL_INFO >= NSLOG_LEVEL_VERBOSE) { static nslog_entry_context_t _nslog_ctx = { &__nslog_category_netsurf , NSLOG_LEVEL_INFO, "frontends/gtk/resources.c", sizeof("frontends/gtk/resources.c" ) - 1, __PRETTY_FUNCTION__, sizeof(__PRETTY_FUNCTION__) - 1, 240 , }; nslog__log(&_nslog_ctx, "Found gresource path %s", resource ->path); } } while(0) | |||
| 240 | resource->path)do { if (NSLOG_LEVEL_INFO >= NSLOG_LEVEL_VERBOSE) { static nslog_entry_context_t _nslog_ctx = { &__nslog_category_netsurf , NSLOG_LEVEL_INFO, "frontends/gtk/resources.c", sizeof("frontends/gtk/resources.c" ) - 1, __PRETTY_FUNCTION__, sizeof(__PRETTY_FUNCTION__) - 1, 240 , }; nslog__log(&_nslog_ctx, "Found gresource path %s", resource ->path); } } while(0); | |||
| 241 | return NSERROR_OK; | |||
| 242 | } | |||
| 243 | NSLOG(netsurf, DEEPDEBUG, "gresource \"%s\" not found", resname)do { if (NSLOG_LEVEL_DEEPDEBUG >= NSLOG_LEVEL_VERBOSE) { static nslog_entry_context_t _nslog_ctx = { &__nslog_category_netsurf , NSLOG_LEVEL_DEEPDEBUG, "frontends/gtk/resources.c", sizeof( "frontends/gtk/resources.c") - 1, __PRETTY_FUNCTION__, sizeof (__PRETTY_FUNCTION__) - 1, 243, }; nslog__log(&_nslog_ctx , "gresource \"%s\" not found", resname); } } while(0); | |||
| 244 | free(resname); | |||
| 245 | ||||
| 246 | #endif | |||
| 247 | ||||
| 248 | /* look for file on disc */ | |||
| 249 | resname = filepath_find(respath, resource->name); | |||
| 250 | if (resname != NULL((void*)0)) { | |||
| 251 | /* found an entry on the path */ | |||
| 252 | resource->path = resname; | |||
| 253 | resource->type = NSGTK_RESOURCE_FILE; | |||
| 254 | ||||
| 255 | NSLOG(netsurf, INFO,do { if (NSLOG_LEVEL_INFO >= NSLOG_LEVEL_VERBOSE) { static nslog_entry_context_t _nslog_ctx = { &__nslog_category_netsurf , NSLOG_LEVEL_INFO, "frontends/gtk/resources.c", sizeof("frontends/gtk/resources.c" ) - 1, __PRETTY_FUNCTION__, sizeof(__PRETTY_FUNCTION__) - 1, 256 , }; nslog__log(&_nslog_ctx, "Found file resource path %s" , resource->path); } } while(0) | |||
| 256 | "Found file resource path %s", resource->path)do { if (NSLOG_LEVEL_INFO >= NSLOG_LEVEL_VERBOSE) { static nslog_entry_context_t _nslog_ctx = { &__nslog_category_netsurf , NSLOG_LEVEL_INFO, "frontends/gtk/resources.c", sizeof("frontends/gtk/resources.c" ) - 1, __PRETTY_FUNCTION__, sizeof(__PRETTY_FUNCTION__) - 1, 256 , }; nslog__log(&_nslog_ctx, "Found file resource path %s" , resource->path); } } while(0); | |||
| 257 | return NSERROR_OK; | |||
| 258 | } | |||
| 259 | ||||
| 260 | NSLOG(netsurf, INFO, "Unable to find resource %s on resource path",do { if (NSLOG_LEVEL_INFO >= NSLOG_LEVEL_VERBOSE) { static nslog_entry_context_t _nslog_ctx = { &__nslog_category_netsurf , NSLOG_LEVEL_INFO, "frontends/gtk/resources.c", sizeof("frontends/gtk/resources.c" ) - 1, __PRETTY_FUNCTION__, sizeof(__PRETTY_FUNCTION__) - 1, 261 , }; nslog__log(&_nslog_ctx, "Unable to find resource %s on resource path" , resource->name); } } while(0) | |||
| 261 | resource->name)do { if (NSLOG_LEVEL_INFO >= NSLOG_LEVEL_VERBOSE) { static nslog_entry_context_t _nslog_ctx = { &__nslog_category_netsurf , NSLOG_LEVEL_INFO, "frontends/gtk/resources.c", sizeof("frontends/gtk/resources.c" ) - 1, __PRETTY_FUNCTION__, sizeof(__PRETTY_FUNCTION__) - 1, 261 , }; nslog__log(&_nslog_ctx, "Unable to find resource %s on resource path" , resource->name); } } while(0); | |||
| 262 | ||||
| 263 | return NSERROR_NOT_FOUND; | |||
| 264 | } | |||
| 265 | ||||
| 266 | /** | |||
| 267 | * locate and setup a direct resource | |||
| 268 | * | |||
| 269 | * Direct resources have general type of NSGTK_RESOURCE_GLIB but have | |||
| 270 | * g_resources_lookup_data() applied and the result stored so the data | |||
| 271 | * can be directly accessed without additional processing. | |||
| 272 | * | |||
| 273 | * \param respath A string vector containing the valid resource search paths | |||
| 274 | * \param resource A resource entry to initialise | |||
| 275 | */ | |||
| 276 | static nserror | |||
| 277 | init_direct_resource(char **respath, struct nsgtk_resource_s *resource) | |||
| 278 | { | |||
| 279 | nserror res; | |||
| 280 | ||||
| 281 | res = init_resource(respath, resource); | |||
| 282 | ||||
| 283 | #ifdef WITH_GRESOURCE1 | |||
| 284 | if ((res == NSERROR_OK) && | |||
| 285 | (resource->type == NSGTK_RESOURCE_GLIB)) { | |||
| 286 | /* found gresource we can convert */ | |||
| 287 | GBytes *data; | |||
| 288 | ||||
| 289 | data = g_resources_lookup_data(resource->path, | |||
| 290 | G_RESOURCE_LOOKUP_FLAGS_NONE, | |||
| 291 | NULL((void*)0)); | |||
| 292 | if (data != NULL((void*)0)) { | |||
| 293 | resource->type = NSGTK_RESOURCE_DIRECT; | |||
| 294 | resource->path = (char *)data; | |||
| 295 | } | |||
| 296 | } | |||
| 297 | #endif | |||
| 298 | ||||
| 299 | return res; | |||
| 300 | } | |||
| 301 | ||||
| 302 | /** | |||
| 303 | * locate a pixbuf resource | |||
| 304 | * | |||
| 305 | * Pixbuf resources can be compiled inline | |||
| 306 | * | |||
| 307 | * \param respath A string vector containing the valid resource search paths | |||
| 308 | * \param resource A resource entry to initialise | |||
| 309 | */ | |||
| 310 | static nserror | |||
| 311 | init_pixbuf_resource(char **respath, struct nsgtk_resource_s *resource) | |||
| 312 | { | |||
| 313 | #ifdef WITH_BUILTIN_PIXBUF | |||
| 314 | if (strncmp(resource->name, "menu_cursor.png", resource->len) == 0) { | |||
| 315 | resource->path = (char *)&menu_cursor_pixdata[0]; | |||
| 316 | resource->type = NSGTK_RESOURCE_INLINE; | |||
| 317 | NSLOG(netsurf, INFO, "Found builtin for %s", resource->name)do { if (NSLOG_LEVEL_INFO >= NSLOG_LEVEL_VERBOSE) { static nslog_entry_context_t _nslog_ctx = { &__nslog_category_netsurf , NSLOG_LEVEL_INFO, "frontends/gtk/resources.c", sizeof("frontends/gtk/resources.c" ) - 1, __PRETTY_FUNCTION__, sizeof(__PRETTY_FUNCTION__) - 1, 317 , }; nslog__log(&_nslog_ctx, "Found builtin for %s", resource ->name); } } while(0); | |||
| 318 | return NSERROR_OK; | |||
| 319 | } | |||
| 320 | ||||
| 321 | if (strncmp(resource->name, "netsurf.xpm", resource->len) == 0) { | |||
| 322 | resource->path = (char *)&netsurf_pixdata[0]; | |||
| 323 | resource->type = NSGTK_RESOURCE_INLINE; | |||
| 324 | NSLOG(netsurf, INFO, "Found builtin for %s", resource->name)do { if (NSLOG_LEVEL_INFO >= NSLOG_LEVEL_VERBOSE) { static nslog_entry_context_t _nslog_ctx = { &__nslog_category_netsurf , NSLOG_LEVEL_INFO, "frontends/gtk/resources.c", sizeof("frontends/gtk/resources.c" ) - 1, __PRETTY_FUNCTION__, sizeof(__PRETTY_FUNCTION__) - 1, 324 , }; nslog__log(&_nslog_ctx, "Found builtin for %s", resource ->name); } } while(0); | |||
| 325 | return NSERROR_OK; | |||
| 326 | } | |||
| 327 | ||||
| 328 | if (strncmp(resource->name, "favicon.png", resource->len) == 0) { | |||
| 329 | resource->path = (char *)&favicon_pixdata[0]; | |||
| 330 | resource->type = NSGTK_RESOURCE_INLINE; | |||
| 331 | NSLOG(netsurf, INFO, "Found builtin for %s", resource->name)do { if (NSLOG_LEVEL_INFO >= NSLOG_LEVEL_VERBOSE) { static nslog_entry_context_t _nslog_ctx = { &__nslog_category_netsurf , NSLOG_LEVEL_INFO, "frontends/gtk/resources.c", sizeof("frontends/gtk/resources.c" ) - 1, __PRETTY_FUNCTION__, sizeof(__PRETTY_FUNCTION__) - 1, 331 , }; nslog__log(&_nslog_ctx, "Found builtin for %s", resource ->name); } } while(0); | |||
| 332 | return NSERROR_OK; | |||
| 333 | } | |||
| 334 | #endif | |||
| 335 | return init_resource(respath, resource); | |||
| 336 | } | |||
| 337 | ||||
| 338 | /** | |||
| 339 | * locate a ui resource | |||
| 340 | * | |||
| 341 | * UI resources need their resource name changing to account for gtk versions | |||
| 342 | * | |||
| 343 | * \param respath A string vector containing the valid resource search paths | |||
| 344 | * \param ui_res A resource entry to initialise | |||
| 345 | */ | |||
| 346 | static nserror init_ui_resource(char **respath, struct nsgtk_resource_s *ui_res) | |||
| 347 | { | |||
| 348 | int resnamelen; | |||
| 349 | char *resname; | |||
| 350 | struct nsgtk_resource_s resource; | |||
| 351 | nserror res; | |||
| 352 | ||||
| 353 | resnamelen = ui_res->len + 10; /* allow for the expanded ui name */ | |||
| 354 | ||||
| 355 | resname = malloc(resnamelen); | |||
| 356 | if (resname == NULL((void*)0)) { | |||
| 357 | return NSERROR_NOMEM; | |||
| 358 | } | |||
| 359 | snprintf(resname, resnamelen, "%s.ui", ui_res->name); | |||
| 360 | resource.name = resname; | |||
| 361 | resource.len = ui_res->len; | |||
| 362 | resource.path = NULL((void*)0); | |||
| 363 | ||||
| 364 | res = init_resource(respath, &resource); | |||
| 365 | ||||
| 366 | ui_res->path = resource.path; | |||
| 367 | ui_res->type = resource.type; | |||
| ||||
| 368 | ||||
| 369 | free(resname); | |||
| 370 | ||||
| 371 | return res; | |||
| 372 | } | |||
| 373 | ||||
| 374 | /** | |||
| 375 | * Find a resource entry by name. | |||
| 376 | * | |||
| 377 | * \param resname The resource name to match. | |||
| 378 | * \param resource The list of resources entries to search. | |||
| 379 | */ | |||
| 380 | static struct nsgtk_resource_s * | |||
| 381 | find_resource_from_name(const char *resname, struct nsgtk_resource_s *resource) | |||
| 382 | { | |||
| 383 | /* find resource from name */ | |||
| 384 | while ((resource->name != NULL((void*)0)) && | |||
| 385 | ((resname[0] != resource->name[0]) || | |||
| 386 | (strncmp(resource->name, resname, resource->len) != 0))) { | |||
| 387 | resource++; | |||
| 388 | } | |||
| 389 | return resource; | |||
| 390 | } | |||
| 391 | ||||
| 392 | #ifdef SHOW_GRESOURCE | |||
| 393 | /** | |||
| 394 | * Debug dump of all resources compiled in via GResource. | |||
| 395 | */ | |||
| 396 | static void list_gresource(void) | |||
| 397 | { | |||
| 398 | const char *nspath = "/org/netsurf"; | |||
| 399 | char **reslist; | |||
| 400 | char **cur; | |||
| 401 | GError* gerror = NULL((void*)0); | |||
| 402 | reslist = g_resources_enumerate_children(nspath, | |||
| 403 | G_RESOURCE_LOOKUP_FLAGS_NONE, | |||
| 404 | &gerror); | |||
| 405 | if (gerror) { | |||
| 406 | NSLOG(netsurf, INFO, "gerror %s", gerror->message)do { if (NSLOG_LEVEL_INFO >= NSLOG_LEVEL_VERBOSE) { static nslog_entry_context_t _nslog_ctx = { &__nslog_category_netsurf , NSLOG_LEVEL_INFO, "frontends/gtk/resources.c", sizeof("frontends/gtk/resources.c" ) - 1, __PRETTY_FUNCTION__, sizeof(__PRETTY_FUNCTION__) - 1, 406 , }; nslog__log(&_nslog_ctx, "gerror %s", gerror->message ); } } while(0); | |||
| 407 | g_error_free(gerror); | |||
| 408 | ||||
| 409 | } else { | |||
| 410 | cur = reslist; | |||
| 411 | while (cur != NULL((void*)0) && *cur != NULL((void*)0)) { | |||
| 412 | NSLOG(netsurf, INFO, "gres %s", *cur)do { if (NSLOG_LEVEL_INFO >= NSLOG_LEVEL_VERBOSE) { static nslog_entry_context_t _nslog_ctx = { &__nslog_category_netsurf , NSLOG_LEVEL_INFO, "frontends/gtk/resources.c", sizeof("frontends/gtk/resources.c" ) - 1, __PRETTY_FUNCTION__, sizeof(__PRETTY_FUNCTION__) - 1, 412 , }; nslog__log(&_nslog_ctx, "gres %s", *cur); } } while( 0); | |||
| 413 | cur++; | |||
| 414 | } | |||
| 415 | g_strfreev(reslist); | |||
| 416 | } | |||
| 417 | } | |||
| 418 | #endif | |||
| 419 | ||||
| 420 | /** | |||
| 421 | * Initialise UI resource table | |||
| 422 | * | |||
| 423 | */ | |||
| 424 | /* exported interface documented in gtk/resources.h */ | |||
| 425 | nserror nsgtk_init_resources(char **respath) | |||
| ||||
| 426 | { | |||
| 427 | struct nsgtk_resource_s *resource; | |||
| 428 | nserror res; | |||
| 429 | ||||
| 430 | #ifdef SHOW_GRESOURCE | |||
| 431 | list_gresource(); | |||
| 432 | #endif | |||
| 433 | ||||
| 434 | /* iterate the ui resource table and initialise all its members */ | |||
| 435 | resource = &ui_resource[0]; | |||
| 436 | while (resource->name != NULL((void*)0)) { | |||
| 437 | res = init_ui_resource(respath, resource); | |||
| 438 | if (res != NSERROR_OK) { | |||
| 439 | return res; | |||
| 440 | } | |||
| 441 | resource++; | |||
| 442 | } | |||
| 443 | ||||
| 444 | /* iterate the pixbuf resource table and initialise all its members */ | |||
| 445 | resource = &pixbuf_resource[0]; | |||
| 446 | while (resource->name != NULL((void*)0)) { | |||
| 447 | res = init_pixbuf_resource(respath, resource); | |||
| 448 | if (res != NSERROR_OK) { | |||
| 449 | return res; | |||
| 450 | } | |||
| 451 | resource++; | |||
| 452 | } | |||
| 453 | ||||
| 454 | /* iterate the direct resource table and initialise all its members */ | |||
| 455 | resource = &direct_resource[0]; | |||
| 456 | while (resource->name != NULL((void*)0)) { | |||
| 457 | res = init_direct_resource(respath, resource); | |||
| 458 | if (res != NSERROR_OK) { | |||
| 459 | return res; | |||
| 460 | } | |||
| 461 | resource++; | |||
| 462 | } | |||
| 463 | ||||
| 464 | return NSERROR_OK; | |||
| 465 | } | |||
| 466 | ||||
| 467 | ||||
| 468 | /* exported interface documented in gtk/resources.h */ | |||
| 469 | nserror | |||
| 470 | nsgdk_pixbuf_new_from_resname(const char *resname, GdkPixbuf **pixbuf_out) | |||
| 471 | { | |||
| 472 | struct nsgtk_resource_s *resource; | |||
| 473 | GdkPixbuf *new_pixbuf = NULL((void*)0); | |||
| 474 | GError* error = NULL((void*)0); | |||
| 475 | ||||
| 476 | resource = find_resource_from_name(resname, &pixbuf_resource[0]); | |||
| 477 | if (resource->name == NULL((void*)0)) { | |||
| 478 | return NSERROR_NOT_FOUND; | |||
| 479 | } | |||
| 480 | ||||
| 481 | switch (resource->type) { | |||
| 482 | case NSGTK_RESOURCE_FILE: | |||
| 483 | new_pixbuf = gdk_pixbuf_new_from_file(resource->path, &error); | |||
| 484 | break; | |||
| 485 | ||||
| 486 | case NSGTK_RESOURCE_GLIB: | |||
| 487 | #ifdef WITH_GRESOURCE1 | |||
| 488 | new_pixbuf = gdk_pixbuf_new_from_resource(resource->path, &error); | |||
| 489 | #endif | |||
| 490 | break; | |||
| 491 | ||||
| 492 | case NSGTK_RESOURCE_INLINE: | |||
| 493 | #ifdef WITH_BUILTIN_PIXBUF | |||
| 494 | new_pixbuf = gdk_pixbuf_new_from_inline(-1, (const guint8 *)resource->path, FALSE(0), &error); | |||
| 495 | #endif | |||
| 496 | break; | |||
| 497 | ||||
| 498 | case NSGTK_RESOURCE_DIRECT: | |||
| 499 | /* pixbuf resources are not currently direct */ | |||
| 500 | break; | |||
| 501 | } | |||
| 502 | ||||
| 503 | if (new_pixbuf == NULL((void*)0)) { | |||
| 504 | if (error != NULL((void*)0)) { | |||
| 505 | NSLOG(netsurf, INFO,do { if (NSLOG_LEVEL_INFO >= NSLOG_LEVEL_VERBOSE) { static nslog_entry_context_t _nslog_ctx = { &__nslog_category_netsurf , NSLOG_LEVEL_INFO, "frontends/gtk/resources.c", sizeof("frontends/gtk/resources.c" ) - 1, __PRETTY_FUNCTION__, sizeof(__PRETTY_FUNCTION__) - 1, 509 , }; nslog__log(&_nslog_ctx, "Unable to create pixbuf from file for %s with path %s \"%s\"" , resource->name, resource->path, error->message); } } while(0) | |||
| 506 | "Unable to create pixbuf from file for %s with path %s \"%s\"",do { if (NSLOG_LEVEL_INFO >= NSLOG_LEVEL_VERBOSE) { static nslog_entry_context_t _nslog_ctx = { &__nslog_category_netsurf , NSLOG_LEVEL_INFO, "frontends/gtk/resources.c", sizeof("frontends/gtk/resources.c" ) - 1, __PRETTY_FUNCTION__, sizeof(__PRETTY_FUNCTION__) - 1, 509 , }; nslog__log(&_nslog_ctx, "Unable to create pixbuf from file for %s with path %s \"%s\"" , resource->name, resource->path, error->message); } } while(0) | |||
| 507 | resource->name,do { if (NSLOG_LEVEL_INFO >= NSLOG_LEVEL_VERBOSE) { static nslog_entry_context_t _nslog_ctx = { &__nslog_category_netsurf , NSLOG_LEVEL_INFO, "frontends/gtk/resources.c", sizeof("frontends/gtk/resources.c" ) - 1, __PRETTY_FUNCTION__, sizeof(__PRETTY_FUNCTION__) - 1, 509 , }; nslog__log(&_nslog_ctx, "Unable to create pixbuf from file for %s with path %s \"%s\"" , resource->name, resource->path, error->message); } } while(0) | |||
| 508 | resource->path,do { if (NSLOG_LEVEL_INFO >= NSLOG_LEVEL_VERBOSE) { static nslog_entry_context_t _nslog_ctx = { &__nslog_category_netsurf , NSLOG_LEVEL_INFO, "frontends/gtk/resources.c", sizeof("frontends/gtk/resources.c" ) - 1, __PRETTY_FUNCTION__, sizeof(__PRETTY_FUNCTION__) - 1, 509 , }; nslog__log(&_nslog_ctx, "Unable to create pixbuf from file for %s with path %s \"%s\"" , resource->name, resource->path, error->message); } } while(0) | |||
| 509 | error->message)do { if (NSLOG_LEVEL_INFO >= NSLOG_LEVEL_VERBOSE) { static nslog_entry_context_t _nslog_ctx = { &__nslog_category_netsurf , NSLOG_LEVEL_INFO, "frontends/gtk/resources.c", sizeof("frontends/gtk/resources.c" ) - 1, __PRETTY_FUNCTION__, sizeof(__PRETTY_FUNCTION__) - 1, 509 , }; nslog__log(&_nslog_ctx, "Unable to create pixbuf from file for %s with path %s \"%s\"" , resource->name, resource->path, error->message); } } while(0); | |||
| 510 | g_error_free(error); | |||
| 511 | } else { | |||
| 512 | NSLOG(netsurf, INFO,do { if (NSLOG_LEVEL_INFO >= NSLOG_LEVEL_VERBOSE) { static nslog_entry_context_t _nslog_ctx = { &__nslog_category_netsurf , NSLOG_LEVEL_INFO, "frontends/gtk/resources.c", sizeof("frontends/gtk/resources.c" ) - 1, __PRETTY_FUNCTION__, sizeof(__PRETTY_FUNCTION__) - 1, 515 , }; nslog__log(&_nslog_ctx, "Unable to create pixbuf from file for %s with path %s" , resource->name, resource->path); } } while(0) | |||
| 513 | "Unable to create pixbuf from file for %s with path %s",do { if (NSLOG_LEVEL_INFO >= NSLOG_LEVEL_VERBOSE) { static nslog_entry_context_t _nslog_ctx = { &__nslog_category_netsurf , NSLOG_LEVEL_INFO, "frontends/gtk/resources.c", sizeof("frontends/gtk/resources.c" ) - 1, __PRETTY_FUNCTION__, sizeof(__PRETTY_FUNCTION__) - 1, 515 , }; nslog__log(&_nslog_ctx, "Unable to create pixbuf from file for %s with path %s" , resource->name, resource->path); } } while(0) | |||
| 514 | resource->name,do { if (NSLOG_LEVEL_INFO >= NSLOG_LEVEL_VERBOSE) { static nslog_entry_context_t _nslog_ctx = { &__nslog_category_netsurf , NSLOG_LEVEL_INFO, "frontends/gtk/resources.c", sizeof("frontends/gtk/resources.c" ) - 1, __PRETTY_FUNCTION__, sizeof(__PRETTY_FUNCTION__) - 1, 515 , }; nslog__log(&_nslog_ctx, "Unable to create pixbuf from file for %s with path %s" , resource->name, resource->path); } } while(0) | |||
| 515 | resource->path)do { if (NSLOG_LEVEL_INFO >= NSLOG_LEVEL_VERBOSE) { static nslog_entry_context_t _nslog_ctx = { &__nslog_category_netsurf , NSLOG_LEVEL_INFO, "frontends/gtk/resources.c", sizeof("frontends/gtk/resources.c" ) - 1, __PRETTY_FUNCTION__, sizeof(__PRETTY_FUNCTION__) - 1, 515 , }; nslog__log(&_nslog_ctx, "Unable to create pixbuf from file for %s with path %s" , resource->name, resource->path); } } while(0); | |||
| 516 | } | |||
| 517 | return NSERROR_INIT_FAILED; | |||
| 518 | } | |||
| 519 | *pixbuf_out = new_pixbuf; | |||
| 520 | ||||
| 521 | return NSERROR_OK; | |||
| 522 | } | |||
| 523 | ||||
| 524 | /* exported interface documented in gtk/resources.h */ | |||
| 525 | nserror | |||
| 526 | nsgtk_builder_new_from_resname(const char *resname, GtkBuilder **builder_out) | |||
| 527 | { | |||
| 528 | GtkBuilder *new_builder; | |||
| 529 | struct nsgtk_resource_s *ui_res; | |||
| 530 | GError* error = NULL((void*)0); | |||
| 531 | ||||
| 532 | ui_res = find_resource_from_name(resname, &ui_resource[0]); | |||
| 533 | if (ui_res->name == NULL((void*)0)) { | |||
| 534 | return NSERROR_NOT_FOUND; | |||
| 535 | } | |||
| 536 | ||||
| 537 | new_builder = gtk_builder_new(); | |||
| 538 | ||||
| 539 | if (ui_res->type == NSGTK_RESOURCE_FILE) { | |||
| 540 | if (!gtk_builder_add_from_file(new_builder, | |||
| 541 | ui_res->path, | |||
| 542 | &error)) { | |||
| 543 | NSLOG(netsurf, INFO,do { if (NSLOG_LEVEL_INFO >= NSLOG_LEVEL_VERBOSE) { static nslog_entry_context_t _nslog_ctx = { &__nslog_category_netsurf , NSLOG_LEVEL_INFO, "frontends/gtk/resources.c", sizeof("frontends/gtk/resources.c" ) - 1, __PRETTY_FUNCTION__, sizeof(__PRETTY_FUNCTION__) - 1, 547 , }; nslog__log(&_nslog_ctx, "Unable to add UI builder from file for %s with path %s \"%s\"" , ui_res->name, ui_res->path, error->message); } } while (0) | |||
| 544 | "Unable to add UI builder from file for %s with path %s \"%s\"",do { if (NSLOG_LEVEL_INFO >= NSLOG_LEVEL_VERBOSE) { static nslog_entry_context_t _nslog_ctx = { &__nslog_category_netsurf , NSLOG_LEVEL_INFO, "frontends/gtk/resources.c", sizeof("frontends/gtk/resources.c" ) - 1, __PRETTY_FUNCTION__, sizeof(__PRETTY_FUNCTION__) - 1, 547 , }; nslog__log(&_nslog_ctx, "Unable to add UI builder from file for %s with path %s \"%s\"" , ui_res->name, ui_res->path, error->message); } } while (0) | |||
| 545 | ui_res->name,do { if (NSLOG_LEVEL_INFO >= NSLOG_LEVEL_VERBOSE) { static nslog_entry_context_t _nslog_ctx = { &__nslog_category_netsurf , NSLOG_LEVEL_INFO, "frontends/gtk/resources.c", sizeof("frontends/gtk/resources.c" ) - 1, __PRETTY_FUNCTION__, sizeof(__PRETTY_FUNCTION__) - 1, 547 , }; nslog__log(&_nslog_ctx, "Unable to add UI builder from file for %s with path %s \"%s\"" , ui_res->name, ui_res->path, error->message); } } while (0) | |||
| 546 | ui_res->path,do { if (NSLOG_LEVEL_INFO >= NSLOG_LEVEL_VERBOSE) { static nslog_entry_context_t _nslog_ctx = { &__nslog_category_netsurf , NSLOG_LEVEL_INFO, "frontends/gtk/resources.c", sizeof("frontends/gtk/resources.c" ) - 1, __PRETTY_FUNCTION__, sizeof(__PRETTY_FUNCTION__) - 1, 547 , }; nslog__log(&_nslog_ctx, "Unable to add UI builder from file for %s with path %s \"%s\"" , ui_res->name, ui_res->path, error->message); } } while (0) | |||
| 547 | error->message)do { if (NSLOG_LEVEL_INFO >= NSLOG_LEVEL_VERBOSE) { static nslog_entry_context_t _nslog_ctx = { &__nslog_category_netsurf , NSLOG_LEVEL_INFO, "frontends/gtk/resources.c", sizeof("frontends/gtk/resources.c" ) - 1, __PRETTY_FUNCTION__, sizeof(__PRETTY_FUNCTION__) - 1, 547 , }; nslog__log(&_nslog_ctx, "Unable to add UI builder from file for %s with path %s \"%s\"" , ui_res->name, ui_res->path, error->message); } } while (0); | |||
| 548 | g_error_free(error); | |||
| 549 | g_object_unref(G_OBJECT(new_builder)((((GObject*) (void *) ((new_builder)))))); | |||
| 550 | return NSERROR_INIT_FAILED; | |||
| 551 | } | |||
| 552 | } else { | |||
| 553 | if (!nsgtk_builder_add_from_resource(new_builder, | |||
| 554 | ui_res->path, | |||
| 555 | &error)) { | |||
| 556 | NSLOG(netsurf, INFO,do { if (NSLOG_LEVEL_INFO >= NSLOG_LEVEL_VERBOSE) { static nslog_entry_context_t _nslog_ctx = { &__nslog_category_netsurf , NSLOG_LEVEL_INFO, "frontends/gtk/resources.c", sizeof("frontends/gtk/resources.c" ) - 1, __PRETTY_FUNCTION__, sizeof(__PRETTY_FUNCTION__) - 1, 560 , }; nslog__log(&_nslog_ctx, "Unable to add UI builder from resource for %s with path %s \"%s\"" , ui_res->name, ui_res->path, error->message); } } while (0) | |||
| 557 | "Unable to add UI builder from resource for %s with path %s \"%s\"",do { if (NSLOG_LEVEL_INFO >= NSLOG_LEVEL_VERBOSE) { static nslog_entry_context_t _nslog_ctx = { &__nslog_category_netsurf , NSLOG_LEVEL_INFO, "frontends/gtk/resources.c", sizeof("frontends/gtk/resources.c" ) - 1, __PRETTY_FUNCTION__, sizeof(__PRETTY_FUNCTION__) - 1, 560 , }; nslog__log(&_nslog_ctx, "Unable to add UI builder from resource for %s with path %s \"%s\"" , ui_res->name, ui_res->path, error->message); } } while (0) | |||
| 558 | ui_res->name,do { if (NSLOG_LEVEL_INFO >= NSLOG_LEVEL_VERBOSE) { static nslog_entry_context_t _nslog_ctx = { &__nslog_category_netsurf , NSLOG_LEVEL_INFO, "frontends/gtk/resources.c", sizeof("frontends/gtk/resources.c" ) - 1, __PRETTY_FUNCTION__, sizeof(__PRETTY_FUNCTION__) - 1, 560 , }; nslog__log(&_nslog_ctx, "Unable to add UI builder from resource for %s with path %s \"%s\"" , ui_res->name, ui_res->path, error->message); } } while (0) | |||
| 559 | ui_res->path,do { if (NSLOG_LEVEL_INFO >= NSLOG_LEVEL_VERBOSE) { static nslog_entry_context_t _nslog_ctx = { &__nslog_category_netsurf , NSLOG_LEVEL_INFO, "frontends/gtk/resources.c", sizeof("frontends/gtk/resources.c" ) - 1, __PRETTY_FUNCTION__, sizeof(__PRETTY_FUNCTION__) - 1, 560 , }; nslog__log(&_nslog_ctx, "Unable to add UI builder from resource for %s with path %s \"%s\"" , ui_res->name, ui_res->path, error->message); } } while (0) | |||
| 560 | error->message)do { if (NSLOG_LEVEL_INFO >= NSLOG_LEVEL_VERBOSE) { static nslog_entry_context_t _nslog_ctx = { &__nslog_category_netsurf , NSLOG_LEVEL_INFO, "frontends/gtk/resources.c", sizeof("frontends/gtk/resources.c" ) - 1, __PRETTY_FUNCTION__, sizeof(__PRETTY_FUNCTION__) - 1, 560 , }; nslog__log(&_nslog_ctx, "Unable to add UI builder from resource for %s with path %s \"%s\"" , ui_res->name, ui_res->path, error->message); } } while (0); | |||
| 561 | g_error_free(error); | |||
| 562 | g_object_unref(G_OBJECT(new_builder)((((GObject*) (void *) ((new_builder)))))); | |||
| 563 | return NSERROR_INIT_FAILED; | |||
| 564 | } | |||
| 565 | } | |||
| 566 | ||||
| 567 | *builder_out = new_builder; | |||
| 568 | ||||
| 569 | return NSERROR_OK; | |||
| 570 | } | |||
| 571 | ||||
| 572 | /* exported interface documented in gtk/resources.h */ | |||
| 573 | nserror | |||
| 574 | nsgtk_data_from_resname(const char *resname, | |||
| 575 | const uint8_t ** data_out, | |||
| 576 | size_t *data_size_out) | |||
| 577 | { | |||
| 578 | #ifdef WITH_GRESOURCE1 | |||
| 579 | struct nsgtk_resource_s *resource; | |||
| 580 | GBytes *data; | |||
| 581 | const gchar *buffer; | |||
| 582 | gsize buffer_length; | |||
| 583 | ||||
| 584 | resource = find_resource_from_name(resname, &direct_resource[0]); | |||
| 585 | if ((resource->name == NULL((void*)0)) || | |||
| 586 | (resource->type != NSGTK_RESOURCE_DIRECT)) { | |||
| 587 | return NSERROR_NOT_FOUND; | |||
| 588 | } | |||
| 589 | ||||
| 590 | data = (GBytes *)resource->path; | |||
| 591 | ||||
| 592 | buffer_length = 0; | |||
| 593 | buffer = g_bytes_get_data(data, &buffer_length); | |||
| 594 | ||||
| 595 | if (buffer == NULL((void*)0)) { | |||
| 596 | return NSERROR_NOMEM; | |||
| 597 | } | |||
| 598 | ||||
| 599 | *data_out = (const uint8_t *)buffer; | |||
| 600 | *data_size_out = (size_t)buffer_length; | |||
| 601 | ||||
| 602 | return NSERROR_OK; | |||
| 603 | #else | |||
| 604 | /** \todo consider adding compiled inline resources for things | |||
| 605 | * other than pixbufs. | |||
| 606 | */ | |||
| 607 | return NSERROR_NOT_FOUND; | |||
| 608 | #endif | |||
| 609 | } | |||
| 610 | ||||
| 611 | /* exported interface documented in gtk/resources.h */ | |||
| 612 | nserror | |||
| 613 | nsgtk_path_from_resname(const char *resname, const char **path_out) | |||
| 614 | { | |||
| 615 | struct nsgtk_resource_s *resource; | |||
| 616 | ||||
| 617 | resource = find_resource_from_name(resname, &direct_resource[0]); | |||
| 618 | if ((resource->name == NULL((void*)0)) || | |||
| 619 | (resource->type != NSGTK_RESOURCE_FILE)) { | |||
| 620 | return NSERROR_NOT_FOUND; | |||
| 621 | } | |||
| 622 | ||||
| 623 | *path_out = (const char *)resource->path; | |||
| 624 | ||||
| 625 | return NSERROR_OK; | |||
| 626 | } |