|
|
- diff --git a/surf.c b/surf.c
- index 93a1629..ba53b94 100644
- --- a/surf.c
- +++ b/surf.c
- @@ -217,6 +217,7 @@ static void togglefullscreen(Client *c, const Arg *a);
- static void togglecookiepolicy(Client *c, const Arg *a);
- static void toggleinspector(Client *c, const Arg *a);
- static void find(Client *c, const Arg *a);
- +static void externalpipe(Client *c, const Arg *a);
-
- /* Buttons */
- static void clicknavigate(Client *c, const Arg *a, WebKitHitTestResult *h);
- @@ -241,6 +242,80 @@ char *argv0;
- /* configuration, allows nested code to access above variables */
- #include "config.h"
-
- +static void
- +externalpipe_execute(char* buffer, Arg *arg) {
- + int to[2];
- + void (*oldsigpipe)(int);
- +
- + if (pipe(to) == -1)
- + return;
- +
- + switch (fork()) {
- + case -1:
- + close(to[0]);
- + close(to[1]);
- + return;
- + case 0:
- + dup2(to[0], STDIN_FILENO); close(to[0]); close(to[1]);
- + execvp(((char **)arg->v)[0], (char **)arg->v);
- + fprintf(stderr, "st: execvp %s\n", ((char **)arg->v)[0]);
- + perror("failed");
- + exit(0);
- + }
- +
- + close(to[0]);
- + oldsigpipe = signal(SIGPIPE, SIG_IGN);
- + write(to[1], buffer, strlen(buffer));
- + close(to[1]);
- + signal(SIGPIPE, oldsigpipe);
- +}
- +
- +static void
- +externalpipe_resource_done(WebKitWebResource *r, GAsyncResult *s, Arg *arg)
- +{
- + GError *gerr = NULL;
- + guchar *buffer = webkit_web_resource_get_data_finish(r, s, NULL, &gerr);
- + if (gerr == NULL) {
- + externalpipe_execute((char *) buffer, arg);
- + } else {
- + g_error_free(gerr);
- + }
- + g_free(buffer);
- +}
- +
- +static void
- +externalpipe_js_done(WebKitWebView *wv, GAsyncResult *s, Arg *arg)
- +{
- + WebKitJavascriptResult *j = webkit_web_view_run_javascript_finish(
- + wv, s, NULL);
- + if (!j) {
- + return;
- + }
- + JSCValue *v = webkit_javascript_result_get_js_value(j);
- + if (jsc_value_is_string(v)) {
- + char *buffer = jsc_value_to_string(v);
- + externalpipe_execute(buffer, arg);
- + g_free(buffer);
- + }
- + webkit_javascript_result_unref(j);
- +}
- +
- +void
- +externalpipe(Client *c, const Arg *arg)
- +{
- + if (curconfig[JavaScript].val.i) {
- + webkit_web_view_run_javascript(
- + c->view, "window.document.documentElement.outerHTML",
- + NULL, externalpipe_js_done, arg);
- + } else {
- + WebKitWebResource *resource = webkit_web_view_get_main_resource(c->view);
- + if (resource != NULL) {
- + webkit_web_resource_get_data(
- + resource, NULL, externalpipe_resource_done, arg);
- + }
- + }
- +}
- +
- void
- usage(void)
- {
|