keybindings.c 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. // BadWolf: Minimalist and privacy-oriented WebKitGTK+ browser
  2. // Copyright © 2019-2020 Badwolf Authors <https://hacktivis.me/projects/badwolf>
  3. // SPDX-License-Identifier: BSD-3-Clause
  4. #include "keybindings.h"
  5. #include "badwolf.h"
  6. #include <glib/gi18n.h> /* _() */
  7. static gboolean
  8. about_dialogCb_activate_link(GtkAboutDialog *about_dialog, gchar *uri, gpointer user_data)
  9. {
  10. (void)about_dialog;
  11. struct Window *window = (struct Window *)user_data;
  12. badwolf_new_tab(GTK_NOTEBOOK(window->notebook), new_browser(window, uri, NULL), FALSE);
  13. gtk_widget_destroy(GTK_WIDGET(about_dialog));
  14. return TRUE;
  15. }
  16. static void
  17. badwolf_about_dialog(GtkWindow *main_window, gpointer user_data)
  18. {
  19. struct Window *window = (struct Window *)user_data;
  20. GtkWidget *about_dialog = gtk_about_dialog_new();
  21. char *comments = NULL;
  22. comments = g_strdup_printf(_("Minimalist and privacy-oriented WebKitGTK+ browser\n"
  23. "Runtime WebKit version: %d.%d.%d"),
  24. webkit_get_major_version(),
  25. webkit_get_minor_version(),
  26. webkit_get_micro_version());
  27. gtk_window_set_transient_for(GTK_WINDOW(about_dialog), main_window);
  28. gtk_window_set_destroy_with_parent(GTK_WINDOW(about_dialog), TRUE);
  29. gtk_about_dialog_set_license(GTK_ABOUT_DIALOG(about_dialog),
  30. "SPDX-License-Identifier: BSD-3-Clause");
  31. gtk_about_dialog_set_copyright(
  32. GTK_ABOUT_DIALOG(about_dialog),
  33. "2019-2020 Badwolf Authors <https://hacktivis.me/projects/badwolf>");
  34. gtk_about_dialog_set_website(GTK_ABOUT_DIALOG(about_dialog), homepage);
  35. gtk_about_dialog_set_comments(GTK_ABOUT_DIALOG(about_dialog), comments);
  36. gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(about_dialog), version);
  37. gtk_about_dialog_set_logo_icon_name(GTK_ABOUT_DIALOG(about_dialog), "badwolf");
  38. g_signal_connect(about_dialog, "activate-link", G_CALLBACK(about_dialogCb_activate_link), window);
  39. (void)gtk_dialog_run(GTK_DIALOG(about_dialog));
  40. gtk_widget_destroy(about_dialog);
  41. }
  42. static void
  43. toggle_caret_browsing(WebKitWebView *webView)
  44. {
  45. WebKitSettings *settings = webkit_web_view_get_settings(webView);
  46. webkit_settings_set_enable_caret_browsing(settings,
  47. !webkit_settings_get_enable_caret_browsing(settings));
  48. webkit_web_view_set_settings(webView, settings);
  49. }
  50. /* commonCb_key_press_event: Global callback for keybindings
  51. *
  52. * Theses shortcuts should be avoided as much as possible:
  53. * - Single key shortcuts (ie. backspace and space)
  54. * - Triple key shortcuts (except for Ctrl+Shift)
  55. * - Unix Terminal shortcuts (specially Ctrl-W)
  56. *
  57. * loosely follows https://developer.gnome.org/hig/stable/keyboard-input.html
  58. */
  59. gboolean
  60. commonCb_key_press_event(struct Window *window, GdkEvent *event, struct Client *browser)
  61. {
  62. GtkNotebook *notebook = GTK_NOTEBOOK(window->notebook);
  63. if(((GdkEventKey *)event)->state & GDK_CONTROL_MASK)
  64. {
  65. if(browser != NULL)
  66. {
  67. switch(((GdkEventKey *)event)->keyval)
  68. {
  69. case GDK_KEY_F4: webkit_web_view_try_close(browser->webView); return TRUE;
  70. case GDK_KEY_r:
  71. if(((GdkEventKey *)event)->state & GDK_SHIFT_MASK)
  72. webkit_web_view_reload_bypass_cache(browser->webView);
  73. else
  74. webkit_web_view_reload(browser->webView);
  75. return TRUE;
  76. case GDK_KEY_f: gtk_widget_grab_focus(browser->search); return TRUE;
  77. case GDK_KEY_l: gtk_widget_grab_focus(browser->location); return TRUE;
  78. case GDK_KEY_bracketleft: webkit_web_view_go_back(browser->webView); return TRUE;
  79. case GDK_KEY_bracketright: webkit_web_view_go_forward(browser->webView); return TRUE;
  80. case GDK_KEY_0:
  81. webkit_web_view_set_zoom_level(WEBKIT_WEB_VIEW(browser->webView), 1);
  82. return TRUE;
  83. case GDK_KEY_p:
  84. webkit_print_operation_run_dialog(webkit_print_operation_new(browser->webView),
  85. GTK_WINDOW(browser->window));
  86. return TRUE;
  87. }
  88. }
  89. else
  90. {
  91. switch(((GdkEventKey *)event)->keyval)
  92. {
  93. case GDK_KEY_Page_Down: gtk_notebook_next_page(notebook); return TRUE;
  94. case GDK_KEY_Page_Up: gtk_notebook_prev_page(notebook); return TRUE;
  95. case GDK_KEY_t: badwolf_new_tab(notebook, new_browser(window, NULL, NULL), TRUE); return TRUE;
  96. }
  97. }
  98. }
  99. if((((GdkEventKey *)event)->state & GDK_MOD1_MASK))
  100. {
  101. if((browser != NULL) && (((GdkEventKey *)event)->keyval == GDK_KEY_d))
  102. {
  103. webkit_web_view_try_close(browser->webView);
  104. return TRUE;
  105. }
  106. switch(((GdkEventKey *)event)->keyval)
  107. {
  108. case GDK_KEY_Left: gtk_notebook_prev_page(notebook); return TRUE;
  109. case GDK_KEY_Right: gtk_notebook_next_page(notebook); return TRUE;
  110. }
  111. if((((GdkEventKey *)event)->keyval >= GDK_KEY_0) &&
  112. (((GdkEventKey *)event)->keyval <= GDK_KEY_9))
  113. gtk_notebook_set_current_page(notebook, (gint)(((GdkEventKey *)event)->keyval - GDK_KEY_1));
  114. }
  115. if(browser != NULL)
  116. {
  117. switch(((GdkEventKey *)event)->keyval)
  118. {
  119. case GDK_KEY_F5: webkit_web_view_reload(browser->webView); return TRUE;
  120. case GDK_KEY_Escape: webkit_web_view_stop_loading(browser->webView); return TRUE;
  121. case GDK_KEY_F7: toggle_caret_browsing(browser->webView); return TRUE;
  122. case GDK_KEY_F12:
  123. webkit_web_inspector_show(webkit_web_view_get_inspector(browser->webView));
  124. return TRUE;
  125. }
  126. }
  127. else
  128. {
  129. switch(((GdkEventKey *)event)->keyval)
  130. {
  131. case GDK_KEY_F1: badwolf_about_dialog(GTK_WINDOW(window->main_window), window); return TRUE;
  132. }
  133. }
  134. return FALSE;
  135. }
  136. gboolean
  137. WebViewCb_key_press_event(WebKitWebView *webView, GdkEvent *event, gpointer user_data)
  138. {
  139. (void)webView;
  140. struct Client *browser = (struct Client *)user_data;
  141. if(commonCb_key_press_event(browser->window, event, browser)) return TRUE;
  142. return FALSE;
  143. }
  144. gboolean
  145. boxCb_key_press_event(GtkWidget *widget, GdkEvent *event, gpointer user_data)
  146. {
  147. (void)widget;
  148. struct Client *browser = (struct Client *)user_data;
  149. if(commonCb_key_press_event(browser->window, event, browser)) return TRUE;
  150. return FALSE;
  151. }
  152. gboolean
  153. main_windowCb_key_press_event(GtkWidget *widget, GdkEvent *event, gpointer user_data)
  154. {
  155. (void)widget;
  156. struct Window *window = (struct Window *)user_data;
  157. if(commonCb_key_press_event(window, event, NULL)) return TRUE;
  158. return FALSE;
  159. }