summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gtk/gtk_gui.c6
-rw-r--r--gtk/gtk_throbber.c131
-rw-r--r--gtk/gtk_throbber.h24
-rw-r--r--gtk/gtk_window.c1472
-rw-r--r--gtk/netsurf.glade1453
-rw-r--r--gtk/throbber.gifbin0 -> 5175 bytes
-rw-r--r--makefile2
7 files changed, 2024 insertions, 1064 deletions
diff --git a/gtk/gtk_gui.c b/gtk/gtk_gui.c
index 37fcea4e9..c6ade174f 100644
--- a/gtk/gtk_gui.c
+++ b/gtk/gtk_gui.c
@@ -30,6 +30,7 @@
#include "netsurf/gtk/gtk_options.h"
#include "netsurf/gtk/gtk_completion.h"
#include "netsurf/gtk/options.h"
+#include "netsurf/gtk/gtk_throbber.h"
#include "netsurf/render/box.h"
#include "netsurf/render/form.h"
#include "netsurf/render/html.h"
@@ -113,6 +114,11 @@ void gui_init(int argc, char** argv)
nsgtk_completion_init();
+ nsgtk_throbber_initialise("./gtk/throbber.gif");
+
+ gladeWindows = glade_xml_new("./gtk/netsurf.glade", NULL, NULL);
+ wndChoices = glade_xml_get_widget(gladeWindows, "wndChoices");
+
find_resource(buf, "Choices", "Choices");
LOG(("Using '%s' as Choices file", buf));
options_file_location = strdup(buf);
diff --git a/gtk/gtk_throbber.c b/gtk/gtk_throbber.c
new file mode 100644
index 000000000..a0b76b14d
--- /dev/null
+++ b/gtk/gtk_throbber.c
@@ -0,0 +1,131 @@
+/*
+ * This file is part of NetSurf, http://netsurf.sourceforge.net/
+ * Licensed under the GNU General Public License,
+ * http://www.opensource.org/licenses/gpl-license
+ * Copyright 2006 Rob Kendrick <rjek@rjek.com>
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "netsurf/utils/log.h"
+#include "netsurf/image/gifread.h"
+#include "netsurf/gtk/gtk_throbber.h"
+#include "netsurf/gtk/gtk_bitmap.h"
+
+struct nsgtk_throbber *nsgtk_throbber = NULL;
+
+bool nsgtk_throbber_initialise(const char *fn)
+{
+ /* disect the GIF provided by filename in *fn into a series of
+ * GdkPixbuf for use later.
+ */
+ struct gif_animation *gif; /**< structure for gifread.c */
+ struct nsgtk_throbber *throb; /**< structure we generate */
+ int i;
+
+ FILE *fh = fopen(fn, "rb");
+
+ if (fh == NULL) {
+ LOG(("Unable to open throbber image '%s' for reading!", fn));
+ return false;
+ }
+
+ gif = (struct gif_animation *)malloc(sizeof(struct gif_animation));
+ throb = (struct nsgtk_throbber *)malloc(sizeof(struct nsgtk_throbber));
+
+ /* discover the size of the data file. */
+ fseek(fh, 0, SEEK_END);
+ gif->buffer_size = ftell(fh);
+ fseek(fh, 0, SEEK_SET);
+
+ /* allocate a block of sufficient size, and load the data in. */
+ gif->gif_data = (unsigned char *)malloc(gif->buffer_size);
+ fread(gif->gif_data, gif->buffer_size, 1, fh);
+ fclose(fh);
+
+ /* set current position within GIF file to beginning, in order to
+ * signal to gifread that we're brand new.
+ */
+ gif->buffer_position = 0;
+
+ /* initialise the gif_animation structure. */
+ switch (gif_initialise(gif))
+ {
+ case GIF_INSUFFICIENT_FRAME_DATA:
+ case GIF_FRAME_DATA_ERROR:
+ case GIF_INSUFFICIENT_DATA:
+ case GIF_DATA_ERROR:
+ LOG(("GIF image '%s' appears invalid!", fn));
+ free(gif->gif_data);
+ free(gif);
+ free(throb);
+ return false;
+ break;
+ case GIF_INSUFFICIENT_MEMORY:
+ LOG(("Ran out of memory decoding GIF image '%s'!", fn));
+ free(gif->gif_data);
+ free(gif);
+ free(throb);
+ return false;
+ break;
+ }
+
+ throb->nframes = gif->frame_count;
+
+ if (throb->nframes < 2)
+ {
+ /* we need at least two frames - one for idle, one for active */
+ LOG(("Insufficent number of frames in throbber image '%s'!",
+ fn));
+ LOG(("(GIF contains %d frames, where 2 is a minimum.)",
+ throb->nframes));
+ free(gif->gif_data);
+ free(gif);
+ free(throb);
+ return false;
+ }
+
+ throb->framedata = (GdkPixbuf **)malloc(sizeof(GdkPixbuf *)
+ * throb->nframes);
+
+ /* decode each frame in turn, extracting the struct bitmap * for each,
+ * and put that in our array of frames.
+ */
+ for (i = 0; i < throb->nframes; i++)
+ {
+ gif_decode_frame(gif, i);
+ throb->framedata[i] = gdk_pixbuf_copy(
+ gtk_bitmap_get_primary(gif->frame_image));
+ }
+
+ gif_finalise(gif);
+ free(gif->gif_data);
+ free(gif);
+
+ /* debug code: save out each frame as a PNG to make sure decoding is
+ * working correctly.
+
+ for (i = 0; i < throb->nframes; i++) {
+ char fname[20];
+ sprintf(fname, "frame%d.png", i);
+ gdk_pixbuf_save(throb->framedata[i], fname, "png", NULL, NULL);
+ }
+ */
+
+ nsgtk_throbber = throb;
+
+ return true;
+}
+
+void nsgtk_throbber_finalise(void)
+{
+ int i;
+
+ for (i = 0; i < nsgtk_throbber->nframes; i++)
+ gdk_pixbuf_unref(nsgtk_throbber->framedata[i]);
+
+ free(nsgtk_throbber->framedata);
+ free(nsgtk_throbber);
+
+ nsgtk_throbber = NULL;
+}
diff --git a/gtk/gtk_throbber.h b/gtk/gtk_throbber.h
new file mode 100644
index 000000000..4c04a6904
--- /dev/null
+++ b/gtk/gtk_throbber.h
@@ -0,0 +1,24 @@
+/*
+ * This file is part of NetSurf, http://netsurf.sourceforge.net/
+ * Licensed under the GNU General Public License,
+ * http://www.opensource.org/licenses/gpl-license
+ * Copyright 2006 Rob Kendrick <rjek@rjek.com>
+ */
+
+#ifndef __GTK_THROBBER_H__
+#define __GTK_THROBBER_H__
+
+#include <gtk/gtk.h>
+
+struct nsgtk_throbber
+{
+ int nframes; /**< Number of frames in the throbber */
+ GdkPixbuf **framedata;
+};
+
+extern struct nsgtk_throbber *nsgtk_throbber;
+
+bool nsgtk_throbber_initialise(const char *fn);
+void nsgtk_throbber_finalise(void);
+
+#endif /* __GTK_THROBBER_H__ */
diff --git a/gtk/gtk_window.c b/gtk/gtk_window.c
index 5eda0cb95..b10757b64 100644
--- a/gtk/gtk_window.c
+++ b/gtk/gtk_window.c
@@ -1,8 +1,8 @@
/*
* This file is part of NetSurf, http://netsurf.sourceforge.net/
* Licensed under the GNU General Public License,
- * http://www.opensource.org/licenses/gpl-license
- * Copyright 2005 James Bursa <bursa@users.sourceforge.net>
+ * http://www.opensource.org/licenses/gpl-license
+ * Copyright 2006 Rob Kendrick <rjek@rjek.com>
*/
#include <stdbool.h>
@@ -11,6 +11,7 @@
#include <string.h>
#include <gdk/gdkkeysyms.h>
#include <gtk/gtk.h>
+#include <glade/glade.h>
#include "netsurf/content/content.h"
#include "netsurf/desktop/browser.h"
#include "netsurf/desktop/history_core.h"
@@ -25,6 +26,7 @@
#include "netsurf/gtk/gtk_window.h"
#include "netsurf/gtk/gtk_options.h"
#include "netsurf/gtk/gtk_completion.h"
+#include "netsurf/gtk/gtk_throbber.h"
#include "netsurf/render/box.h"
#include "netsurf/render/font.h"
#include "netsurf/render/form.h"
@@ -35,32 +37,41 @@
struct gtk_history_window;
struct gui_window {
- GtkWidget *window;
- GtkWidget *url_bar;
- GtkWidget *drawing_area;
- GtkWidget *status_bar;
- GtkWidget *progress_bar;
- GtkWidget *stop_button;
- GtkWidget *back_button;
- GtkWidget *forward_button;
- GtkWidget *reload_button;
- struct browser_window *bw;
- int target_width;
- int target_height;
- gui_pointer_shape current_pointer;
- float scale;
+ GtkWindow *window;
+ GtkEntry *url_bar;
+ GtkEntryCompletion *url_bar_completion;
+ GtkDrawingArea *drawing_area;
+ GtkViewport *viewport;
+ GtkLabel *status_bar;
+ GtkToolButton *back_button;
+ GtkToolButton *forward_button;
+ GtkToolButton *stop_button;
+ GtkToolButton *reload_button;
+ GtkMenuItem *back_menu;
+ GtkMenuItem *forward_menu;
+ GtkMenuItem *stop_menu;
+ GtkMenuItem *reload_menu;
+ GtkImage *throbber;
+
+ GladeXML *xml;
+
+ struct browser_window *bw;
+ float scale;
+ int target_width, target_height;
+ int caretx, carety, careth;
+ gui_pointer_shape current_pointer;
+ int throb_frame;
+
struct gtk_history_window *history_window;
- GtkWidget *history_window_widget;
- int caretx, carety, careth;
- int last_x, last_y;
- struct gui_window *prev;
- struct gui_window *next;
+ int last_x, last_y;
};
struct gtk_history_window {
- struct gui_window *g;
- GtkWidget *drawing_area;
+ struct gui_window *g;
+ GtkWindow *window;
+ GtkScrolledWindow *scrolled;
+ GtkDrawingArea *drawing_area;
};
GtkWidget *current_widget;
@@ -70,673 +81,790 @@ GdkGC *current_gc;
cairo_t *current_cr;
#endif
-struct gui_window *window_list = 0;
-static int open_windows = 0;
-
-/* functions used by below event handlers */
-static void nsgtk_window_change_scale(struct gui_window *g, float scale);
-static void nsgtk_window_update_back_forward(struct gui_window *g);
-
-/* main browser window toolbar event handlers */
-void nsgtk_window_back_button_clicked(GtkWidget *widget, gpointer data);
-void nsgtk_window_forward_button_clicked(GtkWidget *widget, gpointer data);
-void nsgtk_window_stop_button_clicked(GtkWidget *widget, gpointer data);
-void nsgtk_window_reload_button_clicked(GtkWidget *widget, gpointer data);
-void nsgtk_window_home_button_clicked(GtkWidget *widget, gpointer data);
-void nsgtk_window_zoomin_button_clicked(GtkWidget *widget, gpointer data);
-void nsgtk_window_zoom100_button_clicked(GtkWidget *widget, gpointer data);
-void nsgtk_window_zoomout_button_clicked(GtkWidget *widget, gpointer data);
-void nsgtk_window_history_button_clicked(GtkWidget *widget, gpointer data);
-void nsgtk_window_choices_button_clicked(GtkWidget *widget, gpointer data);
-
-/* main browser window event handlers */
-void nsgtk_window_destroy_event(GtkWidget *widget, gpointer data);
-gboolean nsgtk_window_expose_event(GtkWidget *widget,
- GdkEventExpose *event, gpointer data);
-gboolean nsgtk_window_url_activate_event(GtkWidget *widget, gpointer data);
-gboolean nsgtk_window_url_changed(GtkWidget *widget, GdkEventKey *event,
- gpointer data);
-gboolean nsgtk_window_configure_event(GtkWidget *widget,
- GdkEventConfigure *event, gpointer data);
-gboolean nsgtk_window_motion_notify_event(GtkWidget *widget,
- GdkEventMotion *event, gpointer data);
-gboolean nsgtk_window_button_press_event(GtkWidget *widget,
- GdkEventButton *event, gpointer data);
-void nsgtk_window_size_allocate_event(GtkWidget *widget,
- GtkAllocation *allocation, gpointer data);
-gboolean nsgtk_window_keypress_event(GtkWidget *widget,
- GdkEventKey *event, gpointer data);
-
-/* local history window event handlers */
-gboolean nsgtk_history_expose_event(GtkWidget *widget,
- GdkEventExpose *event, gpointer data);
-gboolean nsgtk_history_motion_notify_event(GtkWidget *widget,
- GdkEventMotion *event, gpointer data);
-gboolean nsgtk_history_button_press_event(GtkWidget *widget,
- GdkEventButton *event, gpointer data);
-
-
-/* misc support functions */
-static void nsgtk_perform_deferred_resize(void *p);
-static wchar_t gdkkey_to_nskey(GdkEventKey *key);
-static void nsgtk_pass_mouse_position(void *p);
-
-struct gui_window *gui_create_browser_window(struct browser_window *bw,
- struct browser_window *clone)
-{
- struct gui_window *g;
- GtkWidget *window, *history_window;
- GtkWidget *vbox;
- GtkWidget *toolbar;
- GtkToolItem *back_button, *forward_button, *stop_button, *reload_button;
- GtkToolItem *zoomin_button, *zoomout_button, *zoom100_button;
- GtkToolItem *home_button, *history_button, *choices_button;
- GtkToolItem *url_item;
- GtkWidget *url_bar;
- GtkWidget *scrolled, *history_scrolled;
- GtkWidget *drawing_area, *history_area;
- GtkWidget *status_box;
- GtkEntryCompletion *url_bar_completion;
-
- g = malloc(sizeof *g);
- if (!g) {
- warn_user("NoMemory", 0);
- return 0;
- }
-
- g->prev = 0;
- g->next = window_list;
- if (window_list)
- window_list->prev = g;
- window_list = g;
- open_windows++;
-
- /* a height of zero means no caret */
- g->careth = 0;
-
- window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
- gtk_window_set_default_size(GTK_WINDOW(window), 600, 600);
- gtk_window_set_title(GTK_WINDOW(window), "NetSurf");
-
- g->history_window = malloc(sizeof(struct gtk_history_window));
- if (!g->history_window) {
- warn_user("NoMemory", 0);
- return 0;
- }
- g->history_window->g = g;
-
- history_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
- gtk_window_set_transient_for(GTK_WINDOW(history_window),
- GTK_WINDOW(window));
- gtk_window_set_default_size(GTK_WINDOW(history_window), 400, 400);
- gtk_window_set_title(GTK_WINDOW(history_window), "NetSurf History");
-
- g->history_window_widget = GTK_WIDGET(history_window);
-
- vbox = gtk_vbox_new(false, 0);
- gtk_container_add(GTK_CONTAINER(window), vbox);
- gtk_widget_show(vbox);
-
- toolbar = gtk_toolbar_new();
- gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_ICONS);
- gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, TRUE, 0);
- gtk_widget_show(toolbar);
-
- back_button = gtk_tool_button_new_from_stock(GTK_STOCK_GO_BACK);
- gtk_toolbar_insert(GTK_TOOLBAR(toolbar), back_button, -1);
- gtk_widget_show(GTK_WIDGET(back_button));
- g->back_button = GTK_WIDGET(back_button);
- gtk_widget_set_sensitive(g->back_button, FALSE);
-
- forward_button = gtk_tool_button_new_from_stock(GTK_STOCK_GO_FORWARD);
- gtk_toolbar_insert(GTK_TOOLBAR(toolbar), forward_button, -1);
- gtk_widget_show(GTK_WIDGET(forward_button));
- g->forward_button = GTK_WIDGET(forward_button);
- gtk_widget_set_sensitive(g->forward_button, FALSE);
-
- stop_button = gtk_tool_button_new_from_stock(GTK_STOCK_STOP);
- gtk_toolbar_insert(GTK_TOOLBAR(toolbar), stop_button, -1);
- gtk_widget_show(GTK_WIDGET(stop_button));
- g->stop_button = GTK_WIDGET(stop_button);
- gtk_widget_set_sensitive(g->stop_button, FALSE);
-
-
- reload_button = gtk_tool_button_new_from_stock(GTK_STOCK_REFRESH);
- gtk_toolbar_insert(GTK_TOOLBAR(toolbar), reload_button, -1);
- gtk_widget_show(GTK_WIDGET(reload_button));
- g->reload_button = GTK_WIDGET(reload_button);
- gtk_widget_set_sensitive(g->reload_button, FALSE);
-
- home_button = gtk_tool_button_new_from_stock(GTK_STOCK_HOME);
- gtk_toolbar_insert(GTK_TOOLBAR(toolbar), home_button, -1);
- gtk_widget_show(GTK_WIDGET(home_button));
-
- zoomin_button = gtk_tool_button_new_from_stock(GTK_STOCK_ZOOM_IN);
- gtk_toolbar_insert(GTK_TOOLBAR(toolbar), zoomin_button, -1);
- gtk_widget_show(GTK_WIDGET(zoomin_button));
-
- zoom100_button = gtk_tool_button_new_from_stock(GTK_STOCK_ZOOM_100);
- gtk_toolbar_insert(GTK_TOOLBAR(toolbar), zoom100_button, -1);
- gtk_widget_show(GTK_WIDGET(zoom100_button));
-
- zoomout_button = gtk_tool_button_new_from_stock(GTK_STOCK_ZOOM_OUT);
- gtk_toolbar_insert(GTK_TOOLBAR(toolbar), zoomout_button, -1);
- gtk_widget_show(GTK_WIDGET(zoomout_button));
-
- history_button = gtk_tool_button_new_from_stock(GTK_STOCK_OPEN);
- gtk_toolbar_insert(GTK_TOOLBAR(toolbar), history_button, -1);
- gtk_widget_show(GTK_WIDGET(history_button));
-
- choices_button = gtk_tool_button_new_from_stock(GTK_STOCK_PREFERENCES);
- gtk_toolbar_insert(GTK_TOOLBAR(toolbar), choices_button, -1);
- gtk_widget_show(GTK_WIDGET(choices_button));
-
- url_item = gtk_tool_item_new();
- gtk_tool_item_set_expand(url_item, TRUE);
- gtk_toolbar_insert(GTK_TOOLBAR(toolbar), url_item, -1);
- gtk_widget_show(GTK_WIDGET(url_item));
-
- url_bar = gtk_entry_new();
- gtk_container_add(GTK_CONTAINER(url_item), url_bar);
- gtk_widget_show(url_bar);
- g_signal_connect(G_OBJECT(url_bar), "activate",
- G_CALLBACK(nsgtk_window_url_activate_event), g);
-
- scrolled = gtk_scrolled_window_new(0, 0);
- gtk_box_pack_start(GTK_BOX(vbox), scrolled, TRUE, TRUE, 0);
- gtk_widget_show(scrolled);
-
- history_scrolled = gtk_scrolled_window_new(0, 0);
- gtk_container_add(GTK_CONTAINER(history_window), history_scrolled);
- gtk_widget_show(history_scrolled);
-
- drawing_area = gtk_drawing_area_new();
- gtk_widget_set_events(drawing_area,
- GDK_EXPOSURE_MASK |
- GDK_LEAVE_NOTIFY_MASK |
- GDK_BUTTON_PRESS_MASK |
- GDK_POINTER_MOTION_MASK |
- GDK_KEY_PRESS_MASK |
- GDK_KEY_RELEASE_MASK);
- GTK_WIDGET_SET_FLAGS(GTK_WIDGET(drawing_area),
- GTK_CAN_FOCUS);
- gtk_widget_modify_bg(drawing_area, GTK_STATE_NORMAL,
- &((GdkColor) { 0, 0xffff, 0xffff, 0xffff }));
- gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled),
- drawing_area);
-
- gtk_widget_show(drawing_area);
-
- history_area = gtk_drawing_area_new();
- gtk_widget_set_events(history_area,
- GDK_EXPOSURE_MASK |
- GDK_POINTER_MOTION_MASK |
- GDK_BUTTON_PRESS_MASK);
- gtk_widget_modify_bg(history_area, GTK_STATE_NORMAL,
- &((GdkColor) { 0, 0xffff, 0xffff, 0xffff }));
- gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(history_scrolled),
- history_area);
- gtk_widget_show(history_area);
- g->history_window->drawing_area = history_area;
-
- status_box = gtk_hbox_new(FALSE, 2);
- gtk_box_pack_start(GTK_BOX(vbox), status_box, FALSE, TRUE, 3);
- gtk_widget_show(status_box);
-
- g->status_bar = gtk_label_new("");
- gtk_box_pack_start(GTK_BOX(status_box), g->status_bar, FALSE, TRUE, 0);
- gtk_widget_show(g->status_bar);
-
- g->progress_bar = gtk_progress_bar_new();
- gtk_progress_bar_set_pulse_step(GTK_PROGRESS_BAR(g->progress_bar), 0.20);
- gtk_widget_set_size_request(g->progress_bar, 64, 0);
- gtk_box_pack_end(GTK_BOX(status_box), g->progress_bar, FALSE, FALSE, 0);
-
- g->window = window;
- gtk_widget_show(window);
-
- g->url_bar = url_bar;
- g->drawing_area = drawing_area;
- g->bw = bw;
- g->current_pointer = GUI_POINTER_DEFAULT;
-
- if (clone)
- g->scale = clone->window->scale;
- else
- g->scale = 1.0;
-
- /* set up URL bar completion */
-
- url_bar_completion = gtk_entry_completion_new();
- gtk_entry_set_completion(GTK_ENTRY(url_bar), url_bar_completion);
- gtk_entry_completion_set_match_func(url_bar_completion,
- nsgtk_completion_match, NULL, NULL);
- gtk_entry_completion_set_model(url_bar_completion,
- GTK_TREE_MODEL(nsgtk_completion_list));
- gtk_entry_completion_set_text_column(url_bar_completion, 0);
- gtk_entry_completion_set_minimum_key_length(url_bar_completion, 1);
- gtk_entry_completion_set_popup_completion(url_bar_completion, TRUE);
- g_object_set(G_OBJECT(url_bar_completion),
- "popup-set-width", TRUE,
- "popup-single-match", TRUE,
- NULL);
-
-#define NS_SIGNAL_CONNECT(obj, sig, callback, ptr) \
- g_signal_connect(G_OBJECT(obj), (sig), G_CALLBACK(callback), (ptr))
+struct menu_events {
+ const char *widget;
+ GCallback handler;
+};
- NS_SIGNAL_CONNECT(window, "destroy", nsgtk_window_destroy_event, g);
-
- g_signal_connect(G_OBJECT(url_bar), "changed",
- G_CALLBACK(nsgtk_window_url_changed), g);
-// g_signal_connect(G_OBJECT(url_bar_completion), "match-selected",
-// G_CALLBACK(nsgtk_window_completion_selected), g);
- g_signal_connect(G_OBJECT(drawing_area), "expose_event",
- G_CALLBACK(nsgtk_window_expose_event), g);
- g_signal_connect(G_OBJECT(drawing_area), "configure_event",
- G_CALLBACK(nsgtk_window_configure_event), g);
- g_signal_connect(G_OBJECT(drawing_area), "motion_notify_event",
- G_CALLBACK(nsgtk_window_motion_notify_event), g);
- g_signal_connect(G_OBJECT(drawing_area), "button_press_event",
- G_CALLBACK(nsgtk_window_button_press_event), g);
- g_signal_connect(G_OBJECT(scrolled), "size_allocate",
- G_CALLBACK(nsgtk_window_size_allocate_event), g);
- g_signal_connect(G_OBJECT(drawing_area), "key_press_event",
- G_CALLBACK(nsgtk_window_keypress_event), g);
-
- g_signal_connect(G_OBJECT(zoomin_button), "clicked",
- G_CALLBACK(nsgtk_window_zoomin_button_clicked), g);
- g_signal_connect(G_OBJECT(zoom100_button), "clicked",
- G_CALLBACK(nsgtk_window_zoom100_button_clicked), g);
- g_signal_connect(G_OBJECT(zoomout_button), "clicked",
- G_CALLBACK(nsgtk_window_zoomout_button_clicked), g);
- g_signal_connect(G_OBJECT(g->stop_button), "clicked",
- G_CALLBACK(nsgtk_window_stop_button_clicked), g);
-
- NS_SIGNAL_CONNECT(g->back_button, "clicked", nsgtk_window_back_button_clicked, g);
- NS_SIGNAL_CONNECT(g->forward_button, "clicked", nsgtk_window_forward_button_clicked, g);
- NS_SIGNAL_CONNECT(g->reload_button, "clicked", nsgtk_window_reload_button_clicked, g);
-
- NS_SIGNAL_CONNECT(history_button, "clicked", nsgtk_window_history_button_clicked, g);
- NS_SIGNAL_CONNECT(choices_button, "clicked", nsgtk_window_choices_button_clicked, g);
- NS_SIGNAL_CONNECT(home_button, "clicked", nsgtk_window_home_button_clicked, g);
-
- /* History window events */
- NS_SIGNAL_CONNECT(history_area, "expose_event",
- nsgtk_history_expose_event, g->history_window);
- NS_SIGNAL_CONNECT(history_area, "motion_notify_event",
- nsgtk_history_motion_notify_event, g->history_window);
- NS_SIGNAL_CONNECT(history_area, "button_press_event",
- nsgtk_history_button_press_event, g->history_window);
- NS_SIGNAL_CONNECT(g->history_window_widget, "delete_event",
- gtk_widget_hide_on_delete, NULL);
-
-#undef NS_SIGNAL_CONNECT
-
- if( !bw->gesturer ) {
- /* Prepare a gesturer */
- GestureRecogniser gr = gesture_recogniser_create();
- bw->gesturer = gesturer_create(gr);
- gesture_recogniser_add(gr, "732187", 100);
- gesture_recogniser_set_distance_threshold(gr, 50);
- gesture_recogniser_set_count_threshold(gr, 20);
- schedule(5, nsgtk_pass_mouse_position, g);
- }
+static int open_windows = 0; /**< current number of open browsers */
+
+static wchar_t gdkkey_to_nskey(GdkEventKey *);
+static void nsgtk_window_destroy_event(GtkWidget *, gpointer);
+static gboolean nsgtk_window_expose_event(GtkWidget *, GdkEventExpose *,
+ gpointer);
+static gboolean nsgtk_window_motion_notify_event(GtkWidget *, GdkEventMotion *,
+ gpointer);
+static gboolean nsgtk_window_button_press_event(GtkWidget *, GdkEventButton *,
+ gpointer);
+static gboolean nsgtk_window_keypress_event(GtkWidget *, GdkEventKey *,
+ gpointer);
+static gboolean nsgtk_window_size_allocate_event(GtkWidget *, GtkAllocation *,
+ gpointer);
+
+static void nsgtk_perform_deferred_resize(void *);
+static void nsgtk_window_update_back_forward(struct gui_window *);
+static void nsgtk_throb(void *);
+static void nsgtk_redraw_caret(struct gui_window *);
+
+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);
+static gboolean nsgtk_window_reload_button_clicked(GtkWidget *, gpointer);
+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 gboolean nsgtk_history_expose_event(GtkWidget *, GdkEventExpose *,
+ gpointer);
+static gboolean nsgtk_history_motion_notify_event(GtkWidget *, GdkEventMotion *,
+ gpointer);
+static gboolean nsgtk_history_button_press_event(GtkWidget *, GdkEventButton *,
+ gpointer);
+
+static void nsgtk_attach_menu_handlers(GladeXML *, gpointer);
+static void nsgtk_window_change_scale(struct gui_window *, float);
+
+#define MENUEVENT(x) { #x, G_CALLBACK(nsgtk_on_##x##_activate) }
+#define MENUPROTO(x) static gboolean nsgtk_on_##x##_activate( \
+ GtkMenuItem *widget, gpointer g)
+/* prototypes for menu handlers */
+/* file menu */
+MENUPROTO(new_window);
+MENUPROTO(close_window);
+MENUPROTO(quit);
+
+/* edit menu */
+MENUPROTO(choices);
+
+/* view menu */
+MENUPROTO(stop);
+MENUPROTO(reload);
+MENUPROTO(zoom_in);
+MENUPROTO(normal_size);
+MENUPROTO(zoom_out);
+
+/* navigate menu */
+MENUPROTO(back);
+MENUPROTO(forward);
+MENUPROTO(home);
+MENUPROTO(local_history);
+
+/* help menu */
+MENUPROTO(about);
+
+/* structure used by nsgtk_attach_menu_handlers to connect menu items to
+ * their handling functions.
+ */
+static struct menu_events menu_events[] = {
+ /* file menu */
+ MENUEVENT(new_window),
+ MENUEVENT(close_window),
+ MENUEVENT(quit),
- return g;
-}
+ /* edit menu */
+ MENUEVENT(choices),
+
+ /* view menu */
+ MENUEVENT(stop),
+ MENUEVENT(reload),
+ MENUEVENT(zoom_in),
+ MENUEVENT(normal_size),
+ MENUEVENT(zoom_out),
+
+ /* navigate menu */
+ MENUEVENT(back),
+ MENUEVENT(forward),
+ MENUEVENT(home),
+ MENUEVENT(local_history),
+
+ /* help menu */
+ MENUEVENT(about),
+
+ /* sentinel */
+ { NULL, NULL }
+};
-void nsgtk_pass_mouse_position(void *p)
+void nsgtk_attach_menu_handlers(GladeXML *xml, gpointer g)
{
- struct gui_window *g = (struct gui_window*)p;
- if( g->bw->gesturer )
- if( gesturer_add_point(g->bw->gesturer, g->last_x, g->last_y) == 100 )
- exit(0);
- schedule(5, nsgtk_pass_mouse_position, p);
+ struct menu_events *event = menu_events;
+
+ while (event->widget != NULL)
+ {
+ GtkWidget *w = glade_xml_get_widget(xml, event->widget);
+ g_signal_connect(G_OBJECT(w), "activate", event->handler, g);
+ event++;
+ }
}
-void nsgtk_window_change_scale(struct gui_window *g, float scale)
+wchar_t gdkkey_to_nskey(GdkEventKey *key)
{
- g->scale = scale;
- if (g->bw->current_content != NULL)
- gui_window_set_extent(g, g->bw->current_content->width,
- g->bw->current_content->height);
- gtk_widget_queue_draw(g->drawing_area);
+ /* this function will need to become much more complex to support
+ * everything that the RISC OS version does. But this will do for
+ * now. I hope.
+ */
+
+ switch (key->keyval)
+ {
+ case GDK_BackSpace: return KEY_DELETE_LEFT;
+ case GDK_Delete: return KEY_DELETE_RIGHT;
+ case GDK_Linefeed: return 13;
+ case GDK_Return: return 10;
+ case GDK_Left: return KEY_LEFT;
+ case GDK_Right: return KEY_RIGHT;
+ case GDK_Up: return KEY_UP;
+ case GDK_Down: return KEY_DOWN;
+
+ /* Modifiers - do nothing for now */
+ case GDK_Shift_L:
+ case GDK_Shift_R:
+ case GDK_Control_L:
+ case GDK_Control_R:
+ case GDK_Caps_Lock:
+ case GDK_Shift_Lock:
+ case GDK_Meta_L:
+ case GDK_Meta_R:
+ case GDK_Alt_L:
+ case GDK_Alt_R:
+ case GDK_Super_L:
+ case GDK_Super_R:
+ case GDK_Hyper_L:
+ case GDK_Hyper_R: return 0;
+
+ default: return key->keyval;
+ }
}
-void nsgtk_window_zoomin_button_clicked(GtkWidget *widget, gpointer data)
+/* event handlers and support functions for them */
+
+void nsgtk_window_destroy_event(GtkWidget *widget, gpointer data)
{
struct gui_window *g = data;
- nsgtk_window_change_scale(g, g->scale + 0.05);
+
+ gtk_widget_destroy(GTK_WIDGET(g->history_window->window));
+ gui_window_destroy(g);
+ if (--open_windows == 0)
+ netsurf_quit = true;
}
-void nsgtk_window_zoom100_button_clicked(GtkWidget *widget, gpointer data)
+gboolean nsgtk_window_expose_event(GtkWidget *widget,
+ GdkEventExpose *event, gpointer data)
{
struct gui_window *g = data;
- nsgtk_window_change_scale(g, 1.00);
+ struct content *c = g->bw->current_content;
+
+ if (c == NULL)
+ return FALSE;
+
+ current_widget = widget;
+ current_drawable = widget->window;
+ current_gc = gdk_gc_new(current_drawable);
+#ifdef CAIRO_VERSION
+ current_cr = gdk_cairo_create(current_drawable);
+#endif
+
+ plot = nsgtk_plotters;
+ nsgtk_plot_set_scale(g->scale);
+ content_redraw(c, 0, 0,
+ widget->allocation.width,
+ widget->allocation.height,
+ event->area.x,
+ event->area.y,
+ event->area.x + event->area.width,
+ event->area.y + event->area.height,
+ g->scale, 0xFFFFFF);
+
+ if (g->careth != 0)
+ plot.line(g->caretx, g->carety,
+ g->caretx, g->carety + g->careth, 1, 0, false, false);
+
+ g_object_unref(current_gc);
+#ifdef CAIRO_VERSION
+ cairo_destroy(current_cr);
+#endif
+
+ return FALSE;
}
-void nsgtk_window_zoomout_button_clicked(GtkWidget *widget, gpointer data)
+gboolean nsgtk_window_motion_notify_event(GtkWidget *widget,
+ GdkEventMotion *event, gpointer data)
{
struct gui_window *g = data;
- nsgtk_window_change_scale(g, g->scale - 0.05);
+
+ browser_window_mouse_track(g->bw, 0, event->x / g->scale,
+ event->y / g->scale);
+
+ g->last_x = event->x;
+ g->last_y = event->y;
+
+ return TRUE;
}
-void nsgtk_window_stop_button_clicked(GtkWidget *widget, gpointer data)
+gboolean nsgtk_window_button_press_event(GtkWidget *widget,
+ GdkEventButton *event, gpointer data)
{
struct gui_window *g = data;
- browser_window_stop(g->bw);
+ 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 */
+ return TRUE; /* Do nothing for right click for now */
+
+ browser_window_mouse_click(g->bw, button,
+ event->x / g->scale, event->y / g->scale);
+
+ return TRUE;
}
-void nsgtk_window_destroy_event(GtkWidget *widget, gpointer data)
+gboolean nsgtk_window_keypress_event(GtkWidget *widget, GdkEventKey *event,
+ gpointer data)
{
struct gui_window *g = data;
- gui_window_destroy(g);
- if (--open_windows == 0)
- netsurf_quit = true;
+ wchar_t nskey = gdkkey_to_nskey(event);
+
+ browser_window_key_press(g->bw, nskey);
+
+ return TRUE;
}
-void nsgtk_window_back_button_clicked(GtkWidget *widget, gpointer data)
+gboolean nsgtk_window_size_allocate_event(GtkWidget *widget,
+ GtkAllocation *allocation, gpointer data)
{
struct gui_window *g = data;
- if (!history_back_available(g->bw->history)) return;
- history_back(g->bw, g->bw->history);
- nsgtk_window_update_back_forward(g);
+
+ g->target_width = widget->allocation.width - 2;
+ g->target_height = widget->allocation.height;
+
+ /* schedule a callback to perform the resize for 1/10s from now */
+ schedule(5, nsgtk_perform_deferred_resize, g);
+
+ return TRUE;
}
-void nsgtk_window_forward_button_clicked(GtkWidget *widget, gpointer data)
+void nsgtk_perform_deferred_resize(void *p)
{
- struct gui_window *g = data;
- if (!history_forward_available(g->bw->history)) return;
- history_forward(g->bw, g->bw->history);
- nsgtk_window_update_back_forward(g);
+ struct gui_window *g = p;
+
+ if (gui_in_multitask)
+ return;
+
+ if (g->bw->current_content == NULL)
+ return;
+
+ if (g->bw->current_content->status != CONTENT_STATUS_READY &&
+ g->bw->current_content->status != CONTENT_STATUS_DONE)
+ return;
+
+ content_reformat(g->bw->current_content,
+ g->target_width, g->target_height);
+
+ if (GTK_WIDGET_SENSITIVE((GTK_WIDGET(g->stop_button))))
+ schedule(100, nsgtk_perform_deferred_resize, g);
}
void nsgtk_window_update_back_forward(struct gui_window *g)
{
int width, height;
- gtk_widget_set_sensitive(g->back_button,
+
+ gtk_widget_set_sensitive(GTK_WIDGET(g->back_button),
history_back_available(g->bw->history));
- gtk_widget_set_sensitive(g->forward_button,
+ gtk_widget_set_sensitive(GTK_WIDGET(g->forward_button),
history_forward_available(g->bw->history));
+
+ gtk_widget_set_sensitive(GTK_WIDGET(g->back_menu),
+ history_back_available(g->bw->history));
+ gtk_widget_set_sensitive(GTK_WIDGET(g->forward_menu),
+ history_forward_available(g->bw->history));
+
+ /* update the local history window, as well as queuing a redraw
+ * for it.
+ */
history_size(g->bw->history, &width, &height);
gtk_widget_set_size_request(GTK_WIDGET(g->history_window->drawing_area),
width, height);
- gtk_widget_queue_draw(GTK_WIDGET(g->history_window_widget));
+ gtk_widget_queue_draw(GTK_WIDGET(g->history_window->drawing_area));
}
-void nsgtk_window_history_button_clicked(GtkWidget *widget, gpointer data)
+void nsgtk_throb(void *p)
+{
+ struct gui_window *g = p;
+
+ if (g->throb_frame >= (nsgtk_throbber->nframes - 1))
+ g->throb_frame = 1;
+ else
+ g->throb_frame++;
+
+ gtk_image_set_from_pixbuf(g->throbber, nsgtk_throbber->framedata[
+ g->throb_frame]);
+
+ schedule(10, nsgtk_throb, p);
+}
+
+void nsgtk_redraw_caret(struct gui_window *g)
+{
+ if (g->careth == 0)
+ return;
+
+ gui_window_redraw(g, g->caretx, g->carety,
+ g->caretx, g->carety + g->careth);
+}
+
+/* signal handling functions for the toolbar and URL bar */
+gboolean nsgtk_window_back_button_clicked(GtkWidget *widget, gpointer data)
{
struct gui_window *g = data;
- gtk_widget_show(GTK_WIDGET(g->history_window_widget));
- gdk_window_raise(g->history_window_widget->window);
+
+ if (!history_back_available(g->bw->history))
+ return TRUE;
+
+ history_back(g->bw, g->bw->history);
+ nsgtk_window_update_back_forward(g);
+
+ return TRUE;
}
-void nsgtk_window_choices_button_clicked(GtkWidget *widget, gpointer data)
+gboolean nsgtk_window_forward_button_clicked(GtkWidget *widget, gpointer data)
{
- gtk_widget_show(GTK_WIDGET(wndChoices));
- gdk_window_raise(wndChoices);
+ struct gui_window *g = data;
+
+ if (!history_forward_available(g->bw->history))
+ return TRUE;
+
+ history_forward(g->bw, g->bw->history);
+ nsgtk_window_update_back_forward(g);
+
+ return TRUE;
}
-void nsgtk_window_reload_button_clicked(GtkWidget *widget, gpointer data)
+gboolean nsgtk_window_stop_button_clicked(GtkWidget *widget, gpointer data)
+{
+ struct gui_window *g = data;
+
+ browser_window_stop(g->bw);
+
+ return TRUE;
+}
+
+gboolean nsgtk_window_reload_button_clicked(GtkWidget *widget, gpointer data)
{
struct gui_window *g = data;
+
browser_window_reload(g->bw, true);
+
+ return TRUE;
}
-void nsgtk_window_home_button_clicked(GtkWidget *widget, gpointer data)
+gboolean nsgtk_window_home_button_clicked(GtkWidget *widget, gpointer data)
{
struct gui_window *g = data;
- const char *addr = "http://netsurf.sourceforge.net/";
+ static const char *addr = "http://netsurf.sourceforge.net/";
if (option_homepage_url != NULL)
addr = option_homepage_url;
browser_window_go(g->bw, addr, 0, true);
+
+ return TRUE;
}
-gboolean nsgtk_window_expose_event(GtkWidget *widget,
- GdkEventExpose *event, gpointer data)
+gboolean nsgtk_window_url_activate_event(GtkWidget *widget, gpointer data)
{
struct gui_window *g = data;
- struct content *c = g->bw->current_content;
-
- if (!c)
- return FALSE;
+ char *referer = 0;
- current_widget = widget;
- current_drawable = widget->window;
- current_gc = gdk_gc_new(current_drawable);
-#ifdef CAIRO_VERSION
- current_cr = gdk_cairo_create(current_drawable);
-#endif
+ if (g->bw->current_content && g->bw->current_content->url)
+ referer = g->bw->current_content->url;
- plot = nsgtk_plotters;
- nsgtk_plot_set_scale(g->scale);
+ browser_window_go(g->bw, gtk_entry_get_text(GTK_ENTRY(g->url_bar)),
+ referer, true);
- content_redraw(c, 0, 0,
- widget->allocation.width,
- widget->allocation.height,
- event->area.x,
- event->area.y,
- event->area.x + event->area.width,
- event->area.y + event->area.height,
- g->scale, 0xFFFFFF);
+ return TRUE;
+}
- if (g->careth != 0)
- plot.line(g->caretx, g->carety,
- g->caretx, g->carety + g->careth, 1, 0, false, false);
- g_object_unref(current_gc);
-#ifdef CAIRO_VERSION
- cairo_destroy(current_cr);
-#endif
+gboolean nsgtk_window_url_changed(GtkWidget *widget, GdkEventKey *event,
+ gpointer data)
+{
+ const char *prefix;
+
+ prefix = gtk_entry_get_text(GTK_ENTRY(widget));
+ nsgtk_completion_update(prefix);
- return FALSE;
+ return TRUE;
}
-gboolean nsgtk_history_expose_event(GtkWidget *widget,
- GdkEventExpose *event,
- gpointer data)
-{
- struct gtk_history_window *hw = data;
- current_widget = widget;
- current_drawable = widget->window;
- current_gc = gdk_gc_new(current_drawable);
-#ifdef CAIRO_VERSION
- current_cr = gdk_cairo_create(current_drawable);
-#endif
- plot = nsgtk_plotters;
- nsgtk_plot_set_scale(1.0);
- history_redraw(hw->g->bw->history);
+/* signal handlers for menu entries */
+#define MENUHANDLER(x) gboolean nsgtk_on_##x##_activate(GtkMenuItem *widget, \
+ gpointer g)
- g_object_unref(current_gc);
-#ifdef CAIRO_VERSION
- cairo_destroy(current_cr);
-#endif
- return FALSE;
+MENUHANDLER(new_window)
+{
+ return TRUE;
}
-gboolean nsgtk_history_motion_notify_event(GtkWidget *widget,
- GdkEventMotion *event, gpointer data)
+MENUHANDLER(close_window)
{
- /* Not sure what to do here */
+ struct gui_window *gw = (struct gui_window *)g;
+ gtk_widget_destroy(GTK_WIDGET(gw->window));
+
return TRUE;
}
-gboolean nsgtk_history_button_press_event(GtkWidget *widget,
- GdkEventButton *event,
- gpointer data)
+MENUHANDLER(quit)
{
- struct gtk_history_window *hw = data;
-
- history_click(hw->g->bw, hw->g->bw->history,
- event->x, event->y, false);
+ netsurf_quit = true;
+ return TRUE;
+}
+MENUHANDLER(choices)
+{
+ gtk_widget_show(GTK_WIDGET(wndChoices));
+ gdk_window_raise(GDK_WINDOW(wndChoices));
+
return TRUE;
}
-gboolean nsgtk_window_url_activate_event(GtkWidget *widget, gpointer data)
+void nsgtk_window_change_scale(struct gui_window *g, float scale)
{
- struct gui_window *g = data;
- char *referer = 0;
+ g->scale = scale;
+
+ if (g->bw->current_content != NULL)
+ gui_window_set_extent(g, g->bw->current_content->width,
+ g->bw->current_content->height);
- if (g->bw->current_content && g->bw->current_content->url)
- referer = g->bw->current_content->url;
+ gtk_widget_queue_draw(GTK_WIDGET(g->drawing_area));
+}
- browser_window_go(g->bw, gtk_entry_get_text(GTK_ENTRY(g->url_bar)),
- referer, true);
+MENUHANDLER(zoom_in)
+{
+ struct gui_window *gw = g;
+ nsgtk_window_change_scale(gw, gw->scale + 0.05);
+
return TRUE;
}
-gboolean nsgtk_window_url_changed(GtkWidget *widget, GdkEventKey *event,
- gpointer data)
+MENUHANDLER(normal_size)
{
- const char *prefix;
- prefix = gtk_entry_get_text(GTK_ENTRY(widget));
- nsgtk_completion_update(prefix);
-
+ struct gui_window *gw = g;
+
+ nsgtk_window_change_scale(gw, 1.00);
+
return TRUE;
}
-gboolean nsgtk_window_keypress_event(GtkWidget *widget,
- GdkEventKey *event,
- gpointer data)
+MENUHANDLER(zoom_out)
{
- struct gui_window *g = data;
- wchar_t nskey = gdkkey_to_nskey(event);
- browser_window_key_press(g->bw, nskey);
-
+ struct gui_window *gw = g;
+
+ nsgtk_window_change_scale(gw, gw->scale - 0.05);
+
return TRUE;
}
-gboolean nsgtk_window_configure_event(GtkWidget *widget,
- GdkEventConfigure *event, gpointer data)
+MENUHANDLER(stop)
{
- struct gui_window *g = data;
+ return nsgtk_window_stop_button_clicked(GTK_WIDGET(widget), g);
+}
- if (gui_in_multitask)
- return FALSE;
+MENUHANDLER(reload)
+{
+ return nsgtk_window_reload_button_clicked(GTK_WIDGET(widget), g);
+}
- if (!g->bw->current_content)
- return FALSE;
- if (g->bw->current_content->status != CONTENT_STATUS_READY &&
- g->bw->current_content->status != CONTENT_STATUS_DONE)
- return FALSE;
+MENUHANDLER(back)
+{
+ return nsgtk_window_back_button_clicked(GTK_WIDGET(widget), g);
+}
-/* content_reformat(g->bw->current_content, event->width, event->height); */
+MENUHANDLER(forward)
+{
+ return nsgtk_window_forward_button_clicked(GTK_WIDGET(widget), g);
+}
- return FALSE;
+MENUHANDLER(home)
+{
+ return nsgtk_window_home_button_clicked(GTK_WIDGET(widget), g);
}
-void nsgtk_perform_deferred_resize(void *p)
+MENUHANDLER(local_history)
{
- struct gui_window *g = p;
- if (gui_in_multitask) return;
- if (!g->bw->current_content) return;
- if (g->bw->current_content->status != CONTENT_STATUS_READY &&
- g->bw->current_content->status != CONTENT_STATUS_DONE)
- return;
- content_reformat(g->bw->current_content, g->target_width, g->target_height);
- if (GTK_WIDGET_SENSITIVE (g->stop_button)) {
- schedule(100, nsgtk_perform_deferred_resize, g);
- }
+ struct gui_window *gw = (struct gui_window *)g;
+
+ gtk_widget_show(GTK_WIDGET(gw->history_window->window));
+ gdk_window_raise(GDK_WINDOW(gw->history_window->window));
+
+ return TRUE;
}
-void nsgtk_window_size_allocate_event(GtkWidget *widget,
- GtkAllocation *allocation, gpointer data)
+MENUHANDLER(about)
{
- struct gui_window *g = data;
- GtkWidget *viewport = gtk_bin_get_child(GTK_BIN(widget));
- /* The widget is the scrolled window, which is a GtkBin. We want
- * The width and height of the allocation of its child
- */
- g->target_width = viewport->allocation.width - 2;
- g->target_height = viewport->allocation.height;
- /* Schedule a callback to perform the resize for 1/10s from now */
- schedule(5, nsgtk_perform_deferred_resize, g);
+ return TRUE;
}
-gboolean nsgtk_window_motion_notify_event(GtkWidget *widget,
- GdkEventMotion *event, gpointer data)
+/* signal handler functions for the local history window */
+gboolean nsgtk_history_expose_event(GtkWidget *widget,
+ GdkEventExpose *event, gpointer g)
{
- struct gui_window *g = data;
+ struct gtk_history_window *hw = g;
+
+ current_widget = widget;
+ current_drawable = widget->window;
+ current_gc = gdk_gc_new(current_drawable);
+#ifdef CAIRO_VERSION
+ current_cr = gdk_cairo_create(current_drawable);
+#endif
+ plot = nsgtk_plotters;
+ nsgtk_plot_set_scale(1.0);
- browser_window_mouse_track(g->bw, 0, event->x / g->scale,
- event->y / g->scale);
- g->last_x = event->x;
- g->last_y = event->y;
- return TRUE;
+ history_redraw(hw->g->bw->history);
+
+ g_object_unref(current_gc);
+#ifdef CAIRO_VERSION
+ cairo_destroy(current_cr);
+#endif
+ return FALSE;
}
+gboolean nsgtk_history_motion_notify_event(GtkWidget *widget,
+ GdkEventMotion *event, gpointer g)
+{
+ return TRUE;
+}
-gboolean nsgtk_window_button_press_event(GtkWidget *widget,
- GdkEventButton *event, gpointer data)
+gboolean nsgtk_history_button_press_event(GtkWidget *widget,
+ GdkEventButton *event, gpointer g)
{
- struct gui_window *g = data;
- int button = BROWSER_MOUSE_CLICK_1;
+ struct gtk_history_window *hw = g;
- LOG(("BUTTON PRESS: %d", event->button));
-
- if (event->button == 2) /* 2 == middle button on X */
- button = BROWSER_MOUSE_CLICK_2;
- if (event->button == 3) /* 3 == right button on X */
- return TRUE; /* Do nothing for right click for now */
-
- browser_window_mouse_click(g->bw, button,
- event->x / g->scale, event->y / g->scale);
+ history_click(hw->g->bw, hw->g->bw->history,
+ event->x, event->y, false);
return TRUE;
}
-void gui_window_destroy(struct gui_window *data)
+/* functions called by the core to manipulate the GUI */
+#define GET_WIDGET(x) glade_xml_get_widget(g->xml, (x))
+struct gui_window *gui_create_browser_window(struct browser_window *bw,
+ struct browser_window *clone)
{
- /* XXX: Destroy history window etc here */
-
- struct gui_window *g = data;
+ struct gui_window *g; /**< what we're creating to return */
+
+ g = malloc(sizeof(*g));
+
+ g->bw = bw;
+ g->current_pointer = GUI_POINTER_DEFAULT;
+ if (clone != NULL)
+ g->scale = clone->window->scale;
+ else
+ g->scale = 1.0;
+
+ g->careth = 0;
+
+ /* load the window template from the glade xml file, and extract
+ * widget references from it for later use.
+ */
+ g->xml = glade_xml_new("./gtk/netsurf.glade", "wndBrowser", NULL);
+ glade_xml_signal_autoconnect(g->xml);
+ g->window = GTK_WINDOW(GET_WIDGET("wndBrowser"));
+ g->url_bar = GTK_ENTRY(GET_WIDGET("URLBar"));
+ g->drawing_area = GTK_DRAWING_AREA(GET_WIDGET("drawingArea"));
+ g->status_bar = GTK_LABEL(GET_WIDGET("statusBar"));
+ g->back_button = GTK_TOOL_BUTTON(GET_WIDGET("toolBack"));
+ g->forward_button = GTK_TOOL_BUTTON(GET_WIDGET("toolForward"));
+ g->stop_button = GTK_TOOL_BUTTON(GET_WIDGET("toolStop"));
+ g->reload_button = GTK_TOOL_BUTTON(GET_WIDGET("toolReload"));
+ g->back_menu = GTK_MENU_ITEM(GET_WIDGET("back"));
+ g->forward_menu = GTK_MENU_ITEM(GET_WIDGET("forward"));
+ g->stop_menu = GTK_MENU_ITEM(GET_WIDGET("stop"));
+ g->reload_menu = GTK_MENU_ITEM(GET_WIDGET("reload"));
+ g->throbber = GTK_IMAGE(GET_WIDGET("throbber"));
+ g->viewport = GTK_VIEWPORT(GET_WIDGET("viewport1"));
+
+ /* connect our scrollbars to the viewport */
+ gtk_viewport_set_hadjustment(g->viewport,
+ gtk_range_get_adjustment(GTK_RANGE(GET_WIDGET("hscrollbar1"))));
+ gtk_viewport_set_vadjustment(g->viewport,
+ gtk_range_get_adjustment(GTK_RANGE(GET_WIDGET("vscrollbar1"))));
+ gtk_widget_set_size_request(GTK_WIDGET(g->viewport), 0, 0);
+
+ /* set the URL entry box to expand, as we can't do this from within
+ * glade because of the way it emulates toolbars.
+ */
+ gtk_tool_item_set_expand(GTK_TOOL_ITEM(GET_WIDGET("toolURLBar")), TRUE);
+
+ /* set the initial size of the browser window */
+ gtk_window_set_default_size(g->window, 600, 600);
+
+ /* set the events we're interested in receiving from the browser's
+ * drawing area.
+ */
+ gtk_widget_set_events(GTK_WIDGET(g->drawing_area),
+ GDK_EXPOSURE_MASK |
+ GDK_LEAVE_NOTIFY_MASK |
+ GDK_BUTTON_PRESS_MASK |
+ GDK_POINTER_MOTION_MASK |
+ GDK_KEY_PRESS_MASK |
+ GDK_KEY_RELEASE_MASK);
+ GTK_WIDGET_SET_FLAGS(GTK_WIDGET(g->drawing_area), GTK_CAN_FOCUS);
+
+ /* set the default background colour of the drawing area to white. */
+ gtk_widget_modify_bg(GTK_WIDGET(g->drawing_area), GTK_STATE_NORMAL,
+ &((GdkColor) { 0, 0xffff, 0xffff, 0xffff } ));
+
+ /* disable toolbar buttons that make no sense initially. */
+ gtk_widget_set_sensitive(GTK_WIDGET(g->back_button), FALSE);
+ gtk_widget_set_sensitive(GTK_WIDGET(g->forward_button), FALSE);
+ gtk_widget_set_sensitive(GTK_WIDGET(g->stop_button), FALSE);
+
+ /* create the local history window to be assoicated with this browser */
+ g->history_window = malloc(sizeof(struct gtk_history_window));
+ g->history_window->g = g;
+ g->history_window->window = GTK_WINDOW(
+ gtk_window_new(GTK_WINDOW_TOPLEVEL));
+ gtk_window_set_transient_for(g->history_window->window, g->window);
+ gtk_window_set_default_size(g->history_window->window, 400, 400);
+ gtk_window_set_title(g->history_window->window, "NetSurf History");
+ gtk_window_set_type_hint(g->history_window->window,
+ GDK_WINDOW_TYPE_HINT_UTILITY);
+ g->history_window->scrolled = GTK_SCROLLED_WINDOW(
+ gtk_scrolled_window_new(0, 0));
+ gtk_container_add(GTK_CONTAINER(g->history_window->window),
+ GTK_WIDGET(g->history_window->scrolled));
+
+ gtk_widget_show(GTK_WIDGET(g->history_window->scrolled));
+ g->history_window->drawing_area = GTK_DRAWING_AREA(
+ gtk_drawing_area_new());
+
+ gtk_widget_set_events(GTK_WIDGET(g->history_window->drawing_area),
+ GDK_EXPOSURE_MASK |
+ GDK_POINTER_MOTION_MASK |
+ GDK_BUTTON_PRESS_MASK);
+ gtk_widget_modify_bg(GTK_WIDGET(g->history_window->drawing_area),
+ GTK_STATE_NORMAL,
+ &((GdkColor) { 0, 0xffff, 0xffff, 0xffff } ));
+ gtk_scrolled_window_add_with_viewport(g->history_window->scrolled,
+ GTK_WIDGET(g->history_window->drawing_area));
+ gtk_widget_show(GTK_WIDGET(g->history_window->drawing_area));
+
+ /* set up URL bar completion */
+ g->url_bar_completion = gtk_entry_completion_new();
+ gtk_entry_set_completion(g->url_bar, g->url_bar_completion);
+ gtk_entry_completion_set_match_func(g->url_bar_completion,
+ nsgtk_completion_match, NULL, NULL);
+ gtk_entry_completion_set_model(g->url_bar_completion,
+ GTK_TREE_MODEL(nsgtk_completion_list));
+ gtk_entry_completion_set_text_column(g->url_bar_completion, 0);
+ gtk_entry_completion_set_minimum_key_length(g->url_bar_completion, 1);
+ gtk_entry_completion_set_popup_completion(g->url_bar_completion, TRUE);
+ g_object_set(G_OBJECT(g->url_bar_completion),
+ "popup-set-width", TRUE,
+ "popup-single-match", TRUE,
+ NULL);
+
+ /* set up the throbber. */
+ gtk_image_set_from_pixbuf(g->throbber, nsgtk_throbber->framedata[0]);
+ g->throb_frame = 0;
+
+#define CONNECT(obj, sig, callback, ptr) \
+ g_signal_connect(G_OBJECT(obj), (sig), G_CALLBACK(callback), (ptr))
+
+ /* connect history window signals to their handlers */
+ CONNECT(g->history_window->drawing_area, "expose_event",
+ nsgtk_history_expose_event, g->history_window);
+ CONNECT(g->history_window->drawing_area, "motion_notify_event",
+ nsgtk_history_motion_notify_event, g->history_window);
+ CONNECT(g->history_window->drawing_area, "button_press_event",
+ nsgtk_history_button_press_event, g->history_window);
+ CONNECT(g->history_window->window, "delete_event",
+ gtk_widget_hide_on_delete, NULL);
+
+ /* connect signals to handlers. */
+ CONNECT(g->window, "destroy", nsgtk_window_destroy_event, g);
+ CONNECT(g->drawing_area, "expose_event", nsgtk_window_expose_event, g);
+ 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);
+ CONNECT(g->drawing_area, "key_press_event",
+ nsgtk_window_keypress_event, g);
+ CONNECT(GET_WIDGET("viewport1"), "size_allocate",
+ nsgtk_window_size_allocate_event, g);
+
+ /* toolbar and URL bar signal handlers */
+ CONNECT(g->back_button, "clicked", nsgtk_window_back_button_clicked, g);
+ CONNECT(g->forward_button, "clicked",
+ nsgtk_window_forward_button_clicked, g);
+ CONNECT(g->stop_button, "clicked", nsgtk_window_stop_button_clicked, g);
+ CONNECT(g->reload_button, "clicked",
+ nsgtk_window_reload_button_clicked, g);
+ CONNECT(GET_WIDGET("toolHome"), "clicked",
+ nsgtk_window_home_button_clicked, g);
+ CONNECT(g->url_bar, "activate", nsgtk_window_url_activate_event, g);
+ CONNECT(g->url_bar, "changed", nsgtk_window_url_changed, g);
+
+ /* set up the menu signal handlers */
+ nsgtk_attach_menu_handlers(g->xml, g);
+
+ /* increase the number of open windows. */
+ open_windows++;
- if (g->prev)
- g->prev->next = g->next;
- else
- window_list = g->next;
+ /* finally, show the window. */
+ gtk_widget_show(GTK_WIDGET(g->window));
- if (g->next)
- g->next->prev = g->prev;
+ return g;
}
+void gui_window_destroy(struct gui_window *g)
+{
+
+}
void gui_window_set_title(struct gui_window *g, const char *title)
{
- gtk_window_set_title(GTK_WINDOW(g->window), title);
+ static char suffix[] = " - NetSurf";
+ char nt[strlen(title) + strlen(suffix) + 1];
+
+ if (title == NULL || title[0] == '\0')
+ {
+ gtk_window_set_title(g->window, "NetSurf");
+
+ }
+ else
+ {
+ strcpy(nt, title);
+ strcat(nt, suffix);
+ gtk_window_set_title(g->window, nt);
+ }
}
-
void gui_window_redraw(struct gui_window *g, int x0, int y0, int x1, int y1)
{
- gtk_widget_queue_draw_area(g->drawing_area, x0, y0, x1-x0+1, y1-y0+1);
+ gtk_widget_queue_draw_area(GTK_WIDGET(g->drawing_area),
+ x0, y0, x1-x0+1, y1-y0+1);
}
-
-void gui_window_redraw_window(struct gui_window* g)
+void gui_window_redraw_window(struct gui_window *g)
{
- gtk_widget_queue_draw(g->drawing_area);
+ gtk_widget_queue_draw(GTK_WIDGET(g->drawing_area));
}
-
void gui_window_update_box(struct gui_window *g,
- const union content_msg_data *data)
+ const union content_msg_data *data)
{
struct content *c = g->bw->current_content;
- if (!c) return;
+ if (c == NULL)
+ return;
- gtk_widget_queue_draw_area(g->drawing_area, data->redraw.x, data->redraw.y,
- data->redraw.width, data->redraw.height);
+ gtk_widget_queue_draw_area(GTK_WIDGET(g->drawing_area),
+ data->redraw.x, data->redraw.y,
+ data->redraw.width, data->redraw.height);
}
-
bool gui_window_get_scroll(struct gui_window *g, int *sx, int *sy)
{
*sx = 0;
@@ -744,182 +872,179 @@ bool gui_window_get_scroll(struct gui_window *g, int *sx, int *sy)
return true;
}
-
void gui_window_set_scroll(struct gui_window *g, int sx, int sy)
{
-}
+}
int gui_window_get_width(struct gui_window* g)
{
- return g->drawing_area->allocation.width;
+ return GTK_WIDGET(g->drawing_area)->allocation.width;
}
-
int gui_window_get_height(struct gui_window* g)
{
- return g->drawing_area->allocation.height;
+ return GTK_WIDGET(g->drawing_area)->allocation.height;
}
-
void gui_window_set_extent(struct gui_window *g, int width, int height)
{
- gtk_widget_set_size_request(g->drawing_area, width * g->scale,
- height * g->scale);
+ gtk_widget_set_size_request(GTK_WIDGET(g->drawing_area),
+ width * g->scale, height * g->scale);
+ gtk_widget_set_size_request(GTK_WIDGET(g->viewport), 0, 0);
}
-
void gui_window_set_status(struct gui_window *g, const char *text)
{
- gtk_label_set_text(GTK_LABEL(g->status_bar), text);
+ gtk_label_set_text(g->status_bar, text);
}
-
void gui_window_set_pointer(struct gui_window *g, gui_pointer_shape shape)
{
- GdkCursor *cursor = NULL;
- GdkCursorType cursortype;
- bool nullcursor = false;
- if (g->current_pointer == shape) return;
+ GdkCursor *cursor = NULL;
+ GdkCursorType cursortype;
+ bool nullcursor = false;
+
+ if (g->current_pointer == shape)
+ return;
+
g->current_pointer = shape;
+
switch (shape) {
- case GUI_POINTER_POINT:
- cursortype = GDK_HAND1;
- break;
- case GUI_POINTER_CARET:
- cursortype = GDK_XTERM;
- break;
- case GUI_POINTER_UP:
- cursortype = GDK_TOP_SIDE;
- break;
- case GUI_POINTER_DOWN:
- cursortype = GDK_BOTTOM_SIDE;
- break;
- case GUI_POINTER_LEFT:
- cursortype = GDK_LEFT_SIDE;
- break;
- case GUI_POINTER_RIGHT:
- cursortype = GDK_RIGHT_SIDE;
- break;
- case GUI_POINTER_LD:
- cursortype = GDK_BOTTOM_LEFT_CORNER;
- break;
- case GUI_POINTER_RD:
- cursortype = GDK_BOTTOM_RIGHT_CORNER;
- break;
- case GUI_POINTER_LU:
- cursortype = GDK_TOP_LEFT_CORNER;
- break;
- case GUI_POINTER_RU:
- cursortype = GDK_TOP_RIGHT_CORNER;
- break;
- case GUI_POINTER_CROSS:
- cursortype = GDK_CROSS;
- break;
- case GUI_POINTER_MOVE:
- cursortype = GDK_FLEUR;
- break;
- case GUI_POINTER_WAIT:
- cursortype = GDK_WATCH;
- break;
- case GUI_POINTER_HELP:
- cursortype = GDK_QUESTION_ARROW;
- break;
- case GUI_POINTER_MENU:
- cursortype = GDK_RIGHTBUTTON;
- break;
- case GUI_POINTER_PROGRESS:
- /* In reality, this needs to be the funky left_ptr_watch which we can't do easily yet */
- cursortype = GDK_WATCH;
- break;
- /* The following we're not sure about */
- case GUI_POINTER_NO_DROP:
- case GUI_POINTER_NOT_ALLOWED:
- case GUI_POINTER_DEFAULT:
- default:
- nullcursor = true;
- }
- if (!nullcursor)
- cursor = gdk_cursor_new_for_display(gtk_widget_get_display(GTK_WIDGET(g->drawing_area)), cursortype);
- gdk_window_set_cursor(g->drawing_area->window, cursor);
+ case GUI_POINTER_POINT:
+ cursortype = GDK_HAND1;
+ break;
+ case GUI_POINTER_CARET:
+ cursortype = GDK_XTERM;
+ break;
+ case GUI_POINTER_UP:
+ cursortype = GDK_TOP_SIDE;
+ break;
+ case GUI_POINTER_DOWN:
+ cursortype = GDK_BOTTOM_SIDE;
+ break;
+ case GUI_POINTER_LEFT:
+ cursortype = GDK_LEFT_SIDE;
+ break;
+ case GUI_POINTER_RIGHT:
+ cursortype = GDK_RIGHT_SIDE;
+ break;
+ case GUI_POINTER_LD:
+ cursortype = GDK_BOTTOM_LEFT_CORNER;
+ break;
+ case GUI_POINTER_RD:
+ cursortype = GDK_BOTTOM_RIGHT_CORNER;
+ break;
+ case GUI_POINTER_LU:
+ cursortype = GDK_TOP_LEFT_CORNER;
+ break;
+ case GUI_POINTER_RU:
+ cursortype = GDK_TOP_RIGHT_CORNER;
+ break;
+ case GUI_POINTER_CROSS:
+ cursortype = GDK_CROSS;
+ break;
+ case GUI_POINTER_MOVE:
+ cursortype = GDK_FLEUR;
+ break;
+ case GUI_POINTER_WAIT:
+ cursortype = GDK_WATCH;
+ break;
+ case GUI_POINTER_HELP:
+ cursortype = GDK_QUESTION_ARROW;
+ break;
+ case GUI_POINTER_MENU:
+ cursortype = GDK_RIGHTBUTTON;
+ break;
+ case GUI_POINTER_PROGRESS:
+ /* In reality, this needs to be the funky left_ptr_watch
+ * which we can't do easily yet.
+ */
+ cursortype = GDK_WATCH;
+ break;
+ /* The following we're not sure about */
+ case GUI_POINTER_NO_DROP:
+ case GUI_POINTER_NOT_ALLOWED:
+ case GUI_POINTER_DEFAULT:
+ default:
+ nullcursor = true;
+ }
+
+ if (!nullcursor)
+ cursor = gdk_cursor_new_for_display(
+ gtk_widget_get_display(
+ GTK_WIDGET(g->drawing_area)),
+ cursortype);
+ gdk_window_set_cursor(GTK_WIDGET(g->drawing_area)->window, cursor);
+
if (!nullcursor)
- gdk_cursor_unref(cursor);
+ gdk_cursor_unref(cursor);
}
-
void gui_window_hide_pointer(struct gui_window *g)
{
-}
+}
void gui_window_set_url(struct gui_window *g, const char *url)
{
- gtk_entry_set_text(GTK_ENTRY(g->url_bar), url);
-}
-
-static void nsgtk_throb(void *p)
-{
- struct gui_window *g = p;
- gtk_progress_bar_pulse(GTK_PROGRESS_BAR(
- (struct gui_window *)(g)->progress_bar));
- schedule(10, nsgtk_throb, g);
+ gtk_entry_set_text(g->url_bar, url);
}
void gui_window_start_throbber(struct gui_window* g)
{
- gtk_widget_set_sensitive(g->stop_button, TRUE);
- gtk_widget_set_sensitive(g->reload_button, FALSE);
- gtk_widget_show(g->progress_bar);
- schedule(100, nsgtk_perform_deferred_resize, g);
+ gtk_widget_set_sensitive(GTK_WIDGET(g->stop_button), TRUE);
+ gtk_widget_set_sensitive(GTK_WIDGET(g->reload_button), FALSE);
+ gtk_widget_set_sensitive(GTK_WIDGET(g->stop_menu), TRUE);
+ gtk_widget_set_sensitive(GTK_WIDGET(g->reload_button), FALSE);
+
nsgtk_window_update_back_forward(g);
+
schedule(10, nsgtk_throb, g);
}
-
void gui_window_stop_throbber(struct gui_window* g)
{
- gtk_widget_set_sensitive(g->stop_button, FALSE);
- gtk_widget_set_sensitive(g->reload_button, TRUE);
+ gtk_widget_set_sensitive(GTK_WIDGET(g->stop_button), FALSE);
+ gtk_widget_set_sensitive(GTK_WIDGET(g->reload_button), TRUE);
+ gtk_widget_set_sensitive(GTK_WIDGET(g->stop_menu), FALSE);
+ gtk_widget_set_sensitive(GTK_WIDGET(g->reload_menu), TRUE);
+
nsgtk_window_update_back_forward(g);
- gtk_widget_hide(g->progress_bar);
+
schedule_remove(nsgtk_throb, g);
-}
-
-static void gui_window_redraw_caret(struct gui_window *g)
-{
- if (g->careth == 0)
- return;
-
- gui_window_redraw(g, g->caretx, g->carety,
- g->caretx, g->carety + g->careth);
+
+ gtk_image_set_from_pixbuf(g->throbber, nsgtk_throbber->framedata[0]);
+ // Issue a final reflow so that the content object reports its size correctly
+ schedule(5, nsgtk_perform_deferred_resize, g);
}
void gui_window_place_caret(struct gui_window *g, int x, int y, int height)
{
- gui_window_redraw_caret(g);
+ nsgtk_redraw_caret(g);
g->caretx = x;
g->carety = y + 1;
g->careth = height;
- gui_window_redraw_caret(g);
+ nsgtk_redraw_caret(g);
- gtk_widget_grab_focus(g->drawing_area);
+ gtk_widget_grab_focus(GTK_WIDGET(g->drawing_area));
}
-
void gui_window_remove_caret(struct gui_window *g)
{
- gui_window_redraw_caret(g);
+ if (g->careth == 0)
+ return;
- g->careth = 0;
+ gui_window_redraw(g, g->caretx, g->carety,
+ g->caretx, g->carety + g->careth);
}
-
void gui_window_new_content(struct gui_window *g)
{
-}
+}
bool gui_window_scroll_start(struct gui_window *g)
{
@@ -927,44 +1052,42 @@ bool gui_window_scroll_start(struct gui_window *g)
}
bool gui_window_box_scroll_start(struct gui_window *g,
- int x0, int y0, int x1, int y1)
+ int x0, int y0, int x1, int y1)
{
return true;
}
void gui_drag_save_object(gui_save_type type, struct content *c,
- struct gui_window *g)
+ struct gui_window *g)
{
-}
+}
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;
+ return true;
}
-
bool gui_commit_clipboard(void)
{
return true;
@@ -976,41 +1099,4 @@ bool gui_copy_to_clipboard(struct selection *s)
return true;
}
-wchar_t gdkkey_to_nskey(GdkEventKey *key)
-{
- /* this function will need to become much more complex to support
- * everything that the RISC OS version does. But this will do for
- * now. I hope.
- */
-
- switch (key->keyval)
- {
- case GDK_BackSpace: return KEY_DELETE_LEFT;
- case GDK_Delete: return KEY_DELETE_RIGHT;
- case GDK_Linefeed: return 13;
- case GDK_Return: return 10;
- case GDK_Left: return KEY_LEFT;
- case GDK_Right: return KEY_RIGHT;
- case GDK_Up: return KEY_UP;
- case GDK_Down: return KEY_DOWN;
-
- /* Modifiers - do nothing for now */
- case GDK_Shift_L:
- case GDK_Shift_R:
- case GDK_Control_L:
- case GDK_Control_R:
- case GDK_Caps_Lock:
- case GDK_Shift_Lock:
- case GDK_Meta_L:
- case GDK_Meta_R:
- case GDK_Alt_L:
- case GDK_Alt_R:
- case GDK_Super_L:
- case GDK_Super_R:
- case GDK_Hyper_L:
- case GDK_Hyper_R: return 0;
-
- default: return key->keyval;
- }
-}
diff --git a/gtk/netsurf.glade b/gtk/netsurf.glade
index 697b282e6..e11a4d893 100644
--- a/gtk/netsurf.glade
+++ b/gtk/netsurf.glade
@@ -3,6 +3,1089 @@
<glade-interface>
+<widget class="GtkWindow" id="wndBrowser">
+ <property name="title" translatable="yes">NetSurf</property>
+ <property name="type">GTK_WINDOW_TOPLEVEL</property>
+ <property name="window_position">GTK_WIN_POS_CENTER</property>
+ <property name="modal">False</property>
+ <property name="resizable">True</property>
+ <property name="destroy_with_parent">False</property>
+ <property name="decorated">True</property>
+ <property name="skip_taskbar_hint">False</property>
+ <property name="skip_pager_hint">False</property>
+ <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
+ <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+ <property name="focus_on_map">True</property>
+ <property name="urgency_hint">False</property>
+
+ <child>
+ <widget class="GtkVBox" id="vbox14">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">0</property>
+
+ <child>
+ <widget class="GtkMenuBar" id="menubar1">
+ <property name="visible">True</property>
+ <property name="pack_direction">GTK_PACK_DIRECTION_LTR</property>
+ <property name="child_pack_direction">GTK_PACK_DIRECTION_LTR</property>
+
+ <child>
+ <widget class="GtkMenuItem" id="menuitem4">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_File</property>
+ <property name="use_underline">True</property>
+
+ <child>
+ <widget class="GtkMenu" id="menuitem4_menu">
+
+ <child>
+ <widget class="GtkImageMenuItem" id="new_window">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Opens a new browser window.</property>
+ <property name="label" translatable="yes">New window</property>
+ <property name="use_underline">True</property>
+ <accelerator key="N" modifiers="GDK_CONTROL_MASK" signal="activate"/>
+
+ <child internal-child="image">
+ <widget class="GtkImage" id="image382">
+ <property name="visible">True</property>
+ <property name="stock">gtk-new</property>
+ <property name="icon_size">1</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ </child>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkMenuItem" id="open_location">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="tooltip" translatable="yes">Open an address into this browser window.</property>
+ <property name="label" translatable="yes">Open _location...</property>
+ <property name="use_underline">True</property>
+ <accelerator key="L" modifiers="GDK_CONTROL_MASK" signal="activate"/>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkImageMenuItem" id="open_file">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="tooltip" translatable="yes">Open a file on your computer into this browser window.</property>
+ <property name="label" translatable="yes">Open _file...</property>
+ <property name="use_underline">True</property>
+ <accelerator key="F" modifiers="GDK_CONTROL_MASK" signal="activate"/>
+
+ <child internal-child="image">
+ <widget class="GtkImage" id="image383">
+ <property name="visible">True</property>
+ <property name="stock">gtk-open</property>
+ <property name="icon_size">1</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ </child>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkImageMenuItem" id="close_window">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Close this browser window.</property>
+ <property name="label" translatable="yes">_Close window</property>
+ <property name="use_underline">True</property>
+ <accelerator key="W" modifiers="GDK_CONTROL_MASK | GDK_SHIFT_MASK" signal="activate"/>
+
+ <child internal-child="image">
+ <widget class="GtkImage" id="image384">
+ <property name="visible">True</property>
+ <property name="stock">gtk-close</property>
+ <property name="icon_size">1</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ </child>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkSeparatorMenuItem" id="separatormenuitem1">
+ <property name="visible">True</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkImageMenuItem" id="save_page">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="tooltip" translatable="yes">Save this page to disc, optionally including images, etc.</property>
+ <property name="label" translatable="yes">Save page...</property>
+ <property name="use_underline">True</property>
+ <accelerator key="S" modifiers="GDK_CONTROL_MASK" signal="activate"/>
+
+ <child internal-child="image">
+ <widget class="GtkImage" id="image385">
+ <property name="visible">True</property>
+ <property name="stock">gtk-save-as</property>
+ <property name="icon_size">1</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ </child>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkMenuItem" id="export">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="tooltip" translatable="yes">Export the page to a different format.</property>
+ <property name="label" translatable="yes">Export</property>
+ <property name="use_underline">True</property>
+
+ <child>
+ <widget class="GtkMenu" id="export_menu">
+
+ <child>
+ <widget class="GtkMenuItem" id="export_plain_text">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Plain ASCII text, readable in text editors and views.</property>
+ <property name="label" translatable="yes">Plain text...</property>
+ <property name="use_underline">True</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkMenuItem" id="export_drawfile">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">RISC OS Drawfile vector graphic.</property>
+ <property name="label" translatable="yes">Drawfile...</property>
+ <property name="use_underline">True</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkMenuItem" id="export_postscript">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">PostScript for printing and converting to PDFs.</property>
+ <property name="label" translatable="yes">PostScript...</property>
+ <property name="use_underline">True</property>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkSeparatorMenuItem" id="separator2">
+ <property name="visible">True</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkImageMenuItem" id="print_preview">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="tooltip" translatable="yes">Show how a print out might look like.</property>
+ <property name="label" translatable="yes">Print preview...</property>
+ <property name="use_underline">True</property>
+
+ <child internal-child="image">
+ <widget class="GtkImage" id="image386">
+ <property name="visible">True</property>
+ <property name="stock">gtk-print-preview</property>
+ <property name="icon_size">1</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ </child>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkImageMenuItem" id="print">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="tooltip" translatable="yes">Produce a hardcopy on your printer.</property>
+ <property name="label" translatable="yes">Print...</property>
+ <property name="use_underline">True</property>
+ <accelerator key="P" modifiers="GDK_CONTROL_MASK" signal="activate"/>
+
+ <child internal-child="image">
+ <widget class="GtkImage" id="image387">
+ <property name="visible">True</property>
+ <property name="stock">gtk-print</property>
+ <property name="icon_size">1</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ </child>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkSeparatorMenuItem" id="separator3">
+ <property name="visible">True</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkImageMenuItem" id="quit">
+ <property name="visible">True</property>
+ <property name="label">gtk-quit</property>
+ <property name="use_stock">True</property>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkMenuItem" id="menuitem5">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Edit</property>
+ <property name="use_underline">True</property>
+
+ <child>
+ <widget class="GtkMenu" id="menuitem5_menu">
+
+ <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_stock">True</property>
+ </widget>
+ </child>
+
+ <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_stock">True</property>
+ </widget>
+ </child>
+
+ <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_stock">True</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkImageMenuItem" id="delete">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="label">gtk-delete</property>
+ <property name="use_stock">True</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkSeparatorMenuItem" id="separator4">
+ <property name="visible">True</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkMenuItem" 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="use_underline">True</property>
+ <accelerator key="A" modifiers="GDK_CONTROL_MASK" signal="activate"/>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkSeparatorMenuItem" id="separator5">
+ <property name="visible">True</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkMenuItem" id="find">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="tooltip" translatable="yes">Find specific text in the current browser window.</property>
+ <property name="label" translatable="yes">_Find...</property>
+ <property name="use_underline">True</property>
+ <accelerator key="F" modifiers="GDK_CONTROL_MASK" signal="activate"/>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkSeparatorMenuItem" id="separator6">
+ <property name="visible">True</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkImageMenuItem" id="choices">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Change how NetSurf functions.</property>
+ <property name="label" translatable="yes">_Choices...</property>
+ <property name="use_underline">True</property>
+
+ <child internal-child="image">
+ <widget class="GtkImage" id="image388">
+ <property name="visible">True</property>
+ <property name="stock">gtk-preferences</property>
+ <property name="icon_size">1</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkMenuItem" id="menuitem6">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_View</property>
+ <property name="use_underline">True</property>
+
+ <child>
+ <widget class="GtkMenu" id="menuitem6_menu">
+
+ <child>
+ <widget class="GtkImageMenuItem" id="stop">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Stop</property>
+ <property name="use_underline">True</property>
+ <accelerator key="Escape" modifiers="0" signal="activate"/>
+
+ <child internal-child="image">
+ <widget class="GtkImage" id="image389">
+ <property name="visible">True</property>
+ <property name="stock">gtk-stop</property>
+ <property name="icon_size">1</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ </child>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkImageMenuItem" id="reload">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Reload</property>
+ <property name="use_underline">True</property>
+ <accelerator key="F5" modifiers="0" signal="activate"/>
+
+ <child internal-child="image">
+ <widget class="GtkImage" id="image390">
+ <property name="visible">True</property>
+ <property name="stock">gtk-refresh</property>
+ <property name="icon_size">1</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ </child>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkSeparatorMenuItem" id="separator10">
+ <property name="visible">True</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkImageMenuItem" id="scale_view">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Scale the page in the current browser window to be smaller or larger.</property>
+ <property name="label" translatable="yes">Scale View...</property>
+ <property name="use_underline">True</property>
+ <accelerator key="F11" modifiers="0" signal="activate"/>
+
+ <child internal-child="image">
+ <widget class="GtkImage" id="image391">
+ <property name="visible">True</property>
+ <property name="stock">gtk-zoom-in</property>
+ <property name="icon_size">1</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkMenu" id="scale_view_menu">
+
+ <child>
+ <widget class="GtkImageMenuItem" id="zoom_in">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Zoom _in</property>
+ <property name="use_underline">True</property>
+ <accelerator key="plus" modifiers="GDK_CONTROL_MASK" signal="activate"/>
+
+ <child internal-child="image">
+ <widget class="GtkImage" id="image392">
+ <property name="visible">True</property>
+ <property name="stock">gtk-zoom-in</property>
+ <property name="icon_size">1</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ </child>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkImageMenuItem" id="normal_size">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Normal size</property>
+ <property name="use_underline">True</property>
+ <accelerator key="0" modifiers="GDK_CONTROL_MASK" signal="activate"/>
+
+ <child internal-child="image">
+ <widget class="GtkImage" id="image393">
+ <property name="visible">True</property>
+ <property name="stock">gtk-zoom-100</property>
+ <property name="icon_size">1</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ </child>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkImageMenuItem" id="zoom_out">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Zoom _out</property>
+ <property name="use_underline">True</property>
+ <accelerator key="minus" modifiers="GDK_CONTROL_MASK" signal="activate"/>
+
+ <child internal-child="image">
+ <widget class="GtkImage" id="image394">
+ <property name="visible">True</property>
+ <property name="stock">gtk-zoom-out</property>
+ <property name="icon_size">1</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkMenuItem" id="images">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="label" translatable="yes">Images</property>
+ <property name="use_underline">True</property>
+
+ <child>
+ <widget class="GtkMenu" id="images_menu">
+
+ <child>
+ <widget class="GtkCheckMenuItem" id="foreground_images">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="tooltip" translatable="yes">Toggle the display of images in the foreground.</property>
+ <property name="label" translatable="yes">Foreground images</property>
+ <property name="use_underline">True</property>
+ <property name="active">False</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkCheckMenuItem" id="background_images">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="tooltip" translatable="yes">Toggle the display of images in the background.</property>
+ <property name="label" translatable="yes">Background images</property>
+ <property name="use_underline">True</property>
+ <property name="active">False</property>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkMenuItem" id="toolbars">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="label" translatable="yes">Toolbars</property>
+ <property name="use_underline">True</property>
+
+ <child>
+ <widget class="GtkMenu" id="toolbars_menu">
+
+ <child>
+ <widget class="GtkCheckMenuItem" id="menu_bar">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="label" translatable="yes">Menu bar</property>
+ <property name="use_underline">True</property>
+ <property name="active">False</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkCheckMenuItem" id="buttons">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="label" translatable="yes">Buttons</property>
+ <property name="use_underline">True</property>
+ <property name="active">True</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkCheckMenuItem" id="address_bar">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="label" translatable="yes">Address bar</property>
+ <property name="use_underline">True</property>
+ <property name="active">True</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkCheckMenuItem" id="throbber">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="label" translatable="yes">Throbber</property>
+ <property name="use_underline">True</property>
+ <property name="active">True</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkCheckMenuItem" id="status_bar">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="label" translatable="yes">Status bar</property>
+ <property name="use_underline">True</property>
+ <property name="active">True</property>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkMenuItem" id="navigate">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Navigate</property>
+ <property name="use_underline">True</property>
+
+ <child>
+ <widget class="GtkMenu" id="navigate_menu">
+
+ <child>
+ <widget class="GtkImageMenuItem" id="back">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Back</property>
+ <property name="use_underline">True</property>
+ <accelerator key="Left" modifiers="GDK_MOD1_MASK" signal="activate"/>
+
+ <child internal-child="image">
+ <widget class="GtkImage" id="image395">
+ <property name="visible">True</property>
+ <property name="stock">gtk-go-back</property>
+ <property name="icon_size">1</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ </child>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkImageMenuItem" id="forward">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Forward</property>
+ <property name="use_underline">True</property>
+ <accelerator key="Right" modifiers="GDK_MOD1_MASK" signal="activate"/>
+
+ <child internal-child="image">
+ <widget class="GtkImage" id="image396">
+ <property name="visible">True</property>
+ <property name="stock">gtk-go-forward</property>
+ <property name="icon_size">1</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ </child>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkImageMenuItem" id="home">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Home</property>
+ <property name="use_underline">True</property>
+ <accelerator key="Home" modifiers="GDK_MOD1_MASK" signal="activate"/>
+
+ <child internal-child="image">
+ <widget class="GtkImage" id="image397">
+ <property name="visible">True</property>
+ <property name="stock">gtk-home</property>
+ <property name="icon_size">1</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ </child>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkSeparatorMenuItem" id="separator7">
+ <property name="visible">True</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkMenuItem" id="local_history">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Show the history tree for this browser window.</property>
+ <property name="label" translatable="yes">_Local history...</property>
+ <property name="use_underline">True</property>
+ <accelerator key="F7" modifiers="0" signal="activate"/>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkMenuItem" id="global_history1">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="tooltip" translatable="yes">Show the history tree for all windows.</property>
+ <property name="label" translatable="yes">_Global history...</property>
+ <property name="use_underline">True</property>
+ <accelerator key="F7" modifiers="GDK_CONTROL_MASK" signal="activate"/>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkSeparatorMenuItem" id="separator8">
+ <property name="visible">True</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkMenuItem" id="nsgtk_add_to_bookmarks">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="tooltip" translatable="yes">Add the current page to your bookmarks.</property>
+ <property name="label" translatable="yes">_Add to bookmarks</property>
+ <property name="use_underline">True</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkMenuItem" id="show_bookmarks">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="tooltip" translatable="yes">Open a window showing all your bookmarks.</property>
+ <property name="label" translatable="yes">Show book_marks...</property>
+ <property name="use_underline">True</property>
+ <accelerator key="F6" modifiers="0" signal="activate"/>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkMenuItem" id="help">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">_Help</property>
+ <property name="use_underline">True</property>
+
+ <child>
+ <widget class="GtkMenu" id="help_menu">
+
+ <child>
+ <widget class="GtkImageMenuItem" id="contents">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="tooltip" translatable="yes">Shows the contents of the NetSurf manual.</property>
+ <property name="label" translatable="yes">_Contents...</property>
+ <property name="use_underline">True</property>
+ <accelerator key="F1" modifiers="0" signal="activate"/>
+
+ <child internal-child="image">
+ <widget class="GtkImage" id="image398">
+ <property name="visible">True</property>
+ <property name="stock">gtk-help</property>
+ <property name="icon_size">1</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ </widget>
+ </child>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkMenuItem" id="guide">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="tooltip" translatable="yes">Shows a guide and tutorial.</property>
+ <property name="label" translatable="yes">User _guide...</property>
+ <property name="use_underline">True</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkMenuItem" id="user_information">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="label" translatable="yes">User _information...</property>
+ <property name="use_underline">True</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkSeparatorMenuItem" id="separator9">
+ <property name="visible">True</property>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkImageMenuItem" id="about">
+ <property name="visible">True</property>
+ <property name="label">gtk-about</property>
+ <property name="use_stock">True</property>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkToolbar" id="toolbar1">
+ <property name="visible">True</property>
+ <property name="orientation">GTK_ORIENTATION_HORIZONTAL</property>
+ <property name="toolbar_style">GTK_TOOLBAR_BOTH_HORIZ</property>
+ <property name="tooltips">True</property>
+ <property name="show_arrow">True</property>
+
+ <child>
+ <widget class="GtkToolButton" id="toolBack">
+ <property name="visible">True</property>
+ <property name="stock_id">gtk-go-back</property>
+ <property name="visible_horizontal">True</property>
+ <property name="visible_vertical">True</property>
+ <property name="is_important">False</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkToolButton" id="toolForward">
+ <property name="visible">True</property>
+ <property name="stock_id">gtk-go-forward</property>
+ <property name="visible_horizontal">True</property>
+ <property name="visible_vertical">True</property>
+ <property name="is_important">False</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkToolButton" id="toolStop">
+ <property name="visible">True</property>
+ <property name="stock_id">gtk-stop</property>
+ <property name="visible_horizontal">True</property>
+ <property name="visible_vertical">True</property>
+ <property name="is_important">False</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkToolButton" id="toolReload">
+ <property name="visible">True</property>
+ <property name="stock_id">gtk-refresh</property>
+ <property name="visible_horizontal">True</property>
+ <property name="visible_vertical">True</property>
+ <property name="is_important">False</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkToolButton" id="toolHome">
+ <property name="visible">True</property>
+ <property name="stock_id">gtk-home</property>
+ <property name="visible_horizontal">True</property>
+ <property name="visible_vertical">True</property>
+ <property name="is_important">False</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkToolItem" id="toolURLBar">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">True</property>
+ <property name="visible_vertical">True</property>
+ <property name="is_important">False</property>
+
+ <child>
+ <widget class="GtkEntry" id="URLBar">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="editable">True</property>
+ <property name="visibility">True</property>
+ <property name="max_length">0</property>
+ <property name="text" translatable="yes"></property>
+ <property name="has_frame">True</property>
+ <property name="invisible_char">●</property>
+ <property name="activates_default">False</property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">True</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkToolItem" id="toolthrobber">
+ <property name="visible">True</property>
+ <property name="visible_horizontal">True</property>
+ <property name="visible_vertical">True</property>
+ <property name="is_important">False</property>
+
+ <child>
+ <widget class="GtkImage" id="throbber">
+ <property name="visible">True</property>
+ <property name="icon_size">4</property>
+ <property name="icon_name">gtk-yes</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">2</property>
+ <property name="ypad">0</property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">False</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkTable" id="table6">
+ <property name="visible">True</property>
+ <property name="n_rows">2</property>
+ <property name="n_columns">2</property>
+ <property name="homogeneous">False</property>
+ <property name="row_spacing">0</property>
+ <property name="column_spacing">0</property>
+
+ <child>
+ <widget class="GtkVScrollbar" id="vscrollbar1">
+ <property name="visible">True</property>
+ <property name="update_policy">GTK_UPDATE_CONTINUOUS</property>
+ <property name="inverted">False</property>
+ <property name="adjustment">0 0 100 1 10 0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="x_options">fill</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkViewport" id="viewport1">
+ <property name="visible">True</property>
+ <property name="shadow_type">GTK_SHADOW_IN</property>
+
+ <child>
+ <widget class="GtkDrawingArea" id="drawingArea">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="has_focus">True</property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="x_options">fill</property>
+ <property name="y_options">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="label" translatable="yes">Status bar text goes here</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.490000009537</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_MIDDLE</property>
+ <property name="width_chars">50</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="shrink">True</property>
+ <property name="resize">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkHScrollbar" id="hscrollbar1">
+ <property name="visible">True</property>
+ <property name="update_policy">GTK_UPDATE_CONTINUOUS</property>
+ <property name="inverted">False</property>
+ <property name="adjustment">0 0 100 1 10 0</property>
+ </widget>
+ <packing>
+ <property name="shrink">True</property>
+ <property name="resize">True</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="y_options">shrink</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkStatusbar" id="statusbar1">
+ <property name="height_request">1</property>
+ <property name="visible">True</property>
+ <property name="has_resize_grip">True</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">fill</property>
+ <property name="y_options">shrink|fill</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+</widget>
+
<widget class="GtkDialog" id="wndChoices">
<property name="title" translatable="yes">NetSurf Choices</property>
<property name="type">GTK_WINDOW_TOPLEVEL</property>
@@ -3253,374 +4336,4 @@ Fantasy</property>
</child>
</widget>
-<widget class="GtkWindow" id="wndBrowser">
- <property name="title" translatable="yes">NetSurf</property>
- <property name="type">GTK_WINDOW_TOPLEVEL</property>
- <property name="window_position">GTK_WIN_POS_CENTER_ALWAYS</property>
- <property name="modal">False</property>
- <property name="resizable">True</property>
- <property name="destroy_with_parent">False</property>
- <property name="decorated">True</property>
- <property name="skip_taskbar_hint">False</property>
- <property name="skip_pager_hint">False</property>
- <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
- <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
- <property name="focus_on_map">True</property>
- <property name="urgency_hint">False</property>
-
- <child>
- <widget class="GtkVBox" id="vbox14">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkToolbar" id="toolbar1">
- <property name="visible">True</property>
- <property name="orientation">GTK_ORIENTATION_HORIZONTAL</property>
- <property name="toolbar_style">GTK_TOOLBAR_ICONS</property>
- <property name="tooltips">True</property>
- <property name="show_arrow">True</property>
-
- <child>
- <widget class="GtkToolButton" id="toolBack">
- <property name="visible">True</property>
- <property name="stock_id">gtk-go-back</property>
- <property name="visible_horizontal">True</property>
- <property name="visible_vertical">True</property>
- <property name="is_important">False</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="homogeneous">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkToolButton" id="toolForward">
- <property name="visible">True</property>
- <property name="stock_id">gtk-go-forward</property>
- <property name="visible_horizontal">True</property>
- <property name="visible_vertical">True</property>
- <property name="is_important">False</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="homogeneous">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkToolButton" id="toolStop">
- <property name="visible">True</property>
- <property name="stock_id">gtk-stop</property>
- <property name="visible_horizontal">True</property>
- <property name="visible_vertical">True</property>
- <property name="is_important">False</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="homogeneous">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkToolButton" id="toolReload">
- <property name="visible">True</property>
- <property name="label" translatable="yes"></property>
- <property name="use_underline">True</property>
- <property name="stock_id">gtk-refresh</property>
- <property name="visible_horizontal">True</property>
- <property name="visible_vertical">True</property>
- <property name="is_important">False</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="homogeneous">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkToolButton" id="toolZoomIn">
- <property name="visible">True</property>
- <property name="label" translatable="yes"></property>
- <property name="use_underline">True</property>
- <property name="stock_id">gtk-zoom-in</property>
- <property name="visible_horizontal">True</property>
- <property name="visible_vertical">True</property>
- <property name="is_important">False</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="homogeneous">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkToolButton" id="toolZoom100">
- <property name="visible">True</property>
- <property name="label" translatable="yes"></property>
- <property name="use_underline">True</property>
- <property name="stock_id">gtk-zoom-100</property>
- <property name="visible_horizontal">True</property>
- <property name="visible_vertical">True</property>
- <property name="is_important">False</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="homogeneous">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkToolButton" id="toolZoomOut">
- <property name="visible">True</property>
- <property name="label" translatable="yes"></property>
- <property name="use_underline">True</property>
- <property name="stock_id">gtk-zoom-out</property>
- <property name="visible_horizontal">True</property>
- <property name="visible_vertical">True</property>
- <property name="is_important">False</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="homogeneous">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkToolButton" id="toolHistory">
- <property name="visible">True</property>
- <property name="label" translatable="yes"></property>
- <property name="use_underline">True</property>
- <property name="stock_id">gtk-open</property>
- <property name="visible_horizontal">True</property>
- <property name="visible_vertical">True</property>
- <property name="is_important">False</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="homogeneous">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkToolButton" id="toolChoices">
- <property name="visible">True</property>
- <property name="label" translatable="yes"></property>
- <property name="use_underline">True</property>
- <property name="stock_id">gtk-preferences</property>
- <property name="visible_horizontal">True</property>
- <property name="visible_vertical">True</property>
- <property name="is_important">False</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="homogeneous">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkToolItem" id="toolitem1">
- <property name="visible">True</property>
- <property name="visible_horizontal">True</property>
- <property name="visible_vertical">True</property>
- <property name="is_important">False</property>
-
- <child>
- <widget class="GtkEntry" id="URLBar">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes"></property>
- <property name="has_frame">True</property>
- <property name="invisible_char">●</property>
- <property name="activates_default">False</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="expand">True</property>
- <property name="homogeneous">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkToolItem" id="toolitem2">
- <property name="visible">True</property>
- <property name="visible_horizontal">True</property>
- <property name="visible_vertical">True</property>
- <property name="is_important">False</property>
-
- <child>
- <widget class="GtkImage" id="image7">
- <property name="visible">True</property>
- <property name="icon_size">2</property>
- <property name="icon_name">stock_smiley-1</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">3</property>
- <property name="ypad">0</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="homogeneous">False</property>
- </packing>
- </child>
-
- <child>
- <placeholder/>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkTable" id="table6">
- <property name="visible">True</property>
- <property name="n_rows">2</property>
- <property name="n_columns">2</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">0</property>
- <property name="column_spacing">0</property>
-
- <child>
- <widget class="GtkVScrollbar" id="vscrollbar1">
- <property name="visible">True</property>
- <property name="update_policy">GTK_UPDATE_CONTINUOUS</property>
- <property name="inverted">False</property>
- <property name="adjustment">0 0 100 1 10 0</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHPaned" id="hpaned1">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
-
- <child>
- <widget class="GtkHBox" id="hbox16">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkLabel" id="statusBar">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Status bar text goes here</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_MIDDLE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="shrink">True</property>
- <property name="resize">False</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHScrollbar" id="hscrollbar1">
- <property name="visible">True</property>
- <property name="update_policy">GTK_UPDATE_CONTINUOUS</property>
- <property name="inverted">False</property>
- <property name="adjustment">0 0 100 1 10 0</property>
- </widget>
- <packing>
- <property name="shrink">True</property>
- <property name="resize">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkImage" id="image8">
- <property name="visible">True</property>
- <property name="icon_size">1</property>
- <property name="icon_name">gtk-close</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</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">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkViewport" id="viewport1">
- <property name="visible">True</property>
- <property name="shadow_type">GTK_SHADOW_NONE</property>
-
- <child>
- <widget class="GtkDrawingArea" id="drawingArea">
- <property name="visible">True</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options">fill</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- </child>
-</widget>
-
</glade-interface>
diff --git a/gtk/throbber.gif b/gtk/throbber.gif
new file mode 100644
index 000000000..f9d0c152d
--- /dev/null
+++ b/gtk/throbber.gif
Binary files differ
diff --git a/makefile b/makefile
index 6e05d0aef..af4210c76 100644
--- a/makefile
+++ b/makefile
@@ -69,7 +69,7 @@ OBJECTS_GTK += browser.o history_core.o netsurf.o selection.o textinput.o \
OBJECTS_GTK += font_pango.o gtk_bitmap.o gtk_gui.o \
gtk_schedule.o gtk_thumbnail.o gtk_options.o \
gtk_plotters.o gtk_treeview.o gtk_window.o \
- gtk_completion.o gtk_login.o # gtk/
+ gtk_completion.o gtk_login.o gtk_throbber.o # gtk/
OBJDIR_RISCOS = arm-riscos-aof