From 12d53b57e29807d619c114cdd0bef76bc96772a7 Mon Sep 17 00:00:00 2001 From: Daniel Carl Date: Wed, 28 Sep 2016 00:03:32 +0200 Subject: [PATCH] Show output of :eval in inputbox. --- src/ex.c | 47 +++++++++++++++++++++++++++++++++++++++++++++-- src/main.c | 1 + 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/src/ex.c b/src/ex.c index e3a5a71..98570d1 100644 --- a/src/ex.c +++ b/src/ex.c @@ -22,6 +22,7 @@ * commands from inputbox and the ex commands. */ +#include #include #include @@ -121,6 +122,8 @@ static VbCmdResult execute(Client *c, const ExArg *arg); static VbCmdResult ex_bookmark(Client *c, const ExArg *arg); static VbCmdResult ex_eval(Client *c, const ExArg *arg); +static void ex_eval_javascript_finished(GObject *object, + GAsyncResult *result, Client *c); static VbCmdResult ex_hardcopy(Client *c, const ExArg *arg); static VbCmdResult ex_map(Client *c, const ExArg *arg); static VbCmdResult ex_unmap(Client *c, const ExArg *arg); @@ -747,11 +750,51 @@ static VbCmdResult ex_bookmark(Client *c, const ExArg *arg) static VbCmdResult ex_eval(Client *c, const ExArg *arg) { - /* TODO allow to get the return value and possible errors. */ - webkit_web_view_run_javascript(c->webview, arg->rhs->str, NULL, NULL, NULL); + /* Called as :eval! - don't print to inputbox. */ + if (arg->bang) { + webkit_web_view_run_javascript(c->webview, arg->rhs->str, NULL, NULL, NULL); + } else { + webkit_web_view_run_javascript(c->webview, arg->rhs->str, NULL, + (GAsyncReadyCallback)ex_eval_javascript_finished, c); + } + return CMD_SUCCESS; } +static void ex_eval_javascript_finished(GObject *object, + GAsyncResult *result, Client *c) +{ + WebKitJavascriptResult *js_result; + JSValueRef value; + JSGlobalContextRef context; + GError *error = NULL; + + js_result = webkit_web_view_run_javascript_finish(WEBKIT_WEB_VIEW(object), result, &error); + if (!js_result) { + vb_echo(c, MSG_ERROR, TRUE, "%s", error->message); + g_error_free(error); + + return; + } + + context = webkit_javascript_result_get_global_context(js_result); + value = webkit_javascript_result_get_value(js_result); + if (JSValueIsString(context, value)) { + JSStringRef str_ref; + char *string; + size_t len; + + str_ref = JSValueToStringCopy(context, value, NULL); + len = JSStringGetMaximumUTF8CStringSize(str_ref); + string = g_new(char, len); + JSStringGetUTF8CString(str_ref, string, len); + JSStringRelease(str_ref); + vb_echo(c, MSG_NORMAL, FALSE, "%s", string); + g_free(string); + } + webkit_javascript_result_unref(js_result); +} + static VbCmdResult ex_hardcopy(Client *c, const ExArg *arg) { /* TODO no implemented yet */ diff --git a/src/main.c b/src/main.c index 8644123..93141ad 100644 --- a/src/main.c +++ b/src/main.c @@ -622,6 +622,7 @@ static void input_print(Client *c, gboolean force, MessageType type, /* apply input style only if the message type was changed */ if (type != c->state.input_type) { c->state.input_type = type; + vb_input_update_style(c); } vb_input_set_text(c, message); if (hide) { -- 2.20.1