Simplify communication with webext - surf - surf browser, a WebKit based browser | |
git clone git://git.suckless.org/surf | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 55c65b21f6d94f4042d222f8bde46e1555108c66 | |
parent 5f81d4a99f1dd979cdd5f3e72d5de5ea0d5cdc35 | |
Author: Quentin Rameau <[email protected]> | |
Date: Sat, 2 May 2020 15:50:50 +0200 | |
Simplify communication with webext | |
Diffstat: | |
M surf.c | 10 ++++++---- | |
M webext-surf.c | 78 ++++++++++-------------------… | |
2 files changed, 30 insertions(+), 58 deletions(-) | |
--- | |
diff --git a/surf.c b/surf.c | |
@@ -7,6 +7,7 @@ | |
#include <sys/types.h> | |
#include <sys/wait.h> | |
#include <glib.h> | |
+#include <inttypes.h> | |
#include <libgen.h> | |
#include <limits.h> | |
#include <pwd.h> | |
@@ -107,7 +108,7 @@ typedef struct Client { | |
GTlsCertificate *cert, *failedcert; | |
GTlsCertificateFlags tlserr; | |
Window xid; | |
- unsigned long pageid; | |
+ guint64 pageid; | |
int progress, fullscreen, https, insecure, errorpage; | |
const char *title, *overtitle, *targeturi; | |
const char *needle; | |
@@ -366,7 +367,8 @@ setup(void) | |
} else { | |
gchanin = g_io_channel_unix_new(spair[0]); | |
g_io_channel_set_encoding(gchanin, NULL, NULL); | |
- g_io_channel_set_flags(gchanin, G_IO_FLAG_NONBLOCK, NULL); | |
+ g_io_channel_set_flags(gchanin, g_io_channel_get_flags(gchanin) | |
+ | G_IO_FLAG_NONBLOCK, NULL); | |
g_io_channel_set_close_on_unref(gchanin, TRUE); | |
g_io_add_watch(gchanin, G_IO_IN, readsock, NULL); | |
} | |
@@ -1446,7 +1448,7 @@ createwindow(Client *c) | |
gtk_window_set_wmclass(GTK_WINDOW(w), wmstr, "Surf"); | |
g_free(wmstr); | |
- wmstr = g_strdup_printf("%s[%lu]", "Surf", c->pageid); | |
+ wmstr = g_strdup_printf("%s[%"PRIu64"]", "Surf", c->pageid); | |
gtk_window_set_role(GTK_WINDOW(w), wmstr); | |
g_free(wmstr); | |
@@ -1885,7 +1887,7 @@ msgext(Client *c, char type, const Arg *a) | |
} | |
if (send(spair[0], msg, ret, 0) != ret) | |
- fprintf(stderr, "surf: error sending: %d%c%d (%dB)\n", | |
+ fprintf(stderr, "surf: error sending: %u%c%d (%d)\n", | |
c->pageid, type, a->i, ret); | |
} | |
diff --git a/webext-surf.c b/webext-surf.c | |
@@ -1,6 +1,7 @@ | |
#include <sys/socket.h> | |
#include <sys/stat.h> | |
#include <fcntl.h> | |
+#include <inttypes.h> | |
#include <limits.h> | |
#include <stdio.h> | |
#include <stdlib.h> | |
@@ -14,42 +15,17 @@ | |
#define LENGTH(x) (sizeof(x) / sizeof(x[0])) | |
-typedef struct Page { | |
- guint64 id; | |
- WebKitWebPage *webpage; | |
- struct Page *next; | |
-} Page; | |
- | |
+static WebKitWebExtension *webext; | |
static int sock; | |
-static Page *pages; | |
- | |
-Page * | |
-newpage(WebKitWebPage *page) | |
-{ | |
- Page *p; | |
- | |
- if (!(p = calloc(1, sizeof(Page)))) { | |
- fputs("Cannot malloc!\n", stderr); | |
- exit(1); | |
- } | |
- | |
- p->next = pages; | |
- pages = p; | |
- | |
- p->id = webkit_web_page_get_id(page); | |
- p->webpage = page; | |
- | |
- return p; | |
-} | |
static void | |
-msgsurf(Page *p, const char *s) | |
+msgsurf(guint64 pageid, const char *s) | |
{ | |
static char msg[MSGBUFSZ]; | |
size_t sln = strlen(s); | |
int ret; | |
- if ((ret = snprintf(msg, sizeof(msg), "%c%s", p ? p->id : 0, s)) | |
+ if ((ret = snprintf(msg, sizeof(msg), "%c%s", pageid, s)) | |
>= sizeof(msg)) { | |
fprintf(stderr, "webext: msg: message too long: %d\n", ret); | |
return; | |
@@ -62,14 +38,13 @@ msgsurf(Page *p, const char *s) | |
static gboolean | |
readsock(GIOChannel *s, GIOCondition c, gpointer unused) | |
{ | |
- static char msg[MSGBUFSZ]; | |
- WebKitDOMDOMWindow *view; | |
+ static char js[48], msg[MSGBUFSZ]; | |
+ WebKitWebPage *page; | |
+ JSCContext *jsc; | |
GError *gerr = NULL; | |
gsize msgsz; | |
- glong wh, ww; | |
- Page *p; | |
- if (g_io_channel_read_chars(s, msg, LENGTH(msg), &msgsz, &gerr) != | |
+ if (g_io_channel_read_chars(s, msg, sizeof(msg), &msgsz, &gerr) != | |
G_IO_STATUS_NORMAL) { | |
if (gerr) { | |
fprintf(stderr, "webext: error reading socket: %s\n", | |
@@ -85,52 +60,47 @@ readsock(GIOChannel *s, GIOCondition c, gpointer unused) | |
return TRUE; | |
} | |
- for (p = pages; p; p = p->next) { | |
- if (p->id == msg[0]) | |
- break; | |
- } | |
- if (!p || !(view = webkit_dom_document_get_default_view( | |
- webkit_web_page_get_dom_document(p->webpage)))) | |
+ if (!(page = webkit_web_extension_get_page(webext, msg[0]))) | |
return TRUE; | |
+ jsc = webkit_frame_get_js_context(webkit_web_page_get_main_frame(page)… | |
+ | |
switch (msg[1]) { | |
case 'h': | |
if (msgsz != 3) | |
return TRUE; | |
- ww = webkit_dom_dom_window_get_inner_width(view); | |
- webkit_dom_dom_window_scroll_by(view, | |
- (ww / 100) * msg[2], 0); | |
+ snprintf(js, sizeof(js), | |
+ "window.scrollBy(window.innerWidth/100*%d,0);", | |
+ msg[2]); | |
+ jsc_context_evaluate(jsc, js, -1); | |
break; | |
case 'v': | |
if (msgsz != 3) | |
return TRUE; | |
- wh = webkit_dom_dom_window_get_inner_height(view); | |
- webkit_dom_dom_window_scroll_by(view, | |
- 0, (wh / 100) * msg[2]); | |
+ snprintf(js, sizeof(js), | |
+ "window.scrollBy(0,window.innerHeight/100*%d);", | |
+ msg[2]); | |
+ jsc_context_evaluate(jsc, js, -1); | |
break; | |
} | |
return TRUE; | |
} | |
-static void | |
-webpagecreated(WebKitWebExtension *e, WebKitWebPage *wp, gpointer unused) | |
-{ | |
- Page *p = newpage(wp); | |
-} | |
- | |
G_MODULE_EXPORT void | |
-webkit_web_extension_initialize_with_user_data(WebKitWebExtension *e, GVariant… | |
+webkit_web_extension_initialize_with_user_data(WebKitWebExtension *e, | |
+ const GVariant *gv) | |
{ | |
GIOChannel *gchansock; | |
- g_signal_connect(e, "page-created", G_CALLBACK(webpagecreated), NULL); | |
+ webext = e; | |
g_variant_get(gv, "i", &sock); | |
gchansock = g_io_channel_unix_new(sock); | |
g_io_channel_set_encoding(gchansock, NULL, NULL); | |
- g_io_channel_set_flags(gchansock, G_IO_FLAG_NONBLOCK, NULL); | |
+ g_io_channel_set_flags(gchansock, g_io_channel_get_flags(gchansock) | |
+ | G_IO_FLAG_NONBLOCK, NULL); | |
g_io_channel_set_close_on_unref(gchansock, TRUE); | |
g_io_add_watch(gchansock, G_IO_IN, readsock, NULL); | |
} |