twebext-surf.c - surf - [fork] customized build of surf, the suckless webkit br… | |
git clone git://src.adamsgaard.dk/surf | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
twebext-surf.c (2472B) | |
--- | |
1 #include <sys/socket.h> | |
2 #include <sys/stat.h> | |
3 #include <fcntl.h> | |
4 #include <inttypes.h> | |
5 #include <limits.h> | |
6 #include <stdio.h> | |
7 #include <stdlib.h> | |
8 | |
9 #include <gio/gio.h> | |
10 #include <webkit2/webkit-web-extension.h> | |
11 #include <webkitdom/webkitdom.h> | |
12 #include <webkitdom/WebKitDOMDOMWindowUnstable.h> | |
13 | |
14 #include "common.h" | |
15 | |
16 #define LENGTH(x) (sizeof(x) / sizeof(x[0])) | |
17 | |
18 static WebKitWebExtension *webext; | |
19 static int sock; | |
20 | |
21 static void | |
22 msgsurf(guint64 pageid, const char *s) | |
23 { | |
24 static char msg[MSGBUFSZ]; | |
25 size_t sln = strlen(s); | |
26 int ret; | |
27 | |
28 if ((ret = snprintf(msg, sizeof(msg), "%c%s", pageid, s)) | |
29 >= sizeof(msg)) { | |
30 fprintf(stderr, "webext: msg: message too long: %d\n", r… | |
31 return; | |
32 } | |
33 | |
34 if (send(sock, msg, ret, 0) < 0) | |
35 fprintf(stderr, "webext: error sending: %s\n", msg+1); | |
36 } | |
37 | |
38 static gboolean | |
39 readsock(GIOChannel *s, GIOCondition c, gpointer unused) | |
40 { | |
41 static char js[48], msg[MSGBUFSZ]; | |
42 WebKitWebPage *page; | |
43 JSCContext *jsc; | |
44 GError *gerr = NULL; | |
45 gsize msgsz; | |
46 | |
47 if (g_io_channel_read_chars(s, msg, sizeof(msg), &msgsz, &gerr) … | |
48 G_IO_STATUS_NORMAL) { | |
49 if (gerr) { | |
50 fprintf(stderr, "webext: error reading socket: %… | |
51 gerr->message); | |
52 g_error_free(gerr); | |
53 } | |
54 return TRUE; | |
55 } | |
56 | |
57 if (msgsz < 2) { | |
58 fprintf(stderr, "webext: readsock: message too short: %d… | |
59 msgsz); | |
60 return TRUE; | |
61 } | |
62 | |
63 if (!(page = webkit_web_extension_get_page(webext, msg[0]))) | |
64 return TRUE; | |
65 | |
66 jsc = webkit_frame_get_js_context(webkit_web_page_get_main_frame… | |
67 | |
68 switch (msg[1]) { | |
69 case 'h': | |
70 if (msgsz != 3) | |
71 return TRUE; | |
72 snprintf(js, sizeof(js), | |
73 "window.scrollBy(window.innerWidth/100*%d,0);", | |
74 msg[2]); | |
75 jsc_context_evaluate(jsc, js, -1); | |
76 break; | |
77 case 'v': | |
78 if (msgsz != 3) | |
79 return TRUE; | |
80 snprintf(js, sizeof(js), | |
81 "window.scrollBy(0,window.innerHeight/100*%d);", | |
82 msg[2]); | |
83 jsc_context_evaluate(jsc, js, -1); | |
84 break; | |
85 } | |
86 | |
87 return TRUE; | |
88 } | |
89 | |
90 G_MODULE_EXPORT void | |
91 webkit_web_extension_initialize_with_user_data(WebKitWebExtension *e, | |
92 const GVariant *gv) | |
93 { | |
94 GIOChannel *gchansock; | |
95 | |
96 webext = e; | |
97 | |
98 g_variant_get(gv, "i", &sock); | |
99 | |
100 gchansock = g_io_channel_unix_new(sock); | |
101 g_io_channel_set_encoding(gchansock, NULL, NULL); | |
102 g_io_channel_set_flags(gchansock, g_io_channel_get_flags(gchanso… | |
103 | G_IO_FLAG_NONBLOCK, NULL); | |
104 g_io_channel_set_close_on_unref(gchansock, TRUE); | |
105 g_io_add_watch(gchansock, G_IO_IN, readsock, NULL); | |
106 } |