#include <signal.h>
#include <X11/X.h>
#include <X11/Xatom.h>
+#include <gtk/gtkx.h>
#include <gtk/gtk.h>
#include <gdk/gdkx.h>
#include <gdk/gdk.h>
#include <limits.h>
#include <stdlib.h>
#include <stdio.h>
-#include <webkit/webkit.h>
+#include <webkit2/webkit2.h>
#include <glib/gstdio.h>
#include <JavaScriptCore/JavaScript.h>
#include <sys/file.h>
#define LENGTH(x) (sizeof(x) / sizeof(x[0]))
#define CLEANMASK(mask) (mask & (MODKEY|GDK_SHIFT_MASK))
-#define COOKIEJAR_TYPE (cookiejar_get_type ())
-#define COOKIEJAR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), COOKIEJAR_TYPE, CookieJar))
enum { AtomFind, AtomGo, AtomUri, AtomLast };
enum {
typedef struct Client {
GtkWidget *win, *scroll, *vbox, *pane;
+ Window xid;
WebKitWebView *view;
WebKitWebInspector *inspector;
char *title, *linkhover;
const Arg arg;
} Button;
-typedef struct {
- SoupCookieJarText parent_instance;
- int lock;
-} CookieJar;
-
-typedef struct {
- SoupCookieJarTextClass parent_class;
-} CookieJarClass;
-
-G_DEFINE_TYPE(CookieJar, cookiejar, SOUP_TYPE_COOKIE_JAR_TEXT)
-
typedef struct {
char *regex;
char *style;
static Display *dpy;
static Atom atoms[AtomLast];
static Client *clients = NULL;
-static GdkNativeWindow embed = 0;
+static Window embed = 0;
static gboolean showxid = FALSE;
static char winid[64];
-static gboolean usingproxy = 0;
static char togglestat[9];
static char pagestat[3];
static GTlsDatabase *tlsdb;
-static int policysel = 0;
+static int cookiepolicy;
static char *stylefile = NULL;
-static SoupCache *diskcache = NULL;
static void addaccelgroup(Client *c);
static void beforerequest(WebKitWebView *w, WebKitWebFrame *f,
static void cleanup(void);
static void clipboard(Client *c, const Arg *arg);
-/* Cookiejar implementation */
-static void cookiejar_changed(SoupCookieJar *self, SoupCookie *old_cookie,
- SoupCookie *new_cookie);
-static void cookiejar_finalize(GObject *self);
-static SoupCookieJarAcceptPolicy cookiepolicy_get(void);
-static SoupCookieJar *cookiejar_new(const char *filename, gboolean read_only,
- SoupCookieJarAcceptPolicy policy);
-static void cookiejar_set_property(GObject *self, guint prop_id,
- const GValue *value, GParamSpec *pspec);
-static char cookiepolicy_set(const SoupCookieJarAcceptPolicy p);
+static WebKitCookieAcceptPolicy cookiepolicy_get(void);
+static char cookiepolicy_set(const WebKitCookieAcceptPolicy p);
static char *copystr(char **str, const char *src);
static WebKitWebView *createwindow(WebKitWebView *v, WebKitWebFrame *f,
static void setatom(Client *c, int a, const char *v);
static void setup(void);
static void sigchld(int unused);
-static void source(Client *c, const Arg *arg);
static void spawn(Client *c, const Arg *arg);
static void stop(Client *c, const Arg *arg);
static void titlechange(WebKitWebView *view, GParamSpec *pspec, Client *c);
g_free(dname);
fpath = g_build_filename(bpath, bname, NULL);
+ g_free(bpath);
g_free(bname);
if (!(f = fopen(fpath, "a")))
void
cleanup(void)
{
- if (diskcache) {
- soup_cache_flush(diskcache);
- soup_cache_dump(diskcache);
- }
while (clients)
destroyclient(clients);
g_free(cookiefile);
g_free(stylefile);
}
-void
-cookiejar_changed(SoupCookieJar *self, SoupCookie *old_cookie,
- SoupCookie *new_cookie)
-{
- flock(COOKIEJAR(self)->lock, LOCK_EX);
- if (new_cookie && !new_cookie->expires && sessiontime) {
- soup_cookie_set_expires(new_cookie,
- soup_date_new_from_now(sessiontime));
- }
- SOUP_COOKIE_JAR_CLASS(cookiejar_parent_class)->changed(self,
- old_cookie,
- new_cookie);
- flock(COOKIEJAR(self)->lock, LOCK_UN);
-}
-
-void
-cookiejar_class_init(CookieJarClass *klass)
-{
- SOUP_COOKIE_JAR_CLASS(klass)->changed = cookiejar_changed;
- G_OBJECT_CLASS(klass)->get_property =
- G_OBJECT_CLASS(cookiejar_parent_class)->get_property;
- G_OBJECT_CLASS(klass)->set_property = cookiejar_set_property;
- G_OBJECT_CLASS(klass)->finalize = cookiejar_finalize;
- g_object_class_override_property(G_OBJECT_CLASS(klass), 1, "filename");
-}
-
-void
-cookiejar_finalize(GObject *self)
-{
- close(COOKIEJAR(self)->lock);
- G_OBJECT_CLASS(cookiejar_parent_class)->finalize(self);
-}
-
-void
-cookiejar_init(CookieJar *self)
-{
- self->lock = open(cookiefile, 0);
-}
-
-SoupCookieJar *
-cookiejar_new(const char *filename, gboolean read_only,
- SoupCookieJarAcceptPolicy policy)
-{
- return g_object_new(COOKIEJAR_TYPE,
- SOUP_COOKIE_JAR_TEXT_FILENAME, filename,
- SOUP_COOKIE_JAR_READ_ONLY, read_only,
- SOUP_COOKIE_JAR_ACCEPT_POLICY, policy, NULL);
-}
-
-void
-cookiejar_set_property(GObject *self, guint prop_id, const GValue *value,
- GParamSpec *pspec)
-{
- flock(COOKIEJAR(self)->lock, LOCK_SH);
- G_OBJECT_CLASS(cookiejar_parent_class)->set_property(self, prop_id,
- value, pspec);
- flock(COOKIEJAR(self)->lock, LOCK_UN);
-}
-
-SoupCookieJarAcceptPolicy
+WebKitCookieAcceptPolicy
cookiepolicy_get(void)
{
- switch (cookiepolicies[policysel]) {
+ switch (cookiepolicies[cookiepolicy]) {
case 'a':
- return SOUP_COOKIE_JAR_ACCEPT_NEVER;
+ return WEBKIT_COOKIE_POLICY_ACCEPT_NEVER;
case '@':
- return SOUP_COOKIE_JAR_ACCEPT_NO_THIRD_PARTY;
+ return WEBKIT_COOKIE_POLICY_ACCEPT_NO_THIRD_PARTY;
case 'A':
default:
break;
}
- return SOUP_COOKIE_JAR_ACCEPT_ALWAYS;
+ return WEBKIT_COOKIE_POLICY_ACCEPT_ALWAYS;
}
char
-cookiepolicy_set(const SoupCookieJarAcceptPolicy ep)
+cookiepolicy_set(const WebKitCookieAcceptPolicy ep)
{
switch (ep) {
- case SOUP_COOKIE_JAR_ACCEPT_NEVER:
+ case WEBKIT_COOKIE_POLICY_ACCEPT_NEVER:
return 'a';
- case SOUP_COOKIE_JAR_ACCEPT_NO_THIRD_PARTY:
+ case WEBKIT_COOKIE_POLICY_ACCEPT_NO_THIRD_PARTY:
return '@';
- case SOUP_COOKIE_JAR_ACCEPT_ALWAYS:
+ case WEBKIT_COOKIE_POLICY_ACCEPT_ALWAYS:
default:
break;
}
unsigned long ldummy;
unsigned char *p = NULL;
- XGetWindowProperty(dpy, GDK_WINDOW_XID(GTK_WIDGET(c->win)->window),
- atoms[a], 0L, BUFSIZ, False, XA_STRING,
- &adummy, &idummy, &ldummy, &ldummy, &p);
+ XGetWindowProperty(dpy, c->xid,
+ atoms[a], 0L, BUFSIZ, False, XA_STRING,
+ &adummy, &idummy, &ldummy, &ldummy, &p);
if (p)
strncpy(buf, (char *)p, LENGTH(buf)-1);
else
void
inspector(Client *c, const Arg *arg)
{
- if (c->isinspecting)
- webkit_web_inspector_close(c->inspector);
- else
- webkit_web_inspector_show(c->inspector);
+ if (enableinspector) {
+ if (c->isinspecting)
+ webkit_web_inspector_close(c->inspector);
+ else
+ webkit_web_inspector_show(c->inspector);
+ }
}
WebKitWebView *
}
setatom(c, AtomUri, uri);
- if (enablestyles)
+ if (enablestyle)
setstyle(c, getstyle(uri));
break;
case WEBKIT_LOAD_FINISHED:
c->progress = 100;
updatetitle(c);
- if (diskcache) {
- soup_cache_flush(diskcache);
- soup_cache_dump(diskcache);
- }
break;
default:
break;
WebKitWebFrame *frame;
GdkGeometry hints = { 1, 1 };
GdkScreen *screen;
+ GdkWindow *gwin;
gdouble dpi;
char *ua;
addaccelgroup(c);
/* Pane */
- c->pane = gtk_vpaned_new();
+ c->pane = gtk_paned_new(GTK_ORIENTATION_VERTICAL);
/* VBox */
- c->vbox = gtk_vbox_new(FALSE, 0);
+ c->vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
gtk_paned_pack1(GTK_PANED(c->pane), c->vbox, TRUE, TRUE);
/* Webview */
gtk_widget_show(c->scroll);
gtk_widget_show(GTK_WIDGET(c->view));
gtk_widget_show(c->win);
+ gwin = gtk_widget_get_window(GTK_WIDGET(c->win));
+ c->xid = gdk_x11_window_get_xid(gwin);
gtk_window_set_geometry_hints(GTK_WINDOW(c->win), NULL, &hints,
- GDK_HINT_MIN_SIZE);
- gdk_window_set_events(GTK_WIDGET(c->win)->window, GDK_ALL_EVENTS_MASK);
- gdk_window_add_filter(GTK_WIDGET(c->win)->window, processx, c);
+ GDK_HINT_MIN_SIZE);
+ gdk_window_set_events(gwin, GDK_ALL_EVENTS_MASK);
+ gdk_window_add_filter(gwin, processx, c);
webkit_web_view_set_full_content_zoom(c->view, TRUE);
runscript(frame);
"default-font-size", defaultfontsize, NULL);
g_object_set(G_OBJECT(settings),
"resizable-text-areas", 1, NULL);
- if (enablestyles)
+ if (enablestyle)
setstyle(c, getstyle("about:blank"));
/*
* It is equivalent to firefox's "layout.css.devPixelsPerPx" setting.
*/
if (zoomto96dpi) {
- screen = gdk_window_get_screen(GTK_WIDGET(c->win)->window);
+ screen = gdk_window_get_screen(gwin);
dpi = gdk_screen_get_resolution(screen);
if (dpi != -1) {
g_object_set(G_OBJECT(settings),
if (showxid) {
gdk_display_sync(gtk_widget_get_display(c->win));
- printf("%u\n",
- (guint)GDK_WINDOW_XID(GTK_WIDGET(c->win)->window));
+ printf("%lu\n", c->xid);
fflush(NULL);
if (fclose(stdout) != 0) {
die("Error closing stdout");
* context-menu-action-12 stop
*/
- GtkAction *a = NULL;
- const char *name, *uri;
+ const gchar *name, *uri;
GtkClipboard *prisel, *clpbrd;
- a = gtk_activatable_get_related_action(GTK_ACTIVATABLE(item));
- if (a == NULL)
+ name = gtk_actionable_get_action_name(GTK_ACTIONABLE(item));
+ if (name == NULL)
return;
- name = gtk_action_get_name(a);
if (!g_strcmp0(name, "context-menu-action-3")) {
prisel = gtk_clipboard_get(GDK_SELECTION_PRIMARY);
gtk_clipboard_set_text(prisel, c->linkhover, -1);
setatom(Client *c, int a, const char *v)
{
XSync(dpy, False);
- XChangeProperty(dpy, GDK_WINDOW_XID(GTK_WIDGET(c->win)->window),
- atoms[a], XA_STRING, 8, PropModeReplace,
- (unsigned char *)v, strlen(v) + 1);
+ XChangeProperty(dpy, c->xid,
+ atoms[a], XA_STRING, 8, PropModeReplace,
+ (unsigned char *)v, strlen(v) + 1);
}
void
setup(void)
{
int i;
- char *proxy, *new_proxy;
char *styledirfile, *stylepath;
- SoupURI *puri;
- SoupSession *s;
+ WebKitWebContext *context;
GError *error = NULL;
/* clean up any zombies immediately */
sigchld(0);
gtk_init(NULL, NULL);
- dpy = GDK_DISPLAY();
+ dpy = GDK_DISPLAY_XDISPLAY(gdk_display_get_default());
/* atoms */
atoms[AtomFind] = XInternAtom(dpy, "_SURF_FIND", False);
g_free(stylepath);
}
- /* request handler */
- s = webkit_get_default_session();
-
- /* cookie jar */
- soup_session_add_feature(s,
- SOUP_SESSION_FEATURE(cookiejar_new(cookiefile,
- FALSE, cookiepolicy_get())));
+ /* cookie policy */
+ webkit_cookie_manager_set_persistent_storage(
+ webkit_web_context_get_cookie_manager(context), cookiefile,
+ WEBKIT_COOKIE_PERSISTENT_STORAGE_TEXT);
+ webkit_cookie_manager_set_accept_policy(
+ webkit_web_context_get_cookie_manager(context),
+ cookiepolicy_get());
/* disk cache */
- if (enablediskcache) {
- diskcache = soup_cache_new(cachefolder,
- SOUP_CACHE_SINGLE_USER);
- soup_cache_set_max_size(diskcache, diskcachebytes);
- soup_cache_load(diskcache);
- soup_session_add_feature(s, SOUP_SESSION_FEATURE(diskcache));
- }
+ webkit_web_context_set_cache_model(context, enablecache ?
+ WEBKIT_CACHE_MODEL_WEB_BROWSER :
+ WEBKIT_CACHE_MODEL_DOCUMENT_VIEWER);
/* ssl */
- tlsdb = g_tls_file_database_new(cafile, &error);
-
- if (error) {
- g_warning("Error loading SSL database %s: %s", cafile,
- error->message);
- g_error_free(error);
- }
- g_object_set(G_OBJECT(s), "tls-database", tlsdb, NULL);
- g_object_set(G_OBJECT(s), "ssl-strict", strictssl, NULL);
-
- /* proxy */
- if ((proxy = getenv("http_proxy")) && strcmp(proxy, "")) {
- new_proxy = g_strrstr(proxy, "http://")
- || g_strrstr(proxy, "socks://")
- || g_strrstr(proxy, "socks4://")
- || g_strrstr(proxy, "socks5://")
- ? g_strdup(proxy)
- : g_strdup_printf("http://%s", proxy);
- puri = soup_uri_new(new_proxy);
- g_object_set(G_OBJECT(s), "proxy-uri", puri, NULL);
- soup_uri_free(puri);
- g_free(new_proxy);
- usingproxy = 1;
- }
+ webkit_web_context_set_tls_errors_policy(context, strictssl ?
+ WEBKIT_TLS_ERRORS_POLICY_FAIL :
+ WEBKIT_TLS_ERRORS_POLICY_IGNORE);
}
void
while (0 < waitpid(-1, NULL, WNOHANG));
}
-void
-source(Client *c, const Arg *arg)
-{
- Arg a = { .b = FALSE };
- gboolean s;
-
- s = webkit_web_view_get_view_source_mode(c->view);
- webkit_web_view_set_view_source_mode(c->view, !s);
- reload(c, &a);
-}
-
void
spawn(Client *c, const Arg *arg)
{
void
togglecookiepolicy(Client *c, const Arg *arg)
{
- SoupCookieJar *jar;
- SoupCookieJarAcceptPolicy policy;
-
- jar = SOUP_COOKIE_JAR(soup_session_get_feature(
- webkit_get_default_session(),
- SOUP_TYPE_COOKIE_JAR));
- g_object_get(G_OBJECT(jar), "accept-policy", &policy, NULL);
-
- policysel++;
- if (policysel >= strlen(cookiepolicies))
- policysel = 0;
+ ++cookiepolicy;
+ cookiepolicy %= strlen(cookiepolicies);
- g_object_set(G_OBJECT(jar), "accept-policy", cookiepolicy_get(), NULL);
+ webkit_cookie_manager_set_accept_policy(
+ webkit_web_context_get_cookie_manager(
+ webkit_web_view_get_context(c->view)),
+ cookiepolicy_get());
updatetitle(c);
/* Do not reload. */
void
togglestyle(Client *c, const Arg *arg)
{
- enablestyles = !enablestyles;
- setstyle(c, enablestyles ? getstyle(geturi(c)) : "");
+ enablestyle = !enablestyle;
+ setstyle(c, enablestyle ? getstyle(geturi(c)) : "");
updatetitle(c);
}
g_object_get(G_OBJECT(settings), "enable-plugins", &value, NULL);
togglestat[p++] = value? 'V': 'v';
- togglestat[p++] = enablestyles ? 'M': 'm';
+ togglestat[p++] = enablestyle ? 'M': 'm';
togglestat[p] = '\0';
}
else
pagestat[0] = '-';
- pagestat[1] = usingproxy ? 'P' : '-';
- pagestat[2] = '\0';
+ pagestat[1] = '\0';
}
void
void
updatewinid(Client *c)
{
- snprintf(winid, LENGTH(winid), "%u",
- (int)GDK_WINDOW_XID(GTK_WIDGET(c->win)->window));
+ snprintf(winid, LENGTH(winid), "%lu", c->xid);
}
void
kioskmode = 1;
break;
case 'm':
- enablestyles = 0;
+ enablestyle = 0;
break;
case 'M':
- enablestyles = 1;
+ enablestyle = 1;
break;
case 'n':
enableinspector = 0;