summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.sources12
-rw-r--r--desktop/options.c2
-rw-r--r--desktop/selection.c2
-rw-r--r--gtk/dialogs/gtk_about.c61
-rw-r--r--gtk/dialogs/gtk_about.h30
-rw-r--r--gtk/dialogs/gtk_options.c348
-rw-r--r--gtk/dialogs/gtk_options.h (renamed from gtk/gtk_options.h)7
-rw-r--r--gtk/gtk_gui.c16
-rw-r--r--gtk/gtk_gui.h1
-rw-r--r--gtk/gtk_options.c253
-rw-r--r--gtk/gtk_scaffolding.c238
-rw-r--r--gtk/gtk_selection.c97
-rw-r--r--gtk/gtk_selection.h25
-rw-r--r--gtk/gtk_window.c172
-rw-r--r--gtk/gtk_window.h39
-rw-r--r--gtk/res/license332
-rw-r--r--gtk/res/netsurf.glade2264
-rw-r--r--gtk/res/options.glade1520
18 files changed, 2935 insertions, 2484 deletions
diff --git a/Makefile.sources b/Makefile.sources
index a65ecc8a0..3ac1298f5 100644
--- a/Makefile.sources
+++ b/Makefile.sources
@@ -49,11 +49,15 @@ S_RISCOS := 401login.c artworks.c assert.c awrender.s bitmap.c buffer.c \
con_theme.c)
S_RISCOS := $(addprefix riscos/,$(S_RISCOS))
+# S_DIALOGS are sources related to dialogs but required only
+# for the GTK build
+S_DIALOGS := gtk_options.c gtk_about.c
+S_DIALOGS := $(addprefix gtk/dialogs/,$(S_DIALOGS))
+
# S_GTK are sources purely for the GTK build
S_GTK := font_pango.c gtk_bitmap.c gtk_gui.c gtk_schedule.c \
- gtk_thumbnail.c gtk_options.c \
- gtk_plotters.c gtk_treeview.c gtk_scaffolding.c gtk_completion.c \
- gtk_login.c gtk_throbber.c \
+ gtk_thumbnail.c gtk_plotters.c gtk_treeview.c gtk_scaffolding.c \
+ gtk_completion.c gtk_login.c gtk_throbber.c gtk_selection.c \
gtk_history.c gtk_window.c gtk_filetype.c gtk_download.c
S_GTK := $(addprefix gtk/,$(S_GTK))
@@ -123,7 +127,7 @@ EXETARGET := !NetSurf/!RunImage$(EXEEXT)
endif
ifeq ($(TARGET),gtk)
-SOURCES := $(S_COMMON) $(S_IMAGE) $(S_BROWSER) $(S_GTK)
+SOURCES := $(S_COMMON) $(S_IMAGE) $(S_BROWSER) $(S_GTK) $(S_DIALOGS)
EXETARGET := nsgtk
endif
diff --git a/desktop/options.c b/desktop/options.c
index 9a1111c83..b7b0d74a9 100644
--- a/desktop/options.c
+++ b/desktop/options.c
@@ -166,7 +166,7 @@ struct {
{ "http_proxy", OPTION_BOOL, &option_http_proxy },
{ "http_proxy_host", OPTION_STRING, &option_http_proxy_host },
{ "http_proxy_port", OPTION_INTEGER, &option_http_proxy_port },
- { "http_proxy_auth", OPTION_BOOL, &option_http_proxy_auth },
+ { "http_proxy_auth", OPTION_INTEGER, &option_http_proxy_auth },
{ "http_proxy_auth_user", OPTION_STRING, &option_http_proxy_auth_user },
{ "http_proxy_auth_pass", OPTION_STRING, &option_http_proxy_auth_pass },
{ "font_size", OPTION_INTEGER, &option_font_size },
diff --git a/desktop/selection.c b/desktop/selection.c
index f193e2376..74ae3165f 100644
--- a/desktop/selection.c
+++ b/desktop/selection.c
@@ -262,7 +262,7 @@ bool selection_click(struct selection *s, browser_mouse_state mouse,
}
else if (!modkeys) {
if (mouse & BROWSER_MOUSE_DRAG_1) {
-
+
/* start new selection drag */
selection_clear(s, true);
diff --git a/gtk/dialogs/gtk_about.c b/gtk/dialogs/gtk_about.c
new file mode 100644
index 000000000..d97d13d65
--- /dev/null
+++ b/gtk/dialogs/gtk_about.c
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2008 Mike Lester <element3260@gmail.com>
+ *
+ * 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/>.
+ */
+
+#include "gtk/gtk_gui.h"
+#include "gtk/dialogs/gtk_about.h"
+#include "desktop/browser.h"
+
+GtkAboutDialog* about_dialog;
+
+static gchar *authors[] = {"John-Mark Bell", "James Bursa",
+ "Rob Kendrick", "Adrian Lees", "Vincent Sanders", "Daniel Silverstone",
+ "Richard Wilson", "\nContributors:", "Kevin Bagust", "Stefaan Claes",
+ "Matthew Hambley", "Rob Jackson", "Jeffrey Lee", "Phil Mellor",
+ "Philip Pemberton", "Darren Salt", "Andrew Timmins", "John Tytgat",
+ "Chris Williams", "\nGoogle Summer of Code Contributors:", "Adam Blokus",
+ "Sean Fox", "Michael Lester", "Andrew Sidwell", NULL};
+static gchar *translators = "Sebastian Barthel \nBruno D'Arcangeli \nGerard van Katwijk \nJérôme Mathevet \nSimon Voortman.";
+static gchar *artists[] = {"Michael Drake", "\nContributors:",
+ "Andrew Duffell", "John Duffell", "Richard Hallas", "Phil Mellor", NULL};
+static gchar *documenters[] = {"John-Mark Bell", "James Bursa", "Michael Drake", "Richard Wilson", "\nContributors:", "James Shaw", NULL};
+
+static gchar *name = "NetSurf";
+static gchar *description = "Small as a mouse, fast as a cheetah, and available for free.\nNetsurf is a web browser for RISC OS and UNIX-like platforms.";
+static gchar *url = "http://www.netsurf-browser.org";
+static gchar *url_label = "NetSurf Website";
+static gchar *copyright = "Copyright © 2003 - 2008 The NetSurf Developers";
+
+static gchar* licence = "licence";
+
+static void launch_url (GtkAboutDialog *about_dialog, const gchar *url, gpointer data){
+ struct browser_window *bw = data;
+ browser_window_go(bw, url, 0, true);
+ }
+
+void nsgtk_about_dialog_init(GtkWindow *parent, struct browser_window *bw, const char *version) {
+ g_file_get_contents(g_strconcat(res_dir_location, licence, NULL), &licence, NULL, NULL);
+ gtk_about_dialog_set_url_hook (launch_url, (gpointer) bw, NULL);
+
+ gtk_show_about_dialog(parent, "artists", artists, "authors", authors,
+ "comments", description,"copyright", copyright, "documenters", documenters,
+ "license", licence,
+ "program-name", name, "translator-credits", translators,
+ "version", version, "website", url, "website-label", url_label,
+ "wrap-license", FALSE, NULL);
+}
+
diff --git a/gtk/dialogs/gtk_about.h b/gtk/dialogs/gtk_about.h
new file mode 100644
index 000000000..35e6be80c
--- /dev/null
+++ b/gtk/dialogs/gtk_about.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2008 Rob Kendrick <rjek@rjek.com>
+ *
+ * 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/>.
+ */
+
+#ifndef NETSURF_GTK_ABOUT_H
+#define NETSURF_GTK_ABOUT_H
+
+#include <gtk/gtk.h>
+
+#include "gtk/gtk_gui.h"
+#include "desktop/netsurf.h"
+#include "desktop/browser.h"
+
+void nsgtk_about_dialog_init(GtkWindow *parent, struct browser_window *bw, const char *version);
+
+#endif
diff --git a/gtk/dialogs/gtk_options.c b/gtk/dialogs/gtk_options.c
new file mode 100644
index 000000000..8a85c0ae6
--- /dev/null
+++ b/gtk/dialogs/gtk_options.c
@@ -0,0 +1,348 @@
+/*
+ * Copyright 2006 Rob Kendrick <rjek@rjek.com>
+ *
+ * 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/>.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <gtk/gtk.h>
+#include <glade/glade.h>
+#include "utils/log.h"
+#include "desktop/options.h"
+#include "gtk/options.h"
+#include "gtk/gtk_gui.h"
+#include "gtk/gtk_scaffolding.h"
+#include "gtk/dialogs/gtk_options.h"
+#include "gtk/gtk_window.h"
+
+GtkDialog *wndPreferences;
+GladeXML *gladeFile;
+gboolean is_initialized = FALSE;
+gchar *glade_location = "options.glade";
+struct browser_window *current_browser;
+
+char *proxy_port = NULL;
+int proxy_type;
+float animation_delay;
+
+/* Declares both widget and callback */
+#define DECLARE(x) GtkWidget *x; gboolean on_##x##_changed( \
+ GtkWidget *widget, gpointer data)
+
+DECLARE(entryHomePageURL);
+DECLARE(setCurrentPage);
+DECLARE(setDefaultPage);
+DECLARE(checkHideAdverts);
+DECLARE(checkDisablePopups);
+DECLARE(checkDisablePlugins);
+DECLARE(spinHistoryAge);
+DECLARE(checkHoverURLs);
+DECLARE(checkRequestOverwrite);
+DECLARE(checkDisplayRecentURLs);
+DECLARE(checkSendReferer);
+
+DECLARE(comboProxyType);
+DECLARE(entryProxyHost);
+DECLARE(entryProxyPort);
+DECLARE(entryProxyUser);
+DECLARE(entryProxyPassword);
+DECLARE(spinMaxFetchers);
+DECLARE(spinFetchesPerHost);
+DECLARE(spinCachedConnections);
+
+DECLARE(checkResampleImages);
+DECLARE(spinAnimationSpeed);
+DECLARE(checkDisableAnimations);
+
+DECLARE(fontSansSerif);
+DECLARE(fontSerif);
+DECLARE(fontMonospace);
+DECLARE(fontCursive);
+DECLARE(fontFantasy);
+DECLARE(comboDefault);
+DECLARE(spinDefaultSize);
+DECLARE(spinMinimumSize);
+DECLARE(fontPreview);
+
+DECLARE(spinMemoryCacheSize);
+DECLARE(spinDiscCacheAge);
+
+/* Used when the feature is not implemented yet */
+#define FIND_WIDGET(x) (x) = glade_xml_get_widget(gladeFile, #x); \
+ if ((x) == NULL) LOG(("Unable to find widget '%s'!", #x))
+
+/* Assigns widget and connects it to its callback function */
+#define CONNECT(x, y) g_signal_connect(G_OBJECT(x), y, \
+ G_CALLBACK(on_##x##_changed), NULL)
+
+GtkDialog* nsgtk_options_init(struct browser_window *bw, GtkWindow *parent) {
+ glade_location = g_strconcat(res_dir_location, glade_location, NULL);
+ LOG(("Using '%s' as Glade template file", glade_location));
+ gladeFile = glade_xml_new(glade_location, NULL, NULL);
+
+ current_browser = bw;
+ wndPreferences = GTK_DIALOG(glade_xml_get_widget(gladeFile,
+ "dlgPreferences"));
+ gtk_window_set_transient_for (GTK_WINDOW(wndPreferences), parent);
+
+ /* set the widgets to reflect the current options */
+ nsgtk_options_load();
+
+ /* Connect all widgets to their appropriate callbacks */
+ CONNECT(entryHomePageURL, "focus-out-event");
+ CONNECT(setCurrentPage, "clicked");
+ CONNECT(setDefaultPage, "clicked");
+ CONNECT(checkHideAdverts, "toggled");
+ //CONNECT(checkDisablePopups, "toggled");
+ //CONNECT(checkDisablePlugins, "toggled");
+ //CONNECT(spinHistoryAge, "focus-out-event");
+ //CONNECT(checkHoverURLs, "toggled");
+ //CONNECT(checkRequestOverwrite, "toggled");
+ CONNECT(checkDisplayRecentURLs, "toggled");
+ CONNECT(checkSendReferer, "toggled");
+
+ CONNECT(comboProxyType, "changed");
+ CONNECT(entryProxyHost, "focus-out-event");
+ CONNECT(entryProxyPort, "focus-out-event");
+ CONNECT(entryProxyUser, "focus-out-event");
+ CONNECT(entryProxyPassword, "focus-out-event");
+ CONNECT(spinMaxFetchers, "value-changed");
+ CONNECT(spinFetchesPerHost, "value-changed");
+ CONNECT(spinCachedConnections, "value-changed");
+
+ CONNECT(checkResampleImages, "toggled");
+ CONNECT(spinAnimationSpeed, "value-changed");
+ CONNECT(checkDisableAnimations, "toggled");
+
+ CONNECT(fontSansSerif, "font-set");
+ CONNECT(fontSerif, "font-set");
+ CONNECT(fontMonospace, "font-set");
+ CONNECT(fontCursive, "font-set");
+ CONNECT(fontFantasy, "font-set");
+ CONNECT(comboDefault, "changed");
+ CONNECT(spinDefaultSize, "value-changed");
+ CONNECT(spinMinimumSize, "value-changed");
+ CONNECT(fontPreview, "clicked");
+
+ CONNECT(spinMemoryCacheSize, "value-changed");
+ CONNECT(spinDiscCacheAge, "value-changed");
+
+ g_signal_connect(G_OBJECT(wndPreferences), "response",
+ G_CALLBACK (dialog_response_handler), NULL);
+
+ g_signal_connect(G_OBJECT(wndPreferences), "delete-event",
+ G_CALLBACK (on_dialog_close), (gpointer)TRUE);
+
+ g_signal_connect(G_OBJECT(wndPreferences), "destroy",
+ G_CALLBACK (on_dialog_close), (gpointer)FALSE);
+
+ gtk_widget_show(GTK_WIDGET(wndPreferences));
+
+ return wndPreferences;
+}
+
+#define SET_ENTRY(x, y) (x) = glade_xml_get_widget(gladeFile, #x); \
+ gtk_entry_set_text(GTK_ENTRY((x)), (y))
+#define SET_SPIN(x, y) (x) = glade_xml_get_widget(gladeFile, #x); \
+ gtk_spin_button_set_value(GTK_SPIN_BUTTON((x)), (y))
+#define SET_CHECK(x, y) (x) = glade_xml_get_widget(gladeFile, #x); \
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON((x)), (y))
+#define SET_COMBO(x, y) (x) = glade_xml_get_widget(gladeFile, #x); \
+ gtk_combo_box_set_active(GTK_COMBO_BOX((x)), (y))
+#define SET_FONT(x, y) (x) = glade_xml_get_widget(gladeFile, #x); \
+ gtk_font_button_set_font_name(GTK_FONT_BUTTON((x)), (y))
+#define SET_BUTTON(x) (x) = glade_xml_get_widget(gladeFile, #x);
+
+void nsgtk_options_load(void) {
+ char b[20];
+ int proxytype = 0;
+
+ SET_ENTRY(entryHomePageURL,
+ option_homepage_url ? option_homepage_url : "");
+ SET_BUTTON(setCurrentPage);
+ SET_BUTTON(setDefaultPage);
+ SET_CHECK(checkHideAdverts, option_block_ads);
+ SET_CHECK(checkDisplayRecentURLs, option_url_suggestion);
+ SET_CHECK(checkSendReferer, option_send_referer);
+
+ if (option_http_proxy == false)
+ proxytype = 0;
+ else
+ proxytype = option_http_proxy_auth + 1;
+
+ SET_COMBO(comboProxyType, proxytype);
+ SET_ENTRY(entryProxyHost,
+ option_http_proxy_host ? option_http_proxy_host : "");
+ gtk_widget_set_sensitive (entryProxyHost, !proxytype == 0);
+ snprintf(b, 20, "%d", option_http_proxy_port);
+ SET_ENTRY(entryProxyPort, b);
+ gtk_widget_set_sensitive (entryProxyPort, !proxytype == 0);
+ SET_ENTRY(entryProxyUser, option_http_proxy_auth_user ?
+ option_http_proxy_auth_user : "");
+ gtk_widget_set_sensitive (entryProxyUser, !proxytype == 0);
+ SET_ENTRY(entryProxyPassword, option_http_proxy_auth_pass ?
+ option_http_proxy_auth_pass : "");
+ gtk_widget_set_sensitive (entryProxyPassword, !proxytype == 0);
+
+ SET_SPIN(spinMaxFetchers, option_max_fetchers);
+ SET_SPIN(spinFetchesPerHost, option_max_fetchers_per_host);
+ SET_SPIN(spinCachedConnections, option_max_cached_fetch_handles);
+
+ SET_CHECK(checkResampleImages, option_render_resample);
+ SET_SPIN(spinAnimationSpeed, option_minimum_gif_delay / 100.0);
+ SET_CHECK(checkDisableAnimations, !option_animate_images);
+
+ SET_FONT(fontSansSerif, option_font_sans);
+ SET_FONT(fontSerif, option_font_serif);
+ SET_FONT(fontMonospace, option_font_mono);
+ SET_FONT(fontCursive, option_font_cursive);
+ SET_FONT(fontFantasy, option_font_fantasy);
+ SET_COMBO(comboDefault, option_font_default - 1);
+ SET_SPIN(spinDefaultSize, option_font_size / 10);
+ SET_SPIN(spinMinimumSize, option_font_min_size / 10);
+ SET_BUTTON(fontPreview);
+
+ SET_SPIN(spinMemoryCacheSize, option_memory_cache_size >> 20);
+ SET_SPIN(spinDiscCacheAge, option_disc_cache_age);
+}
+
+static void dialog_response_handler (GtkDialog *dlg, gint res_id){
+ switch (res_id)
+ {
+ case GTK_RESPONSE_HELP:
+ /* Ready to implement Help */
+ break;
+
+ case GTK_RESPONSE_CLOSE:
+ on_dialog_close(dlg, TRUE);
+ }
+}
+
+static gboolean on_dialog_close (GtkDialog *dlg, gboolean stay_alive){
+ LOG(("Writing options to file"));
+ options_write(options_file_location);
+ if (stay_alive) gtk_widget_hide (GTK_WIDGET(wndPreferences));
+ return stay_alive;
+}
+
+
+/* Defines the callback functions for all widgets and specifies
+ * nsgtk_reflow_all_windows only where necessary */
+#define ENTRY_CHANGED(x, y) gboolean on_##x##_changed(GtkWidget *widget, gpointer data) { \
+ if (!g_str_equal(gtk_entry_get_text(GTK_ENTRY((x))), (y))) { \
+ LOG(("Signal emitted on '%s'", #x)); \
+ if ((y)) free((y)); \
+ (y) = strdup(gtk_entry_get_text(GTK_ENTRY((x))));
+#define CHECK_CHANGED(x, y) gboolean on_##x##_changed(GtkWidget *widget, gpointer data) { \
+ LOG(("Signal emitted on '%s'", #x)); \
+ (y) = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON((x)));
+#define SPIN_CHANGED(x, y) gboolean on_##x##_changed(GtkWidget *widget, gpointer data) { \
+ LOG(("Signal emitted on '%s'", #x)); \
+ (y) = gtk_spin_button_get_value(GTK_SPIN_BUTTON((x)));
+#define COMBO_CHANGED(x, y) gboolean on_##x##_changed(GtkWidget *widget, gpointer data) { \
+ LOG(("Signal emitted on '%s'", #x)); \
+ (y) = gtk_combo_box_get_active(GTK_COMBO_BOX((x)));
+#define FONT_CHANGED(x, y) gboolean on_##x##_changed(GtkWidget *widget, gpointer data) { \
+ LOG(("Signal emitted on '%s'", #x)); \
+ if ((y)) free((y)); \
+ (y) = strdup(gtk_font_button_get_font_name(GTK_FONT_BUTTON((x))));
+#define BUTTON_CLICKED(x) gboolean on_##x##_changed(GtkWidget *widget, gpointer data) { \
+ LOG(("Signal emitted on '%s'", #x));
+
+ENTRY_CHANGED(entryHomePageURL, option_homepage_url)}
+ return FALSE;}
+BUTTON_CLICKED(setCurrentPage)
+ const gchar *url = current_browser->current_content->url;
+ gtk_entry_set_text(GTK_ENTRY(entryHomePageURL), url);
+ option_homepage_url =
+ strdup(gtk_entry_get_text(GTK_ENTRY(entryHomePageURL)));}
+BUTTON_CLICKED(setDefaultPage)
+ gtk_entry_set_text(GTK_ENTRY(entryHomePageURL),
+ "http://www.netsurf-browser.org/welcome/");
+ option_homepage_url =
+ strdup(gtk_entry_get_text(GTK_ENTRY(entryHomePageURL)));}
+CHECK_CHANGED(checkHideAdverts, option_block_ads)}
+CHECK_CHANGED(checkDisplayRecentURLs, option_url_suggestion)}
+CHECK_CHANGED(checkSendReferer, option_send_referer)}
+
+COMBO_CHANGED(comboProxyType, proxy_type)
+ LOG(("proxy type: %d", proxy_type));
+ switch (proxy_type)
+ {
+ case 0:
+ option_http_proxy = false;
+ option_http_proxy_auth = OPTION_HTTP_PROXY_AUTH_NONE;
+ break;
+ case 1:
+ option_http_proxy = true;
+ option_http_proxy_auth = OPTION_HTTP_PROXY_AUTH_NONE;
+ break;
+ case 2:
+ option_http_proxy = true;
+ option_http_proxy_auth = OPTION_HTTP_PROXY_AUTH_BASIC;
+ break;
+ case 3:
+ option_http_proxy = true;
+ option_http_proxy_auth = OPTION_HTTP_PROXY_AUTH_NTLM;
+ break;
+ }
+ gboolean sensitive = (!proxy_type == 0);
+ gtk_widget_set_sensitive (entryProxyHost, sensitive);
+ gtk_widget_set_sensitive (entryProxyPort, sensitive);
+ gtk_widget_set_sensitive (entryProxyUser, sensitive);
+ gtk_widget_set_sensitive (entryProxyPassword, sensitive);
+}
+
+ENTRY_CHANGED(entryProxyHost, option_http_proxy_host)}
+ return FALSE;}
+ENTRY_CHANGED(entryProxyPort, proxy_port)
+ option_http_proxy_port = atoi(proxy_port);
+ free(proxy_port);}
+ return FALSE;}
+ENTRY_CHANGED(entryProxyUser, option_http_proxy_auth_user)}
+ return FALSE;}
+ENTRY_CHANGED(entryProxyPassword, option_http_proxy_auth_pass)}
+ return FALSE;}
+
+SPIN_CHANGED(spinMaxFetchers, option_max_fetchers)}
+SPIN_CHANGED(spinFetchesPerHost, option_max_fetchers_per_host)}
+SPIN_CHANGED(spinCachedConnections, option_max_cached_fetch_handles)}
+
+CHECK_CHANGED(checkResampleImages, option_render_resample)}
+SPIN_CHANGED(spinAnimationSpeed, animation_delay)
+ option_minimum_gif_delay = round(animation_delay * 100.0);}
+CHECK_CHANGED(checkDisableAnimations, option_animate_images);
+ option_animate_images = !option_animate_images;}
+
+FONT_CHANGED(fontSansSerif, option_font_sans)}
+FONT_CHANGED(fontSerif, option_font_serif)}
+FONT_CHANGED(fontMonospace, option_font_mono)}
+FONT_CHANGED(fontCursive, option_font_cursive)}
+FONT_CHANGED(fontFantasy, option_font_fantasy)}
+COMBO_CHANGED(comboDefault, option_font_default)
+ option_font_default++;}
+
+SPIN_CHANGED(spinDefaultSize, option_font_size)
+ option_font_size *= 10;}
+SPIN_CHANGED(spinMinimumSize, option_font_min_size)
+ option_font_min_size *= 10;}
+BUTTON_CLICKED(fontPreview)
+ nsgtk_reflow_all_windows();}
+
+SPIN_CHANGED(spinMemoryCacheSize, option_memory_cache_size)
+ option_memory_cache_size <<= 20;}
+SPIN_CHANGED(spinDiscCacheAge, option_disc_cache_age)}
diff --git a/gtk/gtk_options.h b/gtk/dialogs/gtk_options.h
index 2c70829a2..49932ff89 100644
--- a/gtk/gtk_options.h
+++ b/gtk/dialogs/gtk_options.h
@@ -21,10 +21,13 @@
#include <gtk/gtk.h>
-extern GtkWindow *wndPreferences;
+extern GtkDialog *wndPreferences;
-void nsgtk_options_init(void); /** Init options and load window */
+GtkDialog* nsgtk_options_init(struct browser_window *bw, GtkWindow *parent); /** Init options and load window */
void nsgtk_options_load(void); /** Load current options into window */
void nsgtk_options_save(void); /** Save options from window */
+/** Callbacks */
+static void dialog_response_handler (GtkDialog *dlg, gint res_id);
+static gboolean on_dialog_close (GtkDialog *dlg, gboolean stay_alive);
#endif
diff --git a/gtk/gtk_gui.c b/gtk/gtk_gui.c
index b251fec15..61696a673 100644
--- a/gtk/gtk_gui.c
+++ b/gtk/gtk_gui.c
@@ -42,7 +42,7 @@
#include "desktop/netsurf.h"
#include "desktop/options.h"
#include "gtk/gtk_gui.h"
-#include "gtk/gtk_options.h"
+#include "gtk/dialogs/gtk_options.h"
#include "gtk/gtk_completion.h"
#include "gtk/gtk_window.h"
#include "gtk/options.h"
@@ -68,6 +68,7 @@ char *default_stylesheet_url;
char *adblock_stylesheet_url;
char *options_file_location;
char *glade_file_location;
+char *res_dir_location;
struct gui_window *search_current_window = 0;
@@ -76,7 +77,6 @@ GtkWindow *wndWarning;
GladeXML *gladeWindows;
GtkWindow *wndTooltip;
GtkLabel *labelTooltip;
-GtkDialog *wndOpenFile;
static GtkWidget *select_menu;
static struct browser_window *select_menu_bw;
@@ -176,10 +176,14 @@ void gui_init(int argc, char** argv)
gtk_init(&argc, &argv);
check_homedir();
-
+
find_resource(buf, "netsurf.glade", "./gtk/res/netsurf.glade");
LOG(("Using '%s' as Glade template file", buf));
glade_file_location = strdup(buf);
+
+ buf[strlen(buf)- 13] = 0;
+ LOG(("Using '%s' as Resources directory", buf));
+ res_dir_location = strdup(buf);
glade_init();
gladeWindows = glade_xml_new(glade_file_location, NULL, NULL);
@@ -239,8 +243,6 @@ void gui_init(int argc, char** argv)
SETFONTDEFAULT(option_font_cursive, "Serif");
SETFONTDEFAULT(option_font_fantasy, "Serif");
- nsgtk_options_init();
-
if (!option_cookie_file) {
find_resource(buf, "Cookies", "~/.netsurf/Cookies");
LOG(("Using '%s' as Cookies file", buf));
@@ -297,7 +299,6 @@ void gui_init(int argc, char** argv)
glade_xml_get_widget(gladeWindows, "textviewGPL")), fontdesc);
wndWarning = GTK_WINDOW(glade_xml_get_widget(gladeWindows, "wndWarning"));
- wndOpenFile = GTK_DIALOG(glade_xml_get_widget(gladeWindows, "wndOpenFile"));
nsgtk_history_init();
nsgtk_download_initialise();
@@ -306,13 +307,14 @@ void gui_init(int argc, char** argv)
void gui_init2(int argc, char** argv)
{
+ struct browser_window *bw;
const char *addr = "http://netsurf-browser.org/welcome/";
if (option_homepage_url != NULL && option_homepage_url[0] != '\0')
addr = option_homepage_url;
if (argc > 1) addr = argv[1];
- browser_window_create(addr, 0, 0, true);
+ bw = browser_window_create(addr, 0, 0, true);
}
diff --git a/gtk/gtk_gui.h b/gtk/gtk_gui.h
index cf4703fff..39d4d5f16 100644
--- a/gtk/gtk_gui.h
+++ b/gtk/gtk_gui.h
@@ -24,6 +24,7 @@ extern bool gui_in_multitask;
extern GladeXML *gladeWindows;
extern char *glade_file_location;
extern char *options_file_location;
+extern char *res_dir_location;
extern GtkWindow *wndAbout;
diff --git a/gtk/gtk_options.c b/gtk/gtk_options.c
deleted file mode 100644
index a7cd82ac2..000000000
--- a/gtk/gtk_options.c
+++ /dev/null
@@ -1,253 +0,0 @@
-/*
- * Copyright 2006 Rob Kendrick <rjek@rjek.com>
- *
- * 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/>.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <gtk/gtk.h>
-#include <glade/glade.h>
-#include "utils/log.h"
-#include "desktop/options.h"
-#include "gtk/options.h"
-#include "gtk/gtk_gui.h"
-#include "gtk/gtk_scaffolding.h"
-#include "gtk/gtk_options.h"
-#include "gtk/gtk_window.h"
-
-GtkWindow *wndPreferences;
-
-static GtkWidget *entryHomePageURL,
- *checkHideAdverts,
- *checkDisablePopups,
- *checkDisablePlugins,
- *spinHistoryAge,
- *checkHoverURLs,
- *checkRequestOverwrite,
- *checkDisplayRecentURLs,
- *checkSendReferer,
-
- *comboProxyType,
- *entryProxyHost,
- *entryProxyPort,
- *entryProxyUser,
- *entryProxyPassword,
- *spinMaxFetchers,
- *spinFetchesPerHost,
- *spinCachedConnections,
-
- *checkUseCairo,
- *checkResampleImages,
- *spinAnimationSpeed,
- *checkDisableAnimations,
-
- *fontSansSerif,
- *fontSerif,
- *fontMonospace,
- *fontCursive,
- *fontFantasy,
- *comboDefault,
- *spinDefaultSize,
- *spinMinimumSize,
-
- *spinMemoryCacheSize,
- *spinDiscCacheAge;
-
-#define FIND_WIDGET(x) (x) = glade_xml_get_widget(gladeWindows, #x); if ((x) == NULL) LOG(("Unable to find widget '%s'!", #x))
-
-void nsgtk_options_init(void) {
- wndPreferences = GTK_WINDOW(glade_xml_get_widget(gladeWindows,
- "wndPreferences"));
-
- /* get widget objects */
- FIND_WIDGET(entryHomePageURL);
- FIND_WIDGET(checkHideAdverts);
- FIND_WIDGET(checkDisablePopups);
- FIND_WIDGET(checkDisablePlugins);
- FIND_WIDGET(spinHistoryAge);
- FIND_WIDGET(checkHoverURLs);
- FIND_WIDGET(checkRequestOverwrite);
- FIND_WIDGET(checkDisplayRecentURLs);
- FIND_WIDGET(checkSendReferer);
-
- FIND_WIDGET(comboProxyType);
- FIND_WIDGET(entryProxyHost);
- FIND_WIDGET(entryProxyPort);
- FIND_WIDGET(entryProxyUser);
- FIND_WIDGET(entryProxyPassword);
- FIND_WIDGET(spinMaxFetchers);
- FIND_WIDGET(spinFetchesPerHost);
- FIND_WIDGET(spinCachedConnections);
-
- FIND_WIDGET(checkUseCairo);
- FIND_WIDGET(checkResampleImages);
- FIND_WIDGET(spinAnimationSpeed);
- FIND_WIDGET(checkDisableAnimations);
-
- FIND_WIDGET(fontSansSerif);
- FIND_WIDGET(fontSerif);
- FIND_WIDGET(fontMonospace);
- FIND_WIDGET(fontCursive);
- FIND_WIDGET(fontFantasy);
- FIND_WIDGET(comboDefault);
- FIND_WIDGET(spinDefaultSize);
- FIND_WIDGET(spinMinimumSize);
-
- FIND_WIDGET(spinMemoryCacheSize);
- FIND_WIDGET(spinDiscCacheAge);
-
- /* set the widgets to reflect the current options */
- nsgtk_options_load();
-}
-
-#define SET_ENTRY(x, y) gtk_entry_set_text(GTK_ENTRY((x)), (y))
-#define SET_SPIN(x, y) gtk_spin_button_set_value(GTK_SPIN_BUTTON((x)), (y))
-#define SET_CHECK(x, y) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON((x)), (y))
-#define SET_COMBO(x, y) gtk_combo_box_set_active(GTK_COMBO_BOX((x)), (y))
-#define SET_FONT(x, y) gtk_font_button_set_font_name(GTK_FONT_BUTTON((x)), (y))
-
-void nsgtk_options_load(void) {
- char b[20];
- int proxytype = 0;
-
- SET_ENTRY(entryHomePageURL,
- option_homepage_url ? option_homepage_url : "");
- SET_CHECK(checkHideAdverts, option_block_ads);
- SET_CHECK(checkDisplayRecentURLs, option_url_suggestion);
- SET_CHECK(checkSendReferer, option_send_referer);
-
- switch (option_http_proxy_auth) {
- case OPTION_HTTP_PROXY_AUTH_NONE:
- proxytype = 1;
- break;
- case OPTION_HTTP_PROXY_AUTH_BASIC:
- proxytype = 2;
- break;
- case OPTION_HTTP_PROXY_AUTH_NTLM:
- proxytype = 3;
- break;
- }
-
- if (option_http_proxy == false)
- proxytype = 0;
-
- SET_COMBO(comboProxyType, proxytype);
- SET_ENTRY(entryProxyHost,
- option_http_proxy_host ? option_http_proxy_host : "");
- snprintf(b, 20, "%d", option_http_proxy_port);
- SET_ENTRY(entryProxyPort, b);
- SET_ENTRY(entryProxyUser, option_http_proxy_auth_user ?
- option_http_proxy_auth_user : "");
- SET_ENTRY(entryProxyPassword, option_http_proxy_auth_pass ?
- option_http_proxy_auth_pass : "");
-
- SET_SPIN(spinMaxFetchers, option_max_fetchers);
- SET_SPIN(spinFetchesPerHost, option_max_fetchers_per_host);
- SET_SPIN(spinCachedConnections, option_max_cached_fetch_handles);
-
- SET_CHECK(checkResampleImages, option_render_resample);
- SET_SPIN(spinAnimationSpeed, option_minimum_gif_delay / 100);
- SET_CHECK(checkDisableAnimations, !option_animate_images);
-
- SET_FONT(fontSansSerif, option_font_sans);
- SET_FONT(fontSerif, option_font_serif);
- SET_FONT(fontMonospace, option_font_mono);
- SET_FONT(fontCursive, option_font_cursive);
- SET_FONT(fontFantasy, option_font_fantasy);
- SET_COMBO(comboDefault, option_font_default - 1);
- SET_SPIN(spinDefaultSize, option_font_size / 10);
- SET_SPIN(spinMinimumSize, option_font_min_size / 10);
-
- SET_SPIN(spinMemoryCacheSize, option_memory_cache_size >> 20);
- SET_SPIN(spinDiscCacheAge, option_disc_cache_age);
-}
-
-#define GET_ENTRY(x, y) if ((y)) free((y)); \
- (y) = strdup(gtk_entry_get_text(GTK_ENTRY((x))))
-#define GET_CHECK(x, y) (y) = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON((x)))
-#define GET_SPIN(x, y) (y) = gtk_spin_button_get_value(GTK_SPIN_BUTTON((x)))
-#define GET_COMBO(x, y) (y) = gtk_combo_box_get_active(GTK_COMBO_BOX((x)))
-#define GET_FONT(x, y) if ((y)) free((y)); \
- (y) = strdup(gtk_font_button_get_font_name(GTK_FONT_BUTTON((x))))
-
-void nsgtk_options_save(void) {
- char *b = NULL;
- int i;
-
- GET_ENTRY(entryHomePageURL, option_homepage_url);
- GET_CHECK(checkDisplayRecentURLs, option_url_suggestion);
-
- GET_COMBO(comboProxyType, i);
- LOG(("proxy type: %d", i));
- switch (i)
- {
- case 0:
- option_http_proxy = false;
- option_http_proxy_auth = OPTION_HTTP_PROXY_AUTH_NONE;
- break;
- case 1:
- option_http_proxy = true;
- option_http_proxy_auth = OPTION_HTTP_PROXY_AUTH_NONE;
- break;
- case 2:
- option_http_proxy = true;
- option_http_proxy_auth = OPTION_HTTP_PROXY_AUTH_BASIC;
- break;
- case 3:
- option_http_proxy = true;
- option_http_proxy_auth = OPTION_HTTP_PROXY_AUTH_NTLM;
- break;
- default:
- option_http_proxy = false;
- option_http_proxy_auth = OPTION_HTTP_PROXY_AUTH_NONE;
- break;
- }
-
- GET_ENTRY(entryProxyHost, option_http_proxy_host);
- GET_ENTRY(entryProxyPort, b);
- option_http_proxy_port = atoi(b);
- free(b);
- GET_ENTRY(entryProxyUser, option_http_proxy_auth_user);
- GET_ENTRY(entryProxyPassword, option_http_proxy_auth_pass);
-
- GET_SPIN(spinMaxFetchers, option_max_fetchers);
- GET_SPIN(spinFetchesPerHost, option_max_fetchers_per_host);
- GET_SPIN(spinCachedConnections, option_max_cached_fetch_handles);
-
- GET_CHECK(checkResampleImages, option_render_resample);
- GET_SPIN(spinAnimationSpeed, option_minimum_gif_delay);
- option_minimum_gif_delay *= 100;
-
- GET_FONT(fontSansSerif, option_font_sans);
- GET_FONT(fontSerif, option_font_serif);
- GET_FONT(fontMonospace, option_font_mono);
- GET_FONT(fontCursive, option_font_cursive);
- GET_FONT(fontFantasy, option_font_fantasy);
- GET_COMBO(comboDefault, option_font_default);
- option_font_default++;
-
- GET_SPIN(spinDefaultSize, option_font_size);
- option_font_size *= 10;
- GET_SPIN(spinMinimumSize, option_font_min_size);
- option_font_min_size *= 10;
-
- GET_SPIN(spinMemoryCacheSize, option_memory_cache_size);
- option_memory_cache_size <<= 20;
-
- options_write(options_file_location);
- nsgtk_reflow_all_windows();
-}
diff --git a/gtk/gtk_scaffolding.c b/gtk/gtk_scaffolding.c
index ca22c9425..66eefc837 100644
--- a/gtk/gtk_scaffolding.c
+++ b/gtk/gtk_scaffolding.c
@@ -29,12 +29,14 @@
#include "desktop/gui.h"
#include "desktop/netsurf.h"
#include "desktop/plotters.h"
+#include "desktop/selection.h"
#include "desktop/options.h"
#include "desktop/textinput.h"
#include "gtk/gtk_gui.h"
#include "gtk/gtk_plotters.h"
#include "gtk/gtk_scaffolding.h"
-#include "gtk/gtk_options.h"
+#include "gtk/dialogs/gtk_options.h"
+#include "gtk/dialogs/gtk_about.h"
#include "gtk/gtk_completion.h"
#include "gtk/gtk_throbber.h"
#include "gtk/gtk_history.h"
@@ -57,6 +59,7 @@ struct gtk_scaffolding {
GtkEntry *url_bar;
GtkEntryCompletion *url_bar_completion;
GtkLabel *status_bar;
+ GtkMenu *edit_menu;
GtkToolbar *tool_bar;
GtkToolButton *back_button;
GtkToolButton *forward_button;
@@ -76,6 +79,7 @@ struct gtk_scaffolding {
GtkMenu *popup_menu;
struct gtk_history_window *history_window;
+ GtkDialog *preferences_dialog;
int throb_frame;
struct gui_window *top_level;
@@ -102,6 +106,9 @@ static void nsgtk_window_destroy_event(GtkWidget *, gpointer);
static void nsgtk_window_update_back_forward(struct gtk_scaffolding *);
static void nsgtk_throb(void *);
+static gboolean nsgtk_window_edit_menu_clicked(GtkWidget *widget, struct gtk_scaffolding *g);
+static gboolean nsgtk_window_edit_menu_hidden(GtkWidget *widget, struct gtk_scaffolding *g);
+static gboolean nsgtk_window_popup_menu_hidden(GtkWidget *widget, struct gtk_scaffolding *g);
static gboolean nsgtk_window_back_button_clicked(GtkWidget *, gpointer);
static gboolean nsgtk_window_forward_button_clicked(GtkWidget *, gpointer);
static gboolean nsgtk_window_stop_button_clicked(GtkWidget *, gpointer);
@@ -110,6 +117,9 @@ static gboolean nsgtk_window_home_button_clicked(GtkWidget *, gpointer);
static gboolean nsgtk_window_url_activate_event(GtkWidget *, gpointer);
static gboolean nsgtk_window_url_changed(GtkWidget *, GdkEventKey *, gpointer);
+static void nsgtk_scaffolding_update_edit_actions_sensitivity (struct gtk_scaffolding *g, GladeXML *xml, gboolean hide);
+static void nsgtk_scaffolding_enable_edit_actions_sensitivity (struct gtk_scaffolding *g, GladeXML *xml);
+
static gboolean nsgtk_history_expose_event(GtkWidget *, GdkEventExpose *,
gpointer);
static gboolean nsgtk_history_button_press_event(GtkWidget *, GdkEventButton *,
@@ -117,7 +127,7 @@ static gboolean nsgtk_history_button_press_event(GtkWidget *, GdkEventButton *,
static void nsgtk_attach_menu_handlers(GladeXML *, gpointer);
-gboolean nsgtk_openfile_open(GtkWidget *widget, gpointer data);
+void nsgtk_openfile_open(char *filename);
#define MENUEVENT(x) { #x, G_CALLBACK(nsgtk_on_##x##_activate) }
#define MENUPROTO(x) static gboolean nsgtk_on_##x##_activate( \
@@ -131,6 +141,10 @@ MENUPROTO(close_window);
MENUPROTO(quit);
/* edit menu */
+MENUPROTO(cut);
+MENUPROTO(copy);
+MENUPROTO(paste);
+MENUPROTO(select_all);
MENUPROTO(preferences);
/* view menu */
@@ -170,6 +184,10 @@ static struct menu_events menu_events[] = {
MENUEVENT(quit),
/* edit menu */
+ MENUEVENT(cut),
+ MENUEVENT(copy),
+ MENUEVENT(paste),
+ MENUEVENT(select_all),
MENUEVENT(preferences),
/* view menu */
@@ -255,6 +273,10 @@ void nsgtk_window_update_back_forward(struct gtk_scaffolding *g)
history_back_available(bw->history));
gtk_widget_set_sensitive(GTK_WIDGET(g->forward_menu),
history_forward_available(bw->history));
+ gtk_widget_set_sensitive(GTK_WIDGET(glade_xml_get_widget(g->popup_xml,
+ "popupBack")), history_back_available(bw->history));
+ gtk_widget_set_sensitive(GTK_WIDGET(glade_xml_get_widget(g->popup_xml,
+ "popupForward")), history_forward_available(bw->history));
/* update the local history window, as well as queuing a redraw
* for it.
@@ -280,7 +302,22 @@ void nsgtk_throb(void *p)
schedule(10, nsgtk_throb, p);
}
-/* signal handling functions for the toolbar and URL bar */
+/* signal handling functions for the toolbar, URL bar, and menu bar */
+static gboolean nsgtk_window_edit_menu_clicked(GtkWidget *widget, struct gtk_scaffolding *g)
+{
+ nsgtk_scaffolding_update_edit_actions_sensitivity (g, g->xml, FALSE);
+}
+
+static gboolean nsgtk_window_edit_menu_hidden(GtkWidget *widget, struct gtk_scaffolding *g)
+{
+ nsgtk_scaffolding_enable_edit_actions_sensitivity(g, g->xml);
+}
+
+static gboolean nsgtk_window_popup_menu_hidden(GtkWidget *widget, struct gtk_scaffolding *g)
+{
+ nsgtk_scaffolding_enable_edit_actions_sensitivity(g, g->popup_xml);
+}
+
gboolean nsgtk_window_back_button_clicked(GtkWidget *widget, gpointer data)
{
struct gtk_scaffolding *g = data;
@@ -367,12 +404,10 @@ gboolean nsgtk_window_url_changed(GtkWidget *widget, GdkEventKey *event,
}
-gboolean nsgtk_openfile_open(GtkWidget *widget, gpointer data)
+void nsgtk_openfile_open(char *filename)
{
- struct browser_window *bw = nsgtk_get_browser_for_gui(
- current_model->top_level);
- char *filename = gtk_file_chooser_get_filename(
- GTK_FILE_CHOOSER(wndOpenFile));
+ struct browser_window *bw = nsgtk_get_browser_for_gui(
+ current_model->top_level);
char *url = malloc(strlen(filename) + strlen("file://") + 1);
sprintf(url, "file://%s", filename);
@@ -381,8 +416,6 @@ gboolean nsgtk_openfile_open(GtkWidget *widget, gpointer data)
g_free(filename);
free(url);
-
- return TRUE;
}
/* signal handlers for menu entries */
@@ -412,8 +445,16 @@ MENUHANDLER(open_location)
MENUHANDLER(open_file)
{
current_model = (struct gtk_scaffolding *)g;
- gtk_dialog_run(wndOpenFile);
-
+ GtkWidget *dlgOpen = gtk_file_chooser_dialog_new("Open File",
+ current_model->window, GTK_FILE_CHOOSER_ACTION_OPEN,
+ GTK_STOCK_CANCEL, -6, GTK_STOCK_OPEN, -5, NULL);
+
+ gint response = gtk_dialog_run(GTK_DIALOG(dlgOpen));
+ if (response == GTK_RESPONSE_OK){
+ char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dlgOpen));
+ nsgtk_openfile_open(filename);
+ }
+ gtk_widget_destroy(dlgOpen);
return TRUE;
}
@@ -432,10 +473,61 @@ MENUHANDLER(quit)
return TRUE;
}
-MENUHANDLER(preferences)
+MENUHANDLER(cut)
+{
+ struct gtk_scaffolding *gw = (struct gtk_scaffolding *)g;
+ GtkWidget *focused = gtk_window_get_focus(gw->window);
+
+ /* If the url bar has focus, let gtk handle it */
+ if (GTK_IS_EDITABLE (focused))
+ gtk_editable_cut_clipboard (GTK_EDITABLE(gw->url_bar));
+ else
+ /* TODO: Implement Cut functionality */;
+}
+
+MENUHANDLER(copy)
{
- gtk_widget_show(GTK_WIDGET(wndPreferences));
+ struct gtk_scaffolding *gw = (struct gtk_scaffolding *)g;
+ struct browser_window *bw = nsgtk_get_browser_for_gui(gw->top_level);
+ GtkWidget *focused = gtk_window_get_focus(gw->window);
+
+ /* If the url bar has focus, let gtk handle it */
+ if (GTK_IS_EDITABLE (focused))
+ gtk_editable_copy_clipboard(GTK_EDITABLE(gw->url_bar));
+ else
+ gui_copy_to_clipboard(bw->sel);
+}
+
+MENUHANDLER(paste)
+{
+ struct gtk_scaffolding *gw = (struct gtk_scaffolding *)g;
+ struct gui_window *gui = gw->top_level;
+ GtkWidget *focused = gtk_window_get_focus(gw->window);
+
+ /* If the url bar has focus, let gtk handle it */
+ if (GTK_IS_EDITABLE (focused))
+ gtk_editable_paste_clipboard (GTK_EDITABLE (focused));
+ else
+ gui_paste_from_clipboard(gui, 0, 0);
+}
+MENUHANDLER(select_all)
+{
+ struct gtk_scaffolding *gw = (struct gtk_scaffolding *)g;
+ struct browser_window *bw = nsgtk_get_browser_for_gui(gw->top_level);
+
+ LOG(("Selecting all text"));
+ selection_select_all(bw->sel);
+}
+
+MENUHANDLER(preferences)
+{
+ struct gtk_scaffolding *gw = (struct gtk_scaffolding *)g;
+ struct browser_window *bw = nsgtk_get_browser_for_gui(gw->top_level);
+ if (gw->preferences_dialog == NULL)
+ gw->preferences_dialog = nsgtk_options_init(bw, gw->window);
+ else
+ gtk_widget_show (GTK_WIDGET(gw->preferences_dialog));
return TRUE;
}
@@ -492,8 +584,19 @@ MENUHANDLER(menu_bar)
if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget))) {
gtk_widget_show(GTK_WIDGET(gw->menu_bar));
+
+ gtk_widget_show_all(GTK_WIDGET(gw->popup_menu));
+ GList *widgets = glade_xml_get_widget_prefix (gw->popup_xml, "menupopup");
+ for (; widgets != NULL; widgets = widgets->next)
+ gtk_widget_hide (GTK_WIDGET(widgets->data));
} else {
gtk_widget_hide(GTK_WIDGET(gw->menu_bar));
+
+ gtk_widget_hide_all(GTK_WIDGET(gw->popup_menu));
+ gtk_widget_show(GTK_WIDGET(gw->popup_menu));
+ GList *widgets = glade_xml_get_widget_prefix (gw->popup_xml, "menupopup");
+ for (; widgets != NULL; widgets = widgets->next)
+ gtk_widget_show_all (GTK_WIDGET(widgets->data));
}
return TRUE;
@@ -647,8 +750,8 @@ MENUHANDLER(global_history)
MENUHANDLER(about)
{
- gtk_widget_show(GTK_WIDGET(wndAbout));
- gdk_window_raise(GTK_WIDGET(wndAbout)->window);
+ struct gtk_scaffolding *gw = (struct gtk_scaffolding *)g;
+ nsgtk_about_dialog_init(gw->window, nsgtk_get_browser_for_gui(gw->top_level), netsurf_version);
return TRUE;
}
@@ -759,6 +862,7 @@ nsgtk_scaffolding *nsgtk_new_scaffolding(struct gui_window *toplevel)
g->url_bar = GTK_ENTRY(GET_WIDGET("URLBar"));
g->menu_bar = GTK_MENU_BAR(GET_WIDGET("menubar"));
g->status_bar = GTK_LABEL(GET_WIDGET("statusBar"));
+ g->edit_menu = GTK_MENU(GET_WIDGET("menumain_edit"));
g->tool_bar = GTK_TOOLBAR(GET_WIDGET("toolbar"));
g->back_button = GTK_TOOL_BUTTON(GET_WIDGET("toolBack"));
g->forward_button = GTK_TOOL_BUTTON(GET_WIDGET("toolForward"));
@@ -770,6 +874,8 @@ nsgtk_scaffolding *nsgtk_new_scaffolding(struct gui_window *toplevel)
g->reload_menu = GTK_MENU_ITEM(GET_WIDGET("reload"));
g->throbber = GTK_IMAGE(GET_WIDGET("throbber"));
g->status_pane = GTK_PANED(GET_WIDGET("hpaned1"));
+
+ g->preferences_dialog = NULL;
/* set this window's size and position to what's in the options, or
* or some sensible default if they're not set yet.
@@ -860,7 +966,9 @@ nsgtk_scaffolding *nsgtk_new_scaffolding(struct gui_window *toplevel)
/* connect signals to handlers. */
CONNECT(g->window, "destroy", nsgtk_window_destroy_event, g);
- /* toolbar and URL bar signal handlers */
+ /* toolbar, URL bar, and menu bar signal handlers */
+ CONNECT(g->edit_menu, "show", nsgtk_window_edit_menu_clicked, g);
+ CONNECT(g->edit_menu, "hide", nsgtk_window_edit_menu_hidden, g);
CONNECT(g->back_button, "clicked", nsgtk_window_back_button_clicked, g);
CONNECT(g->forward_button, "clicked",
nsgtk_window_forward_button_clicked, g);
@@ -883,6 +991,24 @@ nsgtk_scaffolding *nsgtk_new_scaffolding(struct gui_window *toplevel)
g->popup_xml = glade_xml_new(glade_file_location, "menuPopup", NULL);
g->popup_menu = GTK_MENU(glade_xml_get_widget(g->popup_xml, "menuPopup"));
+ /* TODO - find a way to add g->back, g->forward... directly to popup
+ * menu instead of copying in glade. Use something like:
+ * gtk_menu_shell_append (GTK_MENU_SHELL(g->popup_menu),
+ * GTK_WIDGET(glade_xml_get_widget(g->xml, "back"))); */
+ CONNECT(g->popup_menu, "hide", nsgtk_window_popup_menu_hidden, g);
+ CONNECT(glade_xml_get_widget(g->popup_xml, "popupBack"), "activate",
+ nsgtk_window_back_button_clicked, g);
+ CONNECT(glade_xml_get_widget(g->popup_xml, "popupForward"),"activate",
+ nsgtk_window_forward_button_clicked, g);
+ CONNECT(glade_xml_get_widget(g->popup_xml, "popupReload"), "activate",
+ nsgtk_window_reload_button_clicked, g);
+ CONNECT(glade_xml_get_widget(g->popup_xml, "cut_popup"), "activate",
+ nsgtk_on_cut_activate, g);
+ CONNECT(glade_xml_get_widget(g->popup_xml, "copy_popup"), "activate",
+ nsgtk_on_copy_activate, g);
+ CONNECT(glade_xml_get_widget(g->popup_xml, "paste_popup"),"activate",
+ nsgtk_on_paste_activate, g);
+
#define POPUP_ATTACH(x, y) gtk_menu_item_set_submenu( \
GTK_MENU_ITEM(glade_xml_get_widget(g->popup_xml, x)),\
GTK_WIDGET(glade_xml_get_widget(g->xml, y)))
@@ -894,7 +1020,11 @@ nsgtk_scaffolding *nsgtk_new_scaffolding(struct gui_window *toplevel)
POPUP_ATTACH("menupopup_help", "menumain_help");
#undef POPUP_ATTACH
-
+ /* hides redundant popup menu items */
+ GList *widgets = glade_xml_get_widget_prefix (g->popup_xml, "menupopup");
+ for (; widgets != NULL; widgets = widgets->next)
+ gtk_widget_hide (GTK_WIDGET(widgets->data));
+
/* finally, show the window. */
gtk_widget_show(GTK_WIDGET(g->window));
@@ -965,14 +1095,82 @@ void gui_window_stop_throbber(struct gui_window* _g)
gtk_image_set_from_pixbuf(g->throbber, nsgtk_throbber->framedata[0]);
}
-gboolean nsgtk_scaffolding_is_busy(nsgtk_scaffolding *scaffold)
+gboolean nsgtk_scaffolding_is_busy(struct gtk_scaffolding *scaffold)
{
/* We are considered "busy" if the stop button is sensitive */
return GTK_WIDGET_SENSITIVE((GTK_WIDGET(scaffold->stop_button)));
}
-void nsgtk_scaffolding_popup_menu(nsgtk_scaffolding *g, guint button)
+void nsgtk_scaffolding_popup_menu(struct gtk_scaffolding *g, guint button)
{
+ nsgtk_scaffolding_update_edit_actions_sensitivity(g, g->popup_xml, TRUE);
gtk_menu_popup(g->popup_menu, NULL, NULL, NULL, NULL, 0,
gtk_get_current_event_time());
}
+
+static void nsgtk_scaffolding_update_edit_actions_sensitivity
+ (struct gtk_scaffolding *g, GladeXML *xml, gboolean hide)
+{
+ GtkWidget *widget = gtk_window_get_focus(g->window);
+ gboolean can_copy, can_cut, can_undo, can_redo, can_paste;
+ gboolean has_selection;
+
+ if (GTK_IS_EDITABLE (widget))
+ {
+ has_selection = gtk_editable_get_selection_bounds
+ (GTK_EDITABLE (widget), NULL, NULL);
+
+ can_copy = has_selection;
+ can_cut = has_selection;
+ can_paste = TRUE;
+ }
+ else
+ {
+ struct browser_window *bw = nsgtk_get_browser_for_gui(g->top_level);
+ has_selection = bw->sel->defined;
+
+ can_copy = has_selection;
+ /* Cut and Paste do not always register properly due to a bug
+ * in the core selection code. */
+ can_cut = (has_selection && bw->caret_callback != 0 );
+ can_paste = (bw->paste_callback != 0);
+ }
+ widget = glade_xml_get_widget_prefix(xml, "copy")->data;
+ gtk_widget_set_sensitive (widget, can_copy);
+ if (hide && !can_copy)
+ gtk_widget_hide(widget);
+ widget = glade_xml_get_widget_prefix(xml, "cut")->data;
+ gtk_widget_set_sensitive (widget, can_cut);
+ if (hide && !can_cut)
+ gtk_widget_hide(widget);
+ widget = glade_xml_get_widget_prefix(xml, "paste")->data;
+ gtk_widget_set_sensitive (widget, can_paste);
+ if (hide && !can_paste)
+ gtk_widget_hide(widget);
+
+ /* If its for the popup menu, handle seperator too */
+ if (hide && !(can_paste || can_cut || can_copy)){
+ widget = glade_xml_get_widget(xml, "separator");
+ gtk_widget_hide(widget);
+ }
+}
+
+static void nsgtk_scaffolding_enable_edit_actions_sensitivity
+ (struct gtk_scaffolding *g, GladeXML *xml)
+{
+ GtkWidget *widget;
+
+ widget = glade_xml_get_widget_prefix(xml, "copy")->data;
+ gtk_widget_set_sensitive (widget, TRUE);
+ gtk_widget_show(widget);
+ widget = glade_xml_get_widget_prefix(xml, "cut")->data;
+ gtk_widget_set_sensitive (widget, TRUE);
+ gtk_widget_show(widget);
+ widget = glade_xml_get_widget_prefix(xml, "paste")->data;
+ gtk_widget_set_sensitive (widget, TRUE);
+ gtk_widget_show(widget);
+
+ widget = glade_xml_get_widget(xml, "separator");
+ gtk_widget_show(widget);
+}
+
diff --git a/gtk/gtk_selection.c b/gtk/gtk_selection.c
new file mode 100644
index 000000000..0e5b397fb
--- /dev/null
+++ b/gtk/gtk_selection.c
@@ -0,0 +1,97 @@
+/*
+ * Copyright 2008 Mike Lester <element3260@gmail.com>
+ *
+ * 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/>.
+ */
+#include <gtk/gtk.h>
+
+#include "utils/log.h"
+
+#include "desktop/gui.h"
+#include "desktop/textinput.h"
+#include "desktop/selection.h"
+#include "desktop/browser.h"
+#include "gtk/gtk_selection.h"
+#include "gtk/gtk_window.h"
+
+GString *current_selection;
+GtkClipboard *clipboard;
+
+static bool copy_handler(const char *text, size_t length, struct box *box,
+ void *handle, const char *whitespace_text,
+ size_t whitespace_length);
+
+
+bool gui_add_to_clipboard(const char *text, size_t length, bool space)
+{
+ /* add the text from this box */
+ current_selection = g_string_append_len (current_selection,
+ text, length);
+ if (space) g_string_append (current_selection, " ");
+ return true;
+}
+
+bool copy_handler(const char *text, size_t length, struct box *box,
+ void *handle, const char *whitespace_text,
+ size_t whitespace_length)
+{
+ /* add any whitespace which precedes the text from this box */
+ if (whitespace_text) {
+ if (!gui_add_to_clipboard(whitespace_text,
+ whitespace_length, false)) {
+ return false;
+ }
+ }
+ /* add the text from this box */
+ if (!gui_add_to_clipboard(text, length, box->space))
+ return false;
+
+ return true;
+}
+
+bool gui_copy_to_clipboard(struct selection *s)
+{
+ current_selection = g_string_new(NULL);
+ clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
+ if (s->defined && selection_traverse(s, copy_handler, NULL))
+ gtk_clipboard_set_text (clipboard, current_selection->str, -1);
+ return TRUE;
+}
+
+void gui_start_selection(struct gui_window *g)
+{
+ gtk_widget_grab_focus(GTK_WIDGET(g->drawing_area));
+}
+
+void gui_paste_from_clipboard(struct gui_window *g, int x, int y)
+{
+ char *text;
+ clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
+ text = gtk_clipboard_wait_for_text (clipboard);
+ if (text)
+ browser_window_paste_text(g->bw, text,
+ strlen(text), true);
+}
+
+bool gui_empty_clipboard(void)
+{
+ return true;
+}
+
+bool gui_commit_clipboard(void)
+{
+ return true;
+}
+
diff --git a/gtk/gtk_selection.h b/gtk/gtk_selection.h
new file mode 100644
index 000000000..c2a0b35f4
--- /dev/null
+++ b/gtk/gtk_selection.h
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2008 Mike Lester <element3260@gmail.com>
+ *
+ * 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/>.
+ */
+
+#ifndef GTK_SELECTION_H
+#define GTK_SELECTION_H
+
+#include <gtk/gtk.h>
+#include "desktop/gui.h"
+
+#endif
diff --git a/gtk/gtk_window.c b/gtk/gtk_window.c
index 307b92fa5..e7363c3f1 100644
--- a/gtk/gtk_window.c
+++ b/gtk/gtk_window.c
@@ -22,6 +22,7 @@
#include "desktop/browser.h"
#include "desktop/options.h"
#include "desktop/textinput.h"
+#include "desktop/selection.h"
#include "gtk/gtk_gui.h"
#include "gtk/gtk_scaffolding.h"
#include "gtk/gtk_plotters.h"
@@ -32,34 +33,6 @@
#include <gdk/gdkkeysyms.h>
#include <assert.h>
-struct gui_window {
- /* All gui_window objects have an ultimate scaffold */
- nsgtk_scaffolding *scaffold;
- /* A gui_window is the rendering of a browser_window */
- struct browser_window *bw;
-
- /* These are the storage for the rendering */
- int caretx, carety, careth;
- gui_pointer_shape current_pointer;
- int last_x, last_y;
-
- /* Within GTK, a gui_window is a scrolled window
- * with a viewport inside
- * with a gtkfixed in that
- * with a drawing area in that
- * The scrolled window is optional and only chosen
- * for frames which need it. Otherwise we just use
- * a viewport.
- */
- GtkScrolledWindow *scrolledwindow;
- GtkViewport *viewport;
- GtkFixed *fixed;
- GtkDrawingArea *drawing_area;
-
- /* Keep gui_windows in a list for cleanup later */
- struct gui_window *next, *prev;
-};
-
static struct gui_window *window_list = 0; /**< first entry in win list*/
static uint32_t gdkkey_to_nskey(GdkEventKey *);
@@ -72,10 +45,13 @@ static gboolean nsgtk_window_motion_notify_event(GtkWidget *, GdkEventMotion *,
gpointer);
static gboolean nsgtk_window_button_press_event(GtkWidget *, GdkEventButton *,
gpointer);
+static gboolean nsgtk_window_button_release_event(GtkWidget *, GdkEventButton *,
+ gpointer);
static gboolean nsgtk_window_keypress_event(GtkWidget *, GdkEventKey *,
gpointer);
static gboolean nsgtk_window_size_allocate_event(GtkWidget *, GtkAllocation *,
gpointer);
+
/* Other useful bits */
static void nsgtk_redraw_caret(struct gui_window *g);
@@ -117,6 +93,12 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
LOG(("Creating gui window %p for browser window %p", g, bw));
g->bw = bw;
+ g->mouse = malloc(sizeof(*g->mouse));
+ if (!g->mouse) {
+ warn_user("NoMemory", 0);
+ return 0;
+ }
+ g->mouse->state = 0;
g->current_pointer = GUI_POINTER_DEFAULT;
if (clone != NULL)
bw->scale = clone->scale;
@@ -220,6 +202,7 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
GDK_EXPOSURE_MASK |
GDK_LEAVE_NOTIFY_MASK |
GDK_BUTTON_PRESS_MASK |
+ GDK_BUTTON_RELEASE_MASK |
GDK_POINTER_MOTION_MASK |
GDK_KEY_PRESS_MASK |
GDK_KEY_RELEASE_MASK);
@@ -235,7 +218,9 @@ struct gui_window *gui_create_browser_window(struct browser_window *bw,
CONNECT(g->drawing_area, "motion_notify_event",
nsgtk_window_motion_notify_event, g);
CONNECT(g->drawing_area, "button_press_event",
- nsgtk_window_button_press_event, g);
+ nsgtk_window_button_press_event, g);
+ CONNECT(g->drawing_area, "button_release_event",
+ nsgtk_window_button_release_event, g);
CONNECT(g->drawing_area, "key_press_event",
nsgtk_window_keypress_event, g);
CONNECT(g->viewport, "size_allocate",
@@ -314,6 +299,7 @@ gboolean nsgtk_window_expose_event(GtkWidget *widget,
plot = nsgtk_plotters;
nsgtk_plot_set_scale(g->bw->scale);
+ current_redraw_browser = g->bw;
content_redraw(c, 0, 0,
widget->allocation.width * scale,
widget->allocation.height * scale,
@@ -322,7 +308,8 @@ gboolean nsgtk_window_expose_event(GtkWidget *widget,
event->area.x + event->area.width,
event->area.y + event->area.height,
g->bw->scale, 0xFFFFFF);
-
+ current_redraw_browser = NULL;
+
if (g->careth != 0)
nsgtk_plot_caret(g->caretx, g->carety, g->careth);
@@ -338,10 +325,38 @@ gboolean nsgtk_window_motion_notify_event(GtkWidget *widget,
GdkEventMotion *event, gpointer data)
{
struct gui_window *g = data;
-
- browser_window_mouse_track(g->bw, 0, event->x / g->bw->scale,
- event->y / g->bw->scale);
-
+ bool shift = event->state & GDK_SHIFT_MASK;
+ bool ctrl = event->state & GDK_CONTROL_MASK;
+
+ if (g->mouse->state & BROWSER_MOUSE_PRESS_1){
+ /* Start button 1 drag */
+ browser_window_mouse_click(g->bw, BROWSER_MOUSE_DRAG_1,
+ event->x / g->bw->scale,
+ event->y / g->bw->scale);
+ /* Replace PRESS with HOLDING and declare drag in progress */
+ g->mouse->state ^= (BROWSER_MOUSE_PRESS_1 |
+ BROWSER_MOUSE_HOLDING_1);
+ g->mouse->state |= BROWSER_MOUSE_DRAG_ON;
+ }
+ else if (g->mouse->state & BROWSER_MOUSE_PRESS_2){
+ /* Start button 2 drag */
+ browser_window_mouse_click(g->bw, BROWSER_MOUSE_DRAG_2,
+ event->x / g->bw->scale,
+ event->y / g->bw->scale);
+ /* Replace PRESS with HOLDING and declare drag in progress */
+ g->mouse->state ^= (BROWSER_MOUSE_PRESS_2 |
+ BROWSER_MOUSE_HOLDING_2);
+ g->mouse->state |= BROWSER_MOUSE_DRAG_ON;
+ }
+ /* Handle modifiers being removed */
+ if (g->mouse->state & BROWSER_MOUSE_MOD_1 && !shift)
+ g->mouse->state ^= BROWSER_MOUSE_MOD_1;
+ if (g->mouse->state & BROWSER_MOUSE_MOD_2 && !ctrl)
+ g->mouse->state ^= BROWSER_MOUSE_MOD_2;
+
+ browser_window_mouse_track(g->bw, g->mouse->state,
+ event->x / g->bw->scale, event->y / g->bw->scale);
+
g->last_x = event->x;
g->last_y = event->y;
@@ -352,23 +367,54 @@ gboolean nsgtk_window_button_press_event(GtkWidget *widget,
GdkEventButton *event, gpointer data)
{
struct gui_window *g = data;
- int button = BROWSER_MOUSE_CLICK_1;
-
- if (event->button == 2) /* 2 == middle button on X */
- button = BROWSER_MOUSE_CLICK_2;
-
- if (event->button == 3) {
- /* 3 == right button on X */
+
+ if (event->button == 3){
nsgtk_scaffolding_popup_menu(g->scaffold, event->button);
return TRUE;
}
+
+ switch (event->button) {
+ case 1: g->mouse->state = BROWSER_MOUSE_PRESS_1; break;
+ case 2: g->mouse->state = BROWSER_MOUSE_PRESS_2; break;
+ }
+ /* Handle the modifiers too */
+ if (event->state & GDK_SHIFT_MASK)
+ g->mouse->state |= BROWSER_MOUSE_MOD_1;
+ if (event->state & GDK_CONTROL_MASK)
+ g->mouse->state |= BROWSER_MOUSE_MOD_2;
+
+ browser_window_mouse_click(g->bw, g->mouse->state, event->x / g->bw->scale,
+ event->y / g->bw->scale);
+}
- browser_window_mouse_click(g->bw, button,
- event->x / g->bw->scale,
- event->y / g->bw->scale);
-
- gtk_widget_grab_focus(widget);
-
+gboolean nsgtk_window_button_release_event(GtkWidget *widget,
+ GdkEventButton *event, gpointer data)
+{
+ int button;
+ struct gui_window *g = data;
+ bool shift = event->state & GDK_SHIFT_MASK;
+ bool ctrl = event->state & GDK_CONTROL_MASK;
+
+ /* If the mouse state is PRESS then we are waiting for a release to emit
+ * a click event, otherwise just reset the state to nothing*/
+ if (g->mouse->state & BROWSER_MOUSE_PRESS_1)
+ g->mouse->state ^= (BROWSER_MOUSE_PRESS_1 | BROWSER_MOUSE_CLICK_1);
+ else if (g->mouse->state & BROWSER_MOUSE_PRESS_2)
+ g->mouse->state ^= (BROWSER_MOUSE_PRESS_2 | BROWSER_MOUSE_CLICK_2);
+
+ /* Handle modifiers being removed */
+ if (g->mouse->state & BROWSER_MOUSE_MOD_1 && !shift)
+ g->mouse->state ^= BROWSER_MOUSE_MOD_1;
+ if (g->mouse->state & BROWSER_MOUSE_MOD_2 && !ctrl)
+ g->mouse->state ^= BROWSER_MOUSE_MOD_2;
+
+ if (g->mouse->state & (BROWSER_MOUSE_CLICK_1|BROWSER_MOUSE_CLICK_2))
+ browser_window_mouse_click(g->bw, g->mouse->state, event->x / g->bw->scale,
+ event->y / g->bw->scale);
+ else
+ browser_window_mouse_drag_end(g->bw, 0, event->x, event->y);
+
+ g->mouse->state = 0;
return TRUE;
}
@@ -858,38 +904,6 @@ void gui_drag_save_selection(struct selection *s, struct gui_window *g)
}
-void gui_start_selection(struct gui_window *g)
-{
-
-}
-
-void gui_paste_from_clipboard(struct gui_window *g, int x, int y)
-{
-
-}
-
-bool gui_empty_clipboard(void)
-{
- return true;
-}
-
-bool gui_add_to_clipboard(const char *text, size_t length, bool space)
-{
- return true;
-}
-
-bool gui_commit_clipboard(void)
-{
- return true;
-}
-
-
-bool gui_copy_to_clipboard(struct selection *s)
-{
- return true;
-}
-
-
void gui_window_get_dimensions(struct gui_window *g, int *width, int *height,
bool scaled)
{
diff --git a/gtk/gtk_window.h b/gtk/gtk_window.h
index 0a030e8e7..43f292404 100644
--- a/gtk/gtk_window.h
+++ b/gtk/gtk_window.h
@@ -23,6 +23,45 @@
#include "desktop/browser.h"
#include "gtk/gtk_scaffolding.h"
+struct gui_window {
+ /* All gui_window objects have an ultimate scaffold */
+ nsgtk_scaffolding *scaffold;
+ /* A gui_window is the rendering of a browser_window */
+ struct browser_window *bw;
+ struct browser_mouse *mouse;
+
+ /* These are the storage for the rendering */
+ int caretx, carety, careth;
+ gui_pointer_shape current_pointer;
+ int last_x, last_y;
+
+ /* Within GTK, a gui_window is a scrolled window
+ * with a viewport inside
+ * with a gtkfixed in that
+ * with a drawing area in that
+ * The scrolled window is optional and only chosen
+ * for frames which need it. Otherwise we just use
+ * a viewport.
+ */
+ GtkScrolledWindow *scrolledwindow;
+ GtkViewport *viewport;
+ GtkFixed *fixed;
+ GtkDrawingArea *drawing_area;
+
+ /* Keep gui_windows in a list for cleanup later */
+ struct gui_window *next, *prev;
+};
+
+struct browser_mouse {
+ struct gui_window *gui;
+ struct box *box;
+
+ gdouble pressed_x;
+ gdouble pressed_y;
+ gboolean waiting;
+ browser_mouse_state state;
+};
+
void nsgtk_reflow_all_windows(void);
void nsgtk_window_process_reformats(void);
diff --git a/gtk/res/license b/gtk/res/license
new file mode 100644
index 000000000..6c2a58f90
--- /dev/null
+++ b/gtk/res/license
@@ -0,0 +1,332 @@
+The source code, documentation, translatable messages files and UI
+definitions contained within NetSurf are licensed under the following terms:
+
+ 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.
+
+ In addition, as a special exception, permission is granted to link the
+ code of this release of NetSurf with the OpenSSL project's "OpenSSL"
+ library (or with modified versions of it that use the same licence as
+ the "OpenSSL" library), and distribute the linked executables. You must
+ obey the GNU General Public License version 2 in all respects for all of
+ the code used other than "OpenSSL". If you modify the code, you may
+ extend this exception to your version of the code, but you are not
+ obligated to do so. If you do not wish to do so, delete this exception
+ statement from your version.
+
+All visual artwork contained within NetSurf is licensed under the terms of
+the MIT License.
+
+The full text of the MIT and GPL licenses are provided in Annex A and
+Annex B of this document.
+
+
+Annex A: The MIT License
+------------------------
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+
+Annex B: The GNU General Public License
+---------------------------------------
+
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software
+ interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the
+Free Software Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS
+NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE
+LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS
+AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF
+ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OFMERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU
+ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY
+MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE
+TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE
+THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA
+BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISE
+OF THE POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
diff --git a/gtk/res/netsurf.glade b/gtk/res/netsurf.glade
index b961ca97c..d1b1e15f4 100644
--- a/gtk/res/netsurf.glade
+++ b/gtk/res/netsurf.glade
@@ -190,7 +190,6 @@
<child>
<widget class="GtkImageMenuItem" id="cut">
<property name="visible">True</property>
- <property name="sensitive">False</property>
<property name="label">gtk-cut</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
@@ -199,7 +198,6 @@
<child>
<widget class="GtkImageMenuItem" id="copy">
<property name="visible">True</property>
- <property name="sensitive">False</property>
<property name="label">gtk-copy</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
@@ -208,7 +206,6 @@
<child>
<widget class="GtkImageMenuItem" id="paste">
<property name="visible">True</property>
- <property name="sensitive">False</property>
<property name="label">gtk-paste</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
@@ -229,13 +226,12 @@
</widget>
</child>
<child>
- <widget class="GtkMenuItem" id="select_all">
+ <widget class="GtkImageMenuItem" id="select_all">
<property name="visible">True</property>
- <property name="sensitive">False</property>
<property name="tooltip" translatable="yes">Selects all text in the current browser window.</property>
- <property name="label" translatable="yes">_Select All</property>
+ <property name="label">gtk-select-all</property>
<property name="use_underline">True</property>
- <accelerator key="A" modifiers="GDK_CONTROL_MASK" signal="activate"/>
+ <property name="use_stock">True</property>
</widget>
</child>
<child>
@@ -799,12 +795,22 @@
<child>
<widget class="GtkTable" id="centreTable">
<property name="visible">True</property>
- <property name="n_rows">2</property>
+ <property name="n_rows">3</property>
<property name="n_columns">2</property>
<child>
<placeholder/>
</child>
<child>
+ <widget class="GtkHSeparator" id="hseparator3">
+ <property name="visible">True</property>
+ </widget>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
<widget class="GtkVScrollbar" id="coreScrollVertical">
<property name="visible">True</property>
<property name="adjustment">0 0 100 1 10 0</property>
@@ -812,17 +818,16 @@
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
+ <property name="bottom_attach">2</property>
<property name="x_options">GTK_FILL</property>
</packing>
</child>
<child>
<widget class="GtkHPaned" id="hpaned1">
<property name="visible">True</property>
- <property name="can_focus">True</property>
<child>
<widget class="GtkLabel" id="statusBar">
<property name="visible">True</property>
- <property name="can_focus">True</property>
<property name="xalign">0</property>
<property name="xpad">4</property>
<property name="label" translatable="yes">Status bar text goes here</property>
@@ -847,8 +852,8 @@
</child>
</widget>
<packing>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
<property name="y_options">GTK_SHRINK</property>
</packing>
</child>
@@ -860,8 +865,8 @@
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options">GTK_SHRINK | GTK_FILL</property>
</packing>
@@ -926,7 +931,6 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="visibility">False</property>
- <property name="invisible_char">*</property>
<property name="activates_default">True</property>
<property name="text" translatable="yes">opensesame</property>
</widget>
@@ -1284,1478 +1288,6 @@
</widget>
</child>
</widget>
- <widget class="GtkWindow" id="wndPreferences">
- <property name="can_focus">True</property>
- <property name="title" translatable="yes">NetSurf Preferences</property>
- <property name="window_position">GTK_WIN_POS_CENTER</property>
- <property name="urgency_hint">True</property>
- <signal name="delete_event" handler="gtk_widget_hide"/>
- <child>
- <widget class="GtkVBox" id="vbox15">
- <property name="visible">True</property>
- <property name="border_width">6</property>
- <child>
- <widget class="GtkNotebook" id="notebook2">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="border_width">4</property>
- <child>
- <widget class="GtkVBox" id="vbox16">
- <property name="visible">True</property>
- <child>
- <widget class="GtkFrame" id="frame14">
- <property name="visible">True</property>
- <property name="border_width">5</property>
- <property name="label_xalign">0</property>
- <child>
- <widget class="GtkAlignment" id="alignment18">
- <property name="visible">True</property>
- <property name="left_padding">12</property>
- <child>
- <widget class="GtkHBox" id="hbox16">
- <property name="visible">True</property>
- <property name="border_width">5</property>
- <property name="spacing">5</property>
- <child>
- <widget class="GtkLabel" id="label64">
- <property name="visible">True</property>
- <property name="label" translatable="yes">URL</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- <child>
- <widget class="GtkEntry" id="entryHomePageURL">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="tooltip" translatable="yes">The page to visit when the Home button is pressed, or a new window is opened.</property>
- <property name="text" translatable="yes">http://netsurf-browser.org/</property>
- </widget>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- <child>
- <widget class="GtkLabel" id="label65">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Home page&lt;/b&gt;</property>
- <property name="use_markup">True</property>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="expand">False</property>
- </packing>
- </child>
- <child>
- <widget class="GtkFrame" id="frame15">
- <property name="visible">True</property>
- <property name="border_width">5</property>
- <property name="label_xalign">0</property>
- <child>
- <widget class="GtkAlignment" id="alignment19">
- <property name="visible">True</property>
- <property name="left_padding">12</property>
- <child>
- <widget class="GtkVBox" id="vbox17">
- <property name="visible">True</property>
- <property name="homogeneous">True</property>
- <child>
- <widget class="GtkCheckButton" id="checkHideAdverts">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="tooltip" translatable="yes">Attempt to hide images from known advertisement servers.</property>
- <property name="label" translatable="yes">Hide advertisements</property>
- <property name="use_underline">True</property>
- <property name="response_id">0</property>
- <property name="draw_indicator">True</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- <child>
- <widget class="GtkCheckButton" id="checkDisablePopups">
- <property name="visible">True</property>
- <property name="sensitive">False</property>
- <property name="can_focus">True</property>
- <property name="tooltip" translatable="yes">Stop pop-up windows normally containing adverts appearing.</property>
- <property name="label" translatable="yes">Disable pop-up windows</property>
- <property name="use_underline">True</property>
- <property name="response_id">0</property>
- <property name="draw_indicator">True</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <widget class="GtkCheckButton" id="checkDisablePlugins">
- <property name="visible">True</property>
- <property name="sensitive">False</property>
- <property name="can_focus">True</property>
- <property name="tooltip" translatable="yes">Do not allow the embedded of applets and plugins.</property>
- <property name="label" translatable="yes">Disable plug-ins</property>
- <property name="use_underline">True</property>
- <property name="response_id">0</property>
- <property name="draw_indicator">True</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">2</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- <child>
- <widget class="GtkLabel" id="label66">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Content blocking&lt;/b&gt;</property>
- <property name="use_markup">True</property>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <widget class="GtkFrame" id="frame16">
- <property name="visible">True</property>
- <property name="border_width">5</property>
- <property name="label_xalign">0</property>
- <child>
- <widget class="GtkAlignment" id="alignment20">
- <property name="visible">True</property>
- <property name="left_padding">12</property>
- <child>
- <widget class="GtkVBox" id="vbox18">
- <property name="visible">True</property>
- <property name="border_width">1</property>
- <property name="spacing">2</property>
- <child>
- <widget class="GtkHBox" id="hbox17">
- <property name="visible">True</property>
- <property name="border_width">4</property>
- <property name="spacing">4</property>
- <child>
- <widget class="GtkLabel" id="label67">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Keep history for</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- <child>
- <widget class="GtkSpinButton" id="spinHistoryAge">
- <property name="visible">True</property>
- <property name="sensitive">False</property>
- <property name="can_focus">True</property>
- <property name="tooltip" translatable="yes">Visited pages are forgotten after this many days</property>
- <property name="adjustment">14 0 100 1 10 10</property>
- <property name="climb_rate">1</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <widget class="GtkLabel" id="label68">
- <property name="visible">True</property>
- <property name="label" translatable="yes">days</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">2</property>
- </packing>
- </child>
- </widget>
- </child>
- <child>
- <widget class="GtkCheckButton" id="checkHoverURLs">
- <property name="visible">True</property>
- <property name="sensitive">False</property>
- <property name="can_focus">True</property>
- <property name="tooltip" translatable="yes">Show a tooltip showing the URL of a page in the local history tree.</property>
- <property name="label" translatable="yes">Hover URLs by pointer in local history</property>
- <property name="use_underline">True</property>
- <property name="response_id">0</property>
- <property name="draw_indicator">True</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- <child>
- <widget class="GtkLabel" id="label69">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;History&lt;/b&gt;</property>
- <property name="use_markup">True</property>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">2</property>
- </packing>
- </child>
- <child>
- <widget class="GtkFrame" id="frame17">
- <property name="visible">True</property>
- <property name="border_width">5</property>
- <property name="label_xalign">0</property>
- <child>
- <widget class="GtkAlignment" id="alignment21">
- <property name="visible">True</property>
- <property name="left_padding">12</property>
- <child>
- <widget class="GtkVBox" id="vbox19">
- <property name="visible">True</property>
- <property name="homogeneous">True</property>
- <child>
- <widget class="GtkCheckButton" id="checkRequestOverwrite">
- <property name="visible">True</property>
- <property name="sensitive">False</property>
- <property name="can_focus">True</property>
- <property name="tooltip" translatable="yes">Ask before overwriting files when downloading.</property>
- <property name="label" translatable="yes">Request confirmation before overwriting files</property>
- <property name="use_underline">True</property>
- <property name="response_id">0</property>
- <property name="draw_indicator">True</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- <child>
- <widget class="GtkCheckButton" id="checkDisplayRecentURLs">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="tooltip" translatable="yes">Show a drop-down list of recent addresses when typing into the address bar.</property>
- <property name="label" translatable="yes">Display recently visited URLs as you type</property>
- <property name="use_underline">True</property>
- <property name="response_id">0</property>
- <property name="draw_indicator">True</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <widget class="GtkCheckButton" id="checkSendReferer">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="tooltip" translatable="yes">When requesting items or pages, tell the server what linked to them.</property>
- <property name="label" translatable="yes">Send site referral information</property>
- <property name="use_underline">True</property>
- <property name="response_id">0</property>
- <property name="active">True</property>
- <property name="draw_indicator">True</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">2</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- <child>
- <widget class="GtkLabel" id="label70">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Misc&lt;/b&gt;</property>
- <property name="use_markup">True</property>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="position">3</property>
- </packing>
- </child>
- </widget>
- </child>
- <child>
- <widget class="GtkLabel" id="label71">
- <property name="visible">True</property>
- <property name="label" translatable="yes">General</property>
- </widget>
- <packing>
- <property name="type">tab</property>
- <property name="tab_fill">False</property>
- </packing>
- </child>
- <child>
- <widget class="GtkVBox" id="vbox20">
- <property name="visible">True</property>
- <child>
- <widget class="GtkFrame" id="frame18">
- <property name="visible">True</property>
- <property name="border_width">5</property>
- <property name="label_xalign">0</property>
- <child>
- <widget class="GtkAlignment" id="alignment22">
- <property name="visible">True</property>
- <property name="left_padding">12</property>
- <child>
- <widget class="GtkTable" id="table7">
- <property name="visible">True</property>
- <property name="n_rows">4</property>
- <property name="n_columns">2</property>
- <property name="column_spacing">3</property>
- <property name="row_spacing">3</property>
- <child>
- <widget class="GtkEntry" id="entryProxyUser">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="tooltip" translatable="yes">If your proxy server requires authentication, enter your username here.</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="y_options"></property>
- </packing>
- </child>
- <child>
- <widget class="GtkComboBox" id="comboProxyType">
- <property name="visible">True</property>
- <property name="items" translatable="yes">No proxy
-Simple proxy
-Basic authentication
-NTLM authentication</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="y_options"></property>
- </packing>
- </child>
- <child>
- <widget class="GtkHBox" id="hbox18">
- <property name="visible">True</property>
- <child>
- <widget class="GtkEntry" id="entryProxyHost">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="tooltip" translatable="yes">Host name of your proxy server.</property>
- </widget>
- </child>
- <child>
- <widget class="GtkLabel" id="label72">
- <property name="visible">True</property>
- <property name="label" translatable="yes">:</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <widget class="GtkEntry" id="entryProxyPort">
- <property name="width_request">64</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="tooltip" translatable="yes">Port number to connect to on proxy server.</property>
- </widget>
- <packing>
- <property name="position">2</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">GTK_FILL</property>
- <property name="y_options">GTK_FILL</property>
- </packing>
- </child>
- <child>
- <widget class="GtkLabel" id="label73">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Password</property>
- </widget>
- <packing>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="x_options"></property>
- <property name="y_options">GTK_EXPAND</property>
- </packing>
- </child>
- <child>
- <widget class="GtkLabel" id="label74">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Username</property>
- </widget>
- <packing>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options"></property>
- <property name="y_options">GTK_EXPAND</property>
- </packing>
- </child>
- <child>
- <widget class="GtkLabel" id="label75">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Host</property>
- </widget>
- <packing>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options"></property>
- <property name="y_options">GTK_EXPAND</property>
- </packing>
- </child>
- <child>
- <widget class="GtkLabel" id="label76">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Proxy type</property>
- </widget>
- <packing>
- <property name="x_options"></property>
- <property name="y_options">GTK_EXPAND</property>
- </packing>
- </child>
- <child>
- <widget class="GtkEntry" id="entryProxyPassword">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="tooltip" translatable="yes">If your proxy server requires authentication, enter your password here.</property>
- <property name="visibility">False</property>
- <property name="invisible_char">*</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="y_options"></property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- <child>
- <widget class="GtkLabel" id="label77">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;HTTP Proxy&lt;/b&gt;</property>
- <property name="use_markup">True</property>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="expand">False</property>
- </packing>
- </child>
- <child>
- <widget class="GtkFrame" id="frame19">
- <property name="visible">True</property>
- <property name="border_width">5</property>
- <property name="label_xalign">0</property>
- <child>
- <widget class="GtkAlignment" id="alignment23">
- <property name="visible">True</property>
- <property name="left_padding">12</property>
- <child>
- <widget class="GtkTable" id="table8">
- <property name="visible">True</property>
- <property name="border_width">3</property>
- <property name="n_rows">3</property>
- <property name="n_columns">2</property>
- <property name="column_spacing">3</property>
- <property name="row_spacing">3</property>
- <child>
- <widget class="GtkLabel" id="label78">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Maximum fetchers</property>
- </widget>
- <packing>
- <property name="y_options">GTK_EXPAND</property>
- </packing>
- </child>
- <child>
- <widget class="GtkLabel" id="label79">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Fetches per host</property>
- </widget>
- <packing>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="y_options">GTK_EXPAND</property>
- </packing>
- </child>
- <child>
- <widget class="GtkLabel" id="label80">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Cached connections</property>
- </widget>
- <packing>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="y_options">GTK_EXPAND</property>
- </packing>
- </child>
- <child>
- <widget class="GtkSpinButton" id="spinCachedConnections">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="tooltip" translatable="yes">Number of connections to keep incase they are needed again.</property>
- <property name="adjustment">1 0 100 1 10 10</property>
- <property name="climb_rate">1</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="y_options"></property>
- </packing>
- </child>
- <child>
- <widget class="GtkSpinButton" id="spinFetchesPerHost">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="tooltip" translatable="yes">Maximum number of item fetches per web server.</property>
- <property name="adjustment">1 0 100 1 10 10</property>
- <property name="climb_rate">1</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="y_options"></property>
- </packing>
- </child>
- <child>
- <widget class="GtkSpinButton" id="spinMaxFetchers">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="tooltip" translatable="yes">Maximum number of concurrent items to fetch at once.</property>
- <property name="adjustment">1 0 100 1 10 10</property>
- <property name="climb_rate">1</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="y_options"></property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- <child>
- <widget class="GtkLabel" id="label81">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Fetching&lt;/b&gt;</property>
- <property name="use_markup">True</property>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <widget class="GtkLabel" id="label82">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Network</property>
- </widget>
- <packing>
- <property name="type">tab</property>
- <property name="position">1</property>
- <property name="tab_fill">False</property>
- </packing>
- </child>
- <child>
- <widget class="GtkVBox" id="vbox21">
- <property name="visible">True</property>
- <child>
- <widget class="GtkFrame" id="frame20">
- <property name="visible">True</property>
- <property name="border_width">5</property>
- <property name="label_xalign">0</property>
- <child>
- <widget class="GtkAlignment" id="alignment24">
- <property name="visible">True</property>
- <property name="left_padding">12</property>
- <child>
- <widget class="GtkVBox" id="vbox22">
- <property name="visible">True</property>
- <child>
- <widget class="GtkCheckButton" id="checkUseCairo">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="tooltip" translatable="yes">Enable the use of Cairo, which provides better looking results at the cost of speed.</property>
- <property name="label" translatable="yes">Use Cairo for anti-aliased drawing</property>
- <property name="use_underline">True</property>
- <property name="response_id">0</property>
- <property name="active">True</property>
- <property name="draw_indicator">True</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- <child>
- <widget class="GtkCheckButton" id="checkResampleImages">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="tooltip" translatable="yes">Smoothly resize images when zooming in and out.</property>
- <property name="label" translatable="yes">Resample images when not at natural size</property>
- <property name="use_underline">True</property>
- <property name="response_id">0</property>
- <property name="active">True</property>
- <property name="draw_indicator">True</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- <child>
- <widget class="GtkLabel" id="label83">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Quality&lt;/b&gt;</property>
- <property name="use_markup">True</property>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="expand">False</property>
- </packing>
- </child>
- <child>
- <widget class="GtkFrame" id="frame21">
- <property name="visible">True</property>
- <property name="border_width">5</property>
- <property name="label_xalign">0</property>
- <child>
- <widget class="GtkAlignment" id="alignment25">
- <property name="visible">True</property>
- <property name="left_padding">12</property>
- <child>
- <widget class="GtkVBox" id="vbox23">
- <property name="visible">True</property>
- <child>
- <widget class="GtkHBox" id="hbox19">
- <property name="visible">True</property>
- <property name="spacing">5</property>
- <child>
- <widget class="GtkLabel" id="label84">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Limit speed to</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- <child>
- <widget class="GtkSpinButton" id="spinAnimationSpeed">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="tooltip" translatable="yes">Do not update animations any more often than this.</property>
- <property name="adjustment">0 0 100 0.10000000149 1 1</property>
- <property name="climb_rate">1</property>
- <property name="digits">1</property>
- <property name="numeric">True</property>
- <property name="update_policy">GTK_UPDATE_IF_VALID</property>
- </widget>
- <packing>
- <property name="fill">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <widget class="GtkLabel" id="label85">
- <property name="visible">True</property>
- <property name="label" translatable="yes">seconds between frames</property>
- </widget>
- <packing>
- <property name="position">2</property>
- </packing>
- </child>
- </widget>
- </child>
- <child>
- <widget class="GtkCheckButton" id="checkDisableAnimations">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="tooltip" translatable="yes">Display only the first frame of animated images.</property>
- <property name="label" translatable="yes">Disable animations</property>
- <property name="use_underline">True</property>
- <property name="response_id">0</property>
- <property name="draw_indicator">True</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- <child>
- <widget class="GtkLabel" id="label86">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Animations&lt;/b&gt;</property>
- <property name="use_markup">True</property>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="position">2</property>
- </packing>
- </child>
- <child>
- <widget class="GtkLabel" id="label87">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Rendering</property>
- </widget>
- <packing>
- <property name="type">tab</property>
- <property name="position">2</property>
- <property name="tab_fill">False</property>
- </packing>
- </child>
- <child>
- <widget class="GtkVBox" id="vbox24">
- <property name="visible">True</property>
- <child>
- <widget class="GtkFrame" id="frame22">
- <property name="visible">True</property>
- <property name="border_width">5</property>
- <property name="label_xalign">0</property>
- <child>
- <widget class="GtkAlignment" id="alignment26">
- <property name="visible">True</property>
- <property name="left_padding">12</property>
- <child>
- <widget class="GtkTable" id="table9">
- <property name="visible">True</property>
- <property name="border_width">2</property>
- <property name="n_rows">6</property>
- <property name="n_columns">2</property>
- <property name="column_spacing">3</property>
- <property name="row_spacing">3</property>
- <child>
- <widget class="GtkLabel" id="label88">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Sans-serif</property>
- </widget>
- <packing>
- <property name="x_options">GTK_FILL</property>
- <property name="y_options"></property>
- </packing>
- </child>
- <child>
- <widget class="GtkLabel" id="label89">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Serif</property>
- </widget>
- <packing>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">GTK_FILL</property>
- <property name="y_options"></property>
- </packing>
- </child>
- <child>
- <widget class="GtkLabel" id="label90">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Monospace</property>
- </widget>
- <packing>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">GTK_FILL</property>
- <property name="y_options"></property>
- </packing>
- </child>
- <child>
- <widget class="GtkLabel" id="label91">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Cursive</property>
- </widget>
- <packing>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="x_options">GTK_FILL</property>
- <property name="y_options"></property>
- </packing>
- </child>
- <child>
- <widget class="GtkLabel" id="label92">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Fantasy</property>
- </widget>
- <packing>
- <property name="top_attach">4</property>
- <property name="bottom_attach">5</property>
- <property name="x_options">GTK_FILL</property>
- <property name="y_options"></property>
- </packing>
- </child>
- <child>
- <widget class="GtkLabel" id="label93">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Default</property>
- </widget>
- <packing>
- <property name="top_attach">5</property>
- <property name="bottom_attach">6</property>
- <property name="x_options">GTK_FILL</property>
- <property name="y_options"></property>
- </packing>
- </child>
- <child>
- <widget class="GtkFontButton" id="fontSerif">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="response_id">0</property>
- <property name="show_style">False</property>
- <property name="show_size">False</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">GTK_FILL</property>
- <property name="y_options"></property>
- </packing>
- </child>
- <child>
- <widget class="GtkFontButton" id="fontMonospace">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="response_id">0</property>
- <property name="show_style">False</property>
- <property name="show_size">False</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">GTK_FILL</property>
- <property name="y_options"></property>
- </packing>
- </child>
- <child>
- <widget class="GtkFontButton" id="fontCursive">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="response_id">0</property>
- <property name="show_style">False</property>
- <property name="show_size">False</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="x_options">GTK_FILL</property>
- <property name="y_options"></property>
- </packing>
- </child>
- <child>
- <widget class="GtkFontButton" id="fontFantasy">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="response_id">0</property>
- <property name="show_style">False</property>
- <property name="show_size">False</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">4</property>
- <property name="bottom_attach">5</property>
- <property name="x_options">GTK_FILL</property>
- <property name="y_options"></property>
- </packing>
- </child>
- <child>
- <widget class="GtkComboBox" id="comboDefault">
- <property name="visible">True</property>
- <property name="items" translatable="yes">Sans-serif
-Serif
-Monospace
-Cursive
-Fantasy</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">5</property>
- <property name="bottom_attach">6</property>
- <property name="x_options">GTK_FILL</property>
- <property name="y_options">GTK_FILL</property>
- </packing>
- </child>
- <child>
- <widget class="GtkFontButton" id="fontSansSerif">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="response_id">0</property>
- <property name="show_style">False</property>
- <property name="show_size">False</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="y_options"></property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- <child>
- <widget class="GtkLabel" id="label94">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Font faces&lt;/b&gt;</property>
- <property name="use_markup">True</property>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="expand">False</property>
- </packing>
- </child>
- <child>
- <widget class="GtkFrame" id="frame23">
- <property name="visible">True</property>
- <property name="border_width">5</property>
- <property name="label_xalign">0</property>
- <child>
- <widget class="GtkAlignment" id="alignment27">
- <property name="visible">True</property>
- <property name="left_padding">12</property>
- <child>
- <widget class="GtkTable" id="table10">
- <property name="visible">True</property>
- <property name="n_rows">2</property>
- <property name="n_columns">3</property>
- <property name="column_spacing">3</property>
- <property name="row_spacing">3</property>
- <child>
- <widget class="GtkLabel" id="label95">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Default</property>
- </widget>
- <packing>
- <property name="x_options">GTK_FILL</property>
- <property name="y_options"></property>
- </packing>
- </child>
- <child>
- <widget class="GtkLabel" id="label96">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Minimum</property>
- </widget>
- <packing>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">GTK_FILL</property>
- <property name="y_options"></property>
- </packing>
- </child>
- <child>
- <widget class="GtkSpinButton" id="spinDefaultSize">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="tooltip" translatable="yes">The base-line font size to use.</property>
- <property name="adjustment">1 0 100 1 10 10</property>
- <property name="climb_rate">1</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="x_options"></property>
- <property name="y_options"></property>
- </packing>
- </child>
- <child>
- <widget class="GtkSpinButton" id="spinMinimumSize">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="tooltip" translatable="yes">Do not allow text to be displayed any smaller than this.</property>
- <property name="adjustment">1 0 100 1 10 10</property>
- <property name="climb_rate">1</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options"></property>
- <property name="y_options"></property>
- </packing>
- </child>
- <child>
- <widget class="GtkLabel" id="label97">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">pt</property>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="y_options"></property>
- </packing>
- </child>
- <child>
- <widget class="GtkLabel" id="label98">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">pt</property>
- </widget>
- <packing>
- <property name="left_attach">2</property>
- <property name="right_attach">3</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="y_options"></property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- <child>
- <widget class="GtkLabel" id="label99">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Font size&lt;/b&gt;</property>
- <property name="use_markup">True</property>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="position">3</property>
- </packing>
- </child>
- <child>
- <widget class="GtkLabel" id="label100">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Fonts</property>
- </widget>
- <packing>
- <property name="type">tab</property>
- <property name="position">3</property>
- <property name="tab_fill">False</property>
- </packing>
- </child>
- <child>
- <widget class="GtkVBox" id="vbox25">
- <property name="visible">True</property>
- <child>
- <widget class="GtkFrame" id="frame24">
- <property name="visible">True</property>
- <property name="border_width">5</property>
- <property name="label_xalign">0</property>
- <child>
- <widget class="GtkAlignment" id="alignment28">
- <property name="visible">True</property>
- <property name="left_padding">12</property>
- <child>
- <widget class="GtkHBox" id="hbox20">
- <property name="visible">True</property>
- <property name="border_width">2</property>
- <property name="spacing">6</property>
- <child>
- <widget class="GtkLabel" id="label101">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Size</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- <child>
- <widget class="GtkSpinButton" id="spinMemoryCacheSize">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="tooltip" translatable="yes">How much memory to use for caching recently viewed objects in memory.</property>
- <property name="adjustment">1 0 100 1 10 10</property>
- <property name="climb_rate">1</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <widget class="GtkLabel" id="label102">
- <property name="visible">True</property>
- <property name="label" translatable="yes">MB</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">2</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- <child>
- <widget class="GtkLabel" id="label103">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Memory cache&lt;/b&gt;</property>
- <property name="use_markup">True</property>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- <child>
- <widget class="GtkFrame" id="frame25">
- <property name="visible">True</property>
- <property name="border_width">5</property>
- <property name="label_xalign">0</property>
- <child>
- <widget class="GtkAlignment" id="alignment29">
- <property name="visible">True</property>
- <property name="left_padding">12</property>
- <child>
- <widget class="GtkVBox" id="vbox26">
- <property name="visible">True</property>
- <property name="spacing">5</property>
- <child>
- <widget class="GtkHBox" id="hbox21">
- <property name="visible">True</property>
- <property name="spacing">3</property>
- <child>
- <widget class="GtkLabel" id="label104">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Duration</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- <child>
- <widget class="GtkSpinButton" id="spinDiscCacheAge">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="tooltip" translatable="yes">How long to keep cached items around on disc.</property>
- <property name="adjustment">1 0 100 1 10 10</property>
- <property name="climb_rate">1</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <widget class="GtkLabel" id="label105">
- <property name="visible">True</property>
- <property name="label" translatable="yes">days</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">2</property>
- </packing>
- </child>
- </widget>
- </child>
- <child>
- <widget class="GtkHBox" id="hbox22">
- <property name="visible">True</property>
- <property name="border_width">4</property>
- <property name="spacing">4</property>
- <child>
- <placeholder/>
- </child>
- <child>
- <widget class="GtkButton" id="button4">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="tooltip" translatable="yes">Flush cached items that are older than the maximum permitted age.</property>
- <property name="response_id">0</property>
- <child>
- <widget class="GtkAlignment" id="alignment30">
- <property name="visible">True</property>
- <property name="xscale">0</property>
- <property name="yscale">0</property>
- <child>
- <widget class="GtkHBox" id="hbox23">
- <property name="visible">True</property>
- <property name="spacing">2</property>
- <child>
- <widget class="GtkImage" id="image399">
- <property name="visible">True</property>
- <property name="stock">gtk-delete</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- <child>
- <widget class="GtkLabel" id="label106">
- <property name="visible">True</property>
- <property name="sensitive">False</property>
- <property name="label" translatable="yes">Perform maintainance</property>
- <property name="use_underline">True</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <placeholder/>
- </child>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- <child>
- <widget class="GtkLabel" id="label107">
- <property name="visible">True</property>
- <property name="label" translatable="yes">&lt;b&gt;Disc cache&lt;/b&gt;</property>
- <property name="use_markup">True</property>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="position">4</property>
- </packing>
- </child>
- <child>
- <widget class="GtkLabel" id="label108">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Cache</property>
- </widget>
- <packing>
- <property name="type">tab</property>
- <property name="position">4</property>
- <property name="tab_fill">False</property>
- </packing>
- </child>
- </widget>
- </child>
- <child>
- <widget class="GtkHSeparator" id="hseparator1">
- <property name="visible">True</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">3</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <widget class="GtkHBox" id="hbox24">
- <property name="visible">True</property>
- <property name="spacing">8</property>
- <child>
- <widget class="GtkLabel" id="label109">
- <property name="visible">True</property>
- </widget>
- <packing>
- <property name="fill">False</property>
- </packing>
- </child>
- <child>
- <widget class="GtkButton" id="button9">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="can_default">True</property>
- <property name="tooltip" translatable="yes">Revert any made changes.</property>
- <property name="label">gtk-cancel</property>
- <property name="use_stock">True</property>
- <property name="response_id">0</property>
- <signal name="clicked" handler="gtk_widget_hide" object="wndPreferences"/>
- <signal name="clicked" handler="nsgtk_options_load"/>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <widget class="GtkButton" id="button8">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="can_default">True</property>
- <property name="tooltip" translatable="yes">Apply and save these changes now.</property>
- <property name="label">gtk-apply</property>
- <property name="use_stock">True</property>
- <property name="response_id">0</property>
- <signal name="clicked" handler="nsgtk_options_save"/>
- <signal name="clicked" handler="gtk_widget_hide" object="wndPreferences"/>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">2</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">2</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
<widget class="GtkWindow" id="wndHistory">
<property name="width_request">400</property>
<property name="height_request">500</property>
@@ -2916,542 +1448,6 @@ Fantasy</property>
</widget>
</child>
</widget>
- <widget class="GtkWindow" id="wndAbout">
- <property name="title" translatable="yes">About NetSurf</property>
- <property name="window_position">GTK_WIN_POS_CENTER</property>
- <signal name="delete_event" handler="gtk_widget_hide"/>
- <child>
- <widget class="GtkVBox" id="vbox31">
- <property name="visible">True</property>
- <property name="border_width">5</property>
- <child>
- <widget class="GtkImage" id="imageLogo">
- <property name="visible">True</property>
- <property name="stock">gtk-missing-image</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- <child>
- <widget class="GtkLabel" id="label128">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Open source web browser, ©NetSurf developers</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <widget class="GtkLabel" id="labelVersion">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Version Number</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">2</property>
- </packing>
- </child>
- <child>
- <widget class="GtkNotebook" id="notebook4">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="border_width">4</property>
- <property name="show_border">False</property>
- <child>
- <widget class="GtkScrolledWindow" id="scrolledwindow6">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="hscrollbar_policy">GTK_POLICY_NEVER</property>
- <property name="shadow_type">GTK_SHADOW_IN</property>
- <child>
- <widget class="GtkTextView" id="textview5">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">False</property>
- <property name="wrap_mode">GTK_WRAP_WORD</property>
- <property name="cursor_visible">False</property>
- <property name="accepts_tab">False</property>
- <property name="text" translatable="yes">Kevin Bagust, John M Bell, James Bursa, Matthew Hambley, Rob Jackson, Rob Kendrick, Jeffrey Lee, Adrian Lees, Phil Mellor, Philip Pemberton, Daniel Silverstone, Andrew Timmins, John Tytgat, and Richard Wilson.</property>
- </widget>
- </child>
- </widget>
- </child>
- <child>
- <widget class="GtkLabel" id="label123">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Written by</property>
- </widget>
- <packing>
- <property name="type">tab</property>
- <property name="tab_fill">False</property>
- </packing>
- </child>
- <child>
- <widget class="GtkScrolledWindow" id="scrolledwindow7">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="hscrollbar_policy">GTK_POLICY_NEVER</property>
- <property name="shadow_type">GTK_SHADOW_IN</property>
- <child>
- <widget class="GtkTextView" id="textview6">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">False</property>
- <property name="wrap_mode">GTK_WRAP_WORD</property>
- <property name="cursor_visible">False</property>
- <property name="accepts_tab">False</property>
- <property name="text" translatable="yes">Sebastian Barthel, Bruno D'Arcangeli, Michael Drake, Andrew Duffell, Richard Hallas, Gerard van Katwijk, Jérôme Mathevet, and Simon Voortman.</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <widget class="GtkLabel" id="label124">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Graphics/Translations by</property>
- </widget>
- <packing>
- <property name="type">tab</property>
- <property name="position">1</property>
- <property name="tab_fill">False</property>
- </packing>
- </child>
- <child>
- <widget class="GtkScrolledWindow" id="scrolledwindow8">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="hscrollbar_policy">GTK_POLICY_NEVER</property>
- <property name="shadow_type">GTK_SHADOW_IN</property>
- <child>
- <widget class="GtkTextView" id="textviewGPL">
- <property name="height_request">150</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">False</property>
- <property name="cursor_visible">False</property>
- <property name="accepts_tab">False</property>
- <property name="text" translatable="yes">The source code, documentation, translatable messages files and UI
-definitions contained within NetSurf are licensed under the following terms:
-
- 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.
-
- In addition, as a special exception, permission is granted to link the
- code of this release of NetSurf with the OpenSSL project's "OpenSSL"
- library (or with modified versions of it that use the same licence as
- the "OpenSSL" library), and distribute the linked executables. You must
- obey the GNU General Public License version 2 in all respects for all of
- the code used other than "OpenSSL". If you modify the code, you may
- extend this exception to your version of the code, but you are not
- obligated to do so. If you do not wish to do so, delete this exception
- statement from your version.
-
-All visual artwork contained within NetSurf is licensed under the terms of
-the MIT License.
-
-The full text of the MIT and GPL licenses are provided in Annex A and
-Annex B of this document.
-
-
-Annex A: The MIT License
-------------------------
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-
-
-Annex B: The GNU General Public License
----------------------------------------
-
-
- GNU GENERAL PUBLIC LICENSE
- Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users. This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it. (Some other Free Software Foundation software is covered by
-the GNU Lesser General Public License instead.) You can apply it to
-your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
- To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have. You must make sure that they, too, receive or can get the
-source code. And you must show them these terms so they know their
-rights.
-
- We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
- Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software. If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
- Finally, any free program is threatened constantly by software
-patents. We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary. To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- GNU GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License. The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language. (Hereinafter, translation is included without limitation in
-the term "modification".) Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
- 1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
- 2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) You must cause the modified files to carry prominent notices
- stating that you changed the files and the date of any change.
-
- b) You must cause any work that you distribute or publish, that in
- whole or in part contains or is derived from the Program or any
- part thereof, to be licensed as a whole at no charge to all third
- parties under the terms of this License.
-
- c) If the modified program normally reads commands interactively
- when run, you must cause it, when started running for such
- interactive use in the most ordinary way, to print or display an
- announcement including an appropriate copyright notice and a
- notice that there is no warranty (or else, saying that you provide
- a warranty) and that users may redistribute the program under
- these conditions, and telling the user how to view a copy of this
- License. (Exception: if the Program itself is interactive but
- does not normally print such an announcement, your work based on
- the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
- a) Accompany it with the complete corresponding machine-readable
- source code, which must be distributed under the terms of Sections
- 1 and 2 above on a medium customarily used for software
- interchange; or,
-
- b) Accompany it with a written offer, valid for at least three
- years, to give any third party, for a charge no more than your
- cost of physically performing source distribution, a complete
- machine-readable copy of the corresponding source code, to be
- distributed under the terms of Sections 1 and 2 above on a medium
- customarily used for software interchange; or,
-
- c) Accompany it with the information you received as to the offer
- to distribute corresponding source code. (This alternative is
- allowed only for noncommercial distribution and only if you
- received the program in object code or executable form with such
- an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it. For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable. However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License. Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
- 5. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Program or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
- 6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
- 7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all. For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded. In such case, this License incorporates
-the limitation as if written in the body of this License.
-
- 9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation. If the Program does not specify a version number of
-this License, you may choose any version ever published by the
-Free Software Foundation.
-
- 10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission. For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this. Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
- NO WARRANTY
-
- 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS
-NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE
-LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS
-AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF
-ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
-THE IMPLIED WARRANTIES OFMERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU
-ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY
-MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE
-TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE
-THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA
-BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
-PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISE
-OF THE POSSIBILITY OF SUCH DAMAGES.
-
- END OF TERMS AND CONDITIONS</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="position">2</property>
- </packing>
- </child>
- <child>
- <widget class="GtkLabel" id="label125">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Licence</property>
- </widget>
- <packing>
- <property name="type">tab</property>
- <property name="position">2</property>
- <property name="tab_fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="position">3</property>
- </packing>
- </child>
- <child>
- <widget class="GtkHButtonBox" id="hbuttonbox1">
- <property name="visible">True</property>
- <property name="border_width">6</property>
- <property name="layout_style">GTK_BUTTONBOX_END</property>
- <child>
- <widget class="GtkButton" id="button10">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="can_default">True</property>
- <property name="response_id">0</property>
- <signal name="clicked" handler="gtk_widget_hide" object="wndAbout"/>
- <child>
- <widget class="GtkAlignment" id="alignment31">
- <property name="visible">True</property>
- <property name="xscale">0</property>
- <property name="yscale">0</property>
- <child>
- <widget class="GtkHBox" id="hbox27">
- <property name="visible">True</property>
- <property name="spacing">2</property>
- <child>
- <widget class="GtkImage" id="image484">
- <property name="visible">True</property>
- <property name="stock">gtk-close</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- <child>
- <widget class="GtkLabel" id="label127">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Close</property>
- <property name="use_underline">True</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">4</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
<widget class="GtkWindow" id="wndWarning">
<property name="title" translatable="yes">Warning from NetSurf</property>
<property name="window_position">GTK_WIN_POS_CENTER</property>
@@ -3526,100 +1522,6 @@ OF THE POSSIBILITY OF SUCH DAMAGES.
</widget>
</child>
</widget>
- <widget class="GtkFileChooserDialog" id="wndOpenFile">
- <property name="title" translatable="yes">Open file</property>
- <property name="modal">True</property>
- <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
- <child internal-child="vbox">
- <widget class="GtkVBox" id="dialog-vbox4">
- <property name="visible">True</property>
- <property name="spacing">24</property>
- <child internal-child="action_area">
- <widget class="GtkHButtonBox" id="dialog-action_area4">
- <property name="visible">True</property>
- <property name="layout_style">GTK_BUTTONBOX_END</property>
- <child>
- <widget class="GtkButton" id="button15">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="can_default">True</property>
- <property name="label">gtk-cancel</property>
- <property name="use_stock">True</property>
- <property name="response_id">-6</property>
- <signal name="clicked" handler="gtk_widget_hide" object="wndOpenFile"/>
- </widget>
- </child>
- <child>
- <widget class="GtkButton" id="button16">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="can_default">True</property>
- <property name="has_default">True</property>
- <property name="label">gtk-open</property>
- <property name="use_stock">True</property>
- <property name="response_id">-5</property>
- <signal name="clicked" handler="nsgtk_openfile_open"/>
- <signal name="clicked" handler="gtk_widget_hide" object="wndOpenFile"/>
- </widget>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="pack_type">GTK_PACK_END</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- <widget class="GtkMenu" id="menuPopup">
- <child>
- <widget class="GtkMenuItem" id="menupopup_file">
- <property name="visible">True</property>
- <property name="label" translatable="yes">File</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
- <child>
- <widget class="GtkMenuItem" id="menupopup_object">
- <property name="visible">True</property>
- <property name="sensitive">False</property>
- <property name="label" translatable="yes">Object</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
- <child>
- <widget class="GtkMenuItem" id="menupopup_edit">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Edit</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
- <child>
- <widget class="GtkMenuItem" id="menupopup_view">
- <property name="visible">True</property>
- <property name="label" translatable="yes">View</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
- <child>
- <widget class="GtkMenuItem" id="menupopup_navigate">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Navigate</property>
- <property name="use_underline">True</property>
- <signal name="activate" handler="on_menupopup_navigate_activate"/>
- </widget>
- </child>
- <child>
- <widget class="GtkMenuItem" id="menupopup_help">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Help</property>
- <property name="use_underline">True</property>
- </widget>
- </child>
- </widget>
<widget class="GtkWindow" id="wndDownloads">
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="title" translatable="yes">NetSurf Downloads</property>
@@ -3771,4 +1673,132 @@ OF THE POSSIBILITY OF SUCH DAMAGES.
</widget>
</child>
</widget>
+ <widget class="GtkMenu" id="menuPopup">
+ <child>
+ <widget class="GtkImageMenuItem" id="popupBack">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Back</property>
+ <property name="use_underline">True</property>
+ <child internal-child="image">
+ <widget class="GtkImage" id="menu-item-image31">
+ <property name="visible">True</property>
+ <property name="stock">gtk-go-back</property>
+ <property name="icon_size">1</property>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkImageMenuItem" id="popupForward">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Forward</property>
+ <property name="use_underline">True</property>
+ <child internal-child="image">
+ <widget class="GtkImage" id="menu-item-image32">
+ <property name="visible">True</property>
+ <property name="stock">gtk-go-forward</property>
+ <property name="icon_size">1</property>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkImageMenuItem" id="popupReload">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Reload</property>
+ <property name="use_underline">True</property>
+ <child internal-child="image">
+ <widget class="GtkImage" id="menu-item-image33">
+ <property name="visible">True</property>
+ <property name="stock">gtk-refresh</property>
+ <property name="icon_size">1</property>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkSeparatorMenuItem" id="separator">
+ <property name="visible">True</property>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkImageMenuItem" id="cut_popup">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Cu_t</property>
+ <property name="use_underline">True</property>
+ <child internal-child="image">
+ <widget class="GtkImage" id="menu-item-image22">
+ <property name="stock">gtk-cut</property>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkImageMenuItem" id="copy_popup">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Copy</property>
+ <property name="use_underline">True</property>
+ <child internal-child="image">
+ <widget class="GtkImage" id="menu-item-image23">
+ <property name="stock">gtk-copy</property>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkImageMenuItem" id="paste_popup">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Paste</property>
+ <property name="use_underline">True</property>
+ <child internal-child="image">
+ <widget class="GtkImage" id="menu-item-image24">
+ <property name="stock">gtk-paste</property>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkMenuItem" id="menupopup_file">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">File</property>
+ <property name="use_underline">True</property>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkMenuItem" id="menupopup_edit">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Edit</property>
+ <property name="use_underline">True</property>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkMenuItem" id="menupopup_view">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">View</property>
+ <property name="use_underline">True</property>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkMenuItem" id="menupopup_navigate">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Navigate</property>
+ <property name="use_underline">True</property>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkMenuItem" id="menupopup_object">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="label" translatable="yes">Object</property>
+ <property name="use_underline">True</property>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkMenuItem" id="menupopup_help">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Help</property>
+ <property name="use_underline">True</property>
+ </widget>
+ </child>
+ </widget>
</glade-interface>
diff --git a/gtk/res/options.glade b/gtk/res/options.glade
new file mode 100644
index 000000000..9e0c08650
--- /dev/null
+++ b/gtk/res/options.glade
@@ -0,0 +1,1520 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
+<!--Generated with glade3 3.4.4 on Mon Jun 9 14:16:52 2008 -->
+<glade-interface>
+ <widget class="GtkDialog" id="dlgPreferences">
+ <property name="border_width">5</property>
+ <property name="title" translatable="yes">Netsurf Preferences</property>
+ <property name="window_position">GTK_WIN_POS_CENTER_ON_PARENT</property>
+ <property name="destroy_with_parent">True</property>
+ <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+ <property name="has_separator">False</property>
+ <child internal-child="vbox">
+ <widget class="GtkVBox" id="dialog-vbox6">
+ <property name="visible">True</property>
+ <property name="spacing">2</property>
+ <child>
+ <widget class="GtkNotebook" id="notebook2">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="border_width">4</property>
+ <child>
+ <widget class="GtkVBox" id="vbox16">
+ <property name="visible">True</property>
+ <child>
+ <widget class="GtkFrame" id="frame14">
+ <property name="visible">True</property>
+ <property name="border_width">5</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">GTK_SHADOW_NONE</property>
+ <child>
+ <widget class="GtkAlignment" id="alignment18">
+ <property name="visible">True</property>
+ <property name="left_padding">12</property>
+ <child>
+ <widget class="GtkVBox" id="vbox1">
+ <property name="visible">True</property>
+ <child>
+ <widget class="GtkHBox" id="hbox16">
+ <property name="visible">True</property>
+ <property name="border_width">5</property>
+ <property name="spacing">5</property>
+ <child>
+ <widget class="GtkLabel" id="label64">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">URL</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkEntry" id="entryHomePageURL">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip" translatable="yes">The page to visit when the Home button is pressed, or a new window is opened.</property>
+ </widget>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkHBox" id="hbox1">
+ <property name="visible">True</property>
+ <property name="spacing">5</property>
+ <child>
+ <widget class="GtkButton" id="setCurrentPage">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="label" translatable="yes">Current Page</property>
+ <property name="response_id">0</property>
+ </widget>
+ <packing>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkButton" id="setDefaultPage">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_text">Set your homepage to the original NetSurf Page</property>
+ <property name="label" translatable="yes">Default Page</property>
+ <property name="response_id">0</property>
+ </widget>
+ <packing>
+ <property name="padding">5</property>
+ <property name="pack_type">GTK_PACK_END</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label65">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Home page&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </widget>
+ <packing>
+ <property name="type">label_item</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkFrame" id="frame15">
+ <property name="visible">True</property>
+ <property name="border_width">5</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">GTK_SHADOW_NONE</property>
+ <child>
+ <widget class="GtkAlignment" id="alignment19">
+ <property name="visible">True</property>
+ <property name="left_padding">12</property>
+ <child>
+ <widget class="GtkVBox" id="vbox17">
+ <property name="visible">True</property>
+ <property name="homogeneous">True</property>
+ <child>
+ <widget class="GtkCheckButton" id="checkHideAdverts">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip" translatable="yes">Attempt to hide images from known advertisement servers.</property>
+ <property name="label" translatable="yes">Hide advertisements</property>
+ <property name="use_underline">True</property>
+ <property name="response_id">0</property>
+ <property name="draw_indicator">True</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkCheckButton" id="checkDisablePopups">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip" translatable="yes">Stop pop-up windows normally containing adverts appearing.</property>
+ <property name="label" translatable="yes">Disable pop-up windows</property>
+ <property name="use_underline">True</property>
+ <property name="response_id">0</property>
+ <property name="draw_indicator">True</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkCheckButton" id="checkDisablePlugins">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip" translatable="yes">Do not allow the embedded of applets and plugins.</property>
+ <property name="label" translatable="yes">Disable plug-ins</property>
+ <property name="use_underline">True</property>
+ <property name="response_id">0</property>
+ <property name="draw_indicator">True</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label66">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Content blocking&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </widget>
+ <packing>
+ <property name="type">label_item</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkFrame" id="frame16">
+ <property name="visible">True</property>
+ <property name="border_width">5</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">GTK_SHADOW_NONE</property>
+ <child>
+ <widget class="GtkAlignment" id="alignment20">
+ <property name="visible">True</property>
+ <property name="left_padding">12</property>
+ <child>
+ <widget class="GtkVBox" id="vbox18">
+ <property name="visible">True</property>
+ <property name="border_width">1</property>
+ <property name="spacing">2</property>
+ <child>
+ <widget class="GtkHBox" id="hbox17">
+ <property name="visible">True</property>
+ <property name="border_width">4</property>
+ <property name="spacing">4</property>
+ <child>
+ <widget class="GtkLabel" id="label67">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Keep history for</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkSpinButton" id="spinHistoryAge">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip" translatable="yes">Visited pages are forgotten after this many days</property>
+ <property name="adjustment">14 0 100 1 10 10</property>
+ <property name="climb_rate">1</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label68">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">days</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkCheckButton" id="checkHoverURLs">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip" translatable="yes">Show a tooltip showing the URL of a page in the local history tree.</property>
+ <property name="label" translatable="yes">Hover URLs by pointer in local history</property>
+ <property name="use_underline">True</property>
+ <property name="response_id">0</property>
+ <property name="draw_indicator">True</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label69">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;History&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </widget>
+ <packing>
+ <property name="type">label_item</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkFrame" id="frame17">
+ <property name="visible">True</property>
+ <property name="border_width">5</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">GTK_SHADOW_NONE</property>
+ <child>
+ <widget class="GtkAlignment" id="alignment21">
+ <property name="visible">True</property>
+ <property name="left_padding">12</property>
+ <child>
+ <widget class="GtkVBox" id="vbox19">
+ <property name="visible">True</property>
+ <property name="homogeneous">True</property>
+ <child>
+ <widget class="GtkCheckButton" id="checkRequestOverwrite">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip" translatable="yes">Ask before overwriting files when downloading.</property>
+ <property name="label" translatable="yes">Request confirmation before overwriting files</property>
+ <property name="use_underline">True</property>
+ <property name="response_id">0</property>
+ <property name="draw_indicator">True</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkCheckButton" id="checkDisplayRecentURLs">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip" translatable="yes">Show a drop-down list of recent addresses when typing into the address bar.</property>
+ <property name="label" translatable="yes">Display recently visited URLs as you type</property>
+ <property name="use_underline">True</property>
+ <property name="response_id">0</property>
+ <property name="draw_indicator">True</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkCheckButton" id="checkSendReferer">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip" translatable="yes">When requesting items or pages, tell the server what linked to them.</property>
+ <property name="label" translatable="yes">Send site referral information</property>
+ <property name="use_underline">True</property>
+ <property name="response_id">0</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label70">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Misc&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </widget>
+ <packing>
+ <property name="type">label_item</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label71">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">General</property>
+ </widget>
+ <packing>
+ <property name="type">tab</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkVBox" id="vbox20">
+ <property name="visible">True</property>
+ <child>
+ <widget class="GtkFrame" id="frame18">
+ <property name="visible">True</property>
+ <property name="border_width">5</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">GTK_SHADOW_NONE</property>
+ <child>
+ <widget class="GtkAlignment" id="alignment22">
+ <property name="visible">True</property>
+ <property name="left_padding">12</property>
+ <child>
+ <widget class="GtkTable" id="table7">
+ <property name="visible">True</property>
+ <property name="n_rows">4</property>
+ <property name="n_columns">2</property>
+ <property name="column_spacing">3</property>
+ <property name="row_spacing">3</property>
+ <child>
+ <widget class="GtkEntry" id="entryProxyPassword">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip" translatable="yes">If your proxy server requires authentication, enter your password here.</property>
+ <property name="visibility">False</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label76">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Proxy type</property>
+ </widget>
+ <packing>
+ <property name="x_options"></property>
+ <property name="y_options">GTK_EXPAND</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label75">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Host</property>
+ </widget>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options"></property>
+ <property name="y_options">GTK_EXPAND</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label74">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Username</property>
+ </widget>
+ <packing>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options"></property>
+ <property name="y_options">GTK_EXPAND</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label73">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Password</property>
+ </widget>
+ <packing>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="x_options"></property>
+ <property name="y_options">GTK_EXPAND</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkHBox" id="hbox18">
+ <property name="visible">True</property>
+ <child>
+ <widget class="GtkEntry" id="entryProxyHost">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip" translatable="yes">Host name of your proxy server.</property>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label72">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">:</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkEntry" id="entryProxyPort">
+ <property name="width_request">64</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip" translatable="yes">Port number to connect to on proxy server.</property>
+ </widget>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkComboBox" id="comboProxyType">
+ <property name="visible">True</property>
+ <property name="items" translatable="yes">No proxy
+Simple proxy
+Basic authentication
+NTLM authentication</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkEntry" id="entryProxyUser">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip" translatable="yes">If your proxy server requires authentication, enter your username here.</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label77">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;HTTP Proxy&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </widget>
+ <packing>
+ <property name="type">label_item</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkFrame" id="frame19">
+ <property name="visible">True</property>
+ <property name="border_width">5</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">GTK_SHADOW_NONE</property>
+ <child>
+ <widget class="GtkAlignment" id="alignment23">
+ <property name="visible">True</property>
+ <property name="left_padding">12</property>
+ <child>
+ <widget class="GtkTable" id="table8">
+ <property name="visible">True</property>
+ <property name="border_width">3</property>
+ <property name="n_rows">3</property>
+ <property name="n_columns">2</property>
+ <property name="column_spacing">3</property>
+ <property name="row_spacing">3</property>
+ <child>
+ <widget class="GtkSpinButton" id="spinMaxFetchers">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip" translatable="yes">Maximum number of concurrent items to fetch at once.</property>
+ <property name="adjustment">1 0 100 1 10 10</property>
+ <property name="climb_rate">1</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkSpinButton" id="spinFetchesPerHost">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip" translatable="yes">Maximum number of item fetches per web server.</property>
+ <property name="adjustment">1 0 100 1 10 10</property>
+ <property name="climb_rate">1</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkSpinButton" id="spinCachedConnections">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip" translatable="yes">Number of connections to keep incase they are needed again.</property>
+ <property name="adjustment">1 0 100 1 10 10</property>
+ <property name="climb_rate">1</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label80">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Cached connections</property>
+ </widget>
+ <packing>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="y_options">GTK_EXPAND</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label79">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Fetches per host</property>
+ </widget>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="y_options">GTK_EXPAND</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label78">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Maximum fetchers</property>
+ </widget>
+ <packing>
+ <property name="y_options">GTK_EXPAND</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label81">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Fetching&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </widget>
+ <packing>
+ <property name="type">label_item</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label82">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Network</property>
+ </widget>
+ <packing>
+ <property name="type">tab</property>
+ <property name="position">1</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkVBox" id="vbox21">
+ <property name="visible">True</property>
+ <child>
+ <widget class="GtkFrame" id="frame20">
+ <property name="visible">True</property>
+ <property name="border_width">5</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">GTK_SHADOW_NONE</property>
+ <child>
+ <widget class="GtkAlignment" id="alignment24">
+ <property name="visible">True</property>
+ <property name="left_padding">12</property>
+ <child>
+ <widget class="GtkVBox" id="vbox2">
+ <property name="visible">True</property>
+ <child>
+ <widget class="GtkCheckButton" id="checkResampleImages1">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip" translatable="yes">Resample images when not at natural size</property>
+ <property name="label" translatable="yes">Resample images when not at natural size</property>
+ <property name="use_underline">True</property>
+ <property name="response_id">0</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label83">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Quality&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </widget>
+ <packing>
+ <property name="type">label_item</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkFrame" id="frame21">
+ <property name="visible">True</property>
+ <property name="border_width">5</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">GTK_SHADOW_NONE</property>
+ <child>
+ <widget class="GtkAlignment" id="alignment25">
+ <property name="visible">True</property>
+ <property name="left_padding">12</property>
+ <child>
+ <widget class="GtkVBox" id="vbox23">
+ <property name="visible">True</property>
+ <child>
+ <widget class="GtkHBox" id="hbox19">
+ <property name="visible">True</property>
+ <property name="spacing">5</property>
+ <child>
+ <widget class="GtkLabel" id="label84">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Limit speed to</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkSpinButton" id="spinAnimationSpeed">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip" translatable="yes">Do not update animations any more often than this.</property>
+ <property name="adjustment">0 0 100 0.10000000149 1 1</property>
+ <property name="climb_rate">1</property>
+ <property name="digits">1</property>
+ <property name="numeric">True</property>
+ <property name="update_policy">GTK_UPDATE_IF_VALID</property>
+ </widget>
+ <packing>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label85">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">seconds between frames</property>
+ </widget>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkCheckButton" id="checkDisableAnimations">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip" translatable="yes">Display only the first frame of animated images.</property>
+ <property name="label" translatable="yes">Disable animations</property>
+ <property name="use_underline">True</property>
+ <property name="response_id">0</property>
+ <property name="draw_indicator">True</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label86">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Animations&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </widget>
+ <packing>
+ <property name="type">label_item</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label87">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Rendering</property>
+ </widget>
+ <packing>
+ <property name="type">tab</property>
+ <property name="position">2</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkVBox" id="vbox24">
+ <property name="visible">True</property>
+ <child>
+ <widget class="GtkFrame" id="frame22">
+ <property name="visible">True</property>
+ <property name="border_width">5</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">GTK_SHADOW_NONE</property>
+ <child>
+ <widget class="GtkAlignment" id="alignment26">
+ <property name="visible">True</property>
+ <property name="left_padding">12</property>
+ <child>
+ <widget class="GtkTable" id="table9">
+ <property name="visible">True</property>
+ <property name="border_width">2</property>
+ <property name="n_rows">6</property>
+ <property name="n_columns">2</property>
+ <property name="column_spacing">3</property>
+ <property name="row_spacing">3</property>
+ <child>
+ <widget class="GtkFontButton" id="fontSansSerif">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="response_id">0</property>
+ <property name="show_style">False</property>
+ <property name="show_size">False</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkComboBox" id="comboDefault">
+ <property name="visible">True</property>
+ <property name="items" translatable="yes">Sans-serif
+Serif
+Monospace
+Cursive
+Fantasy</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">5</property>
+ <property name="bottom_attach">6</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options">GTK_FILL</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkFontButton" id="fontFantasy">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="response_id">0</property>
+ <property name="show_style">False</property>
+ <property name="show_size">False</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkFontButton" id="fontCursive">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="response_id">0</property>
+ <property name="show_style">False</property>
+ <property name="show_size">False</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkFontButton" id="fontMonospace">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="response_id">0</property>
+ <property name="show_style">False</property>
+ <property name="show_size">False</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkFontButton" id="fontSerif">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="response_id">0</property>
+ <property name="show_style">False</property>
+ <property name="show_size">False</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label93">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Default</property>
+ </widget>
+ <packing>
+ <property name="top_attach">5</property>
+ <property name="bottom_attach">6</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label92">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Fantasy</property>
+ </widget>
+ <packing>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label91">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Cursive</property>
+ </widget>
+ <packing>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label90">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Monospace</property>
+ </widget>
+ <packing>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label89">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Serif</property>
+ </widget>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label88">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Sans-serif</property>
+ </widget>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label94">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Font faces&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </widget>
+ <packing>
+ <property name="type">label_item</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkFrame" id="frame23">
+ <property name="visible">True</property>
+ <property name="border_width">5</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">GTK_SHADOW_NONE</property>
+ <child>
+ <widget class="GtkAlignment" id="alignment27">
+ <property name="visible">True</property>
+ <property name="left_padding">12</property>
+ <child>
+ <widget class="GtkTable" id="table10">
+ <property name="visible">True</property>
+ <property name="n_rows">2</property>
+ <property name="n_columns">4</property>
+ <property name="column_spacing">3</property>
+ <property name="row_spacing">3</property>
+ <child>
+ <widget class="GtkLabel" id="label98">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">pt</property>
+ </widget>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label97">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">pt</property>
+ </widget>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkSpinButton" id="spinMinimumSize">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip" translatable="yes">Do not allow text to be displayed any smaller than this.</property>
+ <property name="adjustment">1 0 100 1 10 10</property>
+ <property name="climb_rate">1</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options"></property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkSpinButton" id="spinDefaultSize">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip" translatable="yes">The base-line font size to use.</property>
+ <property name="adjustment">1 0 100 1 10 10</property>
+ <property name="climb_rate">1</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="x_options"></property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label96">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Minimum</property>
+ </widget>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label95">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Default</property>
+ </widget>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkButton" id="fontPreview">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip" translatable="yes">View the changes in the browser window immediately.</property>
+ <property name="response_id">0</property>
+ <child>
+ <widget class="GtkHBox" id="hbox3">
+ <property name="visible">True</property>
+ <property name="border_width">2</property>
+ <child>
+ <widget class="GtkImage" id="image1">
+ <property name="visible">True</property>
+ <property name="stock">gtk-apply</property>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Preview</property>
+ <property name="use_underline">True</property>
+ </widget>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="right_attach">4</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options"></property>
+ <property name="y_options"></property>
+ <property name="x_padding">2</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label99">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Font size&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </widget>
+ <packing>
+ <property name="type">label_item</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label100">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Fonts</property>
+ </widget>
+ <packing>
+ <property name="type">tab</property>
+ <property name="position">3</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkVBox" id="vbox25">
+ <property name="visible">True</property>
+ <child>
+ <widget class="GtkFrame" id="frame24">
+ <property name="visible">True</property>
+ <property name="border_width">5</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">GTK_SHADOW_NONE</property>
+ <child>
+ <widget class="GtkAlignment" id="alignment28">
+ <property name="visible">True</property>
+ <property name="left_padding">12</property>
+ <child>
+ <widget class="GtkHBox" id="hbox20">
+ <property name="visible">True</property>
+ <property name="border_width">2</property>
+ <property name="spacing">6</property>
+ <child>
+ <widget class="GtkLabel" id="label101">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Size</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkSpinButton" id="spinMemoryCacheSize">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip" translatable="yes">How much memory to use for caching recently viewed objects in memory.</property>
+ <property name="adjustment">1 0 100 1 10 10</property>
+ <property name="climb_rate">1</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label102">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">MB</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label103">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Memory cache&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </widget>
+ <packing>
+ <property name="type">label_item</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkFrame" id="frame25">
+ <property name="visible">True</property>
+ <property name="border_width">5</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">GTK_SHADOW_NONE</property>
+ <child>
+ <widget class="GtkAlignment" id="alignment29">
+ <property name="visible">True</property>
+ <property name="left_padding">12</property>
+ <child>
+ <widget class="GtkVBox" id="vbox26">
+ <property name="visible">True</property>
+ <property name="spacing">5</property>
+ <child>
+ <widget class="GtkHBox" id="hbox21">
+ <property name="visible">True</property>
+ <property name="spacing">3</property>
+ <child>
+ <widget class="GtkLabel" id="label104">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Duration</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkSpinButton" id="spinDiscCacheAge">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip" translatable="yes">How long to keep cached items around on disc.</property>
+ <property name="adjustment">1 0 100 1 10 10</property>
+ <property name="climb_rate">1</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label105">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">days</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkHBox" id="hbox22">
+ <property name="visible">True</property>
+ <property name="border_width">4</property>
+ <property name="spacing">4</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <widget class="GtkButton" id="button4">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip" translatable="yes">Flush cached items that are older than the maximum permitted age.</property>
+ <property name="response_id">0</property>
+ <child>
+ <widget class="GtkAlignment" id="alignment30">
+ <property name="visible">True</property>
+ <property name="xscale">0</property>
+ <property name="yscale">0</property>
+ <child>
+ <widget class="GtkHBox" id="hbox23">
+ <property name="visible">True</property>
+ <property name="spacing">2</property>
+ <child>
+ <widget class="GtkImage" id="image399">
+ <property name="visible">True</property>
+ <property name="stock">gtk-delete</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label106">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="label" translatable="yes">Perform maintainance</property>
+ <property name="use_underline">True</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label107">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">&lt;b&gt;Disc cache&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </widget>
+ <packing>
+ <property name="type">label_item</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label108">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Cache</property>
+ </widget>
+ <packing>
+ <property name="type">tab</property>
+ <property name="position">4</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child internal-child="action_area">
+ <widget class="GtkHButtonBox" id="dialog-action_area7">
+ <property name="visible">True</property>
+ <property name="layout_style">GTK_BUTTONBOX_EDGE</property>
+ <child>
+ <widget class="GtkButton" id="help">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="label" translatable="yes">gtk-help</property>
+ <property name="use_stock">True</property>
+ <property name="response_id">0</property>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkButton" id="close">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="label" translatable="yes">gtk-close</property>
+ <property name="use_stock">True</property>
+ <property name="response_id">-7</property>
+ </widget>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="pack_type">GTK_PACK_END</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+</glade-interface>