Introduction
Introduction Statistics Contact Development Disclaimer Help
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);
}
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.