Compare commits
6 commits
8f61ff18f9
...
ff0c1ac744
Author | SHA1 | Date | |
---|---|---|---|
Yash Karandikar | ff0c1ac744 | ||
Yash Karandikar | e485b2ea78 | ||
Yash Karandikar | ccaad24f14 | ||
Yash Karandikar | e961680d86 | ||
Yash Karandikar | 454d78a572 | ||
Yash Karandikar | 6c36ace313 |
13
LICENSE
13
LICENSE
|
@ -15,27 +15,18 @@ MIT/X Consortium License
|
|||
© 2013 Alexander Sedov <alex0player@gmail.com>
|
||||
© 2013 Nick White <git@njw.me.uk>
|
||||
© 2013 David Dufberg <david@dufberg.se>
|
||||
© 2014-2021 Quentin Rameau <quinq@fifth.space>
|
||||
© 2014-2017 Quentin Rameau <quinq@fifth.space>
|
||||
© 2014-2016 Markus Teich <markus.teich@stusta.mhn.de>
|
||||
© 2015 Jakukyo Friel <weakish@gmail.com>
|
||||
© 2015 Ben Woolley <tautolog@gmail.com>
|
||||
© 2015 Greg Reagle <greg.reagle@umbc.edu>
|
||||
© 2015 GhostAV <ghostav@riseup.net>
|
||||
© 2015-2017 Ivan Tham <pickfire@riseup.net>
|
||||
© 2015 Ivan Tham <pickfire@riseup.net>
|
||||
© 2015 Alexander Huemer <alexander.huemer@xx.vu>
|
||||
© 2015 Michael Stevens <mstevens@etla.org>
|
||||
© 2015 Felix Janda <felix.janda@posteo.de>
|
||||
© 2016 Charles Lehner <cel@celehner.com>
|
||||
© 2016 Dmitry Bogatov <KAction@gnu.org>
|
||||
© 2017 Hiltjo Posthuma <hiltjo@codemadness.org>
|
||||
© 2017 ssd <ssd@mailless.org>
|
||||
© 2017 Constantine Bytensky <kostya3@gmail.com>
|
||||
© 2017 Eon S. Jeon <esjeon@hyunmu.am>
|
||||
© 2017 Jochen Sprickerhof <git@jochen.sprickerhof.de>
|
||||
© 2018 nzl <uruabi@gmail.com>
|
||||
© 2018 Eddie Thieda <eddie.thieda@gmail.com>
|
||||
© 2018 Leonardo Taccari <iamleot@gmail.com>
|
||||
© 2019 efe <efe@efe.kim>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
|
|
2
Makefile
2
Makefile
|
@ -47,7 +47,7 @@ dist: distclean
|
|||
mkdir -p surf-$(VERSION)
|
||||
cp -R LICENSE Makefile config.mk config.def.h README \
|
||||
surf-open.sh arg.h TODO.md surf.png \
|
||||
surf.1 common.h $(SRC) $(WSRC) surf-$(VERSION)
|
||||
surf.1 $(SRC) $(CSRC) $(WSRC) surf-$(VERSION)
|
||||
tar -cf surf-$(VERSION).tar surf-$(VERSION)
|
||||
gzip surf-$(VERSION).tar
|
||||
rm -rf surf-$(VERSION)
|
||||
|
|
3
surf.1
3
surf.1
|
@ -208,9 +208,6 @@ Toggle scrollbars. This will reload the page.
|
|||
.B Ctrl\-Shift\-c
|
||||
Toggle caret browsing. This will reload the page.
|
||||
.TP
|
||||
.B Ctrl\-Shift\-d
|
||||
Toggle dark mode.
|
||||
.TP
|
||||
.B Ctrl\-Shift\-i
|
||||
Toggle auto-loading of images. This will reload the page.
|
||||
.TP
|
||||
|
|
120
surf.c
120
surf.c
|
@ -37,7 +37,7 @@
|
|||
#define LENGTH(x) (sizeof(x) / sizeof(x[0]))
|
||||
#define CLEANMASK(mask) (mask & (MODKEY|GDK_SHIFT_MASK))
|
||||
|
||||
enum { AtomFind, AtomGo, AtomUri, AtomUTF8, AtomLast };
|
||||
enum { AtomFind, AtomGo, AtomUri, AtomLast };
|
||||
|
||||
enum {
|
||||
OnDoc = WEBKIT_HIT_TEST_RESULT_CONTEXT_DOCUMENT,
|
||||
|
@ -56,7 +56,6 @@ typedef enum {
|
|||
CaretBrowsing,
|
||||
Certificate,
|
||||
CookiePolicies,
|
||||
DarkMode,
|
||||
DiskCache,
|
||||
DefaultCharset,
|
||||
DNSPrefetch,
|
||||
|
@ -101,8 +100,6 @@ typedef struct {
|
|||
typedef struct Client {
|
||||
GtkWidget *win;
|
||||
WebKitWebView *view;
|
||||
WebKitSettings *settings;
|
||||
WebKitWebContext *context;
|
||||
WebKitWebInspector *inspector;
|
||||
WebKitFindController *finder;
|
||||
WebKitHitTestResult *mousepos;
|
||||
|
@ -219,8 +216,6 @@ static void downloadstarted(WebKitWebContext *wc, WebKitDownload *d,
|
|||
Client *c);
|
||||
static void responsereceived(WebKitDownload *d, GParamSpec *ps, Client *c);
|
||||
static void download(Client *c, WebKitURIResponse *r);
|
||||
static gboolean viewusrmsgrcv(WebKitWebView *v, WebKitUserMessage *m,
|
||||
gpointer u);
|
||||
static void webprocessterminated(WebKitWebView *v,
|
||||
WebKitWebProcessTerminationReason r,
|
||||
Client *c);
|
||||
|
@ -262,7 +257,7 @@ static void logdownload(WebKitDownload *d, gchar *tail);
|
|||
static void spawndls(Client *c, const Arg *a);
|
||||
|
||||
static char winid[64];
|
||||
static char togglestats[11];
|
||||
static char togglestats[12];
|
||||
static char pagestats[2];
|
||||
static Atom atoms[AtomLast];
|
||||
static Window embed;
|
||||
|
@ -296,7 +291,6 @@ static ParamName loadcommitted[] = {
|
|||
// AccessMicrophone,
|
||||
// AccessWebcam,
|
||||
CaretBrowsing,
|
||||
DarkMode,
|
||||
DefaultCharset,
|
||||
FontSize,
|
||||
FrameFlattening,
|
||||
|
@ -362,7 +356,6 @@ setup(void)
|
|||
atoms[AtomFind] = XInternAtom(dpy, "_SURF_FIND", False);
|
||||
atoms[AtomGo] = XInternAtom(dpy, "_SURF_GO", False);
|
||||
atoms[AtomUri] = XInternAtom(dpy, "_SURF_URI", False);
|
||||
atoms[AtomUTF8] = XInternAtom(dpy, "UTF8_STRING", False);
|
||||
|
||||
gtk_init(NULL, NULL);
|
||||
|
||||
|
@ -634,7 +627,7 @@ void
|
|||
setatom(Client *c, int a, const char *v)
|
||||
{
|
||||
XChangeProperty(dpy, c->xid,
|
||||
atoms[a], atoms[AtomUTF8], 8, PropModeReplace,
|
||||
atoms[a], XA_STRING, 8, PropModeReplace,
|
||||
(unsigned char *)v, strlen(v) + 1);
|
||||
XSync(dpy, False);
|
||||
}
|
||||
|
@ -649,8 +642,7 @@ getatom(Client *c, int a)
|
|||
unsigned char *p = NULL;
|
||||
|
||||
XSync(dpy, False);
|
||||
XGetWindowProperty(dpy, c->xid,
|
||||
atoms[a], 0L, BUFSIZ, False, atoms[AtomUTF8],
|
||||
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);
|
||||
|
@ -695,10 +687,11 @@ gettogglestats(Client *c)
|
|||
togglestats[3] = curconfig[DiskCache].val.i ? 'D' : 'd';
|
||||
togglestats[4] = curconfig[LoadImages].val.i ? 'I' : 'i';
|
||||
togglestats[5] = curconfig[JavaScript].val.i ? 'S' : 's';
|
||||
togglestats[6] = curconfig[Style].val.i ? 'M' : 'm';
|
||||
togglestats[7] = curconfig[FrameFlattening].val.i ? 'F' : 'f';
|
||||
togglestats[8] = curconfig[Certificate].val.i ? 'X' : 'x';
|
||||
togglestats[9] = curconfig[StrictTLS].val.i ? 'T' : 't';
|
||||
togglestats[7] = curconfig[Style].val.i ? 'M' : 'm';
|
||||
togglestats[8] = curconfig[FrameFlattening].val.i ? 'F' : 'f';
|
||||
togglestats[9] = curconfig[Certificate].val.i ? 'X' : 'x';
|
||||
togglestats[10] = curconfig[StrictTLS].val.i ? 'T' : 't';
|
||||
togglestats[11] = '\0';
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -773,6 +766,7 @@ void
|
|||
setparameter(Client *c, int refresh, ParamName p, const Arg *a)
|
||||
{
|
||||
GdkRGBA bgcolor = { 0 };
|
||||
WebKitSettings *s = webkit_web_view_get_settings(c->view);
|
||||
|
||||
modparams[p] = curconfig[p].prio;
|
||||
|
||||
|
@ -782,7 +776,7 @@ setparameter(Client *c, int refresh, ParamName p, const Arg *a)
|
|||
case AccessWebcam:
|
||||
return; /* do nothing */
|
||||
case CaretBrowsing:
|
||||
webkit_settings_set_enable_caret_browsing(c->settings, a->i);
|
||||
webkit_settings_set_enable_caret_browsing(s, a->i);
|
||||
refresh = 0;
|
||||
break;
|
||||
case Certificate:
|
||||
|
@ -791,36 +785,32 @@ 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_web_context_get_cookie_manager(
|
||||
webkit_web_view_get_context(c->view)),
|
||||
cookiepolicy_get());
|
||||
refresh = 0;
|
||||
break;
|
||||
case DarkMode:
|
||||
g_object_set(gtk_settings_get_default(),
|
||||
"gtk-application-prefer-dark-theme", a->i, NULL);
|
||||
return;
|
||||
case DiskCache:
|
||||
webkit_web_context_set_cache_model(c->context, a->i ?
|
||||
webkit_web_context_set_cache_model(
|
||||
webkit_web_view_get_context(c->view), a->i ?
|
||||
WEBKIT_CACHE_MODEL_WEB_BROWSER :
|
||||
WEBKIT_CACHE_MODEL_DOCUMENT_VIEWER);
|
||||
return; /* do not update */
|
||||
case DefaultCharset:
|
||||
webkit_settings_set_default_charset(c->settings, a->v);
|
||||
webkit_settings_set_default_charset(s, a->v);
|
||||
return; /* do not update */
|
||||
case DNSPrefetch:
|
||||
webkit_settings_set_enable_dns_prefetching(c->settings, a->i);
|
||||
webkit_settings_set_enable_dns_prefetching(s, a->i);
|
||||
return; /* do not update */
|
||||
case FileURLsCrossAccess:
|
||||
webkit_settings_set_allow_file_access_from_file_urls(
|
||||
c->settings, a->i);
|
||||
webkit_settings_set_allow_universal_access_from_file_urls(
|
||||
c->settings, a->i);
|
||||
webkit_settings_set_allow_file_access_from_file_urls(s, a->i);
|
||||
webkit_settings_set_allow_universal_access_from_file_urls(s, a->i);
|
||||
return; /* do not update */
|
||||
case FontSize:
|
||||
webkit_settings_set_default_font_size(c->settings, a->i);
|
||||
webkit_settings_set_default_font_size(s, a->i);
|
||||
return; /* do not update */
|
||||
case FrameFlattening:
|
||||
webkit_settings_set_enable_frame_flattening(c->settings, a->i);
|
||||
webkit_settings_set_enable_frame_flattening(s, a->i);
|
||||
break;
|
||||
case Geolocation:
|
||||
refresh = 0;
|
||||
|
@ -830,22 +820,21 @@ setparameter(Client *c, int refresh, ParamName p, const Arg *a)
|
|||
webkit_web_view_set_background_color(c->view, &bgcolor);
|
||||
return; /* do not update */
|
||||
case Inspector:
|
||||
webkit_settings_set_enable_developer_extras(c->settings, a->i);
|
||||
webkit_settings_set_enable_developer_extras(s, a->i);
|
||||
return; /* do not update */
|
||||
case Java:
|
||||
webkit_settings_set_enable_java(c->settings, a->i);
|
||||
webkit_settings_set_enable_java(s, a->i);
|
||||
return; /* do not update */
|
||||
case JavaScript:
|
||||
webkit_settings_set_enable_javascript(c->settings, a->i);
|
||||
webkit_settings_set_enable_javascript(s, a->i);
|
||||
break;
|
||||
case KioskMode:
|
||||
return; /* do nothing */
|
||||
case LoadImages:
|
||||
webkit_settings_set_auto_load_images(c->settings, a->i);
|
||||
webkit_settings_set_auto_load_images(s, a->i);
|
||||
break;
|
||||
case MediaManualPlay:
|
||||
webkit_settings_set_media_playback_requires_user_gesture(
|
||||
c->settings, a->i);
|
||||
webkit_settings_set_media_playback_requires_user_gesture(s, a->i);
|
||||
break;
|
||||
case PreferredLanguages:
|
||||
return; /* do nothing */
|
||||
|
@ -862,20 +851,20 @@ setparameter(Client *c, int refresh, ParamName p, const Arg *a)
|
|||
case ShowIndicators:
|
||||
break;
|
||||
case SmoothScrolling:
|
||||
webkit_settings_set_enable_smooth_scrolling(c->settings, a->i);
|
||||
webkit_settings_set_enable_smooth_scrolling(s, a->i);
|
||||
return; /* do not update */
|
||||
case SiteQuirks:
|
||||
webkit_settings_set_enable_site_specific_quirks(
|
||||
c->settings, a->i);
|
||||
webkit_settings_set_enable_site_specific_quirks(s, a->i);
|
||||
break;
|
||||
case SpellChecking:
|
||||
webkit_web_context_set_spell_checking_enabled(
|
||||
c->context, a->i);
|
||||
webkit_web_view_get_context(c->view), a->i);
|
||||
return; /* do not update */
|
||||
case SpellLanguages:
|
||||
return; /* do nothing */
|
||||
case StrictTLS:
|
||||
webkit_web_context_set_tls_errors_policy(c->context, a->i ?
|
||||
webkit_web_context_set_tls_errors_policy(
|
||||
webkit_web_view_get_context(c->view), a->i ?
|
||||
WEBKIT_TLS_ERRORS_POLICY_FAIL :
|
||||
WEBKIT_TLS_ERRORS_POLICY_IGNORE);
|
||||
break;
|
||||
|
@ -887,7 +876,7 @@ setparameter(Client *c, int refresh, ParamName p, const Arg *a)
|
|||
refresh = 0;
|
||||
break;
|
||||
case WebGL:
|
||||
webkit_settings_set_enable_webgl(c->settings, a->i);
|
||||
webkit_settings_set_enable_webgl(s, a->i);
|
||||
break;
|
||||
case ZoomLevel:
|
||||
webkit_web_view_set_zoom_level(c->view, a->f);
|
||||
|
@ -933,8 +922,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,
|
||||
cert, host);
|
||||
webkit_web_context_allow_tls_certificate_for_host(
|
||||
webkit_web_view_get_context(c->view), cert, host);
|
||||
g_free(host);
|
||||
}
|
||||
|
||||
|
@ -1135,8 +1124,6 @@ newview(Client *c, WebKitWebView *rv)
|
|||
/* Webview */
|
||||
if (rv) {
|
||||
v = WEBKIT_WEB_VIEW(webkit_web_view_new_with_related_view(rv));
|
||||
context = webkit_web_view_get_context(v);
|
||||
settings = webkit_web_view_get_settings(v);
|
||||
} else {
|
||||
settings = webkit_settings_new_with_settings(
|
||||
"allow-file-access-from-file-urls", curconfig[FileURLsCrossAccess].val.i,
|
||||
|
@ -1247,16 +1234,9 @@ newview(Client *c, WebKitWebView *rv)
|
|||
G_CALLBACK(permissionrequested), c);
|
||||
g_signal_connect(G_OBJECT(v), "ready-to-show",
|
||||
G_CALLBACK(showview), c);
|
||||
g_signal_connect(G_OBJECT(v), "user-message-received",
|
||||
G_CALLBACK(viewusrmsgrcv), c);
|
||||
g_signal_connect(G_OBJECT(v), "web-process-terminated",
|
||||
G_CALLBACK(webprocessterminated), c);
|
||||
|
||||
c->context = context;
|
||||
c->settings = settings;
|
||||
|
||||
setparameter(c, 0, DarkMode, &curconfig[DarkMode].val);
|
||||
|
||||
return v;
|
||||
}
|
||||
|
||||
|
@ -1287,6 +1267,14 @@ readsock(GIOChannel *s, GIOCondition ioc, gpointer unused)
|
|||
void
|
||||
initwebextensions(WebKitWebContext *wc, Client *c)
|
||||
{
|
||||
GVariant *gv;
|
||||
|
||||
if (spair[1] < 0)
|
||||
return;
|
||||
|
||||
gv = g_variant_new("i", spair[1]);
|
||||
|
||||
webkit_web_context_set_web_extensions_initialization_user_data(wc, gv);
|
||||
webkit_web_context_set_web_extensions_directory(wc, WEBEXTDIR);
|
||||
}
|
||||
|
||||
|
@ -1589,30 +1577,6 @@ titlechanged(WebKitWebView *view, GParamSpec *ps, Client *c)
|
|||
updatetitle(c);
|
||||
}
|
||||
|
||||
gboolean
|
||||
viewusrmsgrcv(WebKitWebView *v, WebKitUserMessage *m, gpointer unused)
|
||||
{
|
||||
WebKitUserMessage *r;
|
||||
GUnixFDList *gfd;
|
||||
const char *name;
|
||||
|
||||
name = webkit_user_message_get_name(m);
|
||||
if (strcmp(name, "page-created") != 0) {
|
||||
fprintf(stderr, "surf: Unknown UserMessage: %s\n", name);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (spair[1] < 0)
|
||||
return TRUE;
|
||||
|
||||
gfd = g_unix_fd_list_new_from_array(&spair[1], 1);
|
||||
r = webkit_user_message_new_with_fd_list("surf-pipe", NULL, gfd);
|
||||
|
||||
webkit_user_message_send_reply(m, r);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void
|
||||
mousetargetchanged(WebKitWebView *v, WebKitHitTestResult *h, guint modifiers,
|
||||
Client *c)
|
||||
|
|
|
@ -87,29 +87,15 @@ readsock(GIOChannel *s, GIOCondition c, gpointer unused)
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
pageusermessagereply(GObject *o, GAsyncResult *r, gpointer page)
|
||||
G_MODULE_EXPORT void
|
||||
webkit_web_extension_initialize_with_user_data(WebKitWebExtension *e,
|
||||
const GVariant *gv)
|
||||
{
|
||||
WebKitUserMessage *m;
|
||||
GUnixFDList *gfd;
|
||||
GIOChannel *gchansock;
|
||||
const char *name;
|
||||
int nfd;
|
||||
|
||||
m = webkit_web_page_send_message_to_view_finish(page, r, NULL);
|
||||
name = webkit_user_message_get_name(m);
|
||||
if (strcmp(name, "surf-pipe") != 0) {
|
||||
fprintf(stderr, "webext-surf: Unknown User Reply: %s\n", name);
|
||||
return;
|
||||
}
|
||||
webext = e;
|
||||
|
||||
gfd = webkit_user_message_get_fd_list(m);
|
||||
if ((nfd = g_unix_fd_list_get_length(gfd)) != 1) {
|
||||
fprintf(stderr, "webext-surf: Too many file-descriptors: %d\n", nfd);
|
||||
return;
|
||||
}
|
||||
|
||||
sock = g_unix_fd_list_get(gfd, 0, NULL);
|
||||
g_variant_get(gv, "i", &sock);
|
||||
|
||||
gchansock = g_io_channel_unix_new(sock);
|
||||
g_io_channel_set_encoding(gchansock, NULL, NULL);
|
||||
|
@ -118,21 +104,3 @@ pageusermessagereply(GObject *o, GAsyncResult *r, gpointer page)
|
|||
g_io_channel_set_close_on_unref(gchansock, TRUE);
|
||||
g_io_add_watch(gchansock, G_IO_IN, readsock, NULL);
|
||||
}
|
||||
|
||||
void
|
||||
pagecreated(WebKitWebExtension *e, WebKitWebPage *p, gpointer unused)
|
||||
{
|
||||
WebKitUserMessage *msg;
|
||||
|
||||
msg = webkit_user_message_new("page-created", NULL);
|
||||
webkit_web_page_send_message_to_view(p, msg, NULL, pageusermessagereply, p);
|
||||
}
|
||||
|
||||
G_MODULE_EXPORT void
|
||||
webkit_web_extension_initialize(WebKitWebExtension *e)
|
||||
{
|
||||
webext = e;
|
||||
|
||||
g_signal_connect(G_OBJECT(e), "page-created",
|
||||
G_CALLBACK(pagecreated), NULL);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue