1 #include <webkit2/webkit2.h>
7 key_common(GtkWidget *widget, GdkEvent *event, gpointer data)
9 struct Client *c = (struct Client *)data;
11 if (event->type == GDK_KEY_PRESS) {
12 guint mask = gtk_accelerator_get_default_mod_mask();
13 int key = ((GdkEventKey *)event)->keyval;
14 if ((((GdkEventKey *)event)->state & mask) ==
16 const char *uri = webkit_web_view_get_uri(
17 WEBKIT_WEB_VIEW(c->web_view));
18 if (GDK_KEY_y == key) {
19 downloadmanager_show();
21 } else if (GDK_KEY_h == key) {
22 webkit_web_view_go_back(
23 WEBKIT_WEB_VIEW(c->web_view));
25 } else if (GDK_KEY_l == key) {
26 webkit_web_view_go_forward(
27 WEBKIT_WEB_VIEW(c->web_view));
29 } else if (GDK_KEY_s == key) {
30 gtk_widget_grab_focus(c->location);
32 } else if (GDK_KEY_p == key) {
33 WebKitPrintOperation *operation =
34 webkit_print_operation_new(
35 WEBKIT_WEB_VIEW(c->web_view));
37 gtk_widget_get_toplevel(mw.win);
38 webkit_print_operation_run_dialog(
39 operation, GTK_WINDOW(toplevel));
41 } else if (GDK_KEY_g == key) {
43 gtk_widget_grab_focus(c->web_view);
46 GTK_ENTRY(c->location), uri);
47 webkit_web_view_run_javascript(
48 WEBKIT_WEB_VIEW(c->web_view),
49 "window.getSelection().removeAllRanges();"
50 "document.activeElement.blur();",
52 gtk_widget_hide(c->isearch_box);
53 gtk_editable_set_position(
54 GTK_EDITABLE(c->location), -1);
55 gtk_editable_set_position(
56 GTK_EDITABLE(c->wsearch), -1);
58 } else if (GDK_KEY_r == key) {
59 webkit_web_view_reload_bypass_cache(
60 WEBKIT_WEB_VIEW(c->web_view));
62 } else if (GDK_KEY_j == key) {
63 for (int i = 0; i <= cfg_scroll_lines - 1;
65 event->key.keyval = GDK_KEY_Down;
69 } else if (GDK_KEY_k == key) {
70 for (int i = 0; i <= cfg_scroll_lines - 1;
72 event->key.keyval = GDK_KEY_Up;
76 } else if (GDK_KEY_f == key) {
79 } else if (GDK_KEY_q == key) {
80 client_destroy(NULL, c);
82 } else if (GDK_KEY_1 == key) {
85 } else if (GDK_KEY_2 == key) {
88 } else if (GDK_KEY_3 == key) {
91 } else if (GDK_KEY_4 == key) {
94 } else if (GDK_KEY_5 == key) {
97 } else if (GDK_KEY_6 == key) {
100 } else if (GDK_KEY_7 == key) {
102 gtk_notebook_set_current_page(
103 GTK_NOTEBOOK(mw.notebook), 6);
105 } else if (GDK_KEY_8 == key) {
108 } else if (GDK_KEY_9 == key) {
111 } else if (GDK_KEY_u == key) {
112 gtk_notebook_prev_page(
113 GTK_NOTEBOOK(mw.notebook));
115 } else if (GDK_KEY_m == key) {
116 gboolean muted = webkit_web_view_get_is_muted(
117 WEBKIT_WEB_VIEW(c->web_view));
118 webkit_web_view_set_is_muted(
119 WEBKIT_WEB_VIEW(c->web_view), !muted);
120 changed_title(G_OBJECT(c->web_view), NULL, c);
122 } else if (GDK_KEY_t == key) {
124 client_new(cfg_home_uri, NULL);
126 } else if (GDK_KEY_bracketleft == key) {
129 } else if ((GDK_KEY_i == key) || (GDK_KEY_Tab == key)) {
130 gtk_notebook_next_page(
131 GTK_NOTEBOOK(mw.notebook));
133 } else if (GDK_KEY_d == key) {
134 gtk_widget_grab_focus(c->wsearch);
136 } else if (GDK_KEY_equal == key) {
137 now = webkit_web_view_get_zoom_level(
138 WEBKIT_WEB_VIEW(c->web_view));
139 webkit_web_view_set_zoom_level(
140 WEBKIT_WEB_VIEW(c->web_view),
143 } else if (GDK_KEY_minus == key) {
144 now = webkit_web_view_get_zoom_level(
145 WEBKIT_WEB_VIEW(c->web_view));
146 webkit_web_view_set_zoom_level(
147 WEBKIT_WEB_VIEW(c->web_view),
150 } else if (GDK_KEY_0 == key) {
151 webkit_web_view_set_zoom_level(
152 WEBKIT_WEB_VIEW(c->web_view), 1);
155 } else if ((((GdkEventKey *)event)->state & mask) ==
156 (GDK_CONTROL_MASK | GDK_SHIFT_MASK)) {
157 if (GDK_KEY_ISO_Left_Tab == key) {
158 gtk_notebook_prev_page(
159 GTK_NOTEBOOK(mw.notebook));
161 } else if (GDK_KEY_T == key) {
164 } else if (GDK_KEY_exclam == key) {
165 reorder_current_tab(1);
167 } else if (GDK_KEY_at == key) {
168 reorder_current_tab(2);
170 } else if (GDK_KEY_numbersign == key) {
171 reorder_current_tab(3);
173 } else if (GDK_KEY_dollar == key) {
174 reorder_current_tab(4);
176 } else if (GDK_KEY_percent == key) {
177 reorder_current_tab(5);
179 } else if (GDK_KEY_asciicircum == key) {
180 reorder_current_tab(6);
182 } else if (GDK_KEY_ampersand == key) {
183 reorder_current_tab(7);
185 } else if (GDK_KEY_asterisk == key) {
186 reorder_current_tab(8);
188 } else if (GDK_KEY_parenleft == key) {
189 reorder_current_tab(9);
198 change_tab(int idx, struct Client *c)
200 gtk_notebook_set_current_page(GTK_NOTEBOOK(mw.notebook), idx);
201 gtk_widget_grab_focus(GTK_WIDGET(c->web_view));
205 reorder_current_tab(int target)
207 gtk_notebook_reorder_child(
208 GTK_NOTEBOOK(mw.notebook),
209 gtk_notebook_get_nth_page(GTK_NOTEBOOK(mw.notebook),
210 gtk_notebook_get_current_page(
211 GTK_NOTEBOOK(mw.notebook))),
216 key_isearch(GtkWidget *widget, GdkEvent *event, gpointer data)
218 struct Client *c = (struct Client *)data;
219 if (key_common(widget, event, data)) return TRUE;
221 if (event->type == GDK_KEY_PRESS) {
222 int key = ((GdkEventKey *)event)->keyval;
223 if ((GDK_KEY_KP_Enter == key) || (GDK_KEY_Return == key)) {
224 int direction = (((GdkEventKey *)event)->state &
230 isearch(c, direction);
232 } else if (GDK_KEY_Escape == key) {
234 gtk_widget_hide(c->isearch_box);
235 gtk_widget_grab_focus(c->web_view);
242 key_wsearch(GtkWidget *widget, GdkEvent *event, gpointer data)
244 struct Client *c = (struct Client *)data;
245 if (key_common(widget, event, data)) return TRUE;
247 if (event->type == GDK_KEY_PRESS) {
248 guint mask = gtk_accelerator_get_default_mod_mask();
249 gboolean shifted = ((((GdkEventKey *)event)->state & mask) ==
251 int key = ((GdkEventKey *)event)->keyval;
252 if ((GDK_KEY_KP_Enter == key) || (GDK_KEY_Return == key)) {
254 gtk_entry_get_text(GTK_ENTRY(c->wsearch));
255 int len = strlen(cfg_search_engine) + strlen(t);
256 gchar *f = malloc(len + 1);
259 snprintf(f, len + 1, "%s%s", cfg_search_engine, t);
263 webkit_web_view_load_uri(
264 WEBKIT_WEB_VIEW(c->web_view), f);
265 gtk_widget_grab_focus(c->web_view);
275 key_location(GtkWidget *widget, GdkEvent *event, gpointer data)
277 struct Client *c = (struct Client *)data;
279 if (key_common(widget, event, data)) return TRUE;
281 if (event->type == GDK_KEY_PRESS) {
282 guint mask = gtk_accelerator_get_default_mod_mask();
283 gboolean shifted = ((((GdkEventKey *)event)->state & mask) ==
285 int key = ((GdkEventKey *)event)->keyval;
287 if ((GDK_KEY_KP_Enter == key) || (GDK_KEY_Return == key)) {
288 gtk_widget_grab_focus(c->web_view);
289 t = gtk_entry_get_text(GTK_ENTRY(c->location));
294 webkit_web_view_load_uri(
295 WEBKIT_WEB_VIEW(c->web_view),
296 ensure_uri_scheme(t));
299 } else if (GDK_KEY_Escape == key) {
300 t = webkit_web_view_get_uri(
301 WEBKIT_WEB_VIEW(c->web_view));
302 gtk_entry_set_text(GTK_ENTRY(c->location),
303 (t == NULL) ? "" : t);
310 key_tablabel(GtkWidget *widget, GdkEvent *event, gpointer data)
312 GdkScrollDirection direction;
313 if (event->type == GDK_BUTTON_RELEASE) {
314 switch (((GdkEventButton *)event)->button) {
316 client_destroy(NULL, data);
319 } else if (event->type == GDK_SCROLL) {
320 gdk_event_get_scroll_direction(event, &direction);
323 gtk_notebook_prev_page(GTK_NOTEBOOK(mw.notebook));
325 case GDK_SCROLL_DOWN:
326 gtk_notebook_next_page(GTK_NOTEBOOK(mw.notebook));
337 key_web_view(GtkWidget *widget, GdkEvent *event, gpointer data)
339 struct Client *c = (struct Client *)data;
342 if (key_common(c->web_view, event, data)) return TRUE;
344 if (event->type == GDK_KEY_PRESS) {
345 if (((GdkEventKey *)event)->keyval == GDK_KEY_Escape) {
346 webkit_web_view_stop_loading(
347 WEBKIT_WEB_VIEW(c->web_view));
348 gtk_entry_set_progress_fraction(GTK_ENTRY(c->location),
351 } else if (event->type == GDK_SCROLL) {
352 event->scroll.delta_y *= cfg_scroll_lines;
353 if (((GdkEventScroll *)event)->state & GDK_CONTROL_MASK) {
354 gdk_event_get_scroll_deltas(event, &dx, &dy);
355 z = webkit_web_view_get_zoom_level(
356 WEBKIT_WEB_VIEW(c->web_view));
359 webkit_web_view_set_zoom_level(
360 WEBKIT_WEB_VIEW(c->web_view), z);