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) {
83 gtk_notebook_set_current_page(
84 GTK_NOTEBOOK(mw.notebook), 0);
86 } else if (GDK_KEY_2 == key) {
87 gtk_notebook_set_current_page(
88 GTK_NOTEBOOK(mw.notebook), 1);
90 } else if (GDK_KEY_3 == key) {
91 gtk_notebook_set_current_page(
92 GTK_NOTEBOOK(mw.notebook), 2);
94 } else if (GDK_KEY_4 == key) {
95 gtk_notebook_set_current_page(
96 GTK_NOTEBOOK(mw.notebook), 3);
98 } else if (GDK_KEY_5 == key) {
99 gtk_notebook_set_current_page(
100 GTK_NOTEBOOK(mw.notebook), 4);
102 } else if (GDK_KEY_6 == key) {
103 gtk_notebook_set_current_page(
104 GTK_NOTEBOOK(mw.notebook), 5);
106 } else if (GDK_KEY_7 == key) {
107 gtk_notebook_set_current_page(
108 GTK_NOTEBOOK(mw.notebook), 6);
110 } else if (GDK_KEY_8 == key) {
111 gtk_notebook_set_current_page(
112 GTK_NOTEBOOK(mw.notebook), 7);
114 } else if (GDK_KEY_9 == key) {
115 gtk_notebook_set_current_page(
116 GTK_NOTEBOOK(mw.notebook), 8);
118 } else if (GDK_KEY_u == key) {
119 gtk_notebook_prev_page(
120 GTK_NOTEBOOK(mw.notebook));
122 } else if (GDK_KEY_m == key) {
123 gboolean muted = webkit_web_view_get_is_muted(
124 WEBKIT_WEB_VIEW(c->web_view));
125 webkit_web_view_set_is_muted(
126 WEBKIT_WEB_VIEW(c->web_view), !muted);
127 changed_title(G_OBJECT(c->web_view), NULL, c);
129 } else if (GDK_KEY_t == key) {
131 client_new(cfg_home_uri, NULL);
133 } else if (GDK_KEY_bracketleft == key) {
136 } else if ((GDK_KEY_i == key) || (GDK_KEY_Tab == key)) {
137 gtk_notebook_next_page(
138 GTK_NOTEBOOK(mw.notebook));
140 } else if (GDK_KEY_d == key) {
141 gtk_widget_grab_focus(c->wsearch);
143 } else if (GDK_KEY_equal == 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_minus == key) {
151 now = webkit_web_view_get_zoom_level(
152 WEBKIT_WEB_VIEW(c->web_view));
153 webkit_web_view_set_zoom_level(
154 WEBKIT_WEB_VIEW(c->web_view),
157 } else if (GDK_KEY_0 == key) {
158 webkit_web_view_set_zoom_level(
159 WEBKIT_WEB_VIEW(c->web_view), 1);
162 } else if ((((GdkEventKey *)event)->state & mask) ==
163 (GDK_CONTROL_MASK | GDK_SHIFT_MASK)) {
164 if (GDK_KEY_ISO_Left_Tab == key) {
165 gtk_notebook_prev_page(
166 GTK_NOTEBOOK(mw.notebook));
168 } else if (GDK_KEY_T == key) {
171 } else if (GDK_KEY_exclam == key) {
172 reorder_current_tab(1);
174 } else if (GDK_KEY_at == key) {
175 reorder_current_tab(2);
177 } else if (GDK_KEY_numbersign == key) {
178 reorder_current_tab(3);
180 } else if (GDK_KEY_dollar == key) {
181 reorder_current_tab(4);
183 } else if (GDK_KEY_percent == key) {
184 reorder_current_tab(5);
186 } else if (GDK_KEY_asciicircum == key) {
187 reorder_current_tab(6);
189 } else if (GDK_KEY_ampersand == key) {
190 reorder_current_tab(7);
192 } else if (GDK_KEY_asterisk == key) {
193 reorder_current_tab(8);
195 } else if (GDK_KEY_parenleft == key) {
196 reorder_current_tab(9);
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 int key = ((GdkEventKey *)event)->keyval;
249 if ((GDK_KEY_KP_Enter == key) || (GDK_KEY_Return == key)) {
251 gtk_entry_get_text(GTK_ENTRY(c->wsearch));
252 int len = strlen(cfg_search_engine) + strlen(t);
253 gchar *f = malloc(len + 1);
256 snprintf(f, len + 1, "%s%s", cfg_search_engine, t);
257 webkit_web_view_load_uri(WEBKIT_WEB_VIEW(c->web_view),
260 gtk_widget_grab_focus(c->web_view);
268 key_location(GtkWidget *widget, GdkEvent *event, gpointer data)
270 struct Client *c = (struct Client *)data;
272 if (key_common(widget, event, data)) return TRUE;
274 if (event->type == GDK_KEY_PRESS) {
275 int key = ((GdkEventKey *)event)->keyval;
276 if ((GDK_KEY_KP_Enter == key) || (GDK_KEY_Return == key)) {
277 gtk_widget_grab_focus(c->web_view);
278 t = gtk_entry_get_text(GTK_ENTRY(c->location));
279 webkit_web_view_load_uri(WEBKIT_WEB_VIEW(c->web_view),
280 ensure_uri_scheme(t));
282 } else if (GDK_KEY_Escape == key) {
283 t = webkit_web_view_get_uri(
284 WEBKIT_WEB_VIEW(c->web_view));
285 gtk_entry_set_text(GTK_ENTRY(c->location),
286 (t == NULL) ? "" : t);
293 key_tablabel(GtkWidget *widget, GdkEvent *event, gpointer data)
295 GdkScrollDirection direction;
296 if (event->type == GDK_BUTTON_RELEASE) {
297 switch (((GdkEventButton *)event)->button) {
299 client_destroy(NULL, data);
302 } else if (event->type == GDK_SCROLL) {
303 gdk_event_get_scroll_direction(event, &direction);
306 gtk_notebook_prev_page(GTK_NOTEBOOK(mw.notebook));
308 case GDK_SCROLL_DOWN:
309 gtk_notebook_next_page(GTK_NOTEBOOK(mw.notebook));
320 key_web_view(GtkWidget *widget, GdkEvent *event, gpointer data)
322 struct Client *c = (struct Client *)data;
325 if (key_common(c->web_view, event, data)) return TRUE;
327 if (event->type == GDK_KEY_PRESS) {
328 if (((GdkEventKey *)event)->keyval == GDK_KEY_Escape) {
329 webkit_web_view_stop_loading(
330 WEBKIT_WEB_VIEW(c->web_view));
331 gtk_entry_set_progress_fraction(GTK_ENTRY(c->location),
334 } else if (event->type == GDK_SCROLL) {
335 event->scroll.delta_y *= cfg_scroll_lines;
336 if (((GdkEventScroll *)event)->state & GDK_CONTROL_MASK) {
337 gdk_event_get_scroll_deltas(event, &dx, &dy);
338 z = webkit_web_view_get_zoom_level(
339 WEBKIT_WEB_VIEW(c->web_view));
342 webkit_web_view_set_zoom_level(
343 WEBKIT_WEB_VIEW(c->web_view), z);