gboolean decide_policy(WebKitWebView *, WebKitPolicyDecision *,
WebKitPolicyDecisionType, gpointer);
gboolean download_handle(WebKitDownload *, gchar *, gpointer);
-void download_handle_start(WebKitWebView *, WebKitDownload *, gpointer);
-void downloadmanager_cancel(GtkToolButton *, gpointer);
+void download_click(GtkToolButton *, gpointer);
+void download_start(WebKitWebView *, WebKitDownload *, gpointer);
+void download_cancel(GtkMenuItem *, gpointer);
gboolean downloadmanager_delete(GtkWidget *, gpointer);
void downloadmanager_setup(void);
gchar *ensure_uri_scheme(const gchar *);
gboolean cooperative_instances;
gboolean enable_console_to_stdout;
gboolean javascript_disabled;
+ gboolean spellcheck_disabled;
gchar *download_dir;
gchar *fifo_suffix;
gchar *history_file;
gchar *home_uri;
gchar *search_engine;
+ gchar *spellcheck_language;
gchar *user_agent;
gdouble global_zoom;
gint tab_width_chars;
} cfg;
+struct DownloadItem
+{
+ GtkToolButton *tb;
+ WebKitDownload *download;
+};
+
gint clients = 0, downloads = 0;
int cooperative_pipe_fp = 0;
gchar *search_text;
}
void
-download_handle_finished(WebKitDownload *download, gpointer data)
+download_finished(WebKitDownload *download, gpointer data)
{
+ if (strcmp(gtk_tool_button_get_icon_name(GTK_TOOL_BUTTON(data)),
+ "dialog-error") != 0)
+ gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(data), "emblem-downloads");
downloads--;
}
void
-download_handle_start(WebKitWebView *web_view, WebKitDownload *download,
- gpointer data)
+download_start(WebKitWebView *web_view, WebKitDownload *download,
+ gpointer data)
{
g_signal_connect(G_OBJECT(download), "decide-destination",
G_CALLBACK(download_handle), data);
}
gboolean
-download_handle(WebKitDownload *download, gchar *suggested_filename, gpointer data)
+download_handle(WebKitDownload *download, gchar *suggested_filename,
+ gpointer data)
{
gchar *sug_clean, *path, *path2 = NULL, *uri;
GtkToolItem *tb;
g_free(uri);
tb = gtk_tool_button_new(NULL, NULL);
- gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(tb), "gtk-delete");
+ gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(tb), "network-receive");
gtk_tool_button_set_label(GTK_TOOL_BUTTON(tb), sug_clean);
gtk_toolbar_insert(GTK_TOOLBAR(dm.toolbar), tb, 0);
gtk_widget_show_all(dm.win);
downloads++;
g_signal_connect(G_OBJECT(download), "finished",
- G_CALLBACK(download_handle_finished), NULL);
+ G_CALLBACK(download_finished), tb);
g_object_ref(download);
- g_signal_connect(G_OBJECT(tb), "clicked",
- G_CALLBACK(downloadmanager_cancel), download);
+
+ struct DownloadItem *payload = malloc(sizeof(*payload));
+ payload->tb = (GtkToolButton *)tb;
+ payload->download = download;
+ g_signal_connect(G_OBJECT(tb), "clicked", G_CALLBACK(download_click),
+ payload);
+ g_signal_connect(G_OBJECT(tb), "failed", G_CALLBACK(download_cancel),
+ payload);
+ g_signal_connect(G_OBJECT(tb), "destroy_event", G_CALLBACK(g_free),
+ payload);
}
g_free(sug_clean);
}
void
-downloadmanager_cancel(GtkToolButton *tb, gpointer data)
+download_cancel(GtkMenuItem *tb, gpointer data)
{
- WebKitDownload *download = WEBKIT_DOWNLOAD(data);
+ struct DownloadItem *payload = data;
+ gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(payload->tb), "dialog-error");
+ webkit_download_cancel(payload->download);
+}
- webkit_download_cancel(download);
- g_object_unref(download);
+void
+download_remove(GtkMenuItem *tb, gpointer data)
+{
+ struct DownloadItem *payload = data;
+ g_object_unref(payload->download);
+ gtk_widget_destroy(GTK_WIDGET(payload->tb));
+}
- gtk_widget_destroy(GTK_WIDGET(tb));
+void
+download_copy_url(GtkMenuItem *tb, gpointer data)
+{
+ struct DownloadItem *payload = data;
+ WebKitURIRequest *req = webkit_download_get_request(payload->download);
+ const gchar *uri = webkit_uri_request_get_uri(req);
+ gtk_clipboard_set_text(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD), uri,
+ strlen(uri));
+}
+
+void
+download_copy_path(GtkMenuItem *tb, gpointer data)
+{
+ struct DownloadItem *payload = data;
+ const gchar *path = webkit_download_get_destination(payload->download);
+ gtk_clipboard_set_text(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD), path + 7,
+ strlen(path) - 7); // Offset by 7 to remove "file://"
+}
+
+void
+download_click(GtkToolButton *tb, gpointer data)
+{
+ GtkWidget *pmenu = gtk_menu_new();
+ GtkWidget *option;
+
+ if (strcmp(gtk_tool_button_get_icon_name(GTK_TOOL_BUTTON(tb)),
+ "network-receive") == 0) {
+ option = gtk_menu_item_new_with_label("Cancel download");
+ g_signal_connect(G_OBJECT(option), "activate",
+ G_CALLBACK(download_cancel), data);
+ } else {
+ option = gtk_menu_item_new_with_label("Remove download");
+ g_signal_connect(G_OBJECT(option), "activate",
+ G_CALLBACK(download_remove), data);
+ }
+ gtk_widget_show(option);
+ gtk_menu_shell_append(GTK_MENU_SHELL(pmenu), option);
+
+ option = gtk_menu_item_new_with_label("Copy download URL");
+ gtk_widget_show(option);
+ gtk_menu_shell_append(GTK_MENU_SHELL(pmenu), option);
+ g_signal_connect(G_OBJECT(option), "activate",
+ G_CALLBACK(download_copy_url), data);
+
+ option = gtk_menu_item_new_with_label("Copy local path");
+ gtk_widget_show(option);
+ gtk_menu_shell_append(GTK_MENU_SHELL(pmenu), option);
+ g_signal_connect(G_OBJECT(option), "activate",
+ G_CALLBACK(download_copy_path), data);
+
+ gtk_menu_popup_at_pointer(GTK_MENU(pmenu), NULL);
}
gboolean
cfg.tab_width_chars = (cfg.tab_width_chars) ? cfg.tab_width_chars : 20;
cfg.global_zoom = g_key_file_get_double(config, "ui", "zoom_level", NULL);
cfg.global_zoom = (cfg.global_zoom) ? cfg.global_zoom : 1.0;
- cfg.search_engine = g_key_file_get_string(config, "ui", "search_engine", NULL);
+ cfg.search_engine = g_key_file_get_string(config, "ui", "search_engine",
+ NULL);
cfg.search_engine = (cfg.search_engine) ? cfg.search_engine :
"https://duckduckgo.com?q=";
+ cfg.spellcheck_disabled = g_key_file_get_boolean(config, "ui",
+ "spellcheck_disabled", NULL);
+ cfg.spellcheck_language = g_key_file_get_string(config, "ui",
+ "spellcheck_language",
+ NULL);
+ cfg.spellcheck_language = (cfg.spellcheck_language) ? cfg.spellcheck_language
+ : "en_US";
}
void
webkit_web_context_set_process_model(wc,
WEBKIT_PROCESS_MODEL_MULTIPLE_SECONDARY_PROCESSES);
- p = g_build_filename(g_get_user_config_dir(), __NAME__, "web_extensions",
+ p = g_build_filename(g_get_user_data_dir(), __NAME__, "web_extensions",
NULL);
webkit_web_context_set_web_extensions_directory(wc, p);
g_free(p);
webkit_web_context_set_preferred_languages(wc, cfg.accepted_language);
g_signal_connect(G_OBJECT(wc), "download-started",
- G_CALLBACK(download_handle_start), NULL);
+ G_CALLBACK(download_start), NULL);
trust_user_certs(wc);
"cookies.db",
NULL),
WEBKIT_COOKIE_PERSISTENT_STORAGE_SQLITE);
+
+ const gchar * const languages[2] = {(const gchar *)cfg.spellcheck_language,
+ NULL};
+ webkit_web_context_set_spell_checking_languages(wc, languages);
+ webkit_web_context_set_spell_checking_enabled(wc, !cfg.spellcheck_disabled);
}
void
gtk_entry_set_text(GTK_ENTRY(c->location), goal);
gtk_editable_set_position(GTK_EDITABLE(c->location), -1);
return TRUE;
+ } else if (def_key("print", GDK_KEY_Print) == key) {
+ webkit_print_operation_run_dialog(webkit_print_operation_new(WEBKIT_WEB_VIEW(c->web_view)),
+ GTK_WINDOW(gtk_widget_get_toplevel(mw.win)));
+ return TRUE;
} else if (def_key("quit", GDK_KEY_g) == key) {
search(c, 2);
gtk_widget_grab_focus(c->web_view);
} else if (def_key("tab_close", GDK_KEY_q) == key) {
client_destroy(NULL, c);
return TRUE;
+ } else if (def_key("tab_switch_1", GDK_KEY_1) == key) {
+ gtk_notebook_set_current_page(GTK_NOTEBOOK(mw.notebook), 0);
+ return TRUE;
+ } else if (def_key("tab_switch_2", GDK_KEY_2) == key) {
+ gtk_notebook_set_current_page(GTK_NOTEBOOK(mw.notebook), 1);
+ return TRUE;
+ } else if (def_key("tab_switch_3", GDK_KEY_3) == key) {
+ gtk_notebook_set_current_page(GTK_NOTEBOOK(mw.notebook), 2);
+ return TRUE;
+ } else if (def_key("tab_switch_4", GDK_KEY_4) == key) {
+ gtk_notebook_set_current_page(GTK_NOTEBOOK(mw.notebook), 3);
+ return TRUE;
+ } else if (def_key("tab_switch_5", GDK_KEY_5) == key) {
+ gtk_notebook_set_current_page(GTK_NOTEBOOK(mw.notebook), 4);
+ return TRUE;
+ } else if (def_key("tab_switch_6", GDK_KEY_6) == key) {
+ gtk_notebook_set_current_page(GTK_NOTEBOOK(mw.notebook), 5);
+ return TRUE;
+ } else if (def_key("tab_switch_7", GDK_KEY_7) == key) {
+ gtk_notebook_set_current_page(GTK_NOTEBOOK(mw.notebook), 6);
+ return TRUE;
+ } else if (def_key("tab_switch_8", GDK_KEY_8) == key) {
+ gtk_notebook_set_current_page(GTK_NOTEBOOK(mw.notebook), 7);
+ return TRUE;
+ } else if (def_key("tab_switch_9", GDK_KEY_9) == key) {
+ gtk_notebook_set_current_page(GTK_NOTEBOOK(mw.notebook), 8);
+ return TRUE;
} else if (def_key("tab_previous", GDK_KEY_u) == key) {
gtk_notebook_prev_page(GTK_NOTEBOOK(mw.notebook));
return TRUE;
const gchar *entry = NULL;
GDir *scriptdir = NULL;
- base = g_build_filename(g_get_user_config_dir(), __NAME__, "user-scripts",
+ base = g_build_filename(g_get_user_data_dir(), __NAME__, "user-scripts",
NULL);
scriptdir = g_dir_open(base, 0, NULL);
if (scriptdir != NULL) {
const gchar *basedir, *file, *absfile;
GDir *dir;
- basedir = g_build_filename(g_get_user_config_dir(), __NAME__, "certs", NULL);
+ basedir = g_build_filename(g_get_user_data_dir(), __NAME__, "certs", NULL);
dir = g_dir_open(basedir, 0, NULL);
if (dir != NULL) {
file = g_dir_read_name(dir);
while (file != NULL) {
- absfile = g_build_filename(g_get_user_config_dir(), __NAME__, "certs",
+ absfile = g_build_filename(g_get_user_data_dir(), __NAME__, "certs",
file, NULL);
cert = g_tls_certificate_new_from_file(absfile, NULL);