]> git.armaanb.net Git - chorizo.git/blob - shortcuts.c
382e4c0ccca37ee3c8d89df0f579219f6ef90713
[chorizo.git] / shortcuts.c
1 #include <webkit2/webkit2.h>
2
3 #include "config.h"
4 #include "chorizo.h"
5
6 gboolean
7 key_common(GtkWidget *widget, GdkEvent *event, gpointer data)
8 {
9         struct Client *c = (struct Client *)data;
10         gdouble now;
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) ==
15                     GDK_CONTROL_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();
20                                 return TRUE;
21                         } else if (GDK_KEY_h == key) {
22                                 webkit_web_view_go_back(
23                                         WEBKIT_WEB_VIEW(c->web_view));
24                                 return TRUE;
25                         } else if (GDK_KEY_l == key) {
26                                 webkit_web_view_go_forward(
27                                         WEBKIT_WEB_VIEW(c->web_view));
28                                 return TRUE;
29                         } else if (GDK_KEY_s == key) {
30                                 gtk_widget_grab_focus(c->location);
31                                 return TRUE;
32                         } else if (GDK_KEY_p == key) {
33                                 WebKitPrintOperation *operation =
34                                         webkit_print_operation_new(
35                                                 WEBKIT_WEB_VIEW(c->web_view));
36                                 GtkWidget *toplevel =
37                                         gtk_widget_get_toplevel(mw.win);
38                                 webkit_print_operation_run_dialog(
39                                         operation, GTK_WINDOW(toplevel));
40                                 return TRUE;
41                         } else if (GDK_KEY_g == key) {
42                                 isearch(c, 2);
43                                 gtk_widget_grab_focus(c->web_view);
44                                 if (uri)
45                                         gtk_entry_set_text(
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();",
51                                         NULL, NULL, c);
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);
57                                 return TRUE;
58                         } else if (GDK_KEY_r == key) {
59                                 webkit_web_view_reload_bypass_cache(
60                                         WEBKIT_WEB_VIEW(c->web_view));
61                                 return TRUE;
62                         } else if (GDK_KEY_j == key) {
63                                 for (int i = 0; i <= cfg_scroll_lines - 1;
64                                      i++) {
65                                         event->key.keyval = GDK_KEY_Down;
66                                         gdk_event_put(event);
67                                 }
68                                 return TRUE;
69                         } else if (GDK_KEY_k == key) {
70                                 for (int i = 0; i <= cfg_scroll_lines - 1;
71                                      i++) {
72                                         event->key.keyval = GDK_KEY_Up;
73                                         gdk_event_put(event);
74                                 }
75                                 return TRUE;
76                         } else if (GDK_KEY_f == key) {
77                                 isearch_init(c, 1);
78                                 return TRUE;
79                         } else if (GDK_KEY_q == key) {
80                                 client_destroy(NULL, c);
81                                 return TRUE;
82                         } else if (GDK_KEY_1 == key) {
83                                 gtk_notebook_set_current_page(
84                                         GTK_NOTEBOOK(mw.notebook), 0);
85                                 return TRUE;
86                         } else if (GDK_KEY_2 == key) {
87                                 gtk_notebook_set_current_page(
88                                         GTK_NOTEBOOK(mw.notebook), 1);
89                                 return TRUE;
90                         } else if (GDK_KEY_3 == key) {
91                                 gtk_notebook_set_current_page(
92                                         GTK_NOTEBOOK(mw.notebook), 2);
93                                 return TRUE;
94                         } else if (GDK_KEY_4 == key) {
95                                 gtk_notebook_set_current_page(
96                                         GTK_NOTEBOOK(mw.notebook), 3);
97                                 return TRUE;
98                         } else if (GDK_KEY_5 == key) {
99                                 gtk_notebook_set_current_page(
100                                         GTK_NOTEBOOK(mw.notebook), 4);
101                                 return TRUE;
102                         } else if (GDK_KEY_6 == key) {
103                                 gtk_notebook_set_current_page(
104                                         GTK_NOTEBOOK(mw.notebook), 5);
105                                 return TRUE;
106                         } else if (GDK_KEY_7 == key) {
107                                 gtk_notebook_set_current_page(
108                                         GTK_NOTEBOOK(mw.notebook), 6);
109                                 return TRUE;
110                         } else if (GDK_KEY_8 == key) {
111                                 gtk_notebook_set_current_page(
112                                         GTK_NOTEBOOK(mw.notebook), 7);
113                                 return TRUE;
114                         } else if (GDK_KEY_9 == key) {
115                                 gtk_notebook_set_current_page(
116                                         GTK_NOTEBOOK(mw.notebook), 8);
117                                 return TRUE;
118                         } else if (GDK_KEY_u == key) {
119                                 gtk_notebook_prev_page(
120                                         GTK_NOTEBOOK(mw.notebook));
121                                 return TRUE;
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);
128                                 return TRUE;
129                         } else if (GDK_KEY_t == key) {
130                                 switch_tab = TRUE;
131                                 client_new(cfg_home_uri, NULL);
132                                 return TRUE;
133                         } else if (GDK_KEY_bracketleft == key) {
134                                 reopen_tab();
135                                 return TRUE;
136                         } else if ((GDK_KEY_i == key) || (GDK_KEY_Tab == key)) {
137                                 gtk_notebook_next_page(
138                                         GTK_NOTEBOOK(mw.notebook));
139                                 return TRUE;
140                         } else if (GDK_KEY_d == key) {
141                                 gtk_widget_grab_focus(c->wsearch);
142                                 return TRUE;
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),
148                                         now + 0.1);
149                                 return TRUE;
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),
155                                         now - 0.1);
156                                 return TRUE;
157                         } else if (GDK_KEY_0 == key) {
158                                 webkit_web_view_set_zoom_level(
159                                         WEBKIT_WEB_VIEW(c->web_view), 1);
160                                 return TRUE;
161                         }
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));
167                                 return TRUE;
168                         } else if (GDK_KEY_T == key) {
169                                 reopen_tab();
170                                 return TRUE;
171                         } else if (GDK_KEY_exclam == key) {
172                                 reorder_current_tab(1);
173                                 return TRUE;
174                         } else if (GDK_KEY_at == key) {
175                                 reorder_current_tab(2);
176                                 return TRUE;
177                         } else if (GDK_KEY_numbersign == key) {
178                                 reorder_current_tab(3);
179                                 return TRUE;
180                         } else if (GDK_KEY_dollar == key) {
181                                 reorder_current_tab(4);
182                                 return TRUE;
183                         } else if (GDK_KEY_percent == key) {
184                                 reorder_current_tab(5);
185                                 return TRUE;
186                         } else if (GDK_KEY_asciicircum == key) {
187                                 reorder_current_tab(6);
188                                 return TRUE;
189                         } else if (GDK_KEY_ampersand == key) {
190                                 reorder_current_tab(7);
191                                 return TRUE;
192                         } else if (GDK_KEY_asterisk == key) {
193                                 reorder_current_tab(8);
194                                 return TRUE;
195                         } else if (GDK_KEY_parenleft == key) {
196                                 reorder_current_tab(9);
197                                 return TRUE;
198                         }
199                 }
200         }
201         return FALSE;
202 }
203
204 void
205 reorder_current_tab(int target)
206 {
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))),
212                 target - 1);
213 }
214
215 gboolean
216 key_isearch(GtkWidget *widget, GdkEvent *event, gpointer data)
217 {
218         struct Client *c = (struct Client *)data;
219         if (key_common(widget, event, data)) return TRUE;
220
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 &
225                                          GDK_SHIFT_MASK) ?
226                                                       -1 :
227                                                       1;
228                         isearch(c, 0);
229                         isearch(c, -1);
230                         isearch(c, direction);
231                         return TRUE;
232                 } else if (GDK_KEY_Escape == key) {
233                         isearch(c, 2);
234                         gtk_widget_hide(c->isearch_box);
235                         gtk_widget_grab_focus(c->web_view);
236                 }
237         }
238         return FALSE;
239 }
240
241 gboolean
242 key_wsearch(GtkWidget *widget, GdkEvent *event, gpointer data)
243 {
244         struct Client *c = (struct Client *)data;
245         if (key_common(widget, event, data)) return TRUE;
246
247         if (event->type == GDK_KEY_PRESS) {
248                 int key = ((GdkEventKey *)event)->keyval;
249                 if ((GDK_KEY_KP_Enter == key) || (GDK_KEY_Return == key)) {
250                         const gchar *t =
251                                 gtk_entry_get_text(GTK_ENTRY(c->wsearch));
252                         int len = strlen(cfg_search_engine) + strlen(t);
253                         gchar *f = malloc(len + 1);
254                         if (!f) allocfail();
255
256                         snprintf(f, len + 1, "%s%s", cfg_search_engine, t);
257                         webkit_web_view_load_uri(WEBKIT_WEB_VIEW(c->web_view),
258                                                  f);
259                         g_free(f);
260                         gtk_widget_grab_focus(c->web_view);
261                         return TRUE;
262                 }
263         }
264         return FALSE;
265 }
266
267 gboolean
268 key_location(GtkWidget *widget, GdkEvent *event, gpointer data)
269 {
270         struct Client *c = (struct Client *)data;
271         const gchar *t;
272         if (key_common(widget, event, data)) return TRUE;
273
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));
281                         return TRUE;
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);
287                         return TRUE;
288                 }
289         }
290         return FALSE;
291 }
292 gboolean
293 key_tablabel(GtkWidget *widget, GdkEvent *event, gpointer data)
294 {
295         GdkScrollDirection direction;
296         if (event->type == GDK_BUTTON_RELEASE) {
297                 switch (((GdkEventButton *)event)->button) {
298                 case 2:
299                         client_destroy(NULL, data);
300                         return TRUE;
301                 }
302         } else if (event->type == GDK_SCROLL) {
303                 gdk_event_get_scroll_direction(event, &direction);
304                 switch (direction) {
305                 case GDK_SCROLL_UP:
306                         gtk_notebook_prev_page(GTK_NOTEBOOK(mw.notebook));
307                         break;
308                 case GDK_SCROLL_DOWN:
309                         gtk_notebook_next_page(GTK_NOTEBOOK(mw.notebook));
310                         break;
311                 default:
312                         break;
313                 }
314                 return TRUE;
315         }
316         return FALSE;
317 }
318
319 gboolean
320 key_web_view(GtkWidget *widget, GdkEvent *event, gpointer data)
321 {
322         struct Client *c = (struct Client *)data;
323         gdouble dx, dy;
324         gfloat z;
325         if (key_common(c->web_view, event, data)) return TRUE;
326
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),
332                                                         0);
333                 }
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));
340                         z += -dy * 0.1;
341                         z = dx != 0 ? 1 : z;
342                         webkit_web_view_set_zoom_level(
343                                 WEBKIT_WEB_VIEW(c->web_view), z);
344                         return TRUE;
345                 }
346         }
347         return FALSE;
348 }