]> git.armaanb.net Git - chorizo.git/blob - shortcuts.c
draft 8
[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                                 change_tab(0, c);
84                                 return TRUE;
85                         } else if (GDK_KEY_2 == key) {
86                                 change_tab(1, c);
87                                 return TRUE;
88                         } else if (GDK_KEY_3 == key) {
89                                 change_tab(2, c);
90                                 return TRUE;
91                         } else if (GDK_KEY_4 == key) {
92                                 change_tab(3, c);
93                                 return TRUE;
94                         } else if (GDK_KEY_5 == key) {
95                                 change_tab(4, c);
96                                 return TRUE;
97                         } else if (GDK_KEY_6 == key) {
98                                 change_tab(5, c);
99                                 return TRUE;
100                         } else if (GDK_KEY_7 == key) {
101                                 change_tab(6, c);
102                                 gtk_notebook_set_current_page(
103                                         GTK_NOTEBOOK(mw.notebook), 6);
104                                 return TRUE;
105                         } else if (GDK_KEY_8 == key) {
106                                 change_tab(7, c);
107                                 return TRUE;
108                         } else if (GDK_KEY_9 == key) {
109                                 change_tab(8, c);
110                                 return TRUE;
111                         } else if (GDK_KEY_u == key) {
112                                 gtk_notebook_prev_page(
113                                         GTK_NOTEBOOK(mw.notebook));
114                                 return TRUE;
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);
121                                 return TRUE;
122                         } else if (GDK_KEY_t == key) {
123                                 switch_tab = TRUE;
124                                 client_new(cfg_home_uri, NULL);
125                                 return TRUE;
126                         } else if (GDK_KEY_bracketleft == key) {
127                                 reopen_tab();
128                                 return TRUE;
129                         } else if ((GDK_KEY_i == key) || (GDK_KEY_Tab == key)) {
130                                 gtk_notebook_next_page(
131                                         GTK_NOTEBOOK(mw.notebook));
132                                 return TRUE;
133                         } else if (GDK_KEY_d == key) {
134                                 gtk_widget_grab_focus(c->wsearch);
135                                 return TRUE;
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),
141                                         now + 0.1);
142                                 return TRUE;
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),
148                                         now - 0.1);
149                                 return TRUE;
150                         } else if (GDK_KEY_0 == key) {
151                                 webkit_web_view_set_zoom_level(
152                                         WEBKIT_WEB_VIEW(c->web_view), 1);
153                                 return TRUE;
154                         }
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));
160                                 return TRUE;
161                         } else if (GDK_KEY_T == key) {
162                                 reopen_tab();
163                                 return TRUE;
164                         } else if (GDK_KEY_exclam == key) {
165                                 reorder_current_tab(1);
166                                 return TRUE;
167                         } else if (GDK_KEY_at == key) {
168                                 reorder_current_tab(2);
169                                 return TRUE;
170                         } else if (GDK_KEY_numbersign == key) {
171                                 reorder_current_tab(3);
172                                 return TRUE;
173                         } else if (GDK_KEY_dollar == key) {
174                                 reorder_current_tab(4);
175                                 return TRUE;
176                         } else if (GDK_KEY_percent == key) {
177                                 reorder_current_tab(5);
178                                 return TRUE;
179                         } else if (GDK_KEY_asciicircum == key) {
180                                 reorder_current_tab(6);
181                                 return TRUE;
182                         } else if (GDK_KEY_ampersand == key) {
183                                 reorder_current_tab(7);
184                                 return TRUE;
185                         } else if (GDK_KEY_asterisk == key) {
186                                 reorder_current_tab(8);
187                                 return TRUE;
188                         } else if (GDK_KEY_parenleft == key) {
189                                 reorder_current_tab(9);
190                                 return TRUE;
191                         }
192                 }
193         }
194         return FALSE;
195 }
196
197 void
198 change_tab(int idx, struct Client *c)
199 {
200         gtk_notebook_set_current_page(GTK_NOTEBOOK(mw.notebook), idx);
201         gtk_widget_grab_focus(GTK_WIDGET(c->web_view));
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                 guint mask = gtk_accelerator_get_default_mod_mask();
249                 gboolean shifted = ((((GdkEventKey *)event)->state & mask) ==
250                                     GDK_SHIFT_MASK);
251                 int key = ((GdkEventKey *)event)->keyval;
252                 if ((GDK_KEY_KP_Enter == key) || (GDK_KEY_Return == key)) {
253                         const gchar *t =
254                                 gtk_entry_get_text(GTK_ENTRY(c->wsearch));
255                         int len = strlen(cfg_search_engine) + strlen(t);
256                         gchar *f = malloc(len + 1);
257                         if (!f) allocfail();
258
259                         snprintf(f, len + 1, "%s%s", cfg_search_engine, t);
260                         if (shifted) {
261                                 client_new(f, NULL);
262                         } else {
263                                 webkit_web_view_load_uri(
264                                         WEBKIT_WEB_VIEW(c->web_view), f);
265                                 gtk_widget_grab_focus(c->web_view);
266                         }
267                         g_free(f);
268                         return TRUE;
269                 }
270         }
271         return FALSE;
272 }
273
274 gboolean
275 key_location(GtkWidget *widget, GdkEvent *event, gpointer data)
276 {
277         struct Client *c = (struct Client *)data;
278         const gchar *t;
279         if (key_common(widget, event, data)) return TRUE;
280
281         if (event->type == GDK_KEY_PRESS) {
282                 guint mask = gtk_accelerator_get_default_mod_mask();
283                 gboolean shifted = ((((GdkEventKey *)event)->state & mask) ==
284                                     GDK_SHIFT_MASK);
285                 int key = ((GdkEventKey *)event)->keyval;
286
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));
290                         if (shifted) {
291                                 switch_tab = TRUE;
292                                 client_new(t, NULL);
293                         } else {
294                                 webkit_web_view_load_uri(
295                                         WEBKIT_WEB_VIEW(c->web_view),
296                                         ensure_uri_scheme(t));
297                         }
298                         return TRUE;
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);
304                         return TRUE;
305                 }
306         }
307         return FALSE;
308 }
309 gboolean
310 key_tablabel(GtkWidget *widget, GdkEvent *event, gpointer data)
311 {
312         GdkScrollDirection direction;
313         if (event->type == GDK_BUTTON_RELEASE) {
314                 switch (((GdkEventButton *)event)->button) {
315                 case 2:
316                         client_destroy(NULL, data);
317                         return TRUE;
318                 }
319         } else if (event->type == GDK_SCROLL) {
320                 gdk_event_get_scroll_direction(event, &direction);
321                 switch (direction) {
322                 case GDK_SCROLL_UP:
323                         gtk_notebook_prev_page(GTK_NOTEBOOK(mw.notebook));
324                         break;
325                 case GDK_SCROLL_DOWN:
326                         gtk_notebook_next_page(GTK_NOTEBOOK(mw.notebook));
327                         break;
328                 default:
329                         break;
330                 }
331                 return TRUE;
332         }
333         return FALSE;
334 }
335
336 gboolean
337 key_web_view(GtkWidget *widget, GdkEvent *event, gpointer data)
338 {
339         struct Client *c = (struct Client *)data;
340         gdouble dx, dy;
341         gfloat z;
342         if (key_common(c->web_view, event, data)) return TRUE;
343
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),
349                                                         0);
350                 }
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));
357                         z += -dy * 0.1;
358                         z = dx != 0 ? 1 : z;
359                         webkit_web_view_set_zoom_level(
360                                 WEBKIT_WEB_VIEW(c->web_view), z);
361                         return TRUE;
362                 }
363         }
364         return FALSE;
365 }