summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar BanceDev 2026-02-18 20:26:51 -0500
committerGravatar BanceDev 2026-02-18 20:26:51 -0500
commit094ebf4878524ff6244ba06a9b0bbae2d6bfc904 (patch)
tree0fc946426d38ef0fef68637c85d06d8d5f533d98
parentadded startpage search (diff)
upgrade surf to gtk4 and webkit-6.0
-rw-r--r--config.mk10
-rw-r--r--surf.c347
-rw-r--r--webext-surf.c12
3 files changed, 204 insertions, 165 deletions
diff --git a/config.mk b/config.mk
index 544e123..52b35d4 100644
--- a/config.mk
+++ b/config.mk
@@ -12,17 +12,17 @@ LIBDIR = $(LIBPREFIX)/surf
X11INC = `pkg-config --cflags x11`
X11LIB = `pkg-config --libs x11`
-GTKINC = `pkg-config --cflags gtk+-3.0 gcr-3 webkit2gtk-4.1`
-GTKLIB = `pkg-config --libs gtk+-3.0 gcr-3 webkit2gtk-4.1`
-WEBEXTINC = `pkg-config --cflags webkit2gtk-4.1 webkit2gtk-web-extension-4.1 gio-2.0`
-WEBEXTLIBS = `pkg-config --libs webkit2gtk-4.1 webkit2gtk-web-extension-4.1 gio-2.0`
+GTKINC = `pkg-config --cflags gtk4 webkitgtk-6.0`
+GTKLIB = `pkg-config --libs gtk4 webkitgtk-6.0`
+WEBEXTINC = `pkg-config --cflags webkitgtk-web-process-extension-6.0 gio-2.0`
+WEBEXTLIBS = `pkg-config --libs webkitgtk-web-process-extension-6.0 gio-2.0`
# includes and libs
INCS = $(X11INC) $(GTKINC)
LIBS = $(X11LIB) $(GTKLIB) -lgthread-2.0
# flags
-CPPFLAGS = -DVERSION=\"$(VERSION)\" -DGCR_API_SUBJECT_TO_CHANGE \
+CPPFLAGS = -DVERSION=\"$(VERSION)\" \
-DLIBPREFIX=\"$(LIBPREFIX)\" -DWEBEXTDIR=\"$(LIBDIR)\" \
-D_DEFAULT_SOURCE
SURFCFLAGS = -fPIC $(INCS) $(CPPFLAGS)
diff --git a/surf.c b/surf.c
index b980863..7064aaa 100644
--- a/surf.c
+++ b/surf.c
@@ -20,14 +20,11 @@
#include <gdk/gdk.h>
#include <gdk/gdkkeysyms.h>
-#include <gdk/gdkx.h>
+#include <gdk/x11/gdkx.h>
#include <gio/gunixfdlist.h>
#include <glib/gstdio.h>
#include <gtk/gtk.h>
-#include <gtk/gtkx.h>
-#include <gcr/gcr.h>
-#include <JavaScriptCore/JavaScript.h>
-#include <webkit2/webkit2.h>
+#include <webkit/webkit.h>
#include <X11/X.h>
#include <X11/Xatom.h>
#include <glib.h>
@@ -186,10 +183,14 @@ static WebKitWebView *newview(Client *c, WebKitWebView *rv);
static void initwebextensions(WebKitWebContext *wc, Client *c);
static GtkWidget *createview(WebKitWebView *v, WebKitNavigationAction *a,
Client *c);
-static gboolean buttonreleased(GtkWidget *w, GdkEvent *e, Client *c);
-static GdkFilterReturn processx(GdkXEvent *xevent, GdkEvent *event,
- gpointer d);
-static gboolean winevent(GtkWidget *w, GdkEvent *e, Client *c);
+static gboolean buttonpressed(GtkGestureClick *gesture, int n_press,
+ double x, double y, Client *c);
+static void processx(XEvent *xevent, Client *c);
+static gboolean keypress(GtkEventControllerKey *controller, guint keyval,
+ guint keycode, GdkModifierType state, Client *c);
+static void enternotify(GtkEventControllerMotion *controller,
+ double x, double y, Client *c);
+static void leavenotify(GtkEventControllerMotion *controller, Client *c);
static void showview(WebKitWebView *v, Client *c);
static GtkWidget *createwindow(Client *c);
static gboolean loadfailedtls(WebKitWebView *v, gchar *uri,
@@ -222,7 +223,7 @@ static void closeview(WebKitWebView *v, Client *c);
static void destroywin(GtkWidget* w, Client *c);
/* Hotkeys */
-static void pasteuri(GtkClipboard *clipboard, const char *text, gpointer d);
+static void pasteuri(GdkClipboard *clipboard, GAsyncResult *res, gpointer d);
static void reload(Client *c, const Arg *a);
static void print(Client *c, const Arg *a);
static void showcert(Client *c, const Arg *a);
@@ -247,17 +248,16 @@ static char winid[64];
static char togglestats[11];
static char pagestats[2];
static Atom atoms[AtomLast];
-static Window embed;
static int showxid;
static int cookiepolicy;
static Display *dpy;
static Client *clients;
-static GdkDevice *gdkkb;
static char *stylefile;
static const char *useragent;
static Parameter *curconfig;
static int modparams[ParameterLast];
static int spair[2];
+static GMainLoop *mainloop;
char *argv0;
static ParamName loadtransient[] = {
@@ -320,7 +320,7 @@ void
usage(void)
{
die("usage: surf [-bBdDfFgGiIkKmMnNsStTvwxX]\n"
- "[-a cookiepolicies ] [-c cookiefile] [-C stylefile] [-e xid]\n"
+ "[-a cookiepolicies ] [-c cookiefile] [-C stylefile]\n"
"[-r scriptfile] [-u useragent] [-z zoomlevel] [uri]\n");
}
@@ -328,7 +328,6 @@ void
setup(void)
{
GIOChannel *gchanin;
- GdkDisplay *gdpy;
int i, j;
/* clean up any zombies immediately */
@@ -345,9 +344,7 @@ setup(void)
atoms[AtomUri] = XInternAtom(dpy, "_SURF_URI", False);
atoms[AtomUTF8] = XInternAtom(dpy, "UTF8_STRING", False);
- gtk_init(NULL, NULL);
-
- gdpy = gdk_display_get_default();
+ gtk_init();
curconfig = defconfig;
@@ -360,8 +357,6 @@ setup(void)
else
cachedir = buildpath(cachedir);
- gdkkb = gdk_seat_get_keyboard(gdk_display_get_default_seat(gdpy));
-
if (socketpair(AF_UNIX, SOCK_DGRAM, 0, spair) < 0) {
fputs("Unable to create sockets\n", stderr);
spair[0] = spair[1] = -1;
@@ -773,7 +768,8 @@ setparameter(Client *c, int refresh, ParamName p, const Arg *a)
return; /* do not update */
case CookiePolicies:
webkit_cookie_manager_set_accept_policy(
- webkit_web_context_get_cookie_manager(c->context),
+ webkit_network_session_get_cookie_manager(
+ webkit_web_view_get_network_session(c->view)),
cookiepolicy_get());
refresh = 0;
break;
@@ -790,8 +786,7 @@ setparameter(Client *c, int refresh, ParamName p, const Arg *a)
webkit_settings_set_default_charset(c->settings, a->v);
return; /* do not update */
case DNSPrefetch:
- webkit_settings_set_enable_dns_prefetching(c->settings, a->i);
- return; /* do not update */
+ return; /* removed in WebKit 6.0 */
case FileURLsCrossAccess:
webkit_settings_set_allow_file_access_from_file_urls(
c->settings, a->i);
@@ -853,8 +848,8 @@ setparameter(Client *c, int refresh, ParamName p, const Arg *a)
case SpellLanguages:
return; /* do nothing */
case StrictTLS:
- webkit_website_data_manager_set_tls_errors_policy(
- webkit_web_view_get_website_data_manager(c->view), a->i ?
+ webkit_network_session_set_tls_errors_policy(
+ webkit_web_view_get_network_session(c->view), a->i ?
WEBKIT_TLS_ERRORS_POLICY_FAIL :
WEBKIT_TLS_ERRORS_POLICY_IGNORE);
break;
@@ -912,7 +907,8 @@ setcert(Client *c, const char *uri)
if ((uri = strstr(uri, "https://"))) {
uri += sizeof("https://") - 1;
host = g_strndup(uri, strchr(uri, '/') - uri);
- webkit_web_context_allow_tls_certificate_for_host(c->context,
+ webkit_network_session_allow_tls_certificate_for_host(
+ webkit_web_view_get_network_session(c->view),
cert, host);
g_free(host);
}
@@ -1018,11 +1014,6 @@ newwindow(Client *c, const Arg *a, int noembed)
cmd[i++] = stylefile;
}
cmd[i++] = curconfig[DiskCache].val.i ? "-D" : "-d";
- if (embed && !noembed) {
- cmd[i++] = "-e";
- snprintf(tmp, LENGTH(tmp), "%lu", embed);
- cmd[i++] = tmp;
- }
cmd[i++] = curconfig[RunInFullscreen].val.i ? "-F" : "-f" ;
cmd[i++] = curconfig[Geolocation].val.i ? "-G" : "-g" ;
cmd[i++] = curconfig[LoadImages].val.i ? "-I" : "-i" ;
@@ -1107,12 +1098,16 @@ newview(Client *c, WebKitWebView *rv)
WebKitWebView *v;
WebKitSettings *settings;
WebKitWebContext *context;
+ WebKitNetworkSession *networksession;
WebKitCookieManager *cookiemanager;
WebKitUserContentManager *contentmanager;
/* Webview */
if (rv) {
- v = WEBKIT_WEB_VIEW(webkit_web_view_new_with_related_view(rv));
+ /* Related view: share the same web context */
+ v = WEBKIT_WEB_VIEW(g_object_new(WEBKIT_TYPE_WEB_VIEW,
+ "related-view", rv,
+ NULL));
context = webkit_web_view_get_context(v);
settings = webkit_web_view_get_settings(v);
} else {
@@ -1124,7 +1119,6 @@ newview(Client *c, WebKitWebView *rv)
"default-font-size", curconfig[FontSize].val.i,
"enable-caret-browsing", curconfig[CaretBrowsing].val.i,
"enable-developer-extras", curconfig[Inspector].val.i,
- "enable-dns-prefetching", curconfig[DNSPrefetch].val.i,
"enable-html5-database", curconfig[DiskCache].val.i,
"enable-html5-local-storage", curconfig[DiskCache].val.i,
"enable-javascript", curconfig[JavaScript].val.i,
@@ -1134,7 +1128,7 @@ newview(Client *c, WebKitWebView *rv)
"media-playback-requires-user-gesture", curconfig[MediaManualPlay].val.i,
NULL);
/* For more interesting settings, have a look at
- * http://webkitgtk.org/reference/webkit2gtk/stable/WebKitSettings.html */
+ * https://webkitgtk.org/reference/webkitgtk/stable/class.Settings.html */
if (strcmp(fulluseragent, "")) {
webkit_settings_set_user_agent(settings, fulluseragent);
@@ -1146,38 +1140,33 @@ newview(Client *c, WebKitWebView *rv)
contentmanager = webkit_user_content_manager_new();
+ /* WebKit 6.0: network session owns ephemeral mode, cookies, TLS */
if (curconfig[Ephemeral].val.i) {
- context = webkit_web_context_new_ephemeral();
+ networksession = webkit_network_session_new_ephemeral();
} else {
- context = webkit_web_context_new_with_website_data_manager(
- webkit_website_data_manager_new(
- "base-cache-directory", cachedir,
- "base-data-directory", cachedir,
- NULL));
+ networksession = webkit_network_session_new(
+ cachedir, /* data directory */
+ cachedir); /* cache directory */
}
- cookiemanager = webkit_web_context_get_cookie_manager(context);
-
- /* TLS */
- webkit_website_data_manager_set_tls_errors_policy(
- webkit_web_context_get_website_data_manager(context),
+ /* TLS policy */
+ webkit_network_session_set_tls_errors_policy(networksession,
curconfig[StrictTLS].val.i ? WEBKIT_TLS_ERRORS_POLICY_FAIL :
WEBKIT_TLS_ERRORS_POLICY_IGNORE);
- /* disk cache */
- webkit_web_context_set_cache_model(context,
- curconfig[DiskCache].val.i ? WEBKIT_CACHE_MODEL_WEB_BROWSER :
- WEBKIT_CACHE_MODEL_DOCUMENT_VIEWER);
- /* Currently only works with text file to be compatible with curl */
+ /* Cookie manager lives on network session in WebKit 6.0 */
+ cookiemanager = webkit_network_session_get_cookie_manager(networksession);
if (!curconfig[Ephemeral].val.i)
webkit_cookie_manager_set_persistent_storage(cookiemanager,
cookiefile, WEBKIT_COOKIE_PERSISTENT_STORAGE_TEXT);
- /* cookie policy */
webkit_cookie_manager_set_accept_policy(cookiemanager,
cookiepolicy_get());
- /* languages */
- webkit_web_context_set_preferred_languages(context,
- curconfig[PreferredLanguages].val.v);
+
+ /* WebKitWebContext: spell checking, extensions, cache model */
+ context = webkit_web_context_new();
+ webkit_web_context_set_cache_model(context,
+ curconfig[DiskCache].val.i ? WEBKIT_CACHE_MODEL_WEB_BROWSER :
+ WEBKIT_CACHE_MODEL_DOCUMENT_VIEWER);
webkit_web_context_set_spell_checking_languages(context,
curconfig[SpellLanguages].val.v);
webkit_web_context_set_spell_checking_enabled(context,
@@ -1185,13 +1174,14 @@ newview(Client *c, WebKitWebView *rv)
g_signal_connect(G_OBJECT(context), "download-started",
G_CALLBACK(downloadstarted), c);
- g_signal_connect(G_OBJECT(context), "initialize-web-extensions",
+ g_signal_connect(G_OBJECT(context), "initialize-web-process-extensions",
G_CALLBACK(initwebextensions), c);
v = g_object_new(WEBKIT_TYPE_WEB_VIEW,
"settings", settings,
"user-content-manager", contentmanager,
"web-context", context,
+ "network-session", networksession,
NULL);
}
@@ -1199,8 +1189,6 @@ newview(Client *c, WebKitWebView *rv)
G_CALLBACK(progresschanged), c);
g_signal_connect(G_OBJECT(v), "notify::title",
G_CALLBACK(titlechanged), c);
- g_signal_connect(G_OBJECT(v), "button-release-event",
- G_CALLBACK(buttonreleased), c);
g_signal_connect(G_OBJECT(v), "close",
G_CALLBACK(closeview), c);
g_signal_connect(G_OBJECT(v), "create",
@@ -1235,7 +1223,7 @@ newview(Client *c, WebKitWebView *rv)
void
initwebextensions(WebKitWebContext *wc, Client *c)
{
- webkit_web_context_set_web_extensions_directory(wc, WEBEXTDIR);
+ webkit_web_context_set_web_process_extensions_directory(wc, WEBEXTDIR);
}
GtkWidget *
@@ -1267,19 +1255,32 @@ createview(WebKitWebView *v, WebKitNavigationAction *a, Client *c)
}
gboolean
-buttonreleased(GtkWidget *w, GdkEvent *e, Client *c)
+buttonpressed(GtkGestureClick *gesture, int n_press, double x, double y,
+ Client *c)
{
WebKitHitTestResultContext element;
+ guint button;
+ GdkModifierType state;
+ GdkEvent *event;
int i;
+ if (!c->mousepos)
+ return FALSE;
+
element = webkit_hit_test_result_get_context(c->mousepos);
+ button = gtk_gesture_single_get_current_button(GTK_GESTURE_SINGLE(gesture));
+ event = gtk_event_controller_get_current_event(GTK_EVENT_CONTROLLER(gesture));
+ state = gdk_event_get_modifier_state(event);
for (i = 0; i < LENGTH(buttons); ++i) {
if (element & buttons[i].target &&
- e->button.button == buttons[i].button &&
- CLEANMASK(e->button.state) == CLEANMASK(buttons[i].mask) &&
+ button == buttons[i].button &&
+ CLEANMASK(state) == CLEANMASK(buttons[i].mask) &&
buttons[i].func) {
buttons[i].func(c, &buttons[i].arg, c->mousepos);
+ if (buttons[i].stopevent)
+ gtk_gesture_set_state(GTK_GESTURE(gesture),
+ GTK_EVENT_SEQUENCE_CLAIMED);
return buttons[i].stopevent;
}
}
@@ -1287,76 +1288,87 @@ buttonreleased(GtkWidget *w, GdkEvent *e, Client *c)
return FALSE;
}
-GdkFilterReturn
-processx(GdkXEvent *e, GdkEvent *event, gpointer d)
+void
+processx(XEvent *e, Client *c)
{
- Client *c = (Client *)d;
XPropertyEvent *ev;
Arg a;
- if (((XEvent *)e)->type == PropertyNotify) {
- ev = &((XEvent *)e)->xproperty;
+ if (e->type == PropertyNotify) {
+ ev = &e->xproperty;
if (ev->state == PropertyNewValue) {
if (ev->atom == atoms[AtomFind]) {
find(c, NULL);
-
- return GDK_FILTER_REMOVE;
} else if (ev->atom == atoms[AtomGo]) {
a.v = getatom(c, AtomGo);
loaduri(c, &a);
-
- return GDK_FILTER_REMOVE;
}
}
}
- return GDK_FILTER_CONTINUE;
+}
+
+/* Poll for X11 PropertyNotify events for xprop IPC (replaces gdk_window_add_filter) */
+static gboolean
+pollx(gpointer d)
+{
+ Client *c = (Client *)d;
+ XEvent ev;
+
+ while (XCheckWindowEvent(dpy, c->xid, PropertyChangeMask, &ev)) {
+ processx(&ev, c);
+ }
+
+ return G_SOURCE_CONTINUE;
+}
+
+void
+enternotify(GtkEventControllerMotion *controller, double x, double y,
+ Client *c)
+{
+ c->overtitle = c->targeturi;
+ updatetitle(c);
+}
+
+void
+leavenotify(GtkEventControllerMotion *controller, Client *c)
+{
+ c->overtitle = NULL;
+ updatetitle(c);
}
gboolean
-winevent(GtkWidget *w, GdkEvent *e, Client *c)
+keypress(GtkEventControllerKey *controller, guint keyval, guint keycode,
+ GdkModifierType state, Client *c)
{
int i;
- switch (e->type) {
- case GDK_ENTER_NOTIFY:
- c->overtitle = c->targeturi;
- updatetitle(c);
- break;
- case GDK_KEY_PRESS:
- if (!curconfig[KioskMode].val.i) {
- for (i = 0; i < LENGTH(keys); ++i) {
- if (gdk_keyval_to_lower(e->key.keyval) ==
- keys[i].keyval &&
- CLEANMASK(e->key.state) == keys[i].mod &&
- keys[i].func) {
- updatewinid(c);
- keys[i].func(c, &(keys[i].arg));
- return TRUE;
- }
+ if (!curconfig[KioskMode].val.i) {
+ for (i = 0; i < LENGTH(keys); ++i) {
+ if (gdk_keyval_to_lower(keyval) == keys[i].keyval &&
+ CLEANMASK(state) == keys[i].mod &&
+ keys[i].func) {
+ updatewinid(c);
+ keys[i].func(c, &(keys[i].arg));
+ return TRUE;
}
}
- case GDK_LEAVE_NOTIFY:
- c->overtitle = NULL;
- updatetitle(c);
- break;
- case GDK_WINDOW_STATE:
- if (e->window_state.changed_mask ==
- GDK_WINDOW_STATE_FULLSCREEN)
- c->fullscreen = e->window_state.new_window_state &
- GDK_WINDOW_STATE_FULLSCREEN;
- break;
- default:
- break;
}
return FALSE;
}
+static void
+onsurfacestate(GdkSurface *surface, GParamSpec *pspec, Client *c)
+{
+ GdkToplevelState state = gdk_toplevel_get_state(GDK_TOPLEVEL(surface));
+ c->fullscreen = !!(state & GDK_TOPLEVEL_STATE_FULLSCREEN);
+}
+
void
showview(WebKitWebView *v, Client *c)
{
GdkRGBA bgcolor = { 0 };
- GdkWindow *gwin;
+ GdkSurface *gsurface;
c->finder = webkit_web_view_get_find_controller(c->view);
c->inspector = webkit_web_view_get_inspector(c->view);
@@ -1364,12 +1376,15 @@ showview(WebKitWebView *v, Client *c)
c->pageid = webkit_web_view_get_page_id(c->view);
c->win = createwindow(c);
- gtk_container_add(GTK_CONTAINER(c->win), GTK_WIDGET(c->view));
- gtk_widget_show_all(c->win);
+ gtk_window_set_child(GTK_WINDOW(c->win), GTK_WIDGET(c->view));
+ gtk_widget_set_visible(GTK_WIDGET(c->view), TRUE);
+ gtk_widget_set_visible(c->win, TRUE);
gtk_widget_grab_focus(GTK_WIDGET(c->view));
- gwin = gtk_widget_get_window(GTK_WIDGET(c->win));
- c->xid = gdk_x11_window_get_xid(gwin);
+ /* We need the surface to exist to get the XID, so realize first */
+ gtk_widget_realize(c->win);
+ gsurface = gtk_native_get_surface(GTK_NATIVE(c->win));
+ c->xid = GDK_SURFACE_XID(gsurface);
updatewinid(c);
if (showxid) {
gdk_display_sync(gtk_widget_get_display(c->win));
@@ -1380,9 +1395,14 @@ showview(WebKitWebView *v, Client *c)
if (curconfig[HideBackground].val.i)
webkit_web_view_set_background_color(c->view, &bgcolor);
+ /* Track fullscreen state changes */
+ g_signal_connect(gsurface, "notify::state",
+ G_CALLBACK(onsurfacestate), c);
+
if (!curconfig[KioskMode].val.i) {
- gdk_window_set_events(gwin, GDK_ALL_EVENTS_MASK);
- gdk_window_add_filter(gwin, processx, c);
+ XSelectInput(dpy, c->xid, PropertyChangeMask);
+ /* Poll for X11 PropertyNotify events every 50ms (replaces gdk_window_add_filter) */
+ g_timeout_add(50, pollx, c);
}
if (curconfig[RunInFullscreen].val.i)
@@ -1401,33 +1421,38 @@ createwindow(Client *c)
{
char *wmstr;
GtkWidget *w;
+ GtkEventController *controller;
+ GtkGesture *gesture;
- if (embed) {
- w = gtk_plug_new(embed);
- } else {
- w = gtk_window_new(GTK_WINDOW_TOPLEVEL);
-
- wmstr = g_path_get_basename(argv0);
- gtk_window_set_wmclass(GTK_WINDOW(w), wmstr, "Surf");
- g_free(wmstr);
+ w = gtk_window_new();
- wmstr = g_strdup_printf("%s[%"PRIu64"]", "Surf", c->pageid);
- gtk_window_set_role(GTK_WINDOW(w), wmstr);
- g_free(wmstr);
+ wmstr = g_strdup_printf("%s[%"PRIu64"]", "Surf", c->pageid);
+ gtk_window_set_title(GTK_WINDOW(w), wmstr);
+ g_free(wmstr);
- gtk_window_set_default_size(GTK_WINDOW(w), winsize[0], winsize[1]);
- }
+ gtk_window_set_default_size(GTK_WINDOW(w), winsize[0], winsize[1]);
g_signal_connect(G_OBJECT(w), "destroy",
G_CALLBACK(destroywin), c);
- g_signal_connect(G_OBJECT(w), "enter-notify-event",
- G_CALLBACK(winevent), c);
- g_signal_connect(G_OBJECT(w), "key-press-event",
- G_CALLBACK(winevent), c);
- g_signal_connect(G_OBJECT(w), "leave-notify-event",
- G_CALLBACK(winevent), c);
- g_signal_connect(G_OBJECT(w), "window-state-event",
- G_CALLBACK(winevent), c);
+
+ /* Key press controller */
+ controller = gtk_event_controller_key_new();
+ g_signal_connect(controller, "key-pressed",
+ G_CALLBACK(keypress), c);
+ gtk_widget_add_controller(w, controller);
+
+ /* Mouse enter/leave controller */
+ controller = gtk_event_controller_motion_new();
+ g_signal_connect(controller, "enter", G_CALLBACK(enternotify), c);
+ g_signal_connect(controller, "leave", G_CALLBACK(leavenotify), c);
+ gtk_widget_add_controller(w, controller);
+
+ /* Button (click) gesture for mouse buttons */
+ gesture = gtk_gesture_click_new();
+ gtk_gesture_single_set_button(GTK_GESTURE_SINGLE(gesture), 0); /* all buttons */
+ g_signal_connect(gesture, "pressed",
+ G_CALLBACK(buttonpressed), c);
+ gtk_widget_add_controller(w, GTK_EVENT_CONTROLLER(gesture));
return w;
}
@@ -1771,7 +1796,7 @@ webprocessterminated(WebKitWebView *v, WebKitWebProcessTerminationReason r,
void
closeview(WebKitWebView *v, Client *c)
{
- gtk_widget_destroy(c->win);
+ gtk_window_destroy(GTK_WINDOW(c->win));
}
void
@@ -1779,15 +1804,21 @@ destroywin(GtkWidget* w, Client *c)
{
destroyclient(c);
if (!clients)
- gtk_main_quit();
+ g_main_loop_quit(mainloop);
}
void
-pasteuri(GtkClipboard *clipboard, const char *text, gpointer d)
+pasteuri(GdkClipboard *clipboard, GAsyncResult *res, gpointer d)
{
+ GError *err = NULL;
+ char *text = gdk_clipboard_read_text_finish(clipboard, res, &err);
Arg a = {.v = text };
- if (text)
+ if (text) {
loaduri((Client *) d, &a);
+ g_free(text);
+ }
+ if (err)
+ g_error_free(err);
}
void
@@ -1810,37 +1841,45 @@ void
showcert(Client *c, const Arg *a)
{
GTlsCertificate *cert = c->failedcert ? c->failedcert : c->cert;
- GcrCertificate *gcrt;
- GByteArray *crt;
- GtkWidget *win;
- GcrCertificateWidget *wcert;
+ GtkWidget *win, *sw, *view;
+ gchar *pem = NULL;
if (!cert)
return;
- g_object_get(cert, "certificate", &crt, NULL);
- gcrt = gcr_simple_certificate_new(crt->data, crt->len);
- g_byte_array_unref(crt);
+ win = gtk_window_new();
+ gtk_window_set_title(GTK_WINDOW(win), "Certificate");
+ gtk_window_set_default_size(GTK_WINDOW(win), 500, 400);
+
+ sw = gtk_scrolled_window_new();
+ view = gtk_text_view_new();
+ gtk_text_view_set_editable(GTK_TEXT_VIEW(view), FALSE);
+ gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(view), GTK_WRAP_WORD_CHAR);
+ gtk_text_view_set_monospace(GTK_TEXT_VIEW(view), TRUE);
- win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
- wcert = gcr_certificate_widget_new(gcrt);
- g_object_unref(gcrt);
+ g_object_get(cert, "certificate-pem", &pem, NULL);
+ if (pem) {
+ GtkTextBuffer *buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view));
+ gtk_text_buffer_set_text(buf, pem, -1);
+ g_free(pem);
+ }
- gtk_container_add(GTK_CONTAINER(win), GTK_WIDGET(wcert));
- gtk_widget_show_all(win);
+ gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(sw), view);
+ gtk_window_set_child(GTK_WINDOW(win), sw);
+ gtk_widget_set_visible(win, TRUE);
}
void
clipboard(Client *c, const Arg *a)
{
+ GdkClipboard *clipboard = gtk_widget_get_primary_clipboard(c->win);
+
if (a->i) { /* load clipboard uri */
- gtk_clipboard_request_text(gtk_clipboard_get(
- GDK_SELECTION_PRIMARY),
- pasteuri, c);
+ gdk_clipboard_read_text_async(clipboard, NULL,
+ (GAsyncReadyCallback)pasteuri, c);
} else { /* copy uri */
- gtk_clipboard_set_text(gtk_clipboard_get(
- GDK_SELECTION_PRIMARY), c->targeturi
- ? c->targeturi : geturi(c), -1);
+ gdk_clipboard_set_text(clipboard,
+ c->targeturi ? c->targeturi : geturi(c));
}
}
@@ -1998,6 +2037,9 @@ main(int argc, char *argv[])
Arg arg;
Client *c;
+ /* Force X11 backend - required for xprop/dmenu IPC */
+ setenv("GDK_BACKEND", "x11", 0);
+
memset(&arg, 0, sizeof(arg));
/* command line args */
@@ -2028,9 +2070,6 @@ main(int argc, char *argv[])
defconfig[DiskCache].val.i = 1;
defconfig[DiskCache].prio = 2;
break;
- case 'e':
- embed = strtol(EARGF(usage()), NULL, 0);
- break;
case 'f':
defconfig[RunInFullscreen].val.i = 0;
defconfig[RunInFullscreen].prio = 2;
@@ -2133,7 +2172,9 @@ main(int argc, char *argv[])
loaduri(c, &arg);
updatetitle(c);
- gtk_main();
+ mainloop = g_main_loop_new(NULL, FALSE);
+ g_main_loop_run(mainloop);
+ g_main_loop_unref(mainloop);
cleanup();
return 0;
diff --git a/webext-surf.c b/webext-surf.c
index 7063fa7..412f38b 100644
--- a/webext-surf.c
+++ b/webext-surf.c
@@ -8,15 +8,13 @@
#include <gio/gio.h>
#include <gio/gunixfdlist.h>
-#include <webkit2/webkit-web-extension.h>
-#include <webkitdom/webkitdom.h>
-#include <webkitdom/WebKitDOMDOMWindowUnstable.h>
+#include <webkit/webkit-web-process-extension.h>
#include "common.h"
#define LENGTH(x) (sizeof(x) / sizeof(x[0]))
-static WebKitWebExtension *webext;
+static WebKitWebProcessExtension *webext;
static int sock;
/*
@@ -32,7 +30,7 @@ evalmsg(char *msg, size_t sz)
JSCContext *jsc;
JSCValue *jsv;
- if (!(page = webkit_web_extension_get_page(webext, msg[0])))
+ if (!(page = webkit_web_process_extension_get_page(webext, msg[0])))
return sz;
if (sz < 2)
@@ -148,7 +146,7 @@ pageusermessagereply(GObject *o, GAsyncResult *r, gpointer page)
}
void
-pagecreated(WebKitWebExtension *e, WebKitWebPage *p, gpointer unused)
+pagecreated(WebKitWebProcessExtension *e, WebKitWebPage *p, gpointer unused)
{
WebKitUserMessage *msg;
@@ -157,7 +155,7 @@ pagecreated(WebKitWebExtension *e, WebKitWebPage *p, gpointer unused)
}
G_MODULE_EXPORT void
-webkit_web_extension_initialize(WebKitWebExtension *e)
+webkit_web_process_extension_initialize(WebKitWebProcessExtension *e)
{
webext = e;