+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) {
+ switch (((GdkEventKey *)event)->keyval) {
+ case GDK_KEY_q: // close window
+ client_destroy(NULL, c);
+ return TRUE;
+ case GDK_KEY_w: // new tab
+ f = ensure_uri_scheme(home_uri);
+ client_new(f, NULL, TRUE, TRUE);
+ g_free(f);
+ return TRUE;
+ case GDK_KEY_e: // reload
+ webkit_web_view_reload_bypass_cache(WEBKIT_WEB_VIEW(c->web_view));
+ return TRUE;
+ case GDK_KEY_y: // download manager
+ gtk_widget_show_all(dm.win);
+ return TRUE;
+ case GDK_KEY_d: // initiate web search
+ 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;
+ case GDK_KEY_s: // i-search forwards
+ search_init(c, 1);
+ return TRUE;
+ case GDK_KEY_r: // i-search backwards
+ search_init(c, -1);
+ return TRUE;
+ case GDK_KEY_t: // location
+ gtk_widget_grab_focus(c->location);
+ gtk_entry_set_text(GTK_ENTRY(c->location),
+ webkit_web_view_get_uri(WEBKIT_WEB_VIEW(c->web_view)));
+ return TRUE;
+ case GDK_KEY_u: // previous tab
+ gtk_notebook_prev_page(GTK_NOTEBOOK(mw.notebook));
+ return TRUE;
+ case GDK_KEY_i: // next tab
+ gtk_notebook_next_page(GTK_NOTEBOOK(mw.notebook));
+ return TRUE;
+ case GDK_KEY_h: // back in history
+ webkit_web_view_go_back(WEBKIT_WEB_VIEW(c->web_view));
+ return TRUE;
+ case GDK_KEY_l: // forward in history
+ webkit_web_view_go_forward(WEBKIT_WEB_VIEW(c->web_view));
+ return TRUE;
+ case GDK_KEY_j: // scroll down
+ for (int i = 0; i < 2; i++) {
+ event->key.keyval = GDK_KEY_Down;
+ gdk_event_put(event);
+ }
+ return TRUE;
+ case GDK_KEY_k: // scroll up
+ for (int i = 0; i < 2; i++) {
+ event->key.keyval = GDK_KEY_Up;
+ gdk_event_put(event);
+ }
+ return TRUE;
+ case GDK_KEY_f: // page down
+ event->key.keyval = GDK_KEY_Page_Down;
+ gdk_event_put(event);
+ return TRUE;
+ case GDK_KEY_b: // page up
+ event->key.keyval = GDK_KEY_Page_Up;
+ gdk_event_put(event);
+ return TRUE;
+ case GDK_KEY_o: // toggle JS
+ WebKitSettings *settings = webkit_web_view_get_settings(WEBKIT_WEB_VIEW(c->web_view));
+ gboolean current = webkit_settings_get_enable_javascript(settings);
+ webkit_settings_set_enable_javascript(settings,
+ (current) ? FALSE : TRUE);
+ webkit_web_view_set_settings(WEBKIT_WEB_VIEW(c->web_view), settings);
+ return TRUE;
+ case GDK_KEY_g: // go to bottom
+ 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;
+ case GDK_KEY_equal: // zoom in
+ 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;
+ case GDK_KEY_minus: // zoom out
+ 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;
+ case GDK_KEY_0: // reset zoom
+ webkit_web_view_set_zoom_level(WEBKIT_WEB_VIEW(c->web_view), 1);
+ return TRUE;
+ }