summaryrefslogtreecommitdiff
path: root/gtk/gui.c
diff options
context:
space:
mode:
authorVincent Sanders <vince@kyllikki.org>2015-06-13 11:31:23 +0100
committerVincent Sanders <vince@kyllikki.org>2015-06-17 21:35:40 +0100
commit8ef292b9caf5cae2197493a87480723138f10344 (patch)
treefa39583104ab806b81f382eb85bc9f5a05331dfd /gtk/gui.c
parent16fbb97dbb1688fd9b6f19546792b4173bc30bf1 (diff)
downloadnetsurf-8ef292b9caf5cae2197493a87480723138f10344.tar.gz
netsurf-8ef292b9caf5cae2197493a87480723138f10344.tar.bz2
Change GTK UI builder handling to use resource API
GTK UI builder resources have till now been exclusively stored on disc requiring netsurf to ship numerous additional resource files. This requires going to disc every time a UI action is performed which can become a lot of unwanted file handling. GLib/GTK has moved towards GResource handling for such resources instead. It now seems that migrating to this style of usage is expected and indeed the only portable way to include pixbufs. This introduces an API to hide the various implementation details of how resources are handled from the rest of the codebase.
Diffstat (limited to 'gtk/gui.c')
-rw-r--r--gtk/gui.c204
1 files changed, 75 insertions, 129 deletions
diff --git a/gtk/gui.c b/gtk/gui.c
index b8d8fc152..eb7d2a2cd 100644
--- a/gtk/gui.c
+++ b/gtk/gui.c
@@ -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();