changeset 11014:fb2bcfa6a8de v8.0.0396

patch 8.0.0396: 'balloonexpr' only works synchronously commit https://github.com/vim/vim/commit/59716a27bd5c6c64def6c3ca430ff1246deae749 Author: Bram Moolenaar <Bram@vim.org> Date: Wed Mar 1 20:32:44 2017 +0100 patch 8.0.0396: 'balloonexpr' only works synchronously Problem: 'balloonexpr' only works synchronously. Solution: Add balloon_show(). (Jusufadis Bakamovic, closes https://github.com/vim/vim/issues/1449)
author Christian Brabandt <cb@256bit.org>
date Wed, 01 Mar 2017 20:45:05 +0100
parents dd6c3eab630b
children 53ecc645c32d
files runtime/doc/eval.txt src/evalfunc.c src/os_unix.c src/os_win32.c src/version.c
diffstat 5 files changed, 57 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -1981,19 +1981,20 @@ argidx()			Number	current index in the a
 arglistid([{winnr} [, {tabnr}]]) Number	argument list id
 argv({nr})			String	{nr} entry of the argument list
 argv()				List	the argument list
-assert_equal({exp}, {act} [, {msg}])     none  assert {exp} is equal to {act}
-assert_exception({error} [, {msg}])      none  assert {error} is in v:exception
-assert_fails({cmd} [, {error}])          none  assert {cmd} fails
-assert_false({actual} [, {msg}])         none  assert {actual} is false
+assert_equal({exp}, {act} [, {msg}])  none  assert {exp} is equal to {act}
+assert_exception({error} [, {msg}])   none  assert {error} is in v:exception
+assert_fails({cmd} [, {error}])	      none  assert {cmd} fails
+assert_false({actual} [, {msg}])      none  assert {actual} is false
 assert_inrange({lower}, {upper}, {actual} [, {msg}])
 				none	assert {actual} is inside the range
-assert_match({pat}, {text} [, {msg}])    none  assert {pat} matches {text}
+assert_match({pat}, {text} [, {msg}])	 none  assert {pat} matches {text}
 assert_notequal({exp}, {act} [, {msg}])  none  assert {exp} is not equal {act}
 assert_notmatch({pat}, {text} [, {msg}]) none  assert {pat} not matches {text}
-assert_true({actual} [, {msg}])          none  assert {actual} is true
+assert_true({actual} [, {msg}])		 none  assert {actual} is true
 asin({expr})			Float	arc sine of {expr}
 atan({expr})			Float	arc tangent of {expr}
 atan2({expr1}, {expr2})		Float	arc tangent of {expr1} / {expr2}
+balloon_show({msg})		none	show {msg} inside the balloon
 browse({save}, {title}, {initdir}, {default})
 				String	put up a file requester
 browsedir({title}, {initdir})	String	put up a directory requester
@@ -2619,6 +2620,25 @@ atan2({expr1}, {expr2})					*atan2()*
 <			2.356194
 		{only available when compiled with the |+float| feature}
 
+balloon_show({msg})                                     *balloon_show()*
+                Show {msg} inside the balloon.
+                Example: >
+			func GetBalloonContent()
+			   " initiate getting the content
+			   return ''
+			endfunc
+			set balloonexpr=GetBalloonContent()
+
+			func BalloonCallback(result)
+                          call balloon_show(a:result)
+			endfunc
+<
+		The intended use is that fetching the content of the balloon
+		is initiated from 'balloonexpr'.  It will invoke an
+		asynchronous method, in which a callback invokes
+		balloon_show().  The 'balloonexpr' itself can return an
+		empty string or a placeholder.
+                {only available when compiled with the +beval feature}
 
 							*browse()*
 browse({save}, {title}, {initdir}, {default})
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -58,6 +58,9 @@ static void f_asin(typval_T *argvars, ty
 static void f_atan(typval_T *argvars, typval_T *rettv);
 static void f_atan2(typval_T *argvars, typval_T *rettv);
 #endif
+#ifdef FEAT_BEVAL
+static void f_balloon_show(typval_T *argvars, typval_T *rettv);
+#endif
 static void f_browse(typval_T *argvars, typval_T *rettv);
 static void f_browsedir(typval_T *argvars, typval_T *rettv);
 static void f_bufexists(typval_T *argvars, typval_T *rettv);
@@ -484,6 +487,9 @@ static struct fst
     {"atan",		1, 1, f_atan},
     {"atan2",		2, 2, f_atan2},
 #endif
+#ifdef FEAT_BEVAL
+    {"balloon_show",	1, 1, f_balloon_show},
+#endif
     {"browse",		4, 4, f_browse},
     {"browsedir",	2, 2, f_browsedir},
     {"bufexists",	1, 1, f_bufexists},
@@ -1363,6 +1369,17 @@ f_atan2(typval_T *argvars, typval_T *ret
 #endif
 
 /*
+ * "balloon_show()" function
+ */
+#ifdef FEAT_BEVAL
+    static void
+f_balloon_show(typval_T *argvars, typval_T *rettv UNUSED)
+{
+    gui_mch_post_balloon(balloonEval, get_tv_string_chk(&argvars[0]));
+}
+#endif
+
+/*
  * "browse(save, title, initdir, default)" function
  */
     static void
--- a/src/os_unix.c
+++ b/src/os_unix.c
@@ -467,6 +467,12 @@ mch_inchar(
 	if ((wait_time < 0 || wait_time > 100L) && channel_any_readahead())
 	    wait_time = 10L;
 #endif
+#ifdef FEAT_BEVAL
+	if (p_beval && wait_time > 100L)
+	    /* The 'balloonexpr' may indirectly invoke a callback while waiting
+	     * for a character, need to check often. */
+	    wait_time = 100L;
+#endif
 
 	/*
 	 * We want to be interrupted by the winch signal
--- a/src/os_win32.c
+++ b/src/os_win32.c
@@ -1467,6 +1467,12 @@ WaitForChar(long msec)
 		    dwWaitTime = 10;
 	    }
 #endif
+#ifdef FEAT_BEVAL
+	    if (p_beval && dwWaitTime > 100)
+		/* The 'balloonexpr' may indirectly invoke a callback while
+		 * waiting for a character, need to check often. */
+		dwWaitTime = 100;
+#endif
 #ifdef FEAT_MZSCHEME
 	    if (mzthreads_allowed() && p_mzq > 0
 				    && (msec < 0 || (long)dwWaitTime > p_mzq))
--- a/src/version.c
+++ b/src/version.c
@@ -765,6 +765,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    396,
+/**/
     395,
 /**/
     394,