logo

badwolf

minimalist and privacy-oriented web browser based on WebKitGTK git clone https://anongit.hacktivis.me/git/badwolf.git/

keybindings.c (7074B)


  1. // BadWolf: Minimalist and privacy-oriented WebKitGTK+ browser
  2. // SPDX-FileCopyrightText: 2019-2023 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 UNUSED(user_data))
  9. {
  10. badwolf_new_tab(GTK_NOTEBOOK(window->notebook), new_browser(uri, NULL), TRUE);
  11. gtk_window_close(GTK_WINDOW(about_dialog));
  12. return TRUE;
  13. }
  14. static void
  15. badwolf_about_dialog(GtkWindow *main_window, gpointer UNUSED(user_data))
  16. {
  17. GtkWidget *about_dialog = gtk_about_dialog_new();
  18. char *comments = NULL;
  19. comments = g_strdup_printf(_("Minimalist and privacy-oriented web browser based on WebKitGTK\n"
  20. "Runtime WebKit version: %d.%d.%d"),
  21. webkit_get_major_version(),
  22. webkit_get_minor_version(),
  23. webkit_get_micro_version());
  24. gtk_window_set_transient_for(GTK_WINDOW(about_dialog), main_window);
  25. gtk_window_set_destroy_with_parent(GTK_WINDOW(about_dialog), TRUE);
  26. gtk_about_dialog_set_license(
  27. GTK_ABOUT_DIALOG(about_dialog),
  28. "SPDX License Identifiers: BSD-3-Clause AND CC-BY-SA-4.0 AND MPL-2.0");
  29. gtk_about_dialog_set_copyright(
  30. GTK_ABOUT_DIALOG(about_dialog),
  31. "2019-2021 Badwolf Authors <https://hacktivis.me/projects/badwolf>");
  32. gtk_about_dialog_set_website(GTK_ABOUT_DIALOG(about_dialog), homepage);
  33. gtk_about_dialog_set_comments(GTK_ABOUT_DIALOG(about_dialog), comments);
  34. gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(about_dialog), version);
  35. gtk_about_dialog_set_logo_icon_name(GTK_ABOUT_DIALOG(about_dialog), "badwolf");
  36. g_signal_connect(about_dialog, "activate-link", G_CALLBACK(about_dialogCb_activate_link), window);
  37. gtk_dialog_run(GTK_DIALOG(about_dialog));
  38. gtk_widget_destroy(about_dialog);
  39. }
  40. static void
  41. toggle_caret_browsing(WebKitWebView *webView)
  42. {
  43. WebKitSettings *settings = webkit_web_view_get_settings(webView);
  44. webkit_settings_set_enable_caret_browsing(settings,
  45. !webkit_settings_get_enable_caret_browsing(settings));
  46. webkit_web_view_set_settings(webView, settings);
  47. }
  48. /* commonCb_key_press_event: Global callback for keybindings
  49. *
  50. * These shortcuts should be avoided as much as possible:
  51. * - Single key shortcuts (ie. backspace and space)
  52. * - Triple key shortcuts (except for Ctrl+Shift)
  53. * - Unix Terminal shortcuts (specially Ctrl-W)
  54. *
  55. * loosely follows https://developer.gnome.org/hig/guidelines/keyboard.html
  56. */
  57. gboolean
  58. commonCb_key_press_event(GdkEvent *event, struct Client *browser)
  59. {
  60. GtkNotebook *notebook = GTK_NOTEBOOK(window->notebook);
  61. if(((GdkEventKey *)event)->state & GDK_CONTROL_MASK)
  62. {
  63. if(browser != NULL)
  64. {
  65. switch(((GdkEventKey *)event)->keyval)
  66. {
  67. case GDK_KEY_Escape:
  68. webkit_web_view_terminate_web_process(browser->webView);
  69. return TRUE;
  70. case GDK_KEY_F4:
  71. webkit_web_view_try_close(browser->webView);
  72. return TRUE;
  73. case GDK_KEY_r:
  74. if(((GdkEventKey *)event)->state & GDK_SHIFT_MASK)
  75. webkit_web_view_reload_bypass_cache(browser->webView);
  76. else
  77. webkit_web_view_reload(browser->webView);
  78. return TRUE;
  79. case GDK_KEY_f:
  80. gtk_widget_grab_focus(browser->search);
  81. return TRUE;
  82. case GDK_KEY_l:
  83. gtk_widget_grab_focus(browser->location);
  84. return TRUE;
  85. case GDK_KEY_bracketleft:
  86. webkit_web_view_go_back(browser->webView);
  87. return TRUE;
  88. case GDK_KEY_bracketright:
  89. webkit_web_view_go_forward(browser->webView);
  90. return TRUE;
  91. case GDK_KEY_0:
  92. webkit_web_view_set_zoom_level(WEBKIT_WEB_VIEW(browser->webView), 1.0);
  93. return TRUE;
  94. case GDK_KEY_equal:
  95. webkit_web_view_set_zoom_level(WEBKIT_WEB_VIEW(browser->webView), default_zoom);
  96. return TRUE;
  97. case GDK_KEY_plus:
  98. webkit_web_view_set_zoom_level(
  99. WEBKIT_WEB_VIEW(browser->webView),
  100. webkit_web_view_get_zoom_level(WEBKIT_WEB_VIEW(browser->webView)) + 0.1);
  101. return TRUE;
  102. case GDK_KEY_minus:
  103. webkit_web_view_set_zoom_level(
  104. WEBKIT_WEB_VIEW(browser->webView),
  105. webkit_web_view_get_zoom_level(WEBKIT_WEB_VIEW(browser->webView)) - 0.1);
  106. return TRUE;
  107. case GDK_KEY_p:
  108. webkit_print_operation_run_dialog(webkit_print_operation_new(browser->webView),
  109. GTK_WINDOW(window->main_window));
  110. return TRUE;
  111. }
  112. }
  113. else
  114. {
  115. switch(((GdkEventKey *)event)->keyval)
  116. {
  117. case GDK_KEY_Page_Down:
  118. gtk_notebook_next_page(notebook);
  119. return TRUE;
  120. case GDK_KEY_Page_Up:
  121. gtk_notebook_prev_page(notebook);
  122. return TRUE;
  123. case GDK_KEY_t:
  124. badwolf_new_tab(notebook, new_browser(NULL, NULL), TRUE);
  125. return TRUE;
  126. }
  127. }
  128. }
  129. if((((GdkEventKey *)event)->state & GDK_MOD1_MASK))
  130. {
  131. if((browser != NULL) && (((GdkEventKey *)event)->keyval == GDK_KEY_d))
  132. {
  133. webkit_web_view_try_close(browser->webView);
  134. return TRUE;
  135. }
  136. switch(((GdkEventKey *)event)->keyval)
  137. {
  138. case GDK_KEY_Left:
  139. gtk_notebook_prev_page(notebook);
  140. return TRUE;
  141. case GDK_KEY_Right:
  142. gtk_notebook_next_page(notebook);
  143. return TRUE;
  144. }
  145. if((((GdkEventKey *)event)->keyval >= GDK_KEY_0) &&
  146. (((GdkEventKey *)event)->keyval <= GDK_KEY_9))
  147. gtk_notebook_set_current_page(notebook, (gint)(((GdkEventKey *)event)->keyval - GDK_KEY_1));
  148. }
  149. if(browser != NULL)
  150. {
  151. switch(((GdkEventKey *)event)->keyval)
  152. {
  153. case GDK_KEY_F5:
  154. webkit_web_view_reload(browser->webView);
  155. return TRUE;
  156. case GDK_KEY_Escape:
  157. webkit_web_view_stop_loading(browser->webView);
  158. return TRUE;
  159. case GDK_KEY_F7:
  160. toggle_caret_browsing(browser->webView);
  161. return TRUE;
  162. case GDK_KEY_F12:
  163. webkit_web_inspector_show(webkit_web_view_get_inspector(browser->webView));
  164. return TRUE;
  165. }
  166. }
  167. else
  168. {
  169. switch(((GdkEventKey *)event)->keyval)
  170. {
  171. case GDK_KEY_F1:
  172. badwolf_about_dialog(GTK_WINDOW(window->main_window), window);
  173. return TRUE;
  174. }
  175. }
  176. return FALSE;
  177. }
  178. gboolean
  179. WebViewCb_key_press_event(WebKitWebView *UNUSED(webView), GdkEvent *event, gpointer user_data)
  180. {
  181. struct Client *browser = (struct Client *)user_data;
  182. if(commonCb_key_press_event(event, browser)) return TRUE;
  183. return FALSE;
  184. }
  185. gboolean
  186. boxCb_key_press_event(GtkWidget *UNUSED(widget), GdkEvent *event, gpointer user_data)
  187. {
  188. struct Client *browser = (struct Client *)user_data;
  189. if(commonCb_key_press_event(event, browser)) return TRUE;
  190. return FALSE;
  191. }
  192. gboolean
  193. main_windowCb_key_press_event(GtkWidget *UNUSED(widget),
  194. GdkEvent *event,
  195. gpointer UNUSED(user_data))
  196. {
  197. if(commonCb_key_press_event(event, NULL)) return TRUE;
  198. return FALSE;
  199. }
  200. gboolean
  201. tab_boxCb_button_release_event(GtkWidget *UNUSED(widget), GdkEvent *event, gpointer user_data)
  202. {
  203. struct Client *browser = (struct Client *)user_data;
  204. if(((GdkEventButton *)event)->button == GDK_BUTTON_MIDDLE)
  205. {
  206. webkit_web_view_try_close(browser->webView);
  207. return TRUE;
  208. }
  209. return FALSE;
  210. }