diff options
| author | 2026-02-18 20:26:51 -0500 | |
|---|---|---|
| committer | 2026-02-18 20:26:51 -0500 | |
| commit | 094ebf4878524ff6244ba06a9b0bbae2d6bfc904 (patch) | |
| tree | 0fc946426d38ef0fef68637c85d06d8d5f533d98 | |
| parent | added startpage search (diff) | |
upgrade surf to gtk4 and webkit-6.0
| -rw-r--r-- | config.mk | 10 | ||||
| -rw-r--r-- | surf.c | 347 | ||||
| -rw-r--r-- | webext-surf.c | 12 |
3 files changed, 204 insertions, 165 deletions
@@ -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) @@ -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; |
