diff options
Diffstat (limited to 'gtk')
-rw-r--r-- | gtk/Makefile.target | 41 | ||||
-rw-r--r-- | gtk/compat.c | 37 | ||||
-rw-r--r-- | gtk/compat.h | 25 | ||||
-rw-r--r-- | gtk/cookies.c | 116 | ||||
-rw-r--r-- | gtk/cookies.h | 9 | ||||
-rw-r--r-- | gtk/download.c | 27 | ||||
-rw-r--r-- | gtk/download.h | 11 | ||||
-rw-r--r-- | gtk/gui.c | 204 | ||||
-rw-r--r-- | gtk/gui.h | 23 | ||||
-rw-r--r-- | gtk/history.c | 133 | ||||
-rw-r--r-- | gtk/history.h | 5 | ||||
-rw-r--r-- | gtk/hotlist.c | 84 | ||||
-rw-r--r-- | gtk/hotlist.h | 6 | ||||
-rw-r--r-- | gtk/login.c | 23 | ||||
-rw-r--r-- | gtk/login.h | 31 | ||||
-rw-r--r-- | gtk/preferences.c | 14 | ||||
-rw-r--r-- | gtk/res/netsurf.gresource.xml | 32 | ||||
-rw-r--r-- | gtk/resources.c | 286 | ||||
-rw-r--r-- | gtk/resources.h | 32 | ||||
-rw-r--r-- | gtk/scaffolding.c | 251 | ||||
-rw-r--r-- | gtk/ssl_cert.c | 18 | ||||
-rw-r--r-- | gtk/toolbar.c | 74 | ||||
-rw-r--r-- | gtk/viewdata.c | 25 | ||||
-rw-r--r-- | gtk/window.c | 37 |
24 files changed, 983 insertions, 561 deletions
diff --git a/gtk/Makefile.target b/gtk/Makefile.target index 01c00c2fb..c31cca459 100644 --- a/gtk/Makefile.target +++ b/gtk/Makefile.target @@ -65,6 +65,7 @@ $(eval $(call pkg_config_find_and_add,gtk+-$(NETSURF_GTK_MAJOR).0,GTK-$(NETSURF_ $(eval $(call pkg_config_find_and_add,gthread-2.0,GThread2)) $(eval $(call pkg_config_find_and_add,gmodule-2.0,GModule2)) + CFLAGS += $(GTKCFLAGS) LDFLAGS += -lm @@ -76,9 +77,40 @@ ifeq ($(HOST),Windows_NT) CFLAGS += -U__STRICT_ANSI__ endif +# ---------------------------------------------------------------------------- +# Builtin resource handling +# ---------------------------------------------------------------------------- + +# builtin resource sources +S_RESOURCE := + +# Glib prior to 2.32 does not have GResource handling. +# +# This uses pkg-config to check for the minimum required version for +# this feature. Note we check for gmodule-2.0 which is a specific +# part of glib we require. +# It would be nice if we could check for this functionality rather +# than "knowing" the version but there does not appear to be a simple +# way to implement that. +NETSURF_GRESOURCE_AVAILABLE := $(shell $(PKG_CONFIG) --atleast-version=2.32 gmodule-2.0 && echo yes) +ifeq ($(NETSURF_GRESOURCE_AVAILABLE),yes) + +GLIB_COMPILE_RESOURCES := glib-compile-resources +CFLAGS += -DWITH_GRESOURCE + +S_RESOURCE += $(OBJROOT)/netsurf_gresource.c + +NSGTK_RESOURCES_DIR := gtk/res +GRESOURCE_XML := $(NSGTK_RESOURCES_DIR)/netsurf.gresource.xml + +# generate the gresource source file +$(OBJROOT)/netsurf_gresource.c: $(GRESOURCE_XML) $(shell $(GLIB_COMPILE_RESOURCES) --sourcedir $(NSGTK_RESOURCES_DIR) --generate-dependencies $(GRESOURCE_XML)) + $(GLIB_COMPILE_RESOURCES) --generate-source --sourcedir $(NSGTK_RESOURCES_DIR) --target=$@ $< + +endif # ---------------------------------------------------------------------------- -# Pixbuf +# Builtin Pixbuf resources # ---------------------------------------------------------------------------- GTK_IMAGE_menu_cursor := gtk/res/menu_cursor.png @@ -88,7 +120,8 @@ GTK_IMAGE_menu_cursor := gtk/res/menu_cursor.png # 3: bitmap name define convert_image -S_PIXBUF += $(2) +# add converted pixbuf to builtin resource sources +S_RESOURCE += $(2) $(2): $(1) $(Q)echo "#include <gdk-pixbuf/gdk-pixdata.h>" > $(2) @@ -101,8 +134,6 @@ endef # Source file setup # ---------------------------------------------------------------------------- -#converted pixbuf sources -S_PIXBUF := $(eval $(foreach V,$(filter GTK_IMAGE_%,$(.VARIABLES)),$(call convert_image,$($(V)),$(OBJROOT)/$(patsubst GTK_IMAGE_%,%,$(V)).c,$(patsubst GTK_IMAGE_%,%,$(V))_pixdata))) @@ -120,7 +151,7 @@ S_GTK := $(addprefix gtk/,$(S_GTK)) $(addprefix utils/,container.c) # This is the final source build list # Note this is deliberately *not* expanded here as common and image # are not yet available -SOURCES = $(S_COMMON) $(S_IMAGE) $(S_BROWSER) $(S_PIXBUF) $(S_GTK) +SOURCES = $(S_COMMON) $(S_IMAGE) $(S_BROWSER) $(S_RESOURCE) $(S_GTK) # The gtk binary target EXETARGET := nsgtk diff --git a/gtk/compat.c b/gtk/compat.c index 51469b26e..4c5524b0e 100644 --- a/gtk/compat.c +++ b/gtk/compat.c @@ -601,3 +601,40 @@ void nsgtk_widget_set_margins(GtkWidget *widget, gint hmargin, gint vmargin) gtk_misc_set_padding(GTK_MISC(widget), hmargin, vmargin); #endif } + +/* exported interface documented in gtk/compat.h */ +guint +nsgtk_builder_add_from_resource(GtkBuilder *builder, + const gchar *resource_path, + GError **error) +{ + guint ret; + +#ifdef WITH_GRESOURCE +#if GTK_CHECK_VERSION(3,4,0) + ret = gtk_builder_add_from_resource(builder, resource_path, error); +#else + GBytes *data; + const gchar *buffer; + gsize buffer_length; + + g_assert(error && *error == NULL); + + data = g_resources_lookup_data(resource_path, 0, error); + if (data == NULL) { + return 0; + } + + buffer_length = 0; + buffer = g_bytes_get_data(data, &buffer_length); + g_assert(buffer != NULL); + + ret = gtk_builder_add_from_string(builder, buffer, buffer_length, error); + + g_bytes_unref(data); +#endif +#else + ret = 0; /* return an error as GResource not supported before GLIB 2.32 */ +#endif + return ret; +} diff --git a/gtk/compat.h b/gtk/compat.h index 088cd79fe..9554b0cba 100644 --- a/gtk/compat.h +++ b/gtk/compat.h @@ -268,4 +268,29 @@ GtkWidget *nsgtk_image_menu_item_new_with_mnemonic(const gchar *label); */ void nsgtk_image_menu_item_set_image(GtkWidget *image_menu_item, GtkWidget *image); + +/** + * Parses a resource file containing a GtkBuilder UI definition and + * merges it with the current contents of builder. + * + * Compatability interface as this did not exist prior to GTK 3.4 + * + * GTK prior to 3.4 can have the resources in a GResource but + * gtk_builder cannot directly instantiate from them + * + * GTK 3.4 onwards can use gtk_builder_add_from_resource() to add + * directly from resources. The gtk_builder_new_ type operations + * cannot be used because they are only available post 3.10 and handle + * all errors by aborting the application + * + * @note prior to GLIB 2.32 resources did not exist and this wrapper + * returns the error code. + * + * \param builder a GtkBuilder + * \param resource_path the path of the resource file to parse + * \param error return location for an error, or NULL. + * \return A positive value on success, 0 if an error occurred. + */ +guint nsgtk_builder_add_from_resource(GtkBuilder *builder, const gchar *resource_path, GError **error); + #endif /* NETSURF_GTK_COMPAT_H */ diff --git a/gtk/cookies.c b/gtk/cookies.c index cb59d0ae8..7b21dc9b5 100644 --- a/gtk/cookies.c +++ b/gtk/cookies.c @@ -32,12 +32,11 @@ #include "gtk/plotters.h" #include "gtk/scaffolding.h" #include "gtk/treeview.h" - -#define GLADE_NAME "cookies.glade" +#include "gtk/resources.h" #define MENUPROTO(x) static gboolean nsgtk_on_##x##_activate( \ GtkMenuItem *widget, gpointer g) -#define MENUEVENT(x) { #x, G_CALLBACK(nsgtk_on_##x##_activate) } +#define MENUEVENT(x) { #x, G_CALLBACK(nsgtk_on_##x##_activate) } #define MENUHANDLER(x) gboolean nsgtk_on_##x##_activate(GtkMenuItem *widget, \ gpointer g) @@ -46,8 +45,6 @@ struct menu_events { GCallback handler; }; -static void nsgtk_cookies_init_menu(void); - /* edit menu */ MENUPROTO(delete_selected); MENUPROTO(delete_all); @@ -64,98 +61,97 @@ MENUPROTO(collapse_cookies); static struct menu_events menu_events[] = { - + /* edit menu */ MENUEVENT(delete_selected), MENUEVENT(delete_all), MENUEVENT(select_all), MENUEVENT(clear_selection), - + /* view menu*/ MENUEVENT(expand_all), MENUEVENT(expand_domains), - MENUEVENT(expand_cookies), + MENUEVENT(expand_cookies), MENUEVENT(collapse_all), MENUEVENT(collapse_domains), MENUEVENT(collapse_cookies), - + {NULL, NULL} }; -static struct nsgtk_treeview *cookies_window; -static GtkBuilder *gladeFile; +static struct nsgtk_treeview *cookies_treeview; +static GtkBuilder *cookie_builder; GtkWindow *wndCookies; /** - * Creates the window for the cookies tree. + * Connects menu events in the cookies window. */ -bool nsgtk_cookies_init(const char *glade_file_location) +static void nsgtk_cookies_init_menu(void) +{ + struct menu_events *event = menu_events; + GtkWidget *w; + + while (event->widget != NULL) { + w = GTK_WIDGET(gtk_builder_get_object(cookie_builder, event->widget)); + if (w == NULL) { + LOG("Unable to connect menu widget ""%s""", event->widget); } else { + g_signal_connect(G_OBJECT(w), "activate", event->handler, cookies_treeview); + } + event++; + } +} + +/* exported interface documented in gtk/cookies.h */ +nserror nsgtk_cookies_init(void) { - GtkWindow *window; GtkScrolledWindow *scrolled; GtkDrawingArea *drawing_area; + nserror res; - GError* error = NULL; - gladeFile = gtk_builder_new (); - if (!gtk_builder_add_from_file(gladeFile, glade_file_location, &error)) { - g_warning ("Couldn't load builder file: %s", error->message); - g_error_free (error); - return false; + res = nsgtk_builder_new_from_resname("cookies", &cookie_builder); + if (res != NSERROR_OK) { + LOG("Cookie UI builder init failed"); + return res; } - - gtk_builder_connect_signals(gladeFile, NULL); - - wndCookies = GTK_WINDOW(gtk_builder_get_object(gladeFile, "wndCookies")); - window = wndCookies; - - scrolled = GTK_SCROLLED_WINDOW(gtk_builder_get_object(gladeFile, + + gtk_builder_connect_signals(cookie_builder, NULL); + + wndCookies = GTK_WINDOW(gtk_builder_get_object(cookie_builder, + "wndCookies")); + + scrolled = GTK_SCROLLED_WINDOW(gtk_builder_get_object(cookie_builder, "cookiesScrolled")); - drawing_area = GTK_DRAWING_AREA(gtk_builder_get_object(gladeFile, + drawing_area = GTK_DRAWING_AREA(gtk_builder_get_object(cookie_builder, "cookiesDrawingArea")); - - cookies_window = nsgtk_treeview_create(TREE_COOKIES, window, - scrolled, drawing_area); - - if (cookies_window == NULL) - return false; - + + cookies_treeview = nsgtk_treeview_create(TREE_COOKIES, + wndCookies, + scrolled, + drawing_area); + if (cookies_treeview == NULL) { + return NSERROR_INIT_FAILED; + } + #define CONNECT(obj, sig, callback, ptr) \ - g_signal_connect(G_OBJECT(obj), (sig), G_CALLBACK(callback), (ptr)) - - CONNECT(window, "delete_event", gtk_widget_hide_on_delete, NULL); - CONNECT(window, "hide", nsgtk_tree_window_hide, cookies_window); - - nsgtk_cookies_init_menu(); + g_signal_connect(G_OBJECT(obj), (sig), G_CALLBACK(callback), (ptr)) - return true; -} + CONNECT(wndCookies, "delete_event", gtk_widget_hide_on_delete, NULL); + CONNECT(wndCookies, "hide", nsgtk_tree_window_hide, cookies_treeview); -/** - * Connects menu events in the cookies window. - */ -void nsgtk_cookies_init_menu() -{ - struct menu_events *event = menu_events; - GtkWidget *w; + nsgtk_cookies_init_menu(); - while (event->widget != NULL) { - w = GTK_WIDGET(gtk_builder_get_object(gladeFile, event->widget)); - if (w == NULL) { - LOG("Unable to connect menu widget ""%s""", event->widget); } else { - g_signal_connect(G_OBJECT(w), "activate", event->handler, cookies_window); - } - event++; - } + return NSERROR_OK; } + /** * Destroys the cookies window and performs any other necessary cleanup actions. */ void nsgtk_cookies_destroy(void) { - /* TODO: what about gladeFile? */ - nsgtk_treeview_destroy(cookies_window); + /** \todo what about cookie_builder? */ + nsgtk_treeview_destroy(cookies_treeview); } diff --git a/gtk/cookies.h b/gtk/cookies.h index db12dfe31..2d5c56d52 100644 --- a/gtk/cookies.h +++ b/gtk/cookies.h @@ -23,11 +23,14 @@ #ifndef __NSGTK_COOKIES_H__ #define __NSGTK_COOKIES_H__ -#include <gtk/gtk.h> - extern GtkWindow *wndCookies; -bool nsgtk_cookies_init(const char *glade_file_location); +/** + * Creates the window for the cookies tree. + * + * \return NSERROR_OK on success else appropriate error code on faliure. + */ +nserror nsgtk_cookies_init(void); void nsgtk_cookies_destroy(void); diff --git a/gtk/download.c b/gtk/download.c index 74b49f69c..23832ded9 100644 --- a/gtk/download.c +++ b/gtk/download.c @@ -32,9 +32,10 @@ #include "desktop/gui_download.h" #include "gtk/scaffolding.h" -#include "gtk/download.h" #include "gtk/window.h" #include "gtk/compat.h" +#include "gtk/resources.h" +#include "gtk/download.h" #define UPDATE_RATE 500 /* In milliseconds */ @@ -458,24 +459,26 @@ static void nsgtk_download_store_cancel_item (struct gui_download_window *dl) } } -static gboolean nsgtk_download_hide (GtkWidget *window) +static gboolean nsgtk_download_hide(GtkWidget *window) { gtk_widget_hide(window); return TRUE; } -bool nsgtk_download_init(const char *glade_file_location) +/* exported interface documented in gtk/download.h */ +nserror nsgtk_download_init(void) { - GError* error = NULL; - GtkBuilder* builder = gtk_builder_new(); - - if (!gtk_builder_add_from_file(builder, glade_file_location, &error)) - { - g_warning("Couldn't load builder file: %s", error->message); - g_error_free(error); - return false; + GtkBuilder* builder; + nserror res; + + res = nsgtk_builder_new_from_resname("downloads", &builder); + if (res != NSERROR_OK) { + LOG("Download UI builder init failed"); + return res; } + gtk_builder_connect_signals(builder, NULL); + nsgtk_download_button_pause = GTK_BUTTON(gtk_builder_get_object(builder, "buttonPause")); nsgtk_download_button_clear = GTK_BUTTON(gtk_builder_get_object(builder, "buttonClear")); nsgtk_download_button_cancel = GTK_BUTTON(gtk_builder_get_object(builder, "buttonCancel")); @@ -538,7 +541,7 @@ bool nsgtk_download_init(const char *glade_file_location) g_signal_connect(G_OBJECT(nsgtk_download_window), "delete-event", G_CALLBACK(nsgtk_download_hide), NULL); - return true; + return NSERROR_OK; } void nsgtk_download_destroy () diff --git a/gtk/download.h b/gtk/download.h index a6e624fbd..0b1097655 100644 --- a/gtk/download.h +++ b/gtk/download.h @@ -21,9 +21,18 @@ #include <gtk/gtk.h> +/** + * download operation table for gtk + */ struct gui_download_table *nsgtk_download_table; -bool nsgtk_download_init(const char *glade_file_location); +/** + * Initialise download window ready for use. + * + * \return NSERROR_OK on success else appropriate error code on faliure. + */ +nserror nsgtk_download_init(void); + void nsgtk_download_destroy (void); bool nsgtk_check_for_downloads(GtkWindow *parent); void nsgtk_download_show(GtkWindow *parent); @@ -67,6 +67,8 @@ #include "gtk/search.h" #include "gtk/ssl_cert.h" #include "gtk/bitmap.h" +#include "gtk/resources.h" +#include "gtk/login.h" bool nsgtk_complete = false; @@ -79,10 +81,7 @@ char *nsgtk_config_home; /* exported global defined in gtk/gui.h */ GdkPixbuf *favicon_pixbuf; /* favicon default pixbuf */ -struct glade_file_location_s *glade_file_location; - -static GtkWindow *nsgtk_warning_window; -GtkWidget *widWarning; +GtkBuilder *warning_builder; #define THROBBER_FRAMES 9 @@ -155,87 +154,6 @@ static bool nsgtk_throbber_init(char **respath, int framec) } -#define NEW_GLADE_ERROR_SIZE 128 - -static char * -nsgtk_new_ui(char **respath, const char *name, GtkBuilder **pglade) -{ - GtkBuilder *builder; - GError* error = NULL; - char *filepath; - char errorstr[NEW_GLADE_ERROR_SIZE]; - char resname[PATH_MAX]; -#if GTK_CHECK_VERSION(3,0,0) - int gtkv = 3; -#else - int gtkv = 2; -#endif - - snprintf(resname, PATH_MAX, "%s.gtk%d.ui", name, gtkv); - - filepath = filepath_find(respath, resname); - if (filepath == NULL) { - snprintf(errorstr, NEW_GLADE_ERROR_SIZE, - "Unable to locate %s glade template file.\n", name); - die(errorstr); - } - - builder = gtk_builder_new(); - if (!gtk_builder_add_from_file(builder, filepath, &error)) { - g_warning ("Couldn't load builder file: %s", error->message); - g_error_free (error); - snprintf(errorstr, NEW_GLADE_ERROR_SIZE, - "Unable to load glade %s window definitions.\n", name); - - die(errorstr); - } - - gtk_builder_connect_signals(builder, NULL); - - LOG("Using '%s' as %s ui template file", filepath, name); - - if (pglade != NULL) { - *pglade = builder; - } else { - /* release our reference to the builder if it is not - * being used. - */ - g_object_unref(G_OBJECT(builder)); - } - - return filepath; -} - -/** - * Load definitions from glade files. - */ -static void -nsgtk_init_glade(char **respath) -{ - GtkBuilder *gladeWarning; - - glade_file_location = calloc(1, sizeof(struct glade_file_location_s)); - if (glade_file_location == NULL) { - die("Unable to allocate glade file locations"); - } - - glade_file_location->netsurf = nsgtk_new_ui(respath, "netsurf", NULL); - glade_file_location->tabcontents = nsgtk_new_ui(respath, "tabcontents", NULL); - glade_file_location->password = nsgtk_new_ui(respath, "password", NULL); - glade_file_location->login = nsgtk_new_ui(respath, "login", NULL); - glade_file_location->ssl = nsgtk_new_ui(respath, "ssl", NULL); - glade_file_location->toolbar = nsgtk_new_ui(respath, "toolbar", NULL); - glade_file_location->downloads = nsgtk_new_ui(respath, "downloads", NULL); - glade_file_location->history = nsgtk_new_ui(respath, "history", NULL); - glade_file_location->options = nsgtk_new_ui(respath, "options", NULL); - glade_file_location->hotlist = nsgtk_new_ui(respath, "hotlist", NULL); - glade_file_location->cookies = nsgtk_new_ui(respath, "cookies", NULL); - glade_file_location->viewdata = nsgtk_new_ui(respath, "viewdata", NULL); - - glade_file_location->warning = nsgtk_new_ui(respath, "warning", &gladeWarning); - nsgtk_warning_window = GTK_WINDOW(gtk_builder_get_object(gladeWarning, "wndWarning")); - widWarning = GTK_WIDGET(gtk_builder_get_object(gladeWarning, "labelWarning")); -} /** * Set option defaults for gtk frontend. @@ -347,8 +265,20 @@ static nserror nsgtk_init(int argc, char** argv, char **respath) strlen(languages_file_location) - 9); LOG("Using '%s' for resource path", res_dir_location); - /* initialise the glade templates */ - nsgtk_init_glade(respath); + /* initialise the gtk resource handling */ + error = nsgtk_init_resources(respath); + if (error != NSERROR_OK) { + LOG("Unable to initialise resources"); + return error; + } + + error = nsgtk_builder_new_from_resname("warning", &warning_builder); + if (error != NSERROR_OK) { + LOG("Unable to initialise warning dialog"); + return error; + } + + gtk_builder_connect_signals(warning_builder, NULL); /* set default icon if its available */ resource_filename = filepath_find(respath, "netsurf.xpm"); @@ -366,14 +296,9 @@ static nserror nsgtk_init(int argc, char** argv, char **respath) } /* Default favicon */ - resource_filename = filepath_find(respath, "favicon.png"); - if (resource_filename != NULL) { - favicon_pixbuf = gdk_pixbuf_new_from_file(resource_filename, NULL); - free(resource_filename); - if (favicon_pixbuf == NULL) { - favicon_pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, false, 8, 16,16); - - } + error = nsgdk_pixbuf_new_from_resname("favicon.png", &favicon_pixbuf); + if (error != NSERROR_OK) { + favicon_pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, false, 8, 16,16); } /* Toolbar inicies file */ @@ -402,17 +327,30 @@ static nserror nsgtk_init(int argc, char** argv, char **respath) browser_set_dpi(gdk_screen_get_resolution(gdk_screen_get_default())); LOG("Set CSS DPI to %d", browser_get_dpi()); - if (nsgtk_history_init(glade_file_location->history) == false) - die("Unable to initialise history window.\n"); + /* Initialise top level UI elements */ + error = nsgtk_history_init(); + if (error != NSERROR_OK) { + LOG("Unable to initialise global history window."); + return error; + } - if (nsgtk_download_init(glade_file_location->downloads) == false) - die("Unable to initialise download window.\n"); + error = nsgtk_download_init(); + if (error != NSERROR_OK) { + LOG("Unable to initialise download window."); + return error; + } - if (nsgtk_cookies_init(glade_file_location->cookies) == false) - die("Unable to initialise cookies window.\n"); + error = nsgtk_cookies_init(); + if (error != NSERROR_OK) { + LOG("Unable to initialise cookies window."); + return error; + } - if (nsgtk_hotlist_init(glade_file_location->hotlist) == false) - die("Unable to initialise hotlist window.\n"); + error = nsgtk_hotlist_init(); + if (error != NSERROR_OK) { + LOG("Unable to initialise hotlist window."); + return error; + } /* If there is a url specified on the command line use it */ if (argc > 1) { @@ -566,15 +504,21 @@ static nserror gui_launch_url(struct nsurl *url) void warn_user(const char *warning, const char *detail) { char buf[300]; /* 300 is the size the RISC OS GUI uses */ + static GtkWindow *nsgtk_warning_window; + GtkLabel *WarningLabel; LOG("%s %s", warning, detail ? detail : ""); fflush(stdout); + nsgtk_warning_window = GTK_WINDOW(gtk_builder_get_object(warning_builder, "wndWarning")); + WarningLabel = GTK_LABEL(gtk_builder_get_object(warning_builder, + "labelWarning")); + snprintf(buf, sizeof(buf), "%s %s", messages_get(warning), detail ? detail : ""); buf[sizeof(buf) - 1] = 0; - gtk_label_set_text(GTK_LABEL(widWarning), buf); + gtk_label_set_text(WarningLabel, buf); gtk_widget_show_all(GTK_WIDGET(nsgtk_warning_window)); } @@ -585,34 +529,34 @@ static void nsgtk_PDF_set_pass(GtkButton *w, gpointer data) char **owner_pass = ((void **)data)[0]; char **user_pass = ((void **)data)[1]; GtkWindow *wnd = ((void **)data)[2]; - GtkBuilder *gladeFile = ((void **)data)[3]; + GtkBuilder *password_builder = ((void **)data)[3]; char *path = ((void **)data)[4]; char *op, *op1; char *up, *up1; op = strdup(gtk_entry_get_text( - GTK_ENTRY(gtk_builder_get_object(gladeFile, + GTK_ENTRY(gtk_builder_get_object(password_builder, "entryPDFOwnerPassword")))); op1 = strdup(gtk_entry_get_text( - GTK_ENTRY(gtk_builder_get_object(gladeFile, + GTK_ENTRY(gtk_builder_get_object(password_builder, "entryPDFOwnerPassword1")))); up = strdup(gtk_entry_get_text( - GTK_ENTRY(gtk_builder_get_object(gladeFile, + GTK_ENTRY(gtk_builder_get_object(password_builder, "entryPDFUserPassword")))); up1 = strdup(gtk_entry_get_text( - GTK_ENTRY(gtk_builder_get_object(gladeFile, + GTK_ENTRY(gtk_builder_get_object(password_builder, "entryPDFUserPassword1")))); if (op[0] == '\0') { - gtk_label_set_text(GTK_LABEL(gtk_builder_get_object(gladeFile, + gtk_label_set_text(GTK_LABEL(gtk_builder_get_object(password_builder, "labelInfo")), "Owner password must be at least 1 character long:"); free(op); free(up); } else if (!strcmp(op, up)) { - gtk_label_set_text(GTK_LABEL(gtk_builder_get_object(gladeFile, + gtk_label_set_text(GTK_LABEL(gtk_builder_get_object(password_builder, "labelInfo")), "User and owner passwords must be different:"); free(op); @@ -627,13 +571,13 @@ static void nsgtk_PDF_set_pass(GtkButton *w, gpointer data) free(data); gtk_widget_destroy(GTK_WIDGET(wnd)); - g_object_unref(G_OBJECT(gladeFile)); + g_object_unref(G_OBJECT(password_builder)); save_pdf(path); free(path); } else { - gtk_label_set_text(GTK_LABEL(gtk_builder_get_object(gladeFile, + gtk_label_set_text(GTK_LABEL(gtk_builder_get_object(password_builder, "labelInfo")), "Passwords not confirmed:"); free(op); free(up); @@ -646,13 +590,13 @@ static void nsgtk_PDF_set_pass(GtkButton *w, gpointer data) static void nsgtk_PDF_no_pass(GtkButton *w, gpointer data) { GtkWindow *wnd = ((void **)data)[2]; - GtkBuilder *gladeFile = ((void **)data)[3]; + GtkBuilder *password_builder = ((void **)data)[3]; char *path = ((void **)data)[4]; free(data); gtk_widget_destroy(GTK_WIDGET(wnd)); - g_object_unref(G_OBJECT(gladeFile)); + g_object_unref(G_OBJECT(password_builder)); save_pdf(path); @@ -664,19 +608,19 @@ static void nsgtk_pdf_password(char **owner_pass, char **user_pass, char *path) GtkButton *ok, *no; GtkWindow *wnd; void **data; - GtkBuilder *gladeFile; - GError* error = NULL; - - gladeFile = gtk_builder_new(); - if (!gtk_builder_add_from_file(gladeFile, - glade_file_location->password, - &error)) { - g_warning ("Couldn't load builder file: %s", error->message); - g_error_free (error); + GtkBuilder *password_builder; + nserror res; + + res = nsgtk_builder_new_from_resname("password", &password_builder); + if (res != NSERROR_OK) { + LOG("Password UI builder init failed"); return; } - wnd = GTK_WINDOW(gtk_builder_get_object(gladeFile, "wndPDFPassword")); + gtk_builder_connect_signals(password_builder, NULL); + + wnd = GTK_WINDOW(gtk_builder_get_object(password_builder, + "wndPDFPassword")); data = malloc(5 * sizeof(void *)); @@ -686,11 +630,13 @@ static void nsgtk_pdf_password(char **owner_pass, char **user_pass, char *path) data[0] = owner_pass; data[1] = user_pass; data[2] = wnd; - data[3] = gladeFile; + data[3] = password_builder; data[4] = path; - ok = GTK_BUTTON(gtk_builder_get_object(gladeFile, "buttonPDFSetPassword")); - no = GTK_BUTTON(gtk_builder_get_object(gladeFile, "buttonPDFNoPassword")); + ok = GTK_BUTTON(gtk_builder_get_object(password_builder, + "buttonPDFSetPassword")); + no = GTK_BUTTON(gtk_builder_get_object(password_builder, + "buttonPDFNoPassword")); g_signal_connect(G_OBJECT(ok), "clicked", G_CALLBACK(nsgtk_PDF_set_pass), (gpointer)data); @@ -1177,7 +1123,7 @@ int main(int argc, char** argv) /* run the browser */ ret = nsgtk_init(argc, argv, respaths); if (ret != NSERROR_OK) { - fprintf(stderr, "NetSurf gtk specific initialise failed (%s)\n", + fprintf(stderr, "NetSurf gtk initialise failed (%s)\n", messages_get_errorcode(ret)); } else { nsgtk_main(); @@ -21,26 +21,6 @@ struct nsurl; -/** glade file paths. */ -struct glade_file_location_s { - char *netsurf; - char *tabcontents; - char *password; - char *warning; - char *login; - char *ssl; - char *toolbar; - char *options; - char *downloads; - char *history; - char *hotlist; - char *cookies; - char *viewdata; -}; - -/** location of all glade files. */ -extern struct glade_file_location_s *glade_file_location; - /** language list file path. */ extern char *languages_file_location; @@ -65,9 +45,6 @@ extern char **respaths; /** input conversion. */ uint32_t gtk_gui_gdkkey_to_nskey(GdkEventKey *eventkey); -/** login window request. */ -extern void gui_401login_open(struct nsurl *url, const char *realm, nserror (*cb)(bool proceed, void *pw), void *cbpw); - /** set when no windows remain open. */ extern bool nsgtk_complete; diff --git a/gtk/history.c b/gtk/history.c index 2dbedf98a..db30c5b66 100644 --- a/gtk/history.c +++ b/gtk/history.c @@ -1,6 +1,6 @@ /* * Copyright 2006 Rob Kendrick <rjek@rjek.com> - * Copyright 2009 Paul Blokus <paul_pl@users.sourceforge.net> + * Copyright 2009 Paul Blokus <paul_pl@users.sourceforge.net> * * This file is part of NetSurf, http://www.netsurf-browser.org/ * @@ -26,15 +26,16 @@ #include "desktop/tree.h" #include "desktop/textinput.h" -#include "gtk/history.h" #include "gtk/plotters.h" #include "gtk/scaffolding.h" #include "gtk/treeview.h" #include "gtk/compat.h" +#include "gtk/resources.h" +#include "gtk/history.h" #define MENUPROTO(x) static gboolean nsgtk_on_##x##_activate( \ GtkMenuItem *widget, gpointer g) -#define MENUEVENT(x) { #x, G_CALLBACK(nsgtk_on_##x##_activate) } +#define MENUEVENT(x) { #x, G_CALLBACK(nsgtk_on_##x##_activate) } #define MENUHANDLER(x) gboolean nsgtk_on_##x##_activate(GtkMenuItem *widget, \ gpointer g) @@ -43,8 +44,6 @@ struct menu_events { GCallback handler; }; -static void nsgtk_history_init_menu(void); - /* file menu*/ MENUPROTO(export); @@ -57,7 +56,7 @@ MENUPROTO(clear_selection); /* view menu*/ MENUPROTO(expand_all); MENUPROTO(expand_directories); -MENUPROTO(expand_addresses); +MENUPROTO(expand_addresses); MENUPROTO(collapse_all); MENUPROTO(collapse_directories); MENUPROTO(collapse_addresses); @@ -65,94 +64,102 @@ MENUPROTO(collapse_addresses); MENUPROTO(launch); static struct menu_events menu_events[] = { - + /* file menu*/ MENUEVENT(export), - + /* edit menu */ MENUEVENT(delete_selected), MENUEVENT(delete_all), MENUEVENT(select_all), MENUEVENT(clear_selection), - + /* view menu*/ MENUEVENT(expand_all), MENUEVENT(expand_directories), - MENUEVENT(expand_addresses), + MENUEVENT(expand_addresses), MENUEVENT(collapse_all), MENUEVENT(collapse_directories), MENUEVENT(collapse_addresses), - + MENUEVENT(launch), {NULL, NULL} }; static struct nsgtk_treeview *global_history_window; -static GtkBuilder *gladeFile; +static GtkBuilder *history_builder; GtkWindow *wndHistory; +/** + * Connects menu events in the global history window. + */ +static void nsgtk_history_init_menu(void) +{ + struct menu_events *event = menu_events; + GtkWidget *w; + + while (event->widget != NULL) { + w = GTK_WIDGET(gtk_builder_get_object(history_builder, + event->widget)); + if (w == NULL) { + LOG("Unable to connect menu widget ""%s""", + event->widget); + } else { + g_signal_connect(G_OBJECT(w), + "activate", + event->handler, + global_history_window); + } + event++; + } +} -/* exported interface, documented in gtk_history.h */ -bool nsgtk_history_init(const char *glade_file_location) +/* exported interface, documented in gtk/history.h */ +nserror nsgtk_history_init(void) { GtkWindow *window; GtkScrolledWindow *scrolled; GtkDrawingArea *drawing_area; - GError* error = NULL; + nserror res; - gladeFile = gtk_builder_new(); - if (!gtk_builder_add_from_file(gladeFile, glade_file_location, &error)) { - g_warning ("Couldn't load builder file: %s", error->message); - g_error_free (error); - return false; + res = nsgtk_builder_new_from_resname("history", &history_builder); + if (res != NSERROR_OK) { + LOG("History UI builder init failed"); + return res; } + gtk_builder_connect_signals(history_builder, NULL); + + wndHistory = GTK_WINDOW(gtk_builder_get_object(history_builder, + "wndHistory")); - gtk_builder_connect_signals(gladeFile, NULL); - - wndHistory = GTK_WINDOW(gtk_builder_get_object(gladeFile, "wndHistory")); - window = wndHistory; - - scrolled = GTK_SCROLLED_WINDOW(gtk_builder_get_object(gladeFile, "globalHistoryScrolled")); - drawing_area = GTK_DRAWING_AREA(gtk_builder_get_object(gladeFile, "globalHistoryDrawingArea")); + scrolled = GTK_SCROLLED_WINDOW(gtk_builder_get_object(history_builder, + "globalHistoryScrolled")); + + drawing_area = GTK_DRAWING_AREA(gtk_builder_get_object(history_builder, + "globalHistoryDrawingArea")); + + global_history_window = nsgtk_treeview_create(TREE_HISTORY, + window, + scrolled, + drawing_area); + if (global_history_window == NULL) { + return NSERROR_INIT_FAILED; + } - global_history_window = nsgtk_treeview_create( - TREE_HISTORY, window, scrolled, drawing_area); - - if (global_history_window == NULL) - return false; - #define CONNECT(obj, sig, callback, ptr) \ - g_signal_connect(G_OBJECT(obj), (sig), G_CALLBACK(callback), (ptr)) - + g_signal_connect(G_OBJECT(obj), (sig), G_CALLBACK(callback), (ptr)) + CONNECT(window, "delete_event", gtk_widget_hide_on_delete, NULL); CONNECT(window, "hide", nsgtk_tree_window_hide, global_history_window); - + nsgtk_history_init_menu(); - return true; + return NSERROR_OK; } -/** - * Connects menu events in the global history window. - */ -void nsgtk_history_init_menu(void) -{ - struct menu_events *event = menu_events; - GtkWidget *w; - - while (event->widget != NULL) { - w = GTK_WIDGET(gtk_builder_get_object(gladeFile, event->widget)); - if (w == NULL) { - LOG("Unable to connect menu widget ""%s""", event->widget); - } else { - g_signal_connect(G_OBJECT(w), "activate", event->handler, global_history_window); - } - event++; - } -} /** @@ -161,12 +168,12 @@ void nsgtk_history_init_menu(void) */ void nsgtk_history_destroy(void) { - /* TODO: what about gladeFile? */ + /** \todo what about history_builder? */ nsgtk_treeview_destroy(global_history_window); } -/* file menu*/ +/* file menu */ MENUHANDLER(export) { GtkWidget *save_dialog; @@ -176,21 +183,21 @@ MENUHANDLER(export) NSGTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NSGTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL); - + gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(save_dialog), getenv("HOME") ? getenv("HOME") : "/"); - + gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(save_dialog), "history.html"); - + if (gtk_dialog_run(GTK_DIALOG(save_dialog)) == GTK_RESPONSE_ACCEPT) { gchar *filename = gtk_file_chooser_get_filename( GTK_FILE_CHOOSER(save_dialog)); - - global_history_export(filename, NULL); + + global_history_export(filename, NULL); g_free(filename); } - + gtk_widget_destroy(save_dialog); return TRUE; diff --git a/gtk/history.h b/gtk/history.h index ab3c10ee6..c0f7db2bd 100644 --- a/gtk/history.h +++ b/gtk/history.h @@ -27,10 +27,9 @@ extern GtkWindow *wndHistory; /** * Creates the window for the global history tree. * - * \param glade_file_location The glade file to use for the window. - * \return true on success false on faliure. + * \return NSERROR_OK on sucess else appropriate error code. */ -bool nsgtk_history_init(const char *glade_file_location); +nserror nsgtk_history_init(void); /** * Free global resources associated with the gtk history window. diff --git a/gtk/hotlist.c b/gtk/hotlist.c index fed6ae735..8258e0990 100644 --- a/gtk/hotlist.c +++ b/gtk/hotlist.c @@ -25,13 +25,12 @@ #include "desktop/plotters.h" #include "desktop/tree.h" -#include "gtk/hotlist.h" #include "gtk/plotters.h" #include "gtk/scaffolding.h" #include "gtk/treeview.h" #include "gtk/compat.h" - -#define GLADE_NAME "hotlist.glade" +#include "gtk/resources.h" +#include "gtk/hotlist.h" #define MENUPROTO(x) static gboolean nsgtk_on_##x##_activate( \ GtkMenuItem *widget, gpointer g) @@ -44,7 +43,6 @@ struct menu_events { GCallback handler; }; -static void nsgtk_hotlist_init_menu(void); /* file menu*/ MENUPROTO(export); @@ -92,74 +90,74 @@ static struct menu_events menu_events[] = { {NULL, NULL} }; -static struct nsgtk_treeview *hotlist_window; -static GtkBuilder *gladeFile; +static struct nsgtk_treeview *hotlist_treeview; +static GtkBuilder *hotlist_builder; GtkWindow *wndHotlist; +/** + * Connects menu events in the hotlist window. + */ +static void nsgtk_hotlist_init_menu(void) +{ + struct menu_events *event = menu_events; + GtkWidget *w; + + while (event->widget != NULL) { + w = GTK_WIDGET(gtk_builder_get_object(hotlist_builder, event->widget)); + if (w == NULL) { + LOG("Unable to connect menu widget ""%s""", event->widget); } else { + g_signal_connect(G_OBJECT(w), "activate", event->handler, hotlist_treeview); + } + event++; + } +} -/* exported interface docuemnted in gtk_hotlist.h */ -bool nsgtk_hotlist_init(const char *glade_file_location) +/* exported interface docuemnted in gtk/hotlist.h */ +nserror nsgtk_hotlist_init(void) { GtkWindow *window; GtkScrolledWindow *scrolled; GtkDrawingArea *drawing_area; + nserror res; - GError* error = NULL; - gladeFile = gtk_builder_new(); - if (!gtk_builder_add_from_file(gladeFile, glade_file_location, &error)) { - g_warning("Couldn't load builder file: %s", error->message); - g_error_free(error); - return false; + res = nsgtk_builder_new_from_resname("hotlist", &hotlist_builder); + if (res != NSERROR_OK) { + LOG("Cookie UI builder init failed"); + return res; } - gtk_builder_connect_signals(gladeFile, NULL); - - wndHotlist = GTK_WINDOW(gtk_builder_get_object(gladeFile, "wndHotlist")); + gtk_builder_connect_signals(hotlist_builder, NULL); + + wndHotlist = GTK_WINDOW(gtk_builder_get_object(hotlist_builder, "wndHotlist")); window = wndHotlist; - scrolled = GTK_SCROLLED_WINDOW(gtk_builder_get_object(gladeFile, + scrolled = GTK_SCROLLED_WINDOW(gtk_builder_get_object(hotlist_builder, "hotlistScrolled")); - drawing_area = GTK_DRAWING_AREA(gtk_builder_get_object(gladeFile, + drawing_area = GTK_DRAWING_AREA(gtk_builder_get_object(hotlist_builder, "hotlistDrawingArea")); tree_hotlist_path = nsoption_charp(hotlist_path); - hotlist_window = nsgtk_treeview_create(TREE_HOTLIST, window, + hotlist_treeview = nsgtk_treeview_create(TREE_HOTLIST, window, scrolled, drawing_area); - if (hotlist_window == NULL) - return false; + if (hotlist_treeview == NULL) { + return NSERROR_INIT_FAILED; + } #define CONNECT(obj, sig, callback, ptr) \ g_signal_connect(G_OBJECT(obj), (sig), G_CALLBACK(callback), (ptr)) CONNECT(window, "delete_event", gtk_widget_hide_on_delete, NULL); - CONNECT(window, "hide", nsgtk_tree_window_hide, hotlist_window); + CONNECT(window, "hide", nsgtk_tree_window_hide, hotlist_treeview); nsgtk_hotlist_init_menu(); - return true; + return NSERROR_OK; } -/** - * Connects menu events in the hotlist window. - */ -void nsgtk_hotlist_init_menu(void) -{ - struct menu_events *event = menu_events; - GtkWidget *w; - - while (event->widget != NULL) { - w = GTK_WIDGET(gtk_builder_get_object(gladeFile, event->widget)); - if (w == NULL) { - LOG("Unable to connect menu widget ""%s""", event->widget); } else { - g_signal_connect(G_OBJECT(w), "activate", event->handler, hotlist_window); - } - event++; - } -} /** @@ -167,8 +165,8 @@ void nsgtk_hotlist_init_menu(void) */ void nsgtk_hotlist_destroy(void) { - /* TODO: what about gladeFile? */ - nsgtk_treeview_destroy(hotlist_window); + /** \todo what about hotlist_builder? */ + nsgtk_treeview_destroy(hotlist_treeview); } diff --git a/gtk/hotlist.h b/gtk/hotlist.h index b2477bc9f..01e5a86c5 100644 --- a/gtk/hotlist.h +++ b/gtk/hotlist.h @@ -30,9 +30,11 @@ extern GtkWindow *wndHotlist; /** * Initialise the gtk specific hotlist (bookmarks) display. * - * \param glade_hotlist_file_location the path to the glade file for the hotlist + * \return NSERROR_OK on success else appropriate error code on faliure. */ -bool nsgtk_hotlist_init(const char *glade_hotlist_file_location); +nserror nsgtk_hotlist_init(void); + + void nsgtk_hotlist_destroy(void); #endif /* __NSGTK_HOTLIST_H__ */ diff --git a/gtk/login.c b/gtk/login.c index c237dec30..2de2996b3 100644 --- a/gtk/login.c +++ b/gtk/login.c @@ -30,7 +30,8 @@ #include "utils/utils.h" #include "desktop/browser.h" -#include "gtk/gui.h" +#include "gtk/resources.h" +#include "gtk/login.h" struct session_401 { nsurl *url; /**< URL being fetched */ @@ -65,28 +66,28 @@ void gui_401login_open(nsurl *url, const char *realm, lwc_string_unref(host); } +/* create a new instance of the login window, and get handles to all + * the widgets we're interested in. + */ void create_login_window(nsurl *url, lwc_string *host, const char *realm, nserror (*cb)(bool proceed, void *pw), void *cbpw) { struct session_401 *session; - - /* create a new instance of the login window, and get handles to all - * the widgets we're interested in. - */ - GtkWindow *wnd; GtkLabel *lhost, *lrealm; GtkEntry *euser, *epass; GtkButton *bok, *bcan; - GError* error = NULL; GtkBuilder* builder; + nserror res; - builder = gtk_builder_new (); - if (!gtk_builder_add_from_file(builder, glade_file_location->login, &error)) { - g_warning ("Couldn't load builder file: %s", error->message); - g_error_free (error); + res = nsgtk_builder_new_from_resname("login", &builder); + if (res != NSERROR_OK) { + LOG("Login UI builder init failed"); + return; } + gtk_builder_connect_signals(builder, NULL); + wnd = GTK_WINDOW(gtk_builder_get_object(builder, "wndLogin")); lhost = GTK_LABEL(gtk_builder_get_object(builder, "labelLoginHost")); lrealm = GTK_LABEL(gtk_builder_get_object(builder, "labelLoginRealm")); diff --git a/gtk/login.h b/gtk/login.h new file mode 100644 index 000000000..00c29000c --- /dev/null +++ b/gtk/login.h @@ -0,0 +1,31 @@ +/* + * 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 + * Login interfaces. + */ + +#ifndef __NSGTK_LOGIN_H__ +#define __NSGTK_LOGIN_H__ + +/** + * login window request. + */ +extern void gui_401login_open(struct nsurl *url, const char *realm, nserror (*cb)(bool proceed, void *pw), void *cbpw); + +#endif diff --git a/gtk/preferences.c b/gtk/preferences.c index 9ca8eb759..ba58bc905 100644 --- a/gtk/preferences.c +++ b/gtk/preferences.c @@ -34,6 +34,7 @@ #include "gtk/gui.h" #include "gtk/scaffolding.h" #include "gtk/theme.h" +#include "gtk/resources.h" #include "gtk/preferences.h" /* private prefs */ @@ -1039,9 +1040,9 @@ nsgtk_preferences_dialogPreferences_destroy(GtkDialog *dlg, struct ppref *priv) /* exported interface documented in gtk/preferences.h */ GtkWidget* nsgtk_preferences(struct browser_window *bw, GtkWindow *parent) { - GError *error = NULL; GtkBuilder *preferences_builder; struct ppref *priv = &ppref; + nserror res; priv->bw = bw; /* for setting "current" page */ @@ -1051,17 +1052,12 @@ GtkWidget* nsgtk_preferences(struct browser_window *bw, GtkWindow *parent) return GTK_WIDGET(priv->dialog); } - /* populate builder object */ - preferences_builder = gtk_builder_new(); - if (!gtk_builder_add_from_file(preferences_builder, - glade_file_location->options, - &error)) { - g_warning("Couldn't load builder file: %s", error->message); - g_error_free(error); + res = nsgtk_builder_new_from_resname("options", &preferences_builder); + if (res != NSERROR_OK) { + LOG("Preferences UI builder init failed"); return NULL; } - priv->dialog = gtk_builder_get_object(preferences_builder, "dialogPreferences"); if (priv->dialog == NULL) { diff --git a/gtk/res/netsurf.gresource.xml b/gtk/res/netsurf.gresource.xml new file mode 100644 index 000000000..fb384a86d --- /dev/null +++ b/gtk/res/netsurf.gresource.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<gresources> + <gresource prefix="/org/netsurf"> + <file>cookies.gtk2.ui</file> + <file>history.gtk3.ui</file> + <file>netsurf.gtk2.ui</file> + <file>password.gtk3.ui</file> + <file>toolbar.gtk2.ui</file> + <file>warning.gtk3.ui</file> + <file>cookies.gtk3.ui</file> + <file>hotlist.gtk2.ui</file> + <file>netsurf.gtk3.ui</file> + <file>ssl.gtk2.ui</file> + <file>toolbar.gtk3.ui</file> + <file>downloads.gtk2.ui</file> + <file>hotlist.gtk3.ui</file> + <file>options.gtk2.ui</file> + <file>ssl.gtk3.ui</file> + <file>viewdata.gtk2.ui</file> + <file>downloads.gtk3.ui</file> + <file>login.gtk2.ui</file> + <file>options.gtk3.ui</file> + <file>tabcontents.gtk2.ui</file> + <file>viewdata.gtk3.ui</file> + <file>history.gtk2.ui</file> + <file>login.gtk3.ui</file> + <file>password.gtk2.ui</file> + <file>tabcontents.gtk3.ui</file> + <file>warning.gtk2.ui</file> + <file>favicon.png</file> + </gresource> +</gresources> diff --git a/gtk/resources.c b/gtk/resources.c index e6ad951b8..d4e8b2056 100644 --- a/gtk/resources.c +++ b/gtk/resources.c @@ -20,11 +20,20 @@ * \file * Implementation of gtk builtin resource handling. * - * \todo resource handling in gtk3 has switched to using GResource + * 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" #ifdef __GNUC__ @@ -33,6 +42,41 @@ extern const guint8 menu_cursor_pixdata[] __attribute__ ((__aligned__ (4))); extern const guint8 menu_cursor_pixdata[]; #endif +enum nsgtk_resource_type_e { + NSGTK_RESOURCE_FILE, + NSGTK_RESOURCE_BUILTIN, +}; + +struct nsgtk_resource_s { + const char *name; + unsigned int len; + enum nsgtk_resource_type_e type; + char *path; +}; + +static struct nsgtk_resource_s ui_resource[] = { + { "netsurf", 7, NSGTK_RESOURCE_FILE, NULL }, + { "tabcontents", 10, NSGTK_RESOURCE_FILE, NULL }, + { "password", 8, NSGTK_RESOURCE_FILE, NULL }, + { "login", 5, NSGTK_RESOURCE_FILE, NULL }, + { "ssl", 3, NSGTK_RESOURCE_FILE, NULL }, + { "toolbar", 7, NSGTK_RESOURCE_FILE, NULL }, + { "downloads", 9, NSGTK_RESOURCE_FILE, NULL }, + { "history", 7, NSGTK_RESOURCE_FILE, NULL }, + { "options", 7, NSGTK_RESOURCE_FILE, NULL }, + { "hotlist", 7, NSGTK_RESOURCE_FILE, NULL }, + { "cookies", 7, NSGTK_RESOURCE_FILE, NULL }, + { "viewdata", 8, NSGTK_RESOURCE_FILE, NULL }, + { "warning", 7, NSGTK_RESOURCE_FILE, NULL }, + { NULL, 0, NSGTK_RESOURCE_FILE, NULL }, +}; + +static struct nsgtk_resource_s gen_resource[] = { + { "favicon.png", 11, NSGTK_RESOURCE_FILE, NULL }, + { NULL, 0, NSGTK_RESOURCE_FILE, NULL }, +}; + +/* exported interface documented in gtk/resources.h */ GdkCursor *nsgtk_create_menu_cursor(void) { GdkCursor *cursor = NULL; @@ -44,3 +88,243 @@ GdkCursor *nsgtk_create_menu_cursor(void) 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 ui_res A resource entry to initialise + */ +static nserror +init_resource(char **respath, struct nsgtk_resource_s *resource) +{ + int resnamelen; + char *resname; + +#ifdef WITH_GRESOURCE + gboolean present; + + 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_BUILTIN; + 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 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; +} + +#define SHOW_GRESOURCE + +/** + * Initialise UI resource table + * + */ +nserror nsgtk_init_resources(char **respath) +{ + struct nsgtk_resource_s *resource; + nserror res; + +#ifdef SHOW_GRESOURCE + 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 + + /* walk 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++; + } + + /* walk the general resource table and initialise all its members */ + resource = &gen_resource[0]; + while (resource->name != NULL) { + res = init_resource(respath, resource); + if (res != NSERROR_OK) { + return res; + } + resource++; + } + + + return NSERROR_OK; +} + +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; +} + +/* 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; + GError* error = NULL; + + resource = find_resource_from_name(resname, &gen_resource[0]); + if (resource->name == NULL) { + return NSERROR_NOT_FOUND; + } + + if (resource->type == NSGTK_RESOURCE_FILE) { + new_pixbuf = gdk_pixbuf_new_from_file(resource->path, &error); + } else { + new_pixbuf = gdk_pixbuf_new_from_resource(resource->path, &error); + } + if (new_pixbuf == NULL) { + LOG("Unable to create pixbuf from file for %s with path %s \"%s\"", + resource->name, resource->path, error->message); + g_error_free(error); + 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; +} diff --git a/gtk/resources.h b/gtk/resources.h index bc08e4727..7c3e73d9e 100644 --- a/gtk/resources.h +++ b/gtk/resources.h @@ -24,4 +24,36 @@ */ GdkCursor *nsgtk_create_menu_cursor(void); +nserror nsgtk_init_resources(char **respath); + +/** + * Create gtk builder object for the named ui resource + * + * Creating gtk builder objects from a named resource requires the + * source xml resource to be parsed. + * + * This creates a gtk builder instance using an identifier name which + * is mapped to the ui_resource table which must be initialised with + * nsgtk_init_resources() + * + * \param resname The resource name to construct for + * \param builder_out The builder result + * \return NSERROR_OK and builder_out updated or appropriate error code + */ +nserror nsgtk_builder_new_from_resname(const char *resname, GtkBuilder **builder_out); + + +/** + * Create gdk pixbuf for the named ui resource + * + * This creates a pixbuf using an identifier name which is mapped to + * the ui_resource table which must be initialised with + * nsgtk_init_resources() + * + * \param resname The resource name to construct for + * \param pixbuf_out The pixbuf result + * \return NSERROR_OK and pixbuf_out updated or appropriate error code + */ +nserror nsgdk_pixbuf_new_from_resname(const char *resname, GdkPixbuf **pixbuf_out); + #endif diff --git a/gtk/scaffolding.c b/gtk/scaffolding.c index 3151ba145..c19624257 100644 --- a/gtk/scaffolding.c +++ b/gtk/scaffolding.c @@ -71,6 +71,7 @@ #include "gtk/tabs.h" #include "gtk/schedule.h" #include "gtk/viewdata.h" +#include "gtk/resources.h" /** Macro to define a handler for menu, button and activate events. */ #define MULTIHANDLER(q)\ @@ -122,7 +123,7 @@ struct nsgtk_scaffolding { int toolbarbase; int historybase; - GtkBuilder *xml; + GtkBuilder *builder; struct gtk_history_window *history_window; @@ -2032,95 +2033,87 @@ void nsgtk_scaffolding_toolbars(struct nsgtk_scaffolding *g, int tbi) /* exported interface documented in gtk/scaffolding.h */ struct nsgtk_scaffolding *nsgtk_new_scaffolding(struct gui_window *toplevel) { - struct nsgtk_scaffolding *g; + struct nsgtk_scaffolding *gs; int i; GtkAccelGroup *group; - GError* error = NULL; - g = malloc(sizeof(*g)); - if (g == NULL) { + gs = malloc(sizeof(*gs)); + if (gs == NULL) { return NULL; } - LOG("Constructing a scaffold of %p for gui_window %p", g, toplevel); + LOG("Constructing a scaffold of %p for gui_window %p", gs, toplevel); - g->top_level = toplevel; + gs->top_level = toplevel; - /* load the window template from the glade xml file, and extract - * widget references from it for later use. - */ - g->xml = gtk_builder_new(); - if (!gtk_builder_add_from_file(g->xml, glade_file_location->netsurf, &error)) { - g_warning("Couldn't load builder file: \"%s\"", error->message); - g_error_free(error); - free(g); + /* Construct UI widgets */ + if (nsgtk_builder_new_from_resname("netsurf", &gs->builder) != NSERROR_OK) { + free(gs); return NULL; } - gtk_builder_connect_signals(g->xml, NULL); + gtk_builder_connect_signals(gs->builder, NULL); -/** Obtain a GTK widget handle from glade xml object */ -#define GET_WIDGET(x) GTK_WIDGET (gtk_builder_get_object(g->xml, (x))) +/** Obtain a GTK widget handle from UI builder object */ +#define GET_WIDGET(x) GTK_WIDGET (gtk_builder_get_object(gs->builder, (x))) - g->window = GTK_WINDOW(GET_WIDGET("wndBrowser")); - g->notebook = GTK_NOTEBOOK(GET_WIDGET("notebook")); - g->tool_bar = GTK_TOOLBAR(GET_WIDGET("toolbar")); + gs->window = GTK_WINDOW(GET_WIDGET("wndBrowser")); + gs->notebook = GTK_NOTEBOOK(GET_WIDGET("notebook")); + gs->tool_bar = GTK_TOOLBAR(GET_WIDGET("toolbar")); - g->search = malloc(sizeof(struct gtk_search)); - if (g->search == NULL) { - free(g); + gs->search = malloc(sizeof(struct gtk_search)); + if (gs->search == NULL) { + free(gs); return NULL; } - g->search->bar = GTK_TOOLBAR(GET_WIDGET("searchbar")); - g->search->entry = GTK_ENTRY(GET_WIDGET("searchEntry")); + gs->search->bar = GTK_TOOLBAR(GET_WIDGET("searchbar")); + gs->search->entry = GTK_ENTRY(GET_WIDGET("searchEntry")); - g->search->buttons[0] = GTK_TOOL_BUTTON(GET_WIDGET("searchBackButton")); - g->search->buttons[1] = GTK_TOOL_BUTTON(GET_WIDGET( - "searchForwardButton")); - g->search->buttons[2] = GTK_TOOL_BUTTON(GET_WIDGET( - "closeSearchButton")); - g->search->checkAll = GTK_CHECK_BUTTON(GET_WIDGET("checkAllSearch")); - g->search->caseSens = GTK_CHECK_BUTTON(GET_WIDGET("caseSensButton")); + gs->search->buttons[0] = GTK_TOOL_BUTTON(GET_WIDGET("searchBackButton")); + gs->search->buttons[1] = GTK_TOOL_BUTTON(GET_WIDGET("searchForwardButton")); + gs->search->buttons[2] = GTK_TOOL_BUTTON(GET_WIDGET("closeSearchButton")); + gs->search->checkAll = GTK_CHECK_BUTTON(GET_WIDGET("checkAllSearch")); + gs->search->caseSens = GTK_CHECK_BUTTON(GET_WIDGET("caseSensButton")); #undef GET_WIDGET /* allocate buttons */ for (i = BACK_BUTTON; i < PLACEHOLDER_BUTTON; i++) { - g->buttons[i] = calloc(1, sizeof(struct nsgtk_button_connect)); - if (g->buttons[i] == NULL) { + gs->buttons[i] = calloc(1, sizeof(struct nsgtk_button_connect)); + if (gs->buttons[i] == NULL) { for (i-- ; i >= BACK_BUTTON; i--) { - free(g->buttons[i]); + free(gs->buttons[i]); } - free(g); + free(gs); return NULL; } - g->buttons[i]->location = -1; - g->buttons[i]->sensitivity = true; + gs->buttons[i]->location = -1; + gs->buttons[i]->sensitivity = true; } /* here custom toolbutton adding code */ - g->offset = 0; - g->toolbarmem = 0; - g->toolbarbase = 0; - g->historybase = 0; - nsgtk_toolbar_customization_load(g); - nsgtk_toolbar_set_physical(g); + gs->offset = 0; + gs->toolbarmem = 0; + gs->toolbarbase = 0; + gs->historybase = 0; + nsgtk_toolbar_customization_load(gs); + nsgtk_toolbar_set_physical(gs); group = gtk_accel_group_new(); - gtk_window_add_accel_group(g->window, group); + gtk_window_add_accel_group(gs->window, group); - g->menu_bar = nsgtk_menu_bar_create(GTK_MENU_SHELL(gtk_builder_get_object(g->xml, "menubar")), group); + gs->menu_bar = nsgtk_menu_bar_create(GTK_MENU_SHELL(gtk_builder_get_object(gs->builder, "menubar")), group); /* set this window's size and position to what's in the options, or * or some sensible default if they're not set yet. */ if (nsoption_int(window_width) > 0) { - gtk_window_move(g->window, + gtk_window_move(gs->window, nsoption_int(window_x), nsoption_int(window_y)); - gtk_window_resize(g->window, + gtk_window_resize(gs->window, nsoption_int(window_width), nsoption_int(window_height)); } else { @@ -2128,7 +2121,7 @@ struct nsgtk_scaffolding *nsgtk_new_scaffolding(struct gui_window *toplevel) * 1024x768 displays, not being able to take into account * window furniture or panels. */ - gtk_window_set_default_size(g->window, 1000, 700); + gtk_window_set_default_size(gs->window, 1000, 700); } /* Default toolbar button type uses system defaults */ @@ -2164,137 +2157,151 @@ struct nsgtk_scaffolding *nsgtk_new_scaffolding(struct gui_window *toplevel) } } - nsgtk_scaffolding_toolbars(g, nsoption_int(button_type)); + nsgtk_scaffolding_toolbars(gs, nsoption_int(button_type)); - gtk_toolbar_set_show_arrow(g->tool_bar, TRUE); - gtk_widget_show_all(GTK_WIDGET(g->tool_bar)); - nsgtk_tab_init(g); + gtk_toolbar_set_show_arrow(gs->tool_bar, TRUE); + gtk_widget_show_all(GTK_WIDGET(gs->tool_bar)); + nsgtk_tab_init(gs); gtk_widget_set_size_request(GTK_WIDGET( - g->buttons[HISTORY_BUTTON]->button), 20, -1); + gs->buttons[HISTORY_BUTTON]->button), 20, -1); /* create the local history window to be associated with this browser */ - g->history_window = malloc(sizeof(struct gtk_history_window)); - g->history_window->g = g; - g->history_window->window = + gs->history_window = malloc(sizeof(struct gtk_history_window)); + gs->history_window->g = gs; + gs->history_window->window = GTK_WINDOW(gtk_window_new(GTK_WINDOW_TOPLEVEL)); - gtk_window_set_transient_for(g->history_window->window, g->window); - gtk_window_set_title(g->history_window->window, "NetSurf History"); - gtk_window_set_type_hint(g->history_window->window, + gtk_window_set_transient_for(gs->history_window->window, gs->window); + gtk_window_set_title(gs->history_window->window, "NetSurf History"); + gtk_window_set_type_hint(gs->history_window->window, GDK_WINDOW_TYPE_HINT_UTILITY); - g->history_window->scrolled = + gs->history_window->scrolled = GTK_SCROLLED_WINDOW(gtk_scrolled_window_new(0, 0)); - gtk_container_add(GTK_CONTAINER(g->history_window->window), - GTK_WIDGET(g->history_window->scrolled)); + gtk_container_add(GTK_CONTAINER(gs->history_window->window), + GTK_WIDGET(gs->history_window->scrolled)); - gtk_widget_show(GTK_WIDGET(g->history_window->scrolled)); - g->history_window->drawing_area = + gtk_widget_show(GTK_WIDGET(gs->history_window->scrolled)); + gs->history_window->drawing_area = GTK_DRAWING_AREA(gtk_drawing_area_new()); - gtk_widget_set_events(GTK_WIDGET(g->history_window->drawing_area), + gtk_widget_set_events(GTK_WIDGET(gs->history_window->drawing_area), GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK); - nsgtk_widget_override_background_color(GTK_WIDGET(g->history_window->drawing_area), + nsgtk_widget_override_background_color(GTK_WIDGET(gs->history_window->drawing_area), GTK_STATE_NORMAL, 0, 0xffff, 0xffff, 0xffff); - nsgtk_scrolled_window_add_with_viewport(g->history_window->scrolled, - GTK_WIDGET(g->history_window->drawing_area)); - gtk_widget_show(GTK_WIDGET(g->history_window->drawing_area)); + nsgtk_scrolled_window_add_with_viewport(gs->history_window->scrolled, + GTK_WIDGET(gs->history_window->drawing_area)); + gtk_widget_show(GTK_WIDGET(gs->history_window->drawing_area)); /* set up URL bar completion */ - g->url_bar_completion = gtk_entry_completion_new(); - gtk_entry_completion_set_match_func(g->url_bar_completion, + gs->url_bar_completion = gtk_entry_completion_new(); + gtk_entry_completion_set_match_func(gs->url_bar_completion, nsgtk_completion_match, NULL, NULL); - gtk_entry_completion_set_model(g->url_bar_completion, + gtk_entry_completion_set_model(gs->url_bar_completion, GTK_TREE_MODEL(nsgtk_completion_list)); - gtk_entry_completion_set_text_column(g->url_bar_completion, 0); - gtk_entry_completion_set_minimum_key_length(g->url_bar_completion, 1); - gtk_entry_completion_set_popup_completion(g->url_bar_completion, TRUE); - g_object_set(G_OBJECT(g->url_bar_completion), + gtk_entry_completion_set_text_column(gs->url_bar_completion, 0); + gtk_entry_completion_set_minimum_key_length(gs->url_bar_completion, 1); + gtk_entry_completion_set_popup_completion(gs->url_bar_completion, TRUE); + g_object_set(G_OBJECT(gs->url_bar_completion), "popup-set-width", TRUE, "popup-single-match", TRUE, NULL); /* set up the throbber. */ - g->throb_frame = 0; + gs->throb_frame = 0; #define CONNECT(obj, sig, callback, ptr) \ g_signal_connect(G_OBJECT(obj), (sig), G_CALLBACK(callback), (ptr)) /* connect history window signals to their handlers */ - nsgtk_connect_draw_event(GTK_WIDGET(g->history_window->drawing_area), + nsgtk_connect_draw_event(GTK_WIDGET(gs->history_window->drawing_area), G_CALLBACK(nsgtk_history_draw_event), - g->history_window); - /*CONNECT(g->history_window->drawing_area, "motion_notify_event", - nsgtk_history_motion_notify_event, g->history_window);*/ - CONNECT(g->history_window->drawing_area, "button_press_event", - nsgtk_history_button_press_event, g->history_window); - CONNECT(g->history_window->window, "delete_event", + gs->history_window); + /*CONNECT(gs->history_window->drawing_area, "motion_notify_event", + nsgtk_history_motion_notify_event, gs->history_window);*/ + CONNECT(gs->history_window->drawing_area, "button_press_event", + nsgtk_history_button_press_event, gs->history_window); + CONNECT(gs->history_window->window, "delete_event", gtk_widget_hide_on_delete, NULL); - g_signal_connect_after(g->notebook, "page-added", - G_CALLBACK(nsgtk_window_tabs_add), g); - g_signal_connect_after(g->notebook, "page-removed", - G_CALLBACK(nsgtk_window_tabs_remove), g); + g_signal_connect_after(gs->notebook, "page-added", + G_CALLBACK(nsgtk_window_tabs_add), gs); + g_signal_connect_after(gs->notebook, "page-removed", + G_CALLBACK(nsgtk_window_tabs_remove), gs); /* connect main window signals to their handlers. */ - CONNECT(g->window, "delete-event", scaffolding_window_delete_event, g); - CONNECT(g->window, "destroy", scaffolding_window_destroy, g); + CONNECT(gs->window, "delete-event", + scaffolding_window_delete_event, gs); + + CONNECT(gs->window, "destroy", scaffolding_window_destroy, gs); /* toolbar URL bar menu bar search bar signal handlers */ - CONNECT(g->menu_bar->edit_submenu->edit, "show", nsgtk_window_edit_menu_clicked, g); - CONNECT(g->menu_bar->edit_submenu->edit, "hide", nsgtk_window_edit_menu_hidden, g); - CONNECT(g->search->buttons[1], "clicked", - nsgtk_search_forward_button_clicked, g); - CONNECT(g->search->buttons[0], "clicked", - nsgtk_search_back_button_clicked, g); - CONNECT(g->search->entry, "changed", nsgtk_search_entry_changed, g); - CONNECT(g->search->entry, "activate", nsgtk_search_entry_activate, g); - CONNECT(g->search->entry, "key-press-event", nsgtk_search_entry_key, g); - CONNECT(g->search->buttons[2], "clicked", - nsgtk_search_close_button_clicked, g); - CONNECT(g->search->caseSens, "toggled", nsgtk_search_entry_changed, g); - - CONNECT(g->tool_bar, "popup-context-menu", - nsgtk_window_tool_bar_clicked, g); + CONNECT(gs->menu_bar->edit_submenu->edit, "show", + nsgtk_window_edit_menu_clicked, gs); + CONNECT(gs->menu_bar->edit_submenu->edit, "hide", + nsgtk_window_edit_menu_hidden, gs); + + CONNECT(gs->search->buttons[1], "clicked", + nsgtk_search_forward_button_clicked, gs); + + CONNECT(gs->search->buttons[0], "clicked", + nsgtk_search_back_button_clicked, gs); + + CONNECT(gs->search->entry, "changed", nsgtk_search_entry_changed, gs); + + CONNECT(gs->search->entry, "activate", nsgtk_search_entry_activate, gs); + + CONNECT(gs->search->entry, "key-press-event", + nsgtk_search_entry_key, gs); + + CONNECT(gs->search->buttons[2], "clicked", + nsgtk_search_close_button_clicked, gs); + + CONNECT(gs->search->caseSens, "toggled", + nsgtk_search_entry_changed, gs); + + CONNECT(gs->tool_bar, "popup-context-menu", + nsgtk_window_tool_bar_clicked, gs); /* create popup menu */ - g->menu_popup = nsgtk_new_scaffolding_popup(g, group); + gs->menu_popup = nsgtk_new_scaffolding_popup(gs, group); - g->link_menu = nsgtk_new_scaffolding_link_popup(g, group); + gs->link_menu = nsgtk_new_scaffolding_link_popup(gs, group); /* set up the menu signal handlers */ - nsgtk_scaffolding_toolbar_init(g); - nsgtk_toolbar_connect_all(g); - nsgtk_attach_menu_handlers(g); + nsgtk_scaffolding_toolbar_init(gs); + nsgtk_toolbar_connect_all(gs); + nsgtk_attach_menu_handlers(gs); - nsgtk_scaffolding_initial_sensitivity(g); + nsgtk_scaffolding_initial_sensitivity(gs); - g->fullscreen = false; + gs->fullscreen = false; /* attach to the list */ - if (scaf_list) - scaf_list->prev = g; - g->next = scaf_list; - g->prev = NULL; - scaf_list = g; + if (scaf_list) { + scaf_list->prev = gs; + } + gs->next = scaf_list; + gs->prev = NULL; + scaf_list = gs; /* call functions that need access from the list */ nsgtk_theme_init(); - nsgtk_theme_implement(g); + nsgtk_theme_implement(gs); /* set web search provider */ search_web_select_provider(nsoption_int(search_provider)); /* finally, show the window. */ - gtk_widget_show(GTK_WIDGET(g->window)); + gtk_widget_show(GTK_WIDGET(gs->window)); LOG("creation complete"); - return g; + return gs; } /* exported function documented in gtk/scaffolding.h */ diff --git a/gtk/ssl_cert.c b/gtk/ssl_cert.c index 3c00d71c5..742029f83 100644 --- a/gtk/ssl_cert.c +++ b/gtk/ssl_cert.c @@ -19,14 +19,14 @@ #include <stdlib.h> #include <gtk/gtk.h> -#include "utils/errors.h" +#include "utils/log.h" #include "utils/nsurl.h" #include "desktop/tree.h" #include "desktop/sslcert_viewer.h" -#include "gtk/gui.h" #include "gtk/treeview.h" #include "gtk/scaffolding.h" +#include "gtk/resources.h" #include "gtk/ssl_cert.h" @@ -75,9 +75,9 @@ void gtk_cert_verify(nsurl *url, const struct ssl_cert_info *certs, GtkDialog *dlg; GtkScrolledWindow *scrolled; GtkDrawingArea *drawing_area; - GError *error = NULL; GtkBuilder *builder; GtkWindow *gtk_parent; + nserror res; /* state while dlg is open */ session = calloc(sizeof(void *), 3); @@ -85,15 +85,16 @@ void gtk_cert_verify(nsurl *url, const struct ssl_cert_info *certs, return; } - builder = gtk_builder_new(); - if (!gtk_builder_add_from_file(builder, glade_file_location->ssl, &error)) { - g_warning("Couldn't load builder file: %s", error->message); - g_error_free(error); - + res = nsgtk_builder_new_from_resname("ssl", &builder); + if (res != NSERROR_OK) { + LOG("SSL UI builder init failed"); free(session); + cb(false, cbpw); return; } + gtk_builder_connect_signals(builder, NULL); + sslcert_viewer_create_session_data(num, url, cb, cbpw, certs, &data); ssl_current_session = data; @@ -106,7 +107,6 @@ void gtk_cert_verify(nsurl *url, const struct ssl_cert_info *certs, scrolled = GTK_SCROLLED_WINDOW(gtk_builder_get_object(builder, "SSLScrolled")); drawing_area = GTK_DRAWING_AREA(gtk_builder_get_object(builder, "SSLDrawingArea")); - ssl_window = nsgtk_treeview_create(TREE_SSLCERT, GTK_WINDOW(dlg), scrolled, drawing_area); diff --git a/gtk/toolbar.c b/gtk/toolbar.c index 35ff25ccc..2345f565f 100644 --- a/gtk/toolbar.c +++ b/gtk/toolbar.c @@ -25,7 +25,6 @@ #include "utils/messages.h" #include "utils/utils.h" -#include "gtk/toolbar.h" #include "gtk/gui.h" #include "gtk/scaffolding.h" #include "gtk/search.h" @@ -33,6 +32,8 @@ #include "gtk/throbber.h" #include "gtk/window.h" #include "gtk/compat.h" +#include "gtk/resources.h" +#include "gtk/toolbar.h" static GtkTargetEntry entry = {(char *)"nsgtk_button_data", GTK_TARGET_SAME_APP, 0}; @@ -45,7 +46,7 @@ struct nsgtk_toolbar_custom_store { GtkWidget *widgetvbox; GtkWidget *currentbar; char numberh; /* current horizontal location while adding */ - GtkBuilder *glade; /* button widgets to store */ + GtkBuilder *builder; /* button widgets to store */ int buttonlocations[PLACEHOLDER_BUTTON]; int currentbutton; bool fromstore; @@ -727,30 +728,29 @@ nsgtk_toolbar_store_action(GtkWidget *widget, GdkDragContext *gdc, static void nsgtk_toolbar_window_open(struct nsgtk_scaffolding *g) { int x = 0, y = 0; - GError* error = NULL; - struct nsgtk_theme *theme = - nsgtk_theme_load(GTK_ICON_SIZE_LARGE_TOOLBAR); + struct nsgtk_theme *theme; + nserror res; + + theme = nsgtk_theme_load(GTK_ICON_SIZE_LARGE_TOOLBAR); if (theme == NULL) { warn_user(messages_get("NoMemory"), 0); nsgtk_toolbar_cancel_clicked(NULL, g); return; } - window->glade = gtk_builder_new(); - if (!gtk_builder_add_from_file(window->glade, - glade_file_location->toolbar, - &error)) { - g_warning ("Couldn't load builder file: %s", error->message); - g_error_free (error); + res = nsgtk_builder_new_from_resname("toolbar", &window->builder); + if (res != NSERROR_OK) { + LOG("Toolbar UI builder init failed"); warn_user(messages_get("NoMemory"), 0); nsgtk_toolbar_cancel_clicked(NULL, g); free(theme); return; } - gtk_builder_connect_signals(window->glade, NULL); + gtk_builder_connect_signals(window->builder, NULL); - window->window = GTK_WIDGET(gtk_builder_get_object(window->glade, "toolbarwindow")); + window->window = GTK_WIDGET(gtk_builder_get_object(window->builder, + "toolbarwindow")); if (window->window == NULL) { warn_user(messages_get("NoMemory"), 0); nsgtk_toolbar_cancel_clicked(NULL, g); @@ -758,7 +758,8 @@ static void nsgtk_toolbar_window_open(struct nsgtk_scaffolding *g) return; } - window->widgetvbox = GTK_WIDGET(gtk_builder_get_object(window->glade, "widgetvbox")); + window->widgetvbox = GTK_WIDGET(gtk_builder_get_object(window->builder, + "widgetvbox")); if (window->widgetvbox == NULL) { warn_user(messages_get("NoMemory"), 0); nsgtk_toolbar_cancel_clicked(NULL, g); @@ -767,7 +768,7 @@ static void nsgtk_toolbar_window_open(struct nsgtk_scaffolding *g) } window->numberh = NSGTK_STORE_WIDTH; /* preset to width [in buttons] of */ - /* store to cause creation of a new toolbar */ + /* store to cause creation of a new toolbar */ window->currentbutton = -1; /* load toolbuttons */ /* add toolbuttons to window */ @@ -776,44 +777,57 @@ static void nsgtk_toolbar_window_open(struct nsgtk_scaffolding *g) if (i == URL_BAR_ITEM) continue; window->store_buttons[i] = - nsgtk_toolbar_make_widget(g, i, theme); + nsgtk_toolbar_make_widget(g, i, theme); if (window->store_buttons[i] == NULL) { warn_user(messages_get("NoMemory"), 0); continue; } nsgtk_toolbar_add_store_widget(window->store_buttons[i]); g_signal_connect(window->store_buttons[i], "drag-data-get", - G_CALLBACK( - nsgtk_scaffolding_button(g, i)->dataplus), g); + G_CALLBACK( + nsgtk_scaffolding_button(g, i)->dataplus), g); } free(theme); + gtk_window_set_transient_for(GTK_WINDOW(window->window), - nsgtk_scaffolding_window(g)); + nsgtk_scaffolding_window(g)); gtk_window_set_title(GTK_WINDOW(window->window), messages_get( - "gtkToolBarTitle")); + "gtkToolBarTitle")); gtk_window_set_accept_focus(GTK_WINDOW(window->window), FALSE); gtk_drag_dest_set(GTK_WIDGET(window->window), GTK_DEST_DEFAULT_MOTION | - GTK_DEST_DEFAULT_DROP, &entry, 1, GDK_ACTION_COPY); + GTK_DEST_DEFAULT_DROP, &entry, 1, GDK_ACTION_COPY); gtk_widget_show_all(window->window); gtk_window_set_position(GTK_WINDOW(window->window), - GTK_WIN_POS_CENTER_ON_PARENT); + GTK_WIN_POS_CENTER_ON_PARENT); gtk_window_get_position(nsgtk_scaffolding_window(g), &x, &y); gtk_window_move(GTK_WINDOW(window->window), x, y + 100); - g_signal_connect(GTK_WIDGET(gtk_builder_get_object(window->glade, "cancelbutton")), + + g_signal_connect(GTK_WIDGET(gtk_builder_get_object(window->builder, + "cancelbutton")), "clicked", G_CALLBACK(nsgtk_toolbar_cancel_clicked), g); - g_signal_connect(GTK_WIDGET(gtk_builder_get_object(window->glade, "okbutton")), - "clicked", G_CALLBACK(nsgtk_toolbar_persist), g); - g_signal_connect(GTK_WIDGET(gtk_builder_get_object(window->glade, "resetbutton")), - "clicked", G_CALLBACK(nsgtk_toolbar_reset), g); + g_signal_connect(GTK_WIDGET(gtk_builder_get_object(window->builder, + "okbutton")), + "clicked", + G_CALLBACK(nsgtk_toolbar_persist), + g); + + g_signal_connect(GTK_WIDGET(gtk_builder_get_object(window->builder, + "resetbutton")), + "clicked", + G_CALLBACK(nsgtk_toolbar_reset), + g); + g_signal_connect(window->window, "delete-event", - G_CALLBACK(nsgtk_toolbar_delete), g); + G_CALLBACK(nsgtk_toolbar_delete), g); + g_signal_connect(window->window, "drag-drop", - G_CALLBACK(nsgtk_toolbar_store_return), g); + G_CALLBACK(nsgtk_toolbar_store_return), g); + g_signal_connect(window->window, "drag-motion", - G_CALLBACK(nsgtk_toolbar_store_action), g); + G_CALLBACK(nsgtk_toolbar_store_action), g); } /** diff --git a/gtk/viewdata.c b/gtk/viewdata.c index 94dc5c573..7cd640fa2 100644 --- a/gtk/viewdata.c +++ b/gtk/viewdata.c @@ -45,7 +45,7 @@ #include "gtk/about.h" #include "gtk/fetch.h" #include "gtk/compat.h" -#include "gtk/gui.h" +#include "gtk/resources.h" #include "gtk/viewdata.h" struct nsgtk_viewdata_ctx { @@ -351,7 +351,6 @@ window_init(const char *title, char *ndata, size_t ndata_len) { - GError* error = NULL; GtkWindow *window; GtkWidget *cutbutton; GtkWidget *pastebutton; @@ -361,30 +360,24 @@ window_init(const char *title, PangoFontDescription *fontdesc; GtkTextBuffer *tb; struct nsgtk_viewdata_ctx *newctx; + nserror res; newctx = malloc(sizeof(struct nsgtk_viewdata_ctx)); if (newctx == NULL) { return NSERROR_NOMEM; } - newctx->builder = gtk_builder_new(); - if (newctx->builder == NULL) { + res = nsgtk_builder_new_from_resname("viewdata", &newctx->builder); + if (res != NSERROR_OK) { + LOG("Viewdata UI builder init failed"); free(newctx); - return NSERROR_INIT_FAILED; - } - - if (!gtk_builder_add_from_file(newctx->builder, - glade_file_location->viewdata, - &error)) { - LOG("Couldn't load builder file: %s", error->message); - g_error_free(error); - free(newctx); - return NSERROR_INIT_FAILED; + return res; } + gtk_builder_connect_signals(newctx->builder, NULL); - window = GTK_WINDOW(gtk_builder_get_object(newctx->builder, "ViewDataWindow")); - + window = GTK_WINDOW(gtk_builder_get_object(newctx->builder, + "ViewDataWindow")); if (window == NULL) { LOG("Unable to find window in builder "); diff --git a/gtk/window.c b/gtk/window.c index 239c01e4f..481ae3b1b 100644 --- a/gtk/window.c +++ b/gtk/window.c @@ -736,25 +736,24 @@ gui_window_create(struct browser_window *bw, struct gui_window *existing, gui_window_create_flags flags) { - struct gui_window *g; /* what is being creating to return */ - GError* error = NULL; + struct gui_window *g; /* what is being created to return */ bool tempback; - GtkBuilder* xml; - - /* open builder file first to ease error handling on faliure */ - xml = gtk_builder_new(); - if (!gtk_builder_add_from_file(xml, - glade_file_location->tabcontents, - &error)) { - g_warning ("Couldn't load builder file: %s", error->message); - g_error_free(error); + GtkBuilder* tab_builder; + + nserror res; + + res = nsgtk_builder_new_from_resname("tabcontents", &tab_builder); + if (res != NSERROR_OK) { + LOG("Tab contents UI builder init failed"); return NULL; } + gtk_builder_connect_signals(tab_builder, NULL); + g = calloc(1, sizeof(*g)); if (!g) { warn_user("NoMemory", 0); - g_object_unref(xml); + g_object_unref(tab_builder); return NULL; } @@ -778,15 +777,15 @@ gui_window_create(struct browser_window *bw, if (g->scaffold == NULL) { warn_user("NoMemory", 0); free(g); - g_object_unref(xml); + g_object_unref(tab_builder); return NULL; } /* Construct our primary elements */ - g->container = GTK_WIDGET(gtk_builder_get_object(xml, "tabContents")); - g->layout = GTK_LAYOUT(gtk_builder_get_object(xml, "layout")); - g->status_bar = GTK_LABEL(gtk_builder_get_object(xml, "status_bar")); - g->paned = GTK_PANED(gtk_builder_get_object(xml, "hpaned1")); + g->container = GTK_WIDGET(gtk_builder_get_object(tab_builder, "tabContents")); + g->layout = GTK_LAYOUT(gtk_builder_get_object(tab_builder, "layout")); + g->status_bar = GTK_LABEL(gtk_builder_get_object(tab_builder, "status_bar")); + g->paned = GTK_PANED(gtk_builder_get_object(tab_builder, "hpaned1")); g->input_method = gtk_im_multicontext_new(); @@ -876,10 +875,10 @@ gui_window_create(struct browser_window *bw, } nsgtk_tab_add(g, g->container, tempback); - /* safe to drop the reference to the xml as the container is + /* safe to drop the reference to the tab_builder as the container is * referenced by the notebook now. */ - g_object_unref(xml); + g_object_unref(tab_builder); return g; } |