Summary Files Commits Branches @commit @diff @stats
path: root / keybindings.c
diff options
context:
space:
mode:
Commit66289e480b2b3dca550628352675abc7b7b4f6ee (patch)
Author
 Haelwenn (lanodan) Monnier <contact@hacktivis.me>
2019-10-31 18:22:40 +0100
Committer
 Haelwenn (lanodan) Monnier <contact@hacktivis.me>
2019-10-31 18:23:26 +0100
Filesb3e3c248a87476d90cc2da62d8b0f288f396f73c /keybindings.c
goodwolf-0.4.0.tar
goodwolf-0.4.0.tar.gz
goodwolf-0.4.0.zip
Parent5030dbfd170c3eb35eac9e2be08365f72f52161b (diff)
Parent416fa67dfd0dbd9b308c6db48d02c2dcdf879103 (diff)
Merge branch 'release-0.4' for 0.4.0 v0.4.0
1 files changed, 152 insertions, 0 deletions
-rw-r--r--keybindings.c152
diff --git a/keybindings.c b/keybindings.c
new file mode 100644
index 0000000..d75a438
--- /dev/null
+++ b/keybindings.c
@@ -0,0 +1,152 @@
+#include "keybindings.h"
+
+#include "badwolf.h"
+
+static void
+badwolf_about_dialog(GtkWindow *main_window)
+{
+ // clang-format off
+ gtk_show_about_dialog(
+ main_window,
+ "license", "SPDX-License-Identifier: BSD-3-Clause",
+ "copyright", "2019 Haelwenn (lanodan) Monnier <contact+badwolf@hacktivis.me>",
+ "website", homepage,
+ "comments", "Minimalist and privacy-oriented WebKitGTK+ browser",
+ "version", version,
+ //FIXME: "logo-icon-name", g_get_application_name(),
+ NULL
+ );
+ // clang-format on
+}
+
+static void
+toggle_caret_browsing(WebKitWebView *webView)
+{
+ WebKitSettings *settings = webkit_web_view_get_settings(webView);
+
+ webkit_settings_set_enable_caret_browsing(settings,
+ !webkit_settings_get_enable_caret_browsing(settings));
+
+ webkit_web_view_set_settings(webView, settings);
+}
+
+/* commonCb_key_press_event: Global callback for keybindings
+ *
+ * Theses shortcuts should be avoided as much as possible:
+ * - Single key shortcuts (ie. backspace and space)
+ * - Triple key shortcuts (except for Ctrl+Shift)
+ * - Unix Terminal shortcuts (specially Ctrl-W)
+ *
+ * loosely follows https://developer.gnome.org/hig/stable/keyboard-input.html
+ */
+gboolean
+commonCb_key_press_event(struct Window *window, GdkEvent *event, struct Client *browser)
+{
+ GtkNotebook *notebook = GTK_NOTEBOOK(window->notebook);
+
+ if(((GdkEventKey *)event)->state & GDK_CONTROL_MASK)
+ {
+ if(browser != NULL)
+ {
+ switch(((GdkEventKey *)event)->keyval)
+ {
+ case GDK_KEY_F4: webkit_web_view_try_close(browser->webView); return TRUE;
+ case GDK_KEY_r:
+ if(((GdkEventKey *)event)->state & GDK_SHIFT_MASK)
+ webkit_web_view_reload_bypass_cache(browser->webView);
+ else
+ webkit_web_view_reload(browser->webView);
+
+ return TRUE;
+ case GDK_KEY_f: gtk_widget_grab_focus(browser->search); return TRUE;
+ case GDK_KEY_l: gtk_widget_grab_focus(browser->location); return TRUE;
+ case GDK_KEY_bracketleft: webkit_web_view_go_back(browser->webView); return TRUE;
+ case GDK_KEY_bracketright: webkit_web_view_go_forward(browser->webView); return TRUE;
+ case GDK_KEY_0:
+ webkit_web_view_set_zoom_level(WEBKIT_WEB_VIEW(browser->webView), 1);
+ return TRUE;
+ }
+ }
+ else
+ {
+ switch(((GdkEventKey *)event)->keyval)
+ {
+ case GDK_KEY_Page_Down: gtk_notebook_next_page(notebook); return TRUE;
+ case GDK_KEY_Page_Up: gtk_notebook_prev_page(notebook); return TRUE;
+ case GDK_KEY_t: badwolf_new_tab(notebook, new_browser(window, NULL, NULL)); return TRUE;
+ }
+ }
+ }
+
+ if((((GdkEventKey *)event)->state & GDK_MOD1_MASK))
+ {
+ if((browser != NULL) && (((GdkEventKey *)event)->keyval == GDK_KEY_d))
+ {
+ webkit_web_view_try_close(browser->webView);
+ return TRUE;
+ }
+
+ switch(((GdkEventKey *)event)->keyval)
+ {
+ case GDK_KEY_Left: gtk_notebook_prev_page(notebook); return TRUE;
+ case GDK_KEY_Right: gtk_notebook_next_page(notebook); return TRUE;
+ }
+ if((((GdkEventKey *)event)->keyval >= GDK_KEY_0) &&
+ (((GdkEventKey *)event)->keyval <= GDK_KEY_9))
+ gtk_notebook_set_current_page(notebook, (gint)(((GdkEventKey *)event)->keyval - GDK_KEY_1));
+ }
+
+ if(browser != NULL)
+ {
+ switch(((GdkEventKey *)event)->keyval)
+ {
+ case GDK_KEY_F5: webkit_web_view_reload(browser->webView); return TRUE;
+ case GDK_KEY_F7: toggle_caret_browsing(browser->webView); return TRUE;
+ case GDK_KEY_F12:
+ webkit_web_inspector_show(webkit_web_view_get_inspector(browser->webView));
+ return TRUE;
+ }
+ }
+ else
+ {
+ switch(((GdkEventKey *)event)->keyval)
+ {
+ case GDK_KEY_F1: badwolf_about_dialog(GTK_WINDOW(window->main_window)); return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+gboolean
+WebViewCb_key_press_event(WebKitWebView *webView, GdkEvent *event, gpointer user_data)
+{
+ (void)webView;
+ struct Client *browser = (struct Client *)user_data;
+
+ if(commonCb_key_press_event(browser->window, event, browser)) return TRUE;
+
+ return FALSE;
+}
+
+gboolean
+boxCb_key_press_event(GtkWidget *widget, GdkEvent *event, gpointer user_data)
+{
+ (void)widget;
+ struct Client *browser = (struct Client *)user_data;
+
+ if(commonCb_key_press_event(browser->window, event, browser)) return TRUE;
+
+ return FALSE;
+}
+
+gboolean
+main_windowCb_key_press_event(GtkWidget *widget, GdkEvent *event, gpointer user_data)
+{
+ (void)widget;
+ struct Window *window = (struct Window *)user_data;
+
+ if(commonCb_key_press_event(window, event, NULL)) return TRUE;
+
+ return FALSE;
+}