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 *);
gint tab_width_chars;
} cfg;
+struct DownloadItem
+{
+ GtkToolButton *tb;
+ WebKitDownload *download;
+};
+
gint clients = 0, downloads = 0;
int cooperative_pipe_fp = 0;
gchar *search_text;
t = t == NULL ? u : t;
t = t[0] == 0 ? u : t;
- gtk_label_set_text(GTK_LABEL(c->tablabel), t);
+ gchar *name = malloc(strlen(t) + 4);
+ gchar *muted = (webkit_web_view_get_is_muted(WEBKIT_WEB_VIEW(c->web_view)))
+ ? "[m] " : "";
+ sprintf(name, "%s%s", muted, t);
+
+ gtk_label_set_text(GTK_LABEL(c->tablabel), name);
+ g_free(name);
gtk_widget_set_tooltip_text(c->tablabel, t);
mainwindow_title(gtk_notebook_get_current_page(GTK_NOTEBOOK(mw.notebook)));
}
}
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));
+}
+
+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));
+}
- gtk_widget_destroy(GTK_WIDGET(tb));
+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
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);
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;
+ } else if (def_key("tab_mute", GDK_KEY_m) == key) {
+ gboolean muted =
+ webkit_web_view_get_is_muted(WEBKIT_WEB_VIEW(c->web_view));
+ webkit_web_view_set_is_muted(WEBKIT_WEB_VIEW(c->web_view), !muted);
+ changed_title(G_OBJECT(c->web_view), NULL, c);
+ return TRUE;
} else if (def_key("tab_new", GDK_KEY_w) == key) {
f = ensure_uri_scheme(cfg.home_uri);
client_new(f, NULL, TRUE, 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);