Introduction
Introduction Statistics Contact Development Disclaimer Help
surf-2.0-externalpipe.diff - sites - public wiki contents of suckless.org
git clone git://git.suckless.org/sites
Log
Files
Refs
---
surf-2.0-externalpipe.diff (2379B)
---
1 diff --git a/surf.c b/surf.c
2 index 93a1629..ba53b94 100644
3 --- a/surf.c
4 +++ b/surf.c
5 @@ -217,6 +217,7 @@ static void togglefullscreen(Client *c, const Arg *a…
6 static void togglecookiepolicy(Client *c, const Arg *a);
7 static void toggleinspector(Client *c, const Arg *a);
8 static void find(Client *c, const Arg *a);
9 +static void externalpipe(Client *c, const Arg *a);
10
11 /* Buttons */
12 static void clicknavigate(Client *c, const Arg *a, WebKitHitTestResult …
13 @@ -241,6 +242,80 @@ char *argv0;
14 /* configuration, allows nested code to access above variables */
15 #include "config.h"
16
17 +static void
18 +externalpipe_execute(char* buffer, Arg *arg) {
19 + int to[2];
20 + void (*oldsigpipe)(int);
21 +
22 + if (pipe(to) == -1)
23 + return;
24 +
25 + switch (fork()) {
26 + case -1:
27 + close(to[0]);
28 + close(to[1]);
29 + return;
30 + case 0:
31 + dup2(to[0], STDIN_FILENO); close(to[0]); close(to[1]);
32 + execvp(((char **)arg->v)[0], (char **)arg->v);
33 + fprintf(stderr, "st: execvp %s\n", ((char **)arg->v)[0]…
34 + perror("failed");
35 + exit(0);
36 + }
37 +
38 + close(to[0]);
39 + oldsigpipe = signal(SIGPIPE, SIG_IGN);
40 + write(to[1], buffer, strlen(buffer));
41 + close(to[1]);
42 + signal(SIGPIPE, oldsigpipe);
43 +}
44 +
45 +static void
46 +externalpipe_resource_done(WebKitWebResource *r, GAsyncResult *s, Arg *…
47 +{
48 + GError *gerr = NULL;
49 + guchar *buffer = webkit_web_resource_get_data_finish(r, s, NULL…
50 + if (gerr == NULL) {
51 + externalpipe_execute((char *) buffer, arg);
52 + } else {
53 + g_error_free(gerr);
54 + }
55 + g_free(buffer);
56 +}
57 +
58 +static void
59 +externalpipe_js_done(WebKitWebView *wv, GAsyncResult *s, Arg *arg)
60 +{
61 + WebKitJavascriptResult *j = webkit_web_view_run_javascript_fini…
62 + wv, s, NULL);
63 + if (!j) {
64 + return;
65 + }
66 + JSCValue *v = webkit_javascript_result_get_js_value(j);
67 + if (jsc_value_is_string(v)) {
68 + char *buffer = jsc_value_to_string(v);
69 + externalpipe_execute(buffer, arg);
70 + g_free(buffer);
71 + }
72 + webkit_javascript_result_unref(j);
73 +}
74 +
75 +void
76 +externalpipe(Client *c, const Arg *arg)
77 +{
78 + if (curconfig[JavaScript].val.i) {
79 + webkit_web_view_run_javascript(
80 + c->view, "window.document.documentElement.outer…
81 + NULL, externalpipe_js_done, arg);
82 + } else {
83 + WebKitWebResource *resource = webkit_web_view_get_main_…
84 + if (resource != NULL) {
85 + webkit_web_resource_get_data(
86 + resource, NULL, externalpipe_resource_d…
87 + }
88 + }
89 +}
90 +
91 void
92 usage(void)
93 {
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.