#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;
+ GtkWidget *win;
+ Window xid;
WebKitWebView *view;
WebKitWebInspector *inspector;
- char *title, *linkhover;
+ const char *title, *linkhover;
const char *needle;
gint progress;
struct Client *next;
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 getpagestat(Client *c);
static char *geturi(Client *c);
static const gchar *getstyle(const char *uri);
+static void setstyle(Client *c, const char *style);
static void handleplumb(Client *c, WebKitWebView *w, const gchar *uri);
Client *c);
static void loaduri(Client *c, const Arg *arg);
static void navigate(Client *c, const Arg *arg);
-static Client *newclient(void);
+static Client *newclient(Client *c);
+static WebKitWebView *newview(Client *c, WebKitWebView *rv);
+static void showview(WebKitWebView *v, Client *c);
static void newwindow(Client *c, const Arg *arg, gboolean noembed);
static void pasteuri(GtkClipboard *clipboard, const char *text, gpointer d);
static gboolean contextmenu(WebKitWebView *view, GtkWidget *menu,
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);
+static void titlechanged(WebKitWebView *view, GParamSpec *ps, Client *c);
static void titlechangeleave(void *a, void *b, Client *c);
static void toggle(Client *c, const Arg *arg);
static void togglecookiepolicy(Client *c, const Arg *arg);
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(scriptfile);
g_free(stylefile);
+ g_free(cachedir);
}
-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
return "";
}
+void
+setstyle(Client *c, const char *style)
+{
+ WebKitWebSettings *settings = webkit_web_view_get_settings(c->view);
+
+ g_object_set(G_OBJECT(settings), "user-stylesheet-uri", style, NULL);
+}
+
void
handleplumb(Client *c, WebKitWebView *w, const gchar *uri)
{
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 *
WebKitWebFrame *frame;
WebKitWebDataSource *src;
WebKitNetworkRequest *request;
- WebKitWebSettings *set = webkit_web_view_get_settings(c->view);
SoupMessage *msg;
char *uri;
}
setatom(c, AtomUri, uri);
- if (enablestyles) {
- g_object_set(G_OBJECT(set), "user-stylesheet-uri",
- getstyle(uri), NULL);
- }
+ 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;
}
Client *
-newclient(void)
+newclient(Client *rc)
{
Client *c;
- WebKitWebSettings *settings;
- WebKitWebFrame *frame;
- GdkGeometry hints = { 1, 1 };
- GdkScreen *screen;
gdouble dpi;
- char *ua;
if (!(c = calloc(1, sizeof(Client))))
die("Cannot malloc!\n");
c->title = NULL;
c->progress = 100;
- /* Window */
- if (embed) {
- c->win = gtk_plug_new(embed);
- } else {
- c->win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
-
- /* TA: 20091214: Despite what the GNOME docs say, the ICCCM
- * is always correct, so we should still call this function.
- * But when doing so, we *must* differentiate between a
- * WM_CLASS and a resource on the window. By convention, the
- * window class (WM_CLASS) is capped, while the resource is in
- * lowercase. Both these values come as a pair.
- */
- gtk_window_set_wmclass(GTK_WINDOW(c->win), "surf", "Surf");
-
- /* TA: 20091214: And set the role here as well -- so that
- * sessions can pick this up.
- */
- gtk_window_set_role(GTK_WINDOW(c->win), "Surf");
- }
- gtk_window_set_default_size(GTK_WINDOW(c->win), 800, 600);
- g_signal_connect(G_OBJECT(c->win),
- "destroy",
- G_CALLBACK(destroywin), c);
- g_signal_connect(G_OBJECT(c->win),
- "leave_notify_event",
- G_CALLBACK(titlechangeleave), c);
+ c->next = clients;
+ clients = c;
- if (!kioskmode)
- addaccelgroup(c);
+ c->view = newview(c, rc ? rc->view : NULL);
- /* Pane */
- c->pane = gtk_vpaned_new();
+ return c;
+}
- /* VBox */
- c->vbox = gtk_vbox_new(FALSE, 0);
- gtk_paned_pack1(GTK_PANED(c->pane), c->vbox, TRUE, TRUE);
+WebKitWebView *
+newview(Client *c, WebKitWebView *rv)
+{
+ WebKitWebView *v;
+ WebKitSettings *settings;
+ WebKitUserContentManager *contentmanager;
+ WebKitWebContext *context;
+ char *ua;
/* Webview */
- c->view = WEBKIT_WEB_VIEW(webkit_web_view_new());
+ if (rv) {
+ v = WEBKIT_WEB_VIEW(
+ webkit_web_view_new_with_related_view(rv));
+ } else {
+ settings = webkit_settings_new_with_settings(
+ "auto-load-images", loadimages,
+ "default-font-size", defaultfontsize,
+ "enable-caret-browsing", enablecaretbrowsing,
+ "enable-developer-extras", enableinspector,
+ "enable-dns-prefetching", enablednsprefetching,
+ "enable-frame-flattening", enableframeflattening,
+ "enable-html5-database", enablecache,
+ "enable-html5-local-storage", enablecache,
+ "enable-javascript", enablescripts,
+ "enable-plugins", enableplugins,
+ NULL);
+ if (!(ua = getenv("SURF_USERAGENT")))
+ ua = useragent;
+ webkit_settings_set_user_agent(settings, ua);
+ /* Have a look at http://webkitgtk.org/reference/webkit2gtk/stable/WebKitSettings.html
+ * for more interesting settings */
+
+ contentmanager = webkit_user_content_manager_new();
+
+ context = webkit_web_context_new_with_website_data_manager(
+ webkit_website_data_manager_new(
+ "base-cache-directory", cachedir,
+ "base-data-directory", cachedir,
+ NULL));
+
+ /* rendering process model, can be a shared unique one or one for each
+ * view */
+ webkit_web_context_set_process_model(context,
+ WEBKIT_PROCESS_MODEL_MULTIPLE_SECONDARY_PROCESSES);
+ /* ssl */
+ webkit_web_context_set_tls_errors_policy(context, strictssl ?
+ WEBKIT_TLS_ERRORS_POLICY_FAIL : WEBKIT_TLS_ERRORS_POLICY_IGNORE);
+ /* disk cache */
+ webkit_web_context_set_cache_model(context, enablecache ?
+ WEBKIT_CACHE_MODEL_WEB_BROWSER : WEBKIT_CACHE_MODEL_DOCUMENT_VIEWER);
+
+ /* Currently only works with text file to be compatible with curl */
+ webkit_cookie_manager_set_persistent_storage(
+ webkit_web_context_get_cookie_manager(context), cookiefile,
+ WEBKIT_COOKIE_PERSISTENT_STORAGE_TEXT);
+ /* cookie policy */
+ webkit_cookie_manager_set_accept_policy(
+ webkit_web_context_get_cookie_manager(context),
+ cookiepolicy_get());
+
+ v = g_object_new(WEBKIT_TYPE_WEB_VIEW,
+ "settings", settings,
+ "user-content-manager", contentmanager,
+ "web-context", context,
+ NULL);
+ }
- g_signal_connect(G_OBJECT(c->view),
+ g_signal_connect(G_OBJECT(v),
"notify::title",
- G_CALLBACK(titlechange), c);
- g_signal_connect(G_OBJECT(c->view),
+ G_CALLBACK(titlechanged), c);
+ g_signal_connect(G_OBJECT(v),
"hovering-over-link",
G_CALLBACK(linkhover), c);
- g_signal_connect(G_OBJECT(c->view),
+ g_signal_connect(G_OBJECT(v),
"geolocation-policy-decision-requested",
G_CALLBACK(geopolicyrequested), c);
- g_signal_connect(G_OBJECT(c->view),
+ g_signal_connect(G_OBJECT(v),
"create-web-view",
G_CALLBACK(createwindow), c);
- g_signal_connect(G_OBJECT(c->view),
+ g_signal_connect(G_OBJECT(v), "ready-to-show",
+ G_CALLBACK(showview), c);
+ g_signal_connect(G_OBJECT(v),
"new-window-policy-decision-requested",
G_CALLBACK(decidewindow), c);
- g_signal_connect(G_OBJECT(c->view),
+ g_signal_connect(G_OBJECT(v),
"mime-type-policy-decision-requested",
G_CALLBACK(decidedownload), c);
- g_signal_connect(G_OBJECT(c->view),
+ g_signal_connect(G_OBJECT(v),
"window-object-cleared",
G_CALLBACK(windowobjectcleared), c);
- g_signal_connect(G_OBJECT(c->view),
+ g_signal_connect(G_OBJECT(v),
"notify::load-status",
G_CALLBACK(loadstatuschange), c);
- g_signal_connect(G_OBJECT(c->view),
+ g_signal_connect(G_OBJECT(v),
"notify::progress",
G_CALLBACK(progresschange), c);
- g_signal_connect(G_OBJECT(c->view),
+ g_signal_connect(G_OBJECT(v),
"download-requested",
G_CALLBACK(initdownload), c);
- g_signal_connect(G_OBJECT(c->view),
+ g_signal_connect(G_OBJECT(v),
"button-release-event",
G_CALLBACK(buttonrelease), c);
- g_signal_connect(G_OBJECT(c->view),
+ g_signal_connect(G_OBJECT(v),
"context-menu",
G_CALLBACK(contextmenu), c);
- g_signal_connect(G_OBJECT(c->view),
+ g_signal_connect(G_OBJECT(v),
"resource-request-starting",
G_CALLBACK(beforerequest), c);
- g_signal_connect(G_OBJECT(c->view),
+ g_signal_connect(G_OBJECT(v),
"should-show-delete-interface-for-element",
G_CALLBACK(deletion_interface), c);
- /* Scrolled Window */
- c->scroll = gtk_scrolled_window_new(NULL, NULL);
+ return v;
+}
- frame = webkit_web_view_get_main_frame(WEBKIT_WEB_VIEW(c->view));
- g_signal_connect(G_OBJECT(frame), "scrollbars-policy-changed",
- G_CALLBACK(gtk_true), NULL);
+void
+showview(WebKitWebView *v, Client *c)
+{
+ GdkGeometry hints = { 1, 1 };
+ GdkRGBA bgcolor = { 0 };
+ GdkWindow *gwin;
- if (!enablescrollbars) {
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(c->scroll),
- GTK_POLICY_NEVER,
- GTK_POLICY_NEVER);
+ /* Window */
+ if (embed) {
+ c->win = gtk_plug_new(embed);
} else {
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(c->scroll),
- GTK_POLICY_AUTOMATIC,
- GTK_POLICY_AUTOMATIC);
+ c->win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+
+ /* TA: 20091214: Despite what the GNOME docs say, the ICCCM
+ * is always correct, so we should still call this function.
+ * But when doing so, we *must* differentiate between a
+ * WM_CLASS and a resource on the window. By convention, the
+ * window class (WM_CLASS) is capped, while the resource is in
+ * lowercase. Both these values come as a pair.
+ */
+ gtk_window_set_wmclass(GTK_WINDOW(c->win), "surf", "Surf");
+
+ /* TA: 20091214: And set the role here as well -- so that
+ * sessions can pick this up.
+ */
+ gtk_window_set_role(GTK_WINDOW(c->win), "Surf");
}
+ gtk_window_set_default_size(GTK_WINDOW(c->win), 800, 600);
+ g_signal_connect(G_OBJECT(c->win),
+ "destroy",
+ G_CALLBACK(destroywin), c);
+ g_signal_connect(G_OBJECT(c->win),
+ "leave_notify_event",
+ G_CALLBACK(titlechangeleave), c);
+
+ if (!kioskmode)
+ addaccelgroup(c);
/* Arranging */
- gtk_container_add(GTK_CONTAINER(c->scroll), GTK_WIDGET(c->view));
- gtk_container_add(GTK_CONTAINER(c->win), c->pane);
- gtk_container_add(GTK_CONTAINER(c->vbox), c->scroll);
+ gtk_container_add(GTK_CONTAINER(c->win), GTK_WIDGET(c->view));
/* Setup */
- gtk_box_set_child_packing(GTK_BOX(c->vbox), c->scroll, TRUE, TRUE, 0,
- GTK_PACK_START);
gtk_widget_grab_focus(GTK_WIDGET(c->view));
- gtk_widget_show(c->pane);
- gtk_widget_show(c->vbox);
- 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);
- webkit_web_view_set_full_content_zoom(c->view, TRUE);
+ GDK_HINT_MIN_SIZE);
+ gdk_window_set_events(gwin, GDK_ALL_EVENTS_MASK);
+ gdk_window_add_filter(gwin, processx, c);
runscript(frame);
- settings = webkit_web_view_get_settings(c->view);
- if (!(ua = getenv("SURF_USERAGENT")))
- ua = useragent;
- g_object_set(G_OBJECT(settings), "user-agent", ua, NULL);
- if (enablestyles) {
- g_object_set(G_OBJECT(settings),
- "user-stylesheet-uri", getstyle("about:blank"),
- NULL);
- }
- g_object_set(G_OBJECT(settings),
- "auto-load-images", loadimages, NULL);
- g_object_set(G_OBJECT(settings),
- "enable-plugins", enableplugins, NULL);
- g_object_set(G_OBJECT(settings),
- "enable-scripts", enablescripts, NULL);
- g_object_set(G_OBJECT(settings),
- "enable-spatial-navigation", enablespatialbrowsing, NULL);
- g_object_set(G_OBJECT(settings),
- "enable-developer-extras", enableinspector, NULL);
- g_object_set(G_OBJECT(settings),
- "enable-default-context-menu", kioskmode ^ 1, NULL);
- g_object_set(G_OBJECT(settings),
- "default-font-size", defaultfontsize, NULL);
- g_object_set(G_OBJECT(settings),
- "resizable-text-areas", 1, NULL);
-
- /*
- * While stupid, CSS specifies that a pixel represents 1/96 of an inch.
- * This ensures websites are not unusably small with a high DPI screen.
- * It is equivalent to firefox's "layout.css.devPixelsPerPx" setting.
- */
- if (zoomto96dpi) {
- screen = gdk_window_get_screen(GTK_WIDGET(c->win)->window);
- dpi = gdk_screen_get_resolution(screen);
- if (dpi != -1) {
- g_object_set(G_OBJECT(settings),
- "enforce-96-dpi", true, NULL);
- webkit_web_view_set_zoom_level(c->view, dpi/96);
- }
- }
/* This might conflict with _zoomto96dpi_. */
if (zoomlevel != 1.0)
webkit_web_view_set_zoom_level(c->view, zoomlevel);
- if (enableinspector) {
- c->inspector = webkit_web_view_get_inspector(c->view);
- g_signal_connect(G_OBJECT(c->inspector), "inspect-web-view",
- G_CALLBACK(inspector_new), c);
- g_signal_connect(G_OBJECT(c->inspector), "show-window",
- G_CALLBACK(inspector_show), c);
- g_signal_connect(G_OBJECT(c->inspector), "close-window",
- G_CALLBACK(inspector_close), c);
- g_signal_connect(G_OBJECT(c->inspector), "finished",
- G_CALLBACK(inspector_finished), c);
- c->isinspecting = false;
- }
-
- if (runinfullscreen) {
- c->fullscreen = 0;
+ if (runinfullscreen)
fullscreen(c, NULL);
- }
setatom(c, AtomFind, "");
setatom(c, AtomUri, "about:blank");
if (hidebackground)
- webkit_web_view_set_transparent(c->view, TRUE);
-
- c->next = clients;
- clients = c;
+ webkit_web_view_set_background_color(c->view, &bgcolor);
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");
}
}
-
- return c;
}
void
* 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);
/* dirs and files */
cookiefile = buildfile(cookiefile);
scriptfile = buildfile(scriptfile);
- cachefolder = buildpath(cachefolder);
+ cachedir = buildpath(cachedir);
if (stylefile == NULL) {
styledir = buildpath(styledir);
for (i = 0; i < LENGTH(styles); i++) {
stylefile = g_strconcat("file://", stylepath, NULL);
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())));
-
- /* 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));
- }
-
- /* 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;
- }
}
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
-titlechange(WebKitWebView *view, GParamSpec *pspec, Client *c)
+titlechanged(WebKitWebView *view, GParamSpec *ps, Client *c)
{
- const gchar *t = webkit_web_view_get_title(view);
- if (t) {
- c->title = copystr(&c->title, t);
- updatetitle(c);
- }
+ c->title = webkit_web_view_get_title(c->view);
+ updatetitle(c);
}
void
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);
+ ++cookiepolicy;
+ cookiepolicy %= strlen(cookiepolicies);
- policysel++;
- if (policysel >= strlen(cookiepolicies))
- policysel = 0;
-
- 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)
{
- WebKitWebSettings *settings = webkit_web_view_get_settings(c->view);
-
- enablestyles = !enablestyles;
- g_object_set(G_OBJECT(settings), "user-stylesheet-uri",
- enablestyles ? getstyle(geturi(c)) : "", NULL);
+ 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
usage(void)
{
- die("usage: %s [-bBfFgGiIkKnNpPsSvx] [-a cookiepolicies ] "
+ die("usage: %s [-bBdDfFgGiIkKmMnNpPsSvx] [-a cookiepolicies ] "
"[-c cookiefile] [-e xid] [-r scriptfile] [-t stylefile] "
"[-u useragent] [-z zoomlevel] [uri]\n", basename(argv0));
}
embed = strtol(EARGF(usage()), NULL, 0);
break;
case 'f':
- runinfullscreen = 1;
+ runinfullscreen = 0;
break;
case 'F':
- runinfullscreen = 0;
+ runinfullscreen = 1;
break;
case 'g':
allowgeolocation = 0;
kioskmode = 1;
break;
case 'm':
- enablestyles = 0;
+ enablestyle = 0;
break;
case 'M':
- enablestyles = 1;
+ enablestyle = 1;
break;
case 'n':
enableinspector = 0;
arg.v = argv[0];
setup();
- c = newclient();
+ c = newclient(NULL);
+ showview(NULL, c);
if (arg.v)
loaduri(clients, &arg);
else