summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--!NetSurf/Resources/en/Messages22
-rw-r--r--Makefile.config2
-rw-r--r--desktop/textinput.c4
-rw-r--r--gtk/dialogs/gtk_about.c7
-rw-r--r--gtk/dialogs/gtk_options.c2
-rw-r--r--gtk/gtk_download.c482
-rw-r--r--gtk/gtk_download.h12
-rw-r--r--gtk/gtk_selection.c8
-rw-r--r--gtk/res/downloads.glade139
-rw-r--r--gtk/res/netsurf.glade209
10 files changed, 481 insertions, 406 deletions
diff --git a/!NetSurf/Resources/en/Messages b/!NetSurf/Resources/en/Messages
index 3e218b985..58955321a 100644
--- a/!NetSurf/Resources/en/Messages
+++ b/!NetSurf/Resources/en/Messages
@@ -304,6 +304,11 @@ Unwritten:Writing data to file failed.
# download window.
#
+gtkSizeInfo:%s of %s
+gtkProgressBar:%.0f%% of %u files
+gtkProgressBarPulse:Downloading %u files
+gtkProgressBarPulseSingle:Downloading %u file
+
# Column Headers
#
gtkProgress:Progress
@@ -311,22 +316,29 @@ gtkDetails:Details
gtkSpeed:Speed
gtkRemaining:Remaining
-# Status
+# Status Messages
+# spaces necessary
#
-gtkError:Error
-gtkComplete:Complete
-gtkCanceled:Canceled
-gtkWorking:Working
+
+gtkError: Error
+gtkComplete: Complete
+gtkCanceled: Canceled
+gtkWorking: Working
# Dialogs
#
+gtkQuit:Quit NetSurf?
+gtkDownloadsRunning:There are still downloads running, if you quit now these will be canceled and the files deleted.
gtkStartDownload:Download file?
+gtkOverwrite:A file named "%s" already exists. Do you want to replace it?
+gtkOverwriteInfo:The file already exists in "%s". Replacing it will overwrite its contents.
gtkFailed:Download failed
gtkFileError:File error: %s
gtkInfo:%s from %s is %s in size
gtkSave:Save file as...
gtkUnknownHost:an unknown host
gtkUnknownFile:
+gtkUnknownSize:unknown
# Printing user interface tokens
# ==============================
diff --git a/Makefile.config b/Makefile.config
index d89aa9520..d569738be 100644
--- a/Makefile.config
+++ b/Makefile.config
@@ -6,7 +6,7 @@
# Use libharu to enable PDF export and GTK printing support. There is no
# auto-detection available for this, as it does not have a pkg-config file.
-NETSURF_USE_HARU_PDF=YES
+NETSURF_USE_HARU_PDF=NO
# The following options are GTK-specific
ifeq ($(TARGET),gtk)
diff --git a/desktop/textinput.c b/desktop/textinput.c
index 8cfe01050..fa7ea443a 100644
--- a/desktop/textinput.c
+++ b/desktop/textinput.c
@@ -880,6 +880,10 @@ bool browser_window_input_callback(struct browser_window *bw,
input->gadget->caret_form_offset =
get_form_offset(input, text_box, box_offset);
+ /* update the form offset */
+ input->gadget->caret_form_offset =
+ get_form_offset(input, text_box, box_offset);
+
selection_get_end(bw->sel, &end_offset);
box_coords(input, &box_x, &box_y);
diff --git a/gtk/dialogs/gtk_about.c b/gtk/dialogs/gtk_about.c
index 81d22cea8..e39af1cc2 100644
--- a/gtk/dialogs/gtk_about.c
+++ b/gtk/dialogs/gtk_about.c
@@ -52,10 +52,9 @@ void nsgtk_about_dialog_init(GtkWindow *parent, struct browser_window *bw, const
gtk_about_dialog_set_url_hook (launch_url, (gpointer) bw, NULL);
gtk_show_about_dialog(parent, "artists", artists, "authors", authors,
- "comments", description,"copyright", copyright, "documenters", documenters,
- "license", licence,
- "program-name", name, "translator-credits", translators,
- "version", version, "website", url, "website-label", url_label,
+ "comments", description,"copyright", copyright,
+ "documenters", documenters, "license", licence, "program-name", name,
+ "translator-credits", translators, "version", version, "website", url,
"wrap-license", FALSE, NULL);
}
diff --git a/gtk/dialogs/gtk_options.c b/gtk/dialogs/gtk_options.c
index a40e49e2d..d3ce5669d 100644
--- a/gtk/dialogs/gtk_options.c
+++ b/gtk/dialogs/gtk_options.c
@@ -317,7 +317,7 @@ COMBO_CHANGED(comboProxyType, proxy_type)
option_http_proxy_auth = OPTION_HTTP_PROXY_AUTH_NTLM;
break;
}
- gboolean sensitive = (!proxy_type == 0);
+ gboolean sensitive = (option_http_proxy_auth);
gtk_widget_set_sensitive (entryProxyHost, sensitive);
gtk_widget_set_sensitive (entryProxyPort, sensitive);
gtk_widget_set_sensitive (entryProxyUser, sensitive);
diff --git a/gtk/gtk_download.c b/gtk/gtk_download.c
index e84b6d2fd..6657ce1fc 100644
--- a/gtk/gtk_download.c
+++ b/gtk/gtk_download.c
@@ -1,5 +1,5 @@
/*
- * Copyright 2008 Rob Kendrick <rjek@netsurf-browser.org>
+ * Copyright 2008 Michael Lester <element3260@gmail.com>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
@@ -30,43 +30,51 @@
#include "gtk/options.h"
#include "gtk/gtk_download.h"
+#define UPDATE_RATE 500 /* In milliseconds */
#define GLADE_NAME "downloads.glade"
static GtkWindow *nsgtk_download_window, *nsgtk_download_parent;
-static GtkWidget *nsgtk_download_progressBar;
+static GtkProgressBar *nsgtk_download_progress_bar;
static GtkTreeView *nsgtk_download_tree;
static GtkListStore *nsgtk_download_store;
static GtkTreeSelection *nsgtk_download_selection;
static GtkTreeIter nsgtk_download_iter;
-static GList *nsgtk_download_buttons;
-static gint nsgtk_downloads;
-gchar* status_messages[] = { "gtkWorking", "gtkError", "gtkComplete",
- "gtkCanceled" };
-static gboolean nsgtk_download_hide (GtkWidget *window);
+static GTimer *nsgtk_downloads_timer;
+static GList *nsgtk_downloads_list, *nsgtk_download_buttons;
+static gint nsgtk_downloads_num_active;
+static gchar* status_messages[] = { NULL, "gtkWorking", "gtkError",
+ "gtkComplete", "gtkCanceled" };
+
+static gboolean nsgtk_download_hide(GtkWidget *window);
static GtkTreeView *nsgtk_download_tree_view_new(GladeXML *gladeFile);
static void nsgtk_download_tree_view_row_activated(GtkTreeView *tree,
GtkTreePath *path, GtkTreeViewColumn *column, gpointer data);
+static gint nsgtk_download_sort(GtkTreeModel *model, GtkTreeIter *a,
+ GtkTreeIter *b, gpointer userdata);
+static gboolean nsgtk_download_update(gboolean force_update);
+static void nsgtk_download_do(nsgtk_download_selection_action action);
+
static void nsgtk_download_store_update_item(struct gui_download_window *dl);
static void nsgtk_download_store_create_item (struct gui_download_window *dl);
static void nsgtk_download_store_clear_item (struct gui_download_window *dl);
static void nsgtk_download_store_cancel_item (struct gui_download_window *dl);
-static void nsgtk_download_selection_do(GtkWidget *button,
- selection_action action);
-
-static void nsgtk_download_sensitivity_set(struct gui_download_window *dl,
- nsgtk_download_actions sensitivity);
-static void nsgtk_download_sensitivity_selection_changed(
+static void nsgtk_download_sensitivity_evaluate(
GtkTreeSelection *selection);
static void nsgtk_download_sensitivity_update_buttons(
nsgtk_download_actions sensitivity);
+
+static void nsgtk_download_change_sensitivity(
+ struct gui_download_window *dl, nsgtk_download_actions sens);
+static void nsgtk_download_change_status (
+ struct gui_download_window *dl, nsgtk_download_status status);
static gchar* nsgtk_download_dialog_show (gchar *filename, gchar *domain,
- gchar *size);
+ const gchar *size);
static gchar* nsgtk_download_info_to_string (struct gui_download_window *dl);
static gchar* nsgtk_download_time_to_string (gint seconds);
static gboolean nsgtk_download_handle_error (GError *error);
@@ -81,8 +89,8 @@ void nsgtk_download_init()
nsgtk_download_buttons =
glade_xml_get_widget_prefix(gladeFile, "button");
- nsgtk_download_progressBar =
- glade_xml_get_widget(gladeFile, "progressBar");
+ nsgtk_download_progress_bar = GTK_PROGRESS_BAR(glade_xml_get_widget(
+ gladeFile, "progressBar"));
nsgtk_download_window = GTK_WINDOW(glade_xml_get_widget(gladeFile,
"wndDownloads"));
nsgtk_download_parent = NULL;
@@ -92,6 +100,8 @@ void nsgtk_download_init()
gtk_window_set_destroy_with_parent(GTK_WINDOW(nsgtk_download_window),
FALSE);
+ nsgtk_downloads_timer = g_timer_new();
+
nsgtk_download_tree = nsgtk_download_tree_view_new(gladeFile);
nsgtk_download_store = gtk_list_store_new(NSGTK_DOWNLOAD_N_COLUMNS,
@@ -99,12 +109,22 @@ void nsgtk_download_init()
G_TYPE_STRING, /* Description */
G_TYPE_STRING, /* Time remaining */
G_TYPE_STRING, /* Speed */
+ G_TYPE_INT, /* Pulse */
G_TYPE_STRING, /* Status */
G_TYPE_POINTER /* Download structure */
);
+
gtk_tree_view_set_model(nsgtk_download_tree,
GTK_TREE_MODEL(nsgtk_download_store));
+
+ gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(nsgtk_download_store),
+ NSGTK_DOWNLOAD_STATUS,
+ (GtkTreeIterCompareFunc) nsgtk_download_sort, NULL, NULL);
+ gtk_tree_sortable_set_sort_column_id(
+ GTK_TREE_SORTABLE(nsgtk_download_store),
+ NSGTK_DOWNLOAD_STATUS, GTK_SORT_ASCENDING);
+
g_object_unref(nsgtk_download_store);
nsgtk_download_selection =
@@ -113,38 +133,36 @@ void nsgtk_download_init()
GTK_SELECTION_MULTIPLE);
g_signal_connect(G_OBJECT(nsgtk_download_selection), "changed",
- G_CALLBACK(nsgtk_download_sensitivity_selection_changed),
- NULL);
- g_signal_connect(G_OBJECT(nsgtk_download_window), "delete-event",
- G_CALLBACK(nsgtk_download_hide), NULL);
- g_signal_connect(glade_xml_get_widget(gladeFile, "buttonClear"),
- "clicked", G_CALLBACK(nsgtk_download_selection_do),
- nsgtk_download_store_clear_item);
- g_signal_connect(glade_xml_get_widget(gladeFile, "buttonCancel"),
- "clicked", G_CALLBACK(nsgtk_download_selection_do),
- nsgtk_download_store_cancel_item);
+ G_CALLBACK(nsgtk_download_sensitivity_evaluate), NULL);
g_signal_connect(nsgtk_download_tree, "row-activated",
G_CALLBACK(nsgtk_download_tree_view_row_activated),
NULL);
+ g_signal_connect_swapped(glade_xml_get_widget(gladeFile, "buttonClear"),
+ "clicked", G_CALLBACK(nsgtk_download_do),
+ nsgtk_download_store_clear_item);
+ g_signal_connect_swapped(glade_xml_get_widget(gladeFile, "buttonCancel"),
+ "clicked", G_CALLBACK(nsgtk_download_do),
+ nsgtk_download_store_cancel_item);
+ g_signal_connect(G_OBJECT(nsgtk_download_window), "delete-event",
+ G_CALLBACK(nsgtk_download_hide), NULL);
+
}
void nsgtk_download_destroy ()
{
- gtk_tree_selection_select_all(nsgtk_download_selection);
- nsgtk_download_selection_do(NULL, nsgtk_download_store_cancel_item);
+ nsgtk_download_do(nsgtk_download_store_cancel_item);
}
bool nsgtk_check_for_downloads (GtkWindow *parent)
{
- if (nsgtk_downloads != 0) {
+ if (nsgtk_downloads_num_active != 0) {
GtkWidget *dialog;
dialog = gtk_message_dialog_new_with_markup(parent,
GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING,
GTK_BUTTONS_NONE,
- "<big><b>Quit NetSurf?</b></big>\n\n"
- "<small>There are still downloads running, "
- "if you quit now these will be canceled and the"
- " files deleted</small>");
+ "<big><b>%s</b></big>\n\n"
+ "<small>%s</small>", messages_get("gtkQuit"),
+ messages_get("gtkDownloadsRunning"));
gtk_dialog_add_buttons(GTK_DIALOG(dialog), "gtk-cancel",
GTK_RESPONSE_CANCEL, "gtk-quit",
GTK_RESPONSE_CLOSE, NULL);
@@ -176,13 +194,16 @@ struct gui_download_window *gui_download_window_create(const char *url,
const char *mime_type, struct fetch *fetch,
unsigned int total_size, struct gui_window *gui)
{
- nsgtk_download_parent = nsgtk_scaffolding_get_window(gui);
- struct gui_download_window *download;
gchar *domain;
gchar *filename;
gchar *destination;
- gchar *size = (total_size == 0 ?
- "Unknown" : human_friendly_bytesize(total_size));
+ gboolean unknown_size = total_size == 0;
+ const gchar *size = (total_size == 0 ?
+ messages_get("gtkUnknownSize") :
+ human_friendly_bytesize(total_size));
+
+ nsgtk_download_parent = nsgtk_scaffolding_get_window(gui);
+ struct gui_download_window *download = malloc(sizeof *download);
if (url_nice(url, &filename, false) != URL_FUNC_OK)
strcpy(filename, messages_get("gtkUnknownFile"));
@@ -192,20 +213,26 @@ struct gui_download_window *gui_download_window_create(const char *url,
destination = nsgtk_download_dialog_show(filename, domain, size);
if (destination == NULL)
return NULL;
-
- download = malloc(sizeof *download);
+
+ /* Add the new row and store the reference to it (which keeps track of
+ * the tree changes) */
+ gtk_list_store_prepend(nsgtk_download_store, &nsgtk_download_iter);
+ download->row = gtk_tree_row_reference_new(
+ GTK_TREE_MODEL(nsgtk_download_store),
+ gtk_tree_model_get_path(GTK_TREE_MODEL
+ (nsgtk_download_store), &nsgtk_download_iter));
+
download->fetch = fetch;
download->name = g_string_new(filename);
download->time_left = g_string_new("");
download->size_total = total_size;
download->size_downloaded = 0;
download->speed = 0;
+ download->start_time = g_timer_elapsed(nsgtk_downloads_timer, NULL);
download->time_remaining = -1;
+ download->status = NSGTK_DOWNLOAD_NONE;
download->filename = destination;
- download->status = (total_size == 0 ? NSGTK_DOWNLOAD_WORKING :
- NSGTK_DOWNLOAD_NONE);
- download->progress = (total_size == 0 ? 100 : 0);
- download->timer = g_timer_new();
+ download->progress = 0;
download->error = NULL;
download->write = g_io_channel_new_file(destination, "w",
&download->error);
@@ -213,25 +240,23 @@ struct gui_download_window *gui_download_window_create(const char *url,
free(download);
return NULL;
}
-
- if (g_str_has_prefix(mime_type, "text") == FALSE)
- g_io_channel_set_encoding(download->write, NULL,
- &download->error);
-
- /* Add the new row and store the reference to it (which keeps track of
- * the tree changes) */
- gtk_list_store_append(nsgtk_download_store, &nsgtk_download_iter);
- download->row = gtk_tree_row_reference_new(
- GTK_TREE_MODEL(nsgtk_download_store),
- gtk_tree_model_get_path(GTK_TREE_MODEL
- (nsgtk_download_store), &nsgtk_download_iter));
-
- nsgtk_download_sensitivity_set(download, NSGTK_DOWNLOAD_CANCEL);
+ g_io_channel_set_encoding(download->write, NULL,
+ &download->error);
+
+ nsgtk_download_change_sensitivity(download, NSGTK_DOWNLOAD_CANCEL);
nsgtk_download_store_create_item(download);
nsgtk_download_show(nsgtk_download_parent);
- nsgtk_downloads++;
+ if (unknown_size)
+ nsgtk_download_change_status(download,
+ NSGTK_DOWNLOAD_WORKING);
+
+ if (nsgtk_downloads_num_active == 0)
+ g_timeout_add(UPDATE_RATE, (GSourceFunc)nsgtk_download_update,
+ FALSE);
+ nsgtk_downloads_list = g_list_prepend(nsgtk_downloads_list, download);
+
return download;
}
@@ -241,35 +266,19 @@ void gui_download_window_data(struct gui_download_window *dw, const char *data,
{
g_io_channel_write_chars(dw->write, data, size, NULL, &dw->error);
if (dw->error != NULL) {
- dw->status = NSGTK_DOWNLOAD_ERROR;
dw->speed = 0;
dw->time_remaining = -1;
- dw->sensitivity = NSGTK_DOWNLOAD_CLEAR;
- nsgtk_download_store_update_item(dw);
+
+ nsgtk_download_change_sensitivity(dw, NSGTK_DOWNLOAD_CLEAR);
+ nsgtk_download_change_status(dw, NSGTK_DOWNLOAD_ERROR);
+
+ nsgtk_download_update(TRUE);
fetch_abort(dw->fetch);
- nsgtk_downloads--;
gtk_window_present(nsgtk_download_window);
return;
- }
-
+ }
dw->size_downloaded += size;
- gfloat elapsed = g_timer_elapsed(dw->timer, NULL);
-
- /* If enough time has gone by, update the window */
- if (elapsed - dw->last_update > .5 &&
- GTK_WIDGET_VISIBLE(nsgtk_download_window)) {
- dw->speed = dw->size_downloaded / elapsed;
- dw->time_remaining = (dw->size_total - dw->size_downloaded)/
- dw->speed;
-
- if (dw->size_total)
- dw->progress = (gfloat)(dw->size_downloaded)/
- dw->size_total*100;
-
- nsgtk_download_store_update_item(dw);
- dw->last_update = elapsed;
- }
}
@@ -285,16 +294,16 @@ void gui_download_window_done(struct gui_download_window *dw)
g_io_channel_unref(dw->write);
dw->speed = 0;
+ dw->time_remaining = -1;
dw->progress = 100;
- nsgtk_download_sensitivity_set(dw, NSGTK_DOWNLOAD_CLEAR);
- dw->status = NSGTK_DOWNLOAD_COMPLETE;
+ dw->size_total = dw->size_downloaded;
+ nsgtk_download_change_sensitivity(dw, NSGTK_DOWNLOAD_CLEAR);
+ nsgtk_download_change_status(dw, NSGTK_DOWNLOAD_COMPLETE);
if (option_downloads_clear)
nsgtk_download_store_clear_item(dw);
else
- nsgtk_download_store_update_item(dw);
-
- nsgtk_downloads--;
+ nsgtk_download_update(TRUE);
}
@@ -309,8 +318,8 @@ GtkTreeView* nsgtk_download_tree_view_new(GladeXML *gladeFile)
renderer = gtk_cell_renderer_progress_new();
gtk_tree_view_insert_column_with_attributes (treeview, -1,
messages_get("gtkProgress"), renderer, "value",
- NSGTK_DOWNLOAD_PROGRESS, "text",
- NSGTK_DOWNLOAD_STATUS, NULL);
+ NSGTK_DOWNLOAD_PROGRESS, "pulse", NSGTK_DOWNLOAD_PULSE,
+ "text", NSGTK_DOWNLOAD_STATUS, NULL);
/* Information column */
renderer = gtk_cell_renderer_text_new();
@@ -347,34 +356,146 @@ void nsgtk_download_tree_view_row_activated(GtkTreeView *tree,
if (gtk_tree_model_get_iter(model, &iter, path)) {
/* TODO: This will be a context action (pause, start, clear) */
- nsgtk_download_selection_do(NULL,
- nsgtk_download_store_clear_item);
+ nsgtk_download_do(nsgtk_download_store_clear_item);
}
}
+gint nsgtk_download_sort (GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b,
+ gpointer userdata)
+{
+ struct gui_download_window *dl1, *dl2;
+
+ gtk_tree_model_get(model, a, NSGTK_DOWNLOAD, &dl1, -1);
+ gtk_tree_model_get(model, b, NSGTK_DOWNLOAD, &dl2, -1);
+
+ return dl1->status - dl2->status;
+}
+
+void nsgtk_download_do(nsgtk_download_selection_action action)
+{
+ GList *rows, *dls = NULL;
+ GtkTreeModel *model = GTK_TREE_MODEL(nsgtk_download_store);
+ gboolean selection_exists = gtk_tree_selection_count_selected_rows(
+ nsgtk_download_selection);
+
+ if (selection_exists) {
+ rows = gtk_tree_selection_get_selected_rows(
+ nsgtk_download_selection, &model);
+ while (rows != NULL) {
+ struct gui_download_window *dl;
+ gtk_tree_model_get_iter(GTK_TREE_MODEL(
+ nsgtk_download_store),
+ &nsgtk_download_iter,
+ (GtkTreePath*)rows->data);
+ gtk_tree_model_get(GTK_TREE_MODEL(nsgtk_download_store),
+ &nsgtk_download_iter, NSGTK_DOWNLOAD,
+ &dl, -1);
+ dls = g_list_prepend(dls, dl);
+
+ rows = rows->next;
+ }
+ g_list_foreach(rows, (GFunc)gtk_tree_path_free, NULL);
+ g_list_foreach(rows, (GFunc)g_free, NULL);
+ g_list_free(rows);
+ } else
+ dls = g_list_copy(nsgtk_downloads_list);
+
+ g_list_foreach(dls, (GFunc)action, NULL);
+ g_list_free(dls);
+}
+
+gboolean nsgtk_download_update(gboolean force_update)
+{
+ /* Be sure we need to update */
+ if (!GTK_WIDGET_VISIBLE(nsgtk_download_window))
+ return TRUE;
+
+ GList *list;
+ gchar *text;
+ gboolean update, pulse_mode = FALSE;
+ gint downloaded = 0, total = 0, dls = 0;
+ gfloat percent, elapsed = g_timer_elapsed(nsgtk_downloads_timer, NULL);
+ nsgtk_downloads_num_active = 0;
+
+ for (list = nsgtk_downloads_list; list != NULL; list = list->next) {
+ struct gui_download_window *dl = list->data;
+ update = force_update;
+
+ switch (dl->status) {
+ case NSGTK_DOWNLOAD_WORKING:
+ pulse_mode = TRUE;
+ case NSGTK_DOWNLOAD_NONE:
+ dl->speed = dl->size_downloaded /
+ (elapsed - dl->start_time);
+ if (dl->status == NSGTK_DOWNLOAD_NONE) {
+ dl->time_remaining = (dl->size_total -
+ dl->size_downloaded)/
+ dl->speed;
+ dl->progress = (gfloat)
+ dl->size_downloaded /
+ dl->size_total * 100;
+ } else
+ dl->progress++;
+
+ nsgtk_downloads_num_active++;
+ update = TRUE;
+
+ case NSGTK_DOWNLOAD_COMPLETE:
+ downloaded += dl->size_downloaded;
+ total += dl->size_total;
+ dls++;
+ }
+ if (update)
+ nsgtk_download_store_update_item(dl);
+ }
+
+ if (pulse_mode) {
+ text = g_strdup_printf(
+ messages_get(nsgtk_downloads_num_active > 1 ?
+ "gtkProgressBarPulse" :
+ "gtkProgressBarPulseSingle"),
+ nsgtk_downloads_num_active);
+ gtk_progress_bar_pulse(nsgtk_download_progress_bar);
+ gtk_progress_bar_set_text(nsgtk_download_progress_bar, text);
+ } else {
+ percent = total != 0 ? (gfloat)downloaded / total : 0;
+ text = g_strdup_printf(messages_get("gtkProgressBar"),
+ floor(percent*100), dls);
+ gtk_progress_bar_set_fraction(nsgtk_download_progress_bar,
+ percent);
+ gtk_progress_bar_set_text(nsgtk_download_progress_bar, text);
+ }
+
+ g_free(text);
+
+ if (nsgtk_downloads_num_active == 0)
+ return FALSE; /* Returning FALSE here cancels the g_timeout */
+ else
+ return TRUE;
+}
+
void nsgtk_download_store_update_item (struct gui_download_window *dl)
{
gchar *info = nsgtk_download_info_to_string(dl);
gchar *speed = g_strconcat(human_friendly_bytesize(dl->speed), "/s",
NULL);
gchar *time = nsgtk_download_time_to_string(dl->time_remaining);
+ gboolean pulse = dl->status == NSGTK_DOWNLOAD_WORKING;
/* Updates iter (which is needed to set and get data) with the dl row */
gtk_tree_model_get_iter(GTK_TREE_MODEL(nsgtk_download_store),
&nsgtk_download_iter,
gtk_tree_row_reference_get_path(dl->row));
- gtk_list_store_set (nsgtk_download_store, &nsgtk_download_iter,
- NSGTK_DOWNLOAD_PROGRESS, dl->progress,
+ gtk_list_store_set(nsgtk_download_store, &nsgtk_download_iter,
+ NSGTK_DOWNLOAD_PULSE, pulse ? dl->progress : -1,
+ NSGTK_DOWNLOAD_PROGRESS, pulse ? 0 : dl->progress,
NSGTK_DOWNLOAD_INFO, info,
NSGTK_DOWNLOAD_SPEED, dl->speed == 0 ? "-" : speed,
NSGTK_DOWNLOAD_REMAINING, time,
+ NSGTK_DOWNLOAD, dl,
-1);
- if (dl->status != NSGTK_DOWNLOAD_NONE)
- gtk_list_store_set(nsgtk_download_store, &nsgtk_download_iter,
- NSGTK_DOWNLOAD_STATUS,
- messages_get(status_messages[dl->status]));
-
+
g_free(info);
g_free(speed);
g_free(time);
@@ -384,94 +505,75 @@ void nsgtk_download_store_create_item (struct gui_download_window *dl)
{
nsgtk_download_store_update_item(dl);
/* The iter has already been updated to this row */
- gtk_list_store_set (nsgtk_download_store, &nsgtk_download_iter,
+ gtk_list_store_set(nsgtk_download_store, &nsgtk_download_iter,
NSGTK_DOWNLOAD, dl, -1);
}
void nsgtk_download_store_clear_item (struct gui_download_window *dl)
{
if (dl->sensitivity & NSGTK_DOWNLOAD_CLEAR) {
+ nsgtk_downloads_list = g_list_remove(nsgtk_downloads_list, dl);
+
gtk_tree_model_get_iter(GTK_TREE_MODEL(nsgtk_download_store),
&nsgtk_download_iter,
gtk_tree_row_reference_get_path(dl->row));
gtk_list_store_remove(nsgtk_download_store,
&nsgtk_download_iter);
g_free(dl);
+
+ nsgtk_download_sensitivity_evaluate(nsgtk_download_selection);
+ nsgtk_download_update(FALSE);
}
}
void nsgtk_download_store_cancel_item (struct gui_download_window *dl)
{
if (dl->sensitivity & NSGTK_DOWNLOAD_CANCEL) {
- dl->status = NSGTK_DOWNLOAD_CANCELED;
dl->speed = 0;
+ dl->size_downloaded = 0;
dl->progress = 0;
dl->time_remaining = -1;
- nsgtk_download_sensitivity_set(dl, NSGTK_DOWNLOAD_CLEAR);
+ nsgtk_download_change_sensitivity(dl, NSGTK_DOWNLOAD_CLEAR);
+ nsgtk_download_change_status(dl, NSGTK_DOWNLOAD_CANCELED);
if (dl->fetch)
fetch_abort(dl->fetch);
g_unlink(dl->filename);
- nsgtk_download_store_update_item(dl);
-
- nsgtk_downloads--;
+ nsgtk_download_update(TRUE);
}
}
-void nsgtk_download_selection_do(GtkWidget *button, selection_action action)
-{
- GList *rows, *dls = NULL;
- GtkTreeModel *model = GTK_TREE_MODEL(nsgtk_download_store);
-
- rows = gtk_tree_selection_get_selected_rows(nsgtk_download_selection,
- &model);
- while (rows != NULL) {
- struct gui_download_window *dl;
- gtk_tree_model_get_iter(GTK_TREE_MODEL(nsgtk_download_store),
- &nsgtk_download_iter, (GtkTreePath*)rows->data);
- gtk_tree_model_get(GTK_TREE_MODEL(nsgtk_download_store),
- &nsgtk_download_iter, NSGTK_DOWNLOAD,
- &dl, -1);
- dls = g_list_prepend(dls, dl);
-
- rows = rows->next;
- }
- g_list_foreach(dls, (GFunc)action, NULL);
-
- g_list_foreach(rows, (GFunc)gtk_tree_path_free, NULL);
- g_list_foreach(rows, (GFunc)g_free, NULL);
- g_list_free(rows);
- g_list_free(dls);
-}
-
-void nsgtk_download_sensitivity_set(struct gui_download_window *dl,
- nsgtk_download_actions sensitivity)
+void nsgtk_download_sensitivity_evaluate (GtkTreeSelection *selection)
{
- dl->sensitivity = sensitivity;
- if (gtk_tree_selection_path_is_selected(nsgtk_download_selection,
- gtk_tree_row_reference_get_path(dl->row)))
- nsgtk_download_sensitivity_update_buttons(sensitivity);
-
-}
-
-void nsgtk_download_sensitivity_selection_changed (GtkTreeSelection *selection)
-{
- GtkTreeModel *model = GTK_TREE_MODEL(nsgtk_download_store);
GtkTreeIter iter;
GList *rows;
+ gboolean selected = gtk_tree_selection_count_selected_rows(selection);
+ GtkTreeModel *model = GTK_TREE_MODEL(nsgtk_download_store);
nsgtk_download_actions sensitivity = 0;
-
- rows = gtk_tree_selection_get_selected_rows(selection, &model);
- while (rows != NULL) {
- struct gui_download_window *dl;
- gtk_tree_model_get_iter(model, &iter, (GtkTreePath*)rows->data);
- gtk_tree_model_get(model, &iter, NSGTK_DOWNLOAD, &dl, -1);
- sensitivity |= dl->sensitivity;
- rows = rows->next;
+ struct gui_download_window *dl;
+
+ if (selected) {
+ rows = gtk_tree_selection_get_selected_rows(selection, &model);
+ while (rows != NULL) {
+ gtk_tree_model_get_iter(model, &iter,
+ (GtkTreePath*)rows->data);
+ gtk_tree_model_get(model, &iter, NSGTK_DOWNLOAD,
+ &dl, -1);
+ sensitivity |= dl->sensitivity;
+ rows = rows->next;
+ }
+ } else {
+ rows = nsgtk_downloads_list;
+ while (rows != NULL) {
+ dl = rows->data;
+ sensitivity |= (dl->sensitivity & NSGTK_DOWNLOAD_CLEAR);
+ rows = rows->next;
+ }
}
+
nsgtk_download_sensitivity_update_buttons(sensitivity);
}
@@ -490,12 +592,36 @@ void nsgtk_download_sensitivity_update_buttons(
gtk_widget_set_sensitive(g_list_nth_data(nsgtk_download_buttons,
RESUME_BUTTON), sensitivity & NSGTK_DOWNLOAD_RESUME);
}
+
+void nsgtk_download_change_sensitivity(struct gui_download_window *dl,
+ nsgtk_download_actions sensitivity)
+{
+ dl->sensitivity = sensitivity;
+ nsgtk_download_sensitivity_evaluate(nsgtk_download_selection);
+}
+
+void nsgtk_download_change_status (
+ struct gui_download_window *dl, nsgtk_download_status status)
+{
+ dl->status = status;
+ if (status != NSGTK_DOWNLOAD_NONE) {
+ gtk_tree_model_get_iter(GTK_TREE_MODEL(nsgtk_download_store),
+ &nsgtk_download_iter,
+ gtk_tree_row_reference_get_path(dl->row));
+
+ gtk_list_store_set(nsgtk_download_store, &nsgtk_download_iter,
+ NSGTK_DOWNLOAD_STATUS,
+ messages_get(status_messages[status]), -1);
+ }
+}
-gchar* nsgtk_download_dialog_show (gchar *filename, gchar *domain, gchar *size)
+gchar* nsgtk_download_dialog_show (gchar *filename, gchar *domain,
+ const gchar *size)
{
enum { GTK_RESPONSE_DOWNLOAD, GTK_RESPONSE_SAVE_AS };
GtkWidget *dialog;
gchar *destination = NULL;
+ gchar *message = g_strdup(messages_get("gtkStartDownload"));
gchar *info = g_strdup_printf(messages_get("gtkInfo"), filename,
domain, size);
@@ -504,7 +630,7 @@ gchar* nsgtk_download_dialog_show (gchar *filename, gchar *domain, gchar *size)
GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE,
"<span size=\"x-large\" weight=\"ultrabold\">%s</span>"
"\n\n<small>%s</small>",
- messages_get("gtkStartDownload"), info);
+ message, info);
gtk_dialog_add_buttons(GTK_DIALOG(dialog), GTK_STOCK_SAVE,
GTK_RESPONSE_DOWNLOAD, GTK_STOCK_CANCEL,
@@ -513,6 +639,7 @@ gchar* nsgtk_download_dialog_show (gchar *filename, gchar *domain, gchar *size)
gint result = gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_destroy(dialog);
+ g_free(message);
g_free(info);
switch (result) {
@@ -526,6 +653,9 @@ gchar* nsgtk_download_dialog_show (gchar *filename, gchar *domain, gchar *size)
NULL);
gtk_file_chooser_set_current_name
(GTK_FILE_CHOOSER(dialog), filename);
+ gtk_file_chooser_set_current_folder
+ (GTK_FILE_CHOOSER(dialog),
+ option_downloads_directory);
gtk_file_chooser_set_do_overwrite_confirmation
(GTK_FILE_CHOOSER(dialog),
option_request_overwrite);
@@ -540,6 +670,44 @@ gchar* nsgtk_download_dialog_show (gchar *filename, gchar *domain, gchar *size)
case GTK_RESPONSE_DOWNLOAD: {
destination = g_strconcat(option_downloads_directory,
"/", filename, NULL);
+ /* Test if file already exists and display overwrite
+ * confirmation if needed */
+ if (g_file_test(destination, G_FILE_TEST_EXISTS)
+ && option_request_overwrite) {
+ message = g_strdup_printf(messages_get(
+ "gtkOverwrite"), filename);
+ info = g_strdup_printf(messages_get(
+ "gtkOverwriteInfo"),
+ option_downloads_directory);
+
+ dialog = gtk_message_dialog_new_with_markup(
+ nsgtk_download_parent,
+ GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_MESSAGE_QUESTION,
+ GTK_BUTTONS_CANCEL,
+ "<b>%s</b>",message);
+ gtk_message_dialog_format_secondary_markup(
+ GTK_MESSAGE_DIALOG(dialog),
+ info);
+
+ GtkWidget *button = gtk_dialog_add_button(
+ GTK_DIALOG(dialog),
+ "_Replace",
+ GTK_RESPONSE_DOWNLOAD);
+ gtk_button_set_image(GTK_BUTTON(button),
+ gtk_image_new_from_stock(
+ "gtk-save",
+ GTK_ICON_SIZE_BUTTON));
+
+ gint result = gtk_dialog_run(GTK_DIALOG(
+ dialog));
+ if (result == GTK_RESPONSE_CANCEL)
+ destination = NULL;
+
+ gtk_widget_destroy(dialog);
+ g_free(message);
+ g_free(info);
+ }
break;
}
}
@@ -548,15 +716,19 @@ gchar* nsgtk_download_dialog_show (gchar *filename, gchar *domain, gchar *size)
gchar* nsgtk_download_info_to_string (struct gui_download_window *dl)
{
- if (dl->status != NSGTK_DOWNLOAD_ERROR)
- return g_strdup_printf("%s\n%s of %s completed",
- dl->name->str,
+ gchar *size_info = g_strdup_printf(messages_get("gtkSizeInfo"),
human_friendly_bytesize(dl->size_downloaded),
- dl->size_total == 0 ? "Unknown" :
- human_friendly_bytesize(dl->size_total));
+ dl->size_total == 0 ? messages_get("gtkUnknownSize") :
+ human_friendly_bytesize(dl->size_total));
+
+ if (dl->status != NSGTK_DOWNLOAD_ERROR)
+ return g_strdup_printf("%s\n%s",
+ dl->name->str, size_info);
else
return g_strdup_printf("%s\n%s", dl->name->str,
dl->error->message);
+
+ g_free(size_info);
}
gchar* nsgtk_download_time_to_string (gint seconds)
diff --git a/gtk/gtk_download.h b/gtk/gtk_download.h
index b7a6bd699..284e981cf 100644
--- a/gtk/gtk_download.h
+++ b/gtk/gtk_download.h
@@ -1,5 +1,5 @@
/*
- * Copyright 2008 Rob Kendrick <rjek@netsurf-browser.org>
+ * Copyright 2008 Michael Lester <element3260@gmail.com>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
@@ -26,6 +26,7 @@ enum {
NSGTK_DOWNLOAD_INFO,
NSGTK_DOWNLOAD_REMAINING,
NSGTK_DOWNLOAD_SPEED,
+ NSGTK_DOWNLOAD_PULSE,
NSGTK_DOWNLOAD_STATUS,
NSGTK_DOWNLOAD,
@@ -33,11 +34,11 @@ enum {
};
typedef enum {
+ NSGTK_DOWNLOAD_NONE,
NSGTK_DOWNLOAD_WORKING,
NSGTK_DOWNLOAD_ERROR,
NSGTK_DOWNLOAD_COMPLETE,
- NSGTK_DOWNLOAD_CANCELED,
- NSGTK_DOWNLOAD_NONE
+ NSGTK_DOWNLOAD_CANCELED
} nsgtk_download_status;
typedef enum {
@@ -57,18 +58,17 @@ struct gui_download_window {
gint size_total;
gint size_downloaded;
gint progress;
- gfloat last_update;
gfloat time_remaining;
+ gfloat start_time;
gfloat speed;
gchar *filename;
GtkTreeRowReference *row;
- GTimer *timer;
GIOChannel *write;
GError *error;
};
-typedef void (*selection_action)(struct gui_download_window *dl);
+typedef void (*nsgtk_download_selection_action)(struct gui_download_window *dl);
void nsgtk_download_init();
void nsgtk_download_destroy (void);
diff --git a/gtk/gtk_selection.c b/gtk/gtk_selection.c
index c3631dfc6..cdb43ae15 100644
--- a/gtk/gtk_selection.c
+++ b/gtk/gtk_selection.c
@@ -82,13 +82,13 @@ void gui_start_selection(struct gui_window *g)
void gui_paste_from_clipboard(struct gui_window *g, int x, int y)
{
- char *text;
+ gchar *text;
clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
text = gtk_clipboard_wait_for_text (clipboard);
/* clipboard_wait... converts the string to utf8 for us */
if (text != NULL)
browser_window_paste_text(g->bw, text, strlen(text), true);
- free(text);
+ g_free(text);
}
bool gui_empty_clipboard(void)
@@ -103,8 +103,8 @@ bool gui_empty_clipboard(void)
bool gui_commit_clipboard(void)
{
- clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
- gtk_clipboard_set_text (clipboard, current_selection->str, -1);
+ clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
+ gtk_clipboard_set_text(clipboard, current_selection->str, -1);
return true;
}
diff --git a/gtk/res/downloads.glade b/gtk/res/downloads.glade
index ab12ad8c4..7b99a1a8d 100644
--- a/gtk/res/downloads.glade
+++ b/gtk/res/downloads.glade
@@ -1,7 +1,6 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
-<!--Generated with glade3 3.4.4 on Mon Jul 14 18:30:15 2008 -->
+<?xml version="1.0"?>
<glade-interface>
+ <requires-version lib="gtk+" version="2.12"/>
<widget class="GtkWindow" id="wndDownloads">
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="title" translatable="yes">NetSurf Downloads</property>
@@ -14,94 +13,136 @@
<widget class="GtkVBox" id="vbox1">
<property name="visible">True</property>
<child>
- <widget class="GtkTreeView" id="treeDownloads">
+ <widget class="GtkScrolledWindow" id="scrolledwindow1">
<property name="visible">True</property>
<property name="can_focus">True</property>
- <property name="headers_clickable">True</property>
+ <property name="hscrollbar_policy">GTK_POLICY_NEVER</property>
+ <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+ <child>
+ <widget class="GtkTreeView" id="treeDownloads">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="search_column">2</property>
+ <property name="show_expanders">False</property>
+ <property name="rubber_banding">True</property>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkHSeparator" id="hseparator1">
+ <property name="visible">True</property>
</widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">1</property>
+ </packing>
</child>
<child>
<widget class="GtkHBox" id="hbox1">
<property name="visible">True</property>
- <property name="border_width">2</property>
<child>
- <widget class="GtkProgressBar" id="progressBar">
+ <widget class="GtkAlignment" id="alignment1">
<property name="visible">True</property>
- <property name="fraction">0.20999999344348907</property>
- <property name="text" translatable="yes">21% of 3 files</property>
+ <property name="top_padding">2</property>
+ <property name="bottom_padding">2</property>
+ <property name="left_padding">2</property>
+ <property name="right_padding">2</property>
+ <child>
+ <widget class="GtkProgressBar" id="progressBar">
+ <property name="visible">True</property>
+ <property name="show_text">True</property>
+ <property name="text" translatable="yes">0% of 0 files</property>
+ </widget>
+ </child>
</widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
</child>
<child>
- <widget class="GtkToolbar" id="toolbar2">
+ <widget class="GtkHButtonBox" id="hbuttonbox1">
<property name="visible">True</property>
- <property name="toolbar_style">GTK_TOOLBAR_BOTH_HORIZ</property>
- <property name="show_arrow">False</property>
- <property name="icon_size">GTK_ICON_SIZE_MENU</property>
- <property name="icon_size_set">True</property>
+ <property name="homogeneous">True</property>
+ <property name="layout_style">GTK_BUTTONBOX_END</property>
<child>
- <widget class="GtkToolButton" id="buttonPause">
+ <widget class="GtkButton" id="buttonPause">
<property name="visible">True</property>
<property name="sensitive">False</property>
- <property name="is_important">True</property>
- <property name="label"> Pause</property>
- <property name="use_underline">True</property>
- <property name="stock_id">gtk-media-pause</property>
- <signal name="clicked" handler="button_clear_clicked" object="NULL"/>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="label" translatable="yes">gtk-media-pause</property>
+ <property name="relief">GTK_RELIEF_NONE</property>
+ <property name="use_stock">True</property>
+ <property name="response_id">0</property>
</widget>
- <packing>
- <property name="expand">False</property>
- </packing>
</child>
<child>
- <widget class="GtkToolButton" id="buttonResume">
+ <widget class="GtkButton" id="buttonPlay">
<property name="visible">True</property>
<property name="sensitive">False</property>
- <property name="is_important">True</property>
- <property name="label"> Resume</property>
- <property name="use_underline">True</property>
- <property name="stock_id">gtk-media-play</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="relief">GTK_RELIEF_NONE</property>
+ <property name="response_id">0</property>
+ <child>
+ <widget class="GtkHBox" id="hbox2">
+ <property name="visible">True</property>
+ <child>
+ <widget class="GtkImage" id="image1">
+ <property name="visible">True</property>
+ <property name="stock">gtk-media-play</property>
+ <property name="icon_size">2</property>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Resume</property>
+ </widget>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
</widget>
<packing>
- <property name="expand">False</property>
+ <property name="position">1</property>
</packing>
</child>
<child>
- <widget class="GtkToolButton" id="buttonCancel">
+ <widget class="GtkButton" id="buttonCancel">
<property name="visible">True</property>
<property name="sensitive">False</property>
- <property name="is_important">True</property>
- <property name="label"> Cancel</property>
- <property name="use_underline">True</property>
- <property name="stock_id">gtk-cancel</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="label" translatable="yes">gtk-cancel</property>
+ <property name="relief">GTK_RELIEF_NONE</property>
+ <property name="use_stock">True</property>
+ <property name="response_id">0</property>
</widget>
<packing>
- <property name="expand">False</property>
+ <property name="position">2</property>
</packing>
</child>
<child>
- <widget class="GtkToolButton" id="buttonClear">
+ <widget class="GtkButton" id="buttonClear">
<property name="visible">True</property>
<property name="sensitive">False</property>
- <property name="tooltip" translatable="yes">Remove completed or cancelled downloads from the list</property>
- <property name="visible_vertical">False</property>
- <property name="is_important">True</property>
- <property name="label"> Clear</property>
- <property name="use_underline">True</property>
- <property name="stock_id">gtk-clear</property>
- <signal name="clicked" handler="button_clear_clicked"/>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="label" translatable="yes">gtk-clear</property>
+ <property name="relief">GTK_RELIEF_NONE</property>
+ <property name="use_stock">True</property>
+ <property name="response_id">0</property>
</widget>
<packing>
- <property name="expand">False</property>
+ <property name="position">3</property>
</packing>
</child>
</widget>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
+ <property name="pack_type">GTK_PACK_END</property>
<property name="position">1</property>
</packing>
</child>
@@ -109,7 +150,7 @@
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
- <property name="position">1</property>
+ <property name="position">2</property>
</packing>
</child>
</widget>
diff --git a/gtk/res/netsurf.glade b/gtk/res/netsurf.glade
index 9f9e036f4..f250be753 100644
--- a/gtk/res/netsurf.glade
+++ b/gtk/res/netsurf.glade
@@ -1,7 +1,6 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
-<!--*- mode: xml -*-->
+<?xml version="1.0"?>
<glade-interface>
+ <requires-version lib="gtk+" version="2.12"/>
<widget class="GtkWindow" id="wndBrowser">
<property name="title" translatable="yes">NetSurf</property>
<property name="window_position">GTK_WIN_POS_CENTER</property>
@@ -24,7 +23,6 @@
<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="image554">
<property name="visible">True</property>
@@ -32,6 +30,7 @@
<property name="icon_size">1</property>
</widget>
</child>
+ <accelerator key="N" signal="activate" modifiers="GDK_CONTROL_MASK"/>
</widget>
</child>
<child>
@@ -40,7 +39,6 @@
<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="image555">
<property name="visible">True</property>
@@ -48,6 +46,7 @@
<property name="icon_size">1</property>
</widget>
</child>
+ <accelerator key="F" signal="activate" modifiers="GDK_CONTROL_MASK"/>
</widget>
</child>
<child>
@@ -56,7 +55,6 @@
<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_SHIFT_MASK | GDK_CONTROL_MASK" signal="activate"/>
<child internal-child="image">
<widget class="GtkImage" id="image556">
<property name="visible">True</property>
@@ -64,6 +62,7 @@
<property name="icon_size">1</property>
</widget>
</child>
+ <accelerator key="W" signal="activate" modifiers="GDK_SHIFT_MASK | GDK_CONTROL_MASK"/>
</widget>
</child>
<child>
@@ -78,7 +77,6 @@
<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="image557">
<property name="visible">True</property>
@@ -86,6 +84,7 @@
<property name="icon_size">1</property>
</widget>
</child>
+ <accelerator key="S" signal="activate" modifiers="GDK_CONTROL_MASK"/>
</widget>
</child>
<child>
@@ -166,7 +165,6 @@
<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="image559">
<property name="visible">True</property>
@@ -174,6 +172,7 @@
<property name="icon_size">1</property>
</widget>
</child>
+ <accelerator key="P" signal="activate" modifiers="GDK_CONTROL_MASK"/>
</widget>
</child>
<child>
@@ -245,7 +244,7 @@
<property name="label">gtk-select-all</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
- <accelerator key="a" modifiers="GDK_CONTROL_MASK" signal="activate"/>
+ <accelerator key="a" signal="activate" modifiers="GDK_CONTROL_MASK"/>
</widget>
</child>
<child>
@@ -260,7 +259,7 @@
<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"/>
+ <accelerator key="F" signal="activate" modifiers="GDK_CONTROL_MASK"/>
</widget>
</child>
<child>
@@ -299,7 +298,6 @@
<property name="visible">True</property>
<property name="label" translatable="yes">_Stop</property>
<property name="use_underline">True</property>
- <accelerator key="Escape" modifiers="" signal="activate"/>
<child internal-child="image">
<widget class="GtkImage" id="image561">
<property name="visible">True</property>
@@ -307,6 +305,7 @@
<property name="icon_size">1</property>
</widget>
</child>
+ <accelerator key="Escape" signal="activate"/>
</widget>
</child>
<child>
@@ -314,7 +313,6 @@
<property name="visible">True</property>
<property name="label" translatable="yes">_Reload</property>
<property name="use_underline">True</property>
- <accelerator key="F5" modifiers="" signal="activate"/>
<child internal-child="image">
<widget class="GtkImage" id="image562">
<property name="visible">True</property>
@@ -322,6 +320,7 @@
<property name="icon_size">1</property>
</widget>
</child>
+ <accelerator key="F5" signal="activate"/>
</widget>
</child>
<child>
@@ -335,7 +334,6 @@
<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="" signal="activate"/>
<child>
<widget class="GtkMenu" id="scale_view_menu">
<child>
@@ -343,9 +341,6 @@
<property name="visible">True</property>
<property name="label" translatable="yes">Zoom _in</property>
<property name="use_underline">True</property>
- <accelerator key="equal" modifiers="GDK_CONTROL_MASK" signal="activate"/>
- <accelerator key="KP_Add" modifiers="GDK_CONTROL_MASK" signal="activate"/>
- <accelerator key="plus" modifiers="GDK_CONTROL_MASK" signal="activate"/>
<child internal-child="image">
<widget class="GtkImage" id="image564">
<property name="visible">True</property>
@@ -353,6 +348,9 @@
<property name="icon_size">1</property>
</widget>
</child>
+ <accelerator key="equal" signal="activate" modifiers="GDK_CONTROL_MASK"/>
+ <accelerator key="KP_Add" signal="activate" modifiers="GDK_CONTROL_MASK"/>
+ <accelerator key="plus" signal="activate" modifiers="GDK_CONTROL_MASK"/>
</widget>
</child>
<child>
@@ -360,8 +358,6 @@
<property name="visible">True</property>
<property name="label" translatable="yes">_Normal size</property>
<property name="use_underline">True</property>
- <accelerator key="KP_0" modifiers="GDK_CONTROL_MASK" signal="activate"/>
- <accelerator key="0" modifiers="GDK_CONTROL_MASK" signal="activate"/>
<child internal-child="image">
<widget class="GtkImage" id="image565">
<property name="visible">True</property>
@@ -369,6 +365,8 @@
<property name="icon_size">1</property>
</widget>
</child>
+ <accelerator key="KP_0" signal="activate" modifiers="GDK_CONTROL_MASK"/>
+ <accelerator key="0" signal="activate" modifiers="GDK_CONTROL_MASK"/>
</widget>
</child>
<child>
@@ -376,8 +374,6 @@
<property name="visible">True</property>
<property name="label" translatable="yes">Zoom _out</property>
<property name="use_underline">True</property>
- <accelerator key="KP_Subtract" modifiers="GDK_CONTROL_MASK" signal="activate"/>
- <accelerator key="minus" modifiers="GDK_CONTROL_MASK" signal="activate"/>
<child internal-child="image">
<widget class="GtkImage" id="image566">
<property name="visible">True</property>
@@ -385,6 +381,8 @@
<property name="icon_size">1</property>
</widget>
</child>
+ <accelerator key="KP_Subtract" signal="activate" modifiers="GDK_CONTROL_MASK"/>
+ <accelerator key="minus" signal="activate" modifiers="GDK_CONTROL_MASK"/>
</widget>
</child>
</widget>
@@ -396,6 +394,7 @@
<property name="icon_size">1</property>
</widget>
</child>
+ <accelerator key="F11" signal="activate"/>
</widget>
</child>
<child>
@@ -403,7 +402,6 @@
<property name="visible">True</property>
<property name="label" translatable="yes">_Fullscreen</property>
<property name="use_underline">True</property>
- <accelerator key="F11" modifiers="GDK_CONTROL_MASK" signal="activate"/>
<child internal-child="image">
<widget class="GtkImage" id="image567">
<property name="visible">True</property>
@@ -411,6 +409,7 @@
<property name="icon_size">1</property>
</widget>
</child>
+ <accelerator key="F11" signal="activate" modifiers="GDK_CONTROL_MASK"/>
</widget>
</child>
<child>
@@ -550,7 +549,6 @@
<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="image568">
<property name="visible">True</property>
@@ -558,6 +556,7 @@
<property name="icon_size">1</property>
</widget>
</child>
+ <accelerator key="Left" signal="activate" modifiers="GDK_MOD1_MASK"/>
</widget>
</child>
<child>
@@ -565,7 +564,6 @@
<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="image569">
<property name="visible">True</property>
@@ -573,6 +571,7 @@
<property name="icon_size">1</property>
</widget>
</child>
+ <accelerator key="Right" signal="activate" modifiers="GDK_MOD1_MASK"/>
</widget>
</child>
<child>
@@ -580,7 +579,6 @@
<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="image570">
<property name="visible">True</property>
@@ -588,6 +586,7 @@
<property name="icon_size">1</property>
</widget>
</child>
+ <accelerator key="Home" signal="activate" modifiers="GDK_MOD1_MASK"/>
</widget>
</child>
<child>
@@ -601,7 +600,7 @@
<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="" signal="activate"/>
+ <accelerator key="F7" signal="activate"/>
</widget>
</child>
<child>
@@ -610,7 +609,7 @@
<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"/>
+ <accelerator key="F7" signal="activate" modifiers="GDK_CONTROL_MASK"/>
</widget>
</child>
<child>
@@ -634,7 +633,7 @@
<property name="tooltip" translatable="yes">Open a window showing all your bookmarks.</property>
<property name="label" translatable="yes">_Show Bookmarks...</property>
<property name="use_underline">True</property>
- <accelerator key="F6" modifiers="" signal="activate"/>
+ <accelerator key="F6" signal="activate"/>
</widget>
</child>
<child>
@@ -648,7 +647,7 @@
<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"/>
+ <accelerator key="L" signal="activate" modifiers="GDK_CONTROL_MASK"/>
</widget>
</child>
</widget>
@@ -669,7 +668,6 @@
<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="" signal="activate"/>
<child internal-child="image">
<widget class="GtkImage" id="image571">
<property name="visible">True</property>
@@ -677,6 +675,7 @@
<property name="icon_size">1</property>
</widget>
</child>
+ <accelerator key="F1" signal="activate"/>
</widget>
</child>
<child>
@@ -839,7 +838,6 @@
<property name="label" translatable="yes">Status bar text goes here</property>
<property name="selectable">True</property>
<property name="ellipsize">PANGO_ELLIPSIZE_MIDDLE</property>
- <property name="width_chars">50</property>
</widget>
<packing>
<property name="resize">False</property>
@@ -1536,157 +1534,6 @@
</widget>
</child>
</widget>
- <widget class="GtkWindow" id="wndDownloads">
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="title" translatable="yes">NetSurf Downloads</property>
- <property name="window_position">GTK_WIN_POS_CENTER</property>
- <property name="default_width">500</property>
- <property name="default_height">400</property>
- <property name="type_hint">GDK_WINDOW_TYPE_HINT_UTILITY</property>
- <signal name="delete_event" handler="gtk_widget_hide"/>
- <child>
- <widget class="GtkVBox" id="vbox1">
- <property name="visible">True</property>
- <child>
- <widget class="GtkToolbar" id="toolbar1">
- <property name="visible">True</property>
- <property name="toolbar_style">GTK_TOOLBAR_BOTH</property>
- <child>
- <widget class="GtkToolButton" id="downloadPause">
- <property name="visible">True</property>
- <property name="label">Pause</property>
- <property name="use_underline">True</property>
- <property name="stock_id">gtk-media-pause</property>
- <signal name="clicked" handler="nsgtk_downloadPause_clicked"/>
- </widget>
- <packing>
- <property name="expand">False</property>
- </packing>
- </child>
- <child>
- <widget class="GtkToolButton" id="downloadResume">
- <property name="visible">True</property>
- <property name="label">Resume</property>
- <property name="use_underline">True</property>
- <property name="stock_id">gtk-media-play</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- </packing>
- </child>
- <child>
- <widget class="GtkToolButton" id="downloadCancel">
- <property name="visible">True</property>
- <property name="label">Cancel</property>
- <property name="use_underline">True</property>
- <property name="stock_id">gtk-cancel</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- </packing>
- </child>
- <child>
- <widget class="GtkToolButton" id="downloadCleanup">
- <property name="visible">True</property>
- <property name="tooltip" translatable="yes">Remove completed or cancelled downloads from the list</property>
- <property name="visible_vertical">False</property>
- <property name="is_important">True</property>
- <property name="label">Clean up</property>
- <property name="use_underline">True</property>
- <property name="stock_id">gtk-clear</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- </packing>
- </child>
- <child>
- <widget class="GtkSeparatorToolItem" id="toolbutton2">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="draw">False</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="homogeneous">False</property>
- </packing>
- </child>
- <child>
- <widget class="GtkToolItem" id="toolProgress">
- <property name="visible">True</property>
- <property name="is_important">True</property>
- <child>
- <widget class="GtkHBox" id="hbox2">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <child>
- <widget class="GtkVBox" id="vbox2">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <child>
- <widget class="GtkProgressBar" id="progressbar1">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="fraction">0.10000000149011612</property>
- <property name="text" translatable="yes">10% of 5 files</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_END</property>
- </widget>
- <packing>
- <property name="fill">False</property>
- </packing>
- </child>
- <child>
- <widget class="GtkLabel" id="label2">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="label" translatable="yes">230kB/sec, 12 minutes remaining</property>
- </widget>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="homogeneous">False</property>
- </packing>
- </child>
- <child>
- <widget class="GtkSeparatorToolItem" id="toolbutton1">
- <property name="visible">True</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="draw">False</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="homogeneous">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- <child>
- <widget class="GtkTreeView" id="treeDownloads">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="events">GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_MOTION_MASK | GDK_BUTTON1_MOTION_MASK | GDK_BUTTON2_MOTION_MASK | GDK_BUTTON3_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_FOCUS_CHANGE_MASK | GDK_STRUCTURE_MASK | GDK_PROPERTY_CHANGE_MASK | GDK_VISIBILITY_NOTIFY_MASK | GDK_PROXIMITY_IN_MASK | GDK_PROXIMITY_OUT_MASK | GDK_SUBSTRUCTURE_MASK | GDK_SCROLL_MASK</property>
- <property name="reorderable">True</property>
- <property name="rules_hint">True</property>
- <property name="rubber_banding">True</property>
- </widget>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
<widget class="GtkMenu" id="menuPopup">
<child>
<widget class="GtkImageMenuItem" id="popupBack">