+ webkit_web_context_set_favicon_database_directory(wc, NULL);
+ webkit_cookie_manager_set_persistent_storage(cm,
+ g_build_filename("/",
+ g_get_user_cache_dir(),
+ __NAME__,
+ "cookies.db",
+ NULL),
+ WEBKIT_COOKIE_PERSISTENT_STORAGE_SQLITE);
+}
+
+void
+search(gpointer data, gint direction)
+{
+ struct Client *c = (struct Client *)data;
+ WebKitWebView *web_view = WEBKIT_WEB_VIEW(c->web_view);
+ WebKitFindController *fc = webkit_web_view_get_find_controller(web_view);
+
+ if (search_text == NULL)
+ return;
+
+ switch (direction) {
+ case 0:
+ webkit_find_controller_search(fc, search_text,
+ WEBKIT_FIND_OPTIONS_CASE_INSENSITIVE |
+ WEBKIT_FIND_OPTIONS_WRAP_AROUND,
+ G_MAXUINT);
+ break;
+ case 1:
+ webkit_find_controller_search_next(fc);
+ break;
+ case -1:
+ webkit_find_controller_search_previous(fc);
+ break;
+ case 2:
+ webkit_find_controller_search_finish(fc);
+ break;
+ }
+}
+
+void
+search_init(struct Client *c, int direction)
+{
+ gtk_widget_grab_focus(c->location);
+ const gchar *contents = gtk_entry_get_text(GTK_ENTRY(c->location));
+ if (strcspn(contents, "s/")) {
+ gtk_entry_set_text(GTK_ENTRY(c->location), "s/");
+ }
+ gtk_editable_set_position(GTK_EDITABLE(c->location), -1);
+ search(c, 0);
+ search(c, -1);
+ search(c, direction);
+}
+
+int
+def_key(char *key, unsigned int def)
+{
+ char *conf = g_key_file_get_string(config, "keybindings", key, NULL);
+ return (conf) ? gdk_keyval_from_name((conf) ? conf : NULL) : def;
+}
+
+gboolean
+key_common(GtkWidget *widget, GdkEvent *event, gpointer data)
+{
+ struct Client *c = (struct Client *)data;
+ gdouble now;
+ gchar *f;
+
+ if (event->type == GDK_KEY_PRESS) {
+ if (((GdkEventKey *)event)->state & GDK_CONTROL_MASK) {
+ WebKitSettings *settings = webkit_web_view_get_settings(WEBKIT_WEB_VIEW(c->web_view));
+ gboolean js = webkit_settings_get_enable_javascript(settings);
+ int key = ((GdkEventKey *)event)->keyval;
+ if (def_key("close_tab", GDK_KEY_q) == key) {
+ client_destroy(NULL, c);
+ return TRUE;
+ } else if (def_key("new_tab", GDK_KEY_w) == key) {
+ f = ensure_uri_scheme(home_uri);
+ client_new(f, NULL, TRUE, TRUE);
+ g_free(f);
+ return TRUE;
+ } else if (def_key("reload", GDK_KEY_e) == key) {
+ webkit_web_view_reload_bypass_cache(WEBKIT_WEB_VIEW(c->web_view));
+ return TRUE;
+ } else if (def_key("download_manager", GDK_KEY_y) == key) {
+ gtk_widget_show_all(dm.win);
+ return TRUE;
+ } else if (def_key("web_search", GDK_KEY_d) == key) {
+ gtk_widget_grab_focus(c->location);
+ gtk_entry_set_text(GTK_ENTRY(c->location), "w/");
+ gtk_editable_set_position(GTK_EDITABLE(c->location), -1);
+ return TRUE;
+ } else if (def_key("search_forwards", GDK_KEY_s) == key) {
+ search_init(c, 1);
+ return TRUE;
+ } else if (def_key("search_backwards", GDK_KEY_r) == key) {
+ search_init(c, -1);
+ return TRUE;
+ } else if (def_key("location", GDK_KEY_t) == key) {
+ gtk_widget_grab_focus(c->location);
+ const char *uri = webkit_web_view_get_uri(WEBKIT_WEB_VIEW(c->web_view));
+ const char *goal = (uri) ? uri : "https://";
+ gtk_entry_set_text(GTK_ENTRY(c->location), goal);
+ gtk_editable_set_position(GTK_EDITABLE(c->location), -1);
+ return TRUE;
+ } else if (def_key("previous_tab", GDK_KEY_u) == key) {
+ gtk_notebook_prev_page(GTK_NOTEBOOK(mw.notebook));
+ return TRUE;
+ } else if (def_key("next_tab", GDK_KEY_i) == key) {
+ gtk_notebook_next_page(GTK_NOTEBOOK(mw.notebook));
+ return TRUE;
+ } else if (def_key("history_back", GDK_KEY_h) == key) {
+ webkit_web_view_go_back(WEBKIT_WEB_VIEW(c->web_view));
+ return TRUE;
+ } else if (def_key("history_forwards", GDK_KEY_l) == key) {
+ webkit_web_view_go_forward(WEBKIT_WEB_VIEW(c->web_view));
+ return TRUE;
+ } else if (def_key("scroll_down", GDK_KEY_j) == key) {
+ for (int i = 0; i < 2; i++) {
+ event->key.keyval = GDK_KEY_Down;
+ gdk_event_put(event);
+ }
+ return TRUE;
+ } else if (def_key("scroll_up", GDK_KEY_k) == key) {
+ event->key.keyval = GDK_KEY_Up;
+ gdk_event_put(event);
+ return TRUE;
+ } else if (def_key("scroll_page_down", GDK_KEY_f) == key) {
+ event->key.keyval = GDK_KEY_Page_Down;
+ gdk_event_put(event);
+ return TRUE;
+ } else if (def_key("scroll_page_up", GDK_KEY_b) == key) {
+ event->key.keyval = GDK_KEY_Page_Up;
+ gdk_event_put(event);
+ return TRUE;
+ } else if (def_key("toggle_js", GDK_KEY_o) == key) {
+ webkit_settings_set_enable_javascript(settings, (js) ? FALSE : TRUE);
+ webkit_web_view_set_settings(WEBKIT_WEB_VIEW(c->web_view), settings);
+ return TRUE;
+ } else if (def_key("quit", GDK_KEY_g) == key) {
+ search(c, 2);
+ gtk_widget_grab_focus(c->web_view);
+ gtk_entry_set_text(GTK_ENTRY(c->location),
+ webkit_web_view_get_uri(WEBKIT_WEB_VIEW(c->web_view)));
+ webkit_web_view_run_javascript(WEBKIT_WEB_VIEW(c->web_view),
+ "window.getSelection().removeAllRanges();"
+ "document.activeElement.blur();",
+ NULL, NULL, c);
+ return TRUE;
+ } else if (def_key("zoom_in", GDK_KEY_equal) == key) {
+ now = webkit_web_view_get_zoom_level(WEBKIT_WEB_VIEW(c->web_view));
+ webkit_web_view_set_zoom_level(WEBKIT_WEB_VIEW(c->web_view), now + 0.1);
+ return TRUE;
+ } else if (def_key("zoom_out", GDK_KEY_minus) == key) {
+ now = webkit_web_view_get_zoom_level(WEBKIT_WEB_VIEW(c->web_view));
+ webkit_web_view_set_zoom_level(WEBKIT_WEB_VIEW(c->web_view), now - 0.1);
+ return TRUE;
+ } else if (def_key("zoom_reset", GDK_KEY_0) == key) {
+ webkit_web_view_set_zoom_level(WEBKIT_WEB_VIEW(c->web_view),
+ global_zoom);
+ return TRUE;
+ }