Summary Files Commits Branches @commit @diff @stats
path: root / badwolf.c
diff options
context:
space:
mode:
1 files changed, 35 insertions, 201 deletions
-rw-r--r--badwolf.c236
diff --git a/badwolf.c b/badwolf.c
index 6677d99..6c6b0c9 100644
--- a/badwolf.c
+++ b/badwolf.c
@@ -2,61 +2,31 @@
// Copyright © 2019 Haelwenn (lanodan) Monnier <contact@hacktivis.me>
// SPDX-License-Identifier: BSD-3-Clause
+#include "badwolf.h"
+
#include "config.h"
+#include "keybindings.h"
#include <glib/gi18n.h> /* _() and other internationalization/localization helpers */
#include <glib/gprintf.h> /* g_fprintf() */
-#include <gtk/gtk.h>
-#include <locale.h> /* LC_* */
-#include <stdlib.h> /* realpath(), malloc() */
-#include <webkit2/webkit2.h>
+#include <locale.h> /* LC_* */
+#include <stdlib.h> /* realpath(), malloc() */
const gchar *homepage = "https://hacktivis.me/projects/badwolf";
-const gchar *version = "0.3.0";
-
-struct Window
-{
- GtkWidget *main_window;
- GtkWidget *notebook;
- GtkWidget *new_tab;
-};
-
-struct Client
-{
- GtkWidget *box;
-
- GtkWidget *toolbar;
- GtkWidget *javascript;
- GtkWidget *location;
+const gchar *version = VERSION;
- WebKitWebView *webView;
- struct Window *window;
+gchar *web_extensions_directory;
- GtkWidget *statusbar;
- GtkWidget *statuslabel;
- GtkWidget *search;
-};
-
-gchar *ensure_uri_scheme(gchar *text, gboolean try_file);
static gboolean WebViewCb_close(WebKitWebView *webView, gpointer user_data);
-static gboolean
-commonCb_key_press_event(struct Window *window, GdkEvent *event, struct Client *browser);
-static gboolean
-WebViewCb_key_press_event(WebKitWebView *webView, GdkEvent *event, gpointer user_data);
-static gboolean
-main_windowCb_key_press_event(GtkWidget *widget, GdkEvent *event, gpointer user_data);
-static gboolean boxCb_key_press_event(GtkWidget *widget, GdkEvent *event, gpointer user_data);
static gboolean WebViewCb_web_process_terminated(WebKitWebView *webView,
WebKitWebProcessTerminationReason reason,
gpointer user_data);
static gboolean
WebViewCb_notify__uri(WebKitWebView *webView, GParamSpec *pspec, gpointer user_data);
-GtkWidget *badwolf_new_tab_box(const gchar *title, struct Client *browser);
static gboolean
WebViewCb_notify__title(WebKitWebView *webView, GParamSpec *pspec, gpointer user_data);
static gboolean
WebViewCb_notify__is__playing__audio(WebKitWebView *webView, GParamSpec *pspec, gpointer user_data);
-void webView_tab_label_change(struct Client *browser, const gchar *title);
static gboolean WebViewCb_notify__estimated_load_progress(WebKitWebView *webView,
GParamSpec *pspec,
gpointer user_data);
@@ -74,7 +44,7 @@ static gboolean WebViewCb_decide_policy(WebKitWebView *web_view,
WebKitPolicyDecision *decision,
WebKitPolicyDecisionType decision_type,
gpointer user_data);
-static void web_contentCb_download_started(WebKitWebContext *context,
+static void web_contextCb_download_started(WebKitWebContext *web_context,
WebKitDownload *download,
gpointer user_data);
static gboolean downloadCb_decide_destination(WebKitDownload *download,
@@ -86,28 +56,13 @@ static gboolean SearchEntryCb_next__match(GtkSearchEntry *search, gpointer user_
static gboolean SearchEntryCb_previous__match(GtkSearchEntry *search, gpointer user_data);
static gboolean SearchEntryCb_search__changed(GtkSearchEntry *search, gpointer user_data);
static gboolean SearchEntryCb_stop__search(GtkSearchEntry *search, gpointer user_data);
-struct Client *
-new_browser(struct Window *window, gchar *target_url, WebKitWebView *related_web_view);
-int badwolf_new_tab(GtkNotebook *notebook, struct Client *browser);
static void new_tabCb_clicked(GtkButton *new_tab, gpointer user_data);
static void closeCb_clicked(GtkButton *close, gpointer user_data);
static void
notebookCb_switch__page(GtkNotebook *notebook, GtkWidget *page, guint page_num, gpointer user_data);
-gint get_tab_position(GtkContainer *notebook, GtkWidget *child);
-/* ensure_uri_scheme: tries to add a scheme on a pseudo-URL missing a scheme
- * - gchar text: pseudo-URL missing a scheme
- * - gboolean try_file: when TRUE check try first if it can be a file:// path
- *
- * When `text` isn't exploitable (ie. NULL), returns "about:blank",
- * when the URL seems to be valid, return it,
- * if try_file is TRUE, check if it can be file:// path,
- * some other checks might be added.
- * In the end use the fallback (`http://` for now, might get configuration),
- * might get some safeguard.
- */
gchar *
-ensure_uri_scheme(gchar *text, gboolean try_file)
+badwolf_ensure_uri_scheme(gchar *text, gboolean try_file)
{
if(text == NULL) return "about:blank";
@@ -132,23 +87,6 @@ ensure_uri_scheme(gchar *text, gboolean try_file)
return g_strdup_printf("http://%s", text);
}
-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 gboolean
WebViewCb_close(WebKitWebView *webView, gpointer user_data)
{
@@ -156,7 +94,8 @@ WebViewCb_close(WebKitWebView *webView, gpointer user_data)
struct Client *browser = (struct Client *)user_data;
GtkNotebook *notebook = GTK_NOTEBOOK(browser->window->notebook);
- gtk_notebook_remove_page(notebook, get_tab_position(GTK_CONTAINER(notebook), browser->box));
+ gtk_notebook_remove_page(notebook,
+ badwolf_get_tab_position(GTK_CONTAINER(notebook), browser->box));
gtk_widget_destroy(browser->box);
@@ -165,122 +104,6 @@ WebViewCb_close(WebKitWebView *webView, gpointer user_data)
return TRUE;
}
-/* 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
- */
-static 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;
- }
- }
- else
- {
- switch(((GdkEventKey *)event)->keyval)
- {
- case GDK_KEY_F1: badwolf_about_dialog(GTK_WINDOW(window->main_window)); return TRUE;
- }
- }
-
- return FALSE;
-}
-
-static 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;
-}
-
-static 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;
-}
-
-static 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;
-}
static gboolean
WebViewCb_web_process_terminated(WebKitWebView *webView,
WebKitWebProcessTerminationReason reason,
@@ -405,7 +228,7 @@ webView_tab_label_change(struct Client *browser, const gchar *title)
gtk_notebook_set_menu_label_text(GTK_NOTEBOOK(notebook), browser->box, title);
// Set the window title if the title change was on the current tab
- if(get_tab_position(GTK_CONTAINER(notebook), browser->box) ==
+ if(badwolf_get_tab_position(GTK_CONTAINER(notebook), browser->box) ==
gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook)))
gtk_window_set_title(GTK_WINDOW(browser->window->main_window), title);
}
@@ -532,11 +355,11 @@ WebViewCb_decide_policy(WebKitWebView *web_view,
}
static void
-web_contentCb_download_started(WebKitWebContext *context,
+web_contextCb_download_started(WebKitWebContext *web_context,
WebKitDownload *download,
gpointer user_data)
{
- (void)context;
+ (void)web_context;
g_signal_connect(G_OBJECT(download),
"decide-destination",
@@ -585,7 +408,7 @@ locationCb_activate(GtkEntry *location, gpointer user_data)
char *target_url;
struct Client *browser = (struct Client *)user_data;
- target_url = ensure_uri_scheme((char *)gtk_entry_get_text(location), TRUE);
+ target_url = badwolf_ensure_uri_scheme((char *)gtk_entry_get_text(location), TRUE);
if(target_url != NULL) webkit_web_view_load_uri(browser->webView, target_url);
@@ -599,7 +422,7 @@ javascriptCb_toggled(GtkButton *javascript, gpointer user_data)
WebKitSettings *settings = webkit_web_view_get_settings(browser->webView);
- webkit_settings_set_enable_javascript(
+ webkit_settings_set_enable_javascript_markup(
settings, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(javascript)));
webkit_web_view_set_settings(browser->webView, settings);
@@ -659,7 +482,7 @@ struct Client *
new_browser(struct Window *window, gchar *target_url, WebKitWebView *related_web_view)
{
struct Client *browser = malloc(sizeof(struct Client));
- target_url = ensure_uri_scheme(target_url, (related_web_view == NULL));
+ target_url = badwolf_ensure_uri_scheme(target_url, (related_web_view == NULL));
char *badwolf_l10n = NULL;
if(browser == NULL) return NULL;
@@ -675,9 +498,12 @@ new_browser(struct Window *window, gchar *target_url, WebKitWebView *related_web
browser->search = gtk_search_entry_new();
WebKitWebContext *web_context = webkit_web_context_new_ephemeral();
+ webkit_web_context_set_sandbox_enabled(web_context, TRUE);
webkit_web_context_set_process_model(web_context,
WEBKIT_PROCESS_MODEL_MULTIPLE_SECONDARY_PROCESSES);
+ webkit_web_context_set_web_extensions_directory(web_context, web_extensions_directory);
+
badwolf_l10n = getenv("BADWOLF_L10N");
if(badwolf_l10n != NULL)
@@ -691,6 +517,9 @@ new_browser(struct Window *window, gchar *target_url, WebKitWebView *related_web
WebKitSettings *settings = webkit_settings_new_with_settings(BADWOLF_WEBKIT_SETTINGS);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(browser->javascript),
+ webkit_settings_get_enable_javascript_markup(settings));
+
browser->webView = WEBKIT_WEB_VIEW(g_object_new(WEBKIT_TYPE_WEB_VIEW,
"web-context",
web_context,
@@ -735,6 +564,7 @@ new_browser(struct Window *window, gchar *target_url, WebKitWebView *related_web
gtk_widget_set_halign(browser->statusbar, GTK_ALIGN_START);
gtk_label_set_single_line_mode(GTK_LABEL(browser->statuslabel), TRUE);
+ gtk_label_set_ellipsize(GTK_LABEL(browser->statuslabel), BADWOLF_STATUSLABEL_ELLIPSIZE);
gtk_entry_set_text(GTK_ENTRY(browser->location), target_url);
gtk_entry_set_has_frame(GTK_ENTRY(browser->location), FALSE);
@@ -780,7 +610,7 @@ new_browser(struct Window *window, gchar *target_url, WebKitWebView *related_web
/* signals for WebView's WebContext */
g_signal_connect(G_OBJECT(web_context),
"download-started",
- G_CALLBACK(web_contentCb_download_started),
+ G_CALLBACK(web_contextCb_download_started),
browser);
/* signals for search widget */
@@ -861,7 +691,7 @@ notebookCb_switch__page(GtkNotebook *notebook, GtkWidget *page, guint page_num,
}
gint
-get_tab_position(GtkContainer *notebook, GtkWidget *child)
+badwolf_get_tab_position(GtkContainer *notebook, GtkWidget *child)
{
GValue position = G_VALUE_INIT;
g_value_init(&position, G_TYPE_INT);
@@ -876,13 +706,14 @@ main(int argc, char *argv[])
{
// getting an abort if this one fails to alloc
struct Window *window = g_malloc(sizeof(struct Window));
- gchar *target_url = NULL;
setlocale(LC_ALL, "");
bindtextdomain(PACKAGE, DATADIR "/locale");
bind_textdomain_codeset(PACKAGE, "UTF-8");
textdomain(PACKAGE);
+ gtk_init(&argc, &argv);
+
g_fprintf(stderr, _("Running Badwolf version: %s\n"), version);
g_fprintf(stderr,
_("Buildtime WebKit version: %d.%d.%d\n"),
@@ -895,9 +726,8 @@ main(int argc, char *argv[])
webkit_get_minor_version(),
webkit_get_micro_version());
- gtk_init(&argc, &argv);
-
- if(argv[1]) target_url = argv[1];
+ web_extensions_directory = g_build_filename(g_get_user_data_dir(), "badwolf", "webkit-web-extension", NULL);
+ g_fprintf(stderr, _("webkit-web-extension directory set to: %s\n"), web_extensions_directory);
window->main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
window->notebook = gtk_notebook_new();
@@ -916,7 +746,11 @@ main(int argc, char *argv[])
gtk_container_add(GTK_CONTAINER(window->main_window), window->notebook);
- badwolf_new_tab(GTK_NOTEBOOK(window->notebook), new_browser(window, target_url, NULL));
+ if(argc == 1)
+ badwolf_new_tab(GTK_NOTEBOOK(window->notebook), new_browser(window, NULL, NULL));
+ else
+ for(int i = 1; i < argc; ++i)
+ badwolf_new_tab(GTK_NOTEBOOK(window->notebook), new_browser(window, argv[i], NULL));
g_signal_connect(
window->main_window, "key-press-event", G_CALLBACK(main_windowCb_key_press_event), window);