summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2018-03-03 21:29:55 +0100
committerBram Moolenaar <Bram@vim.org>2018-03-03 21:29:55 +0100
commit3f54fd319f6641b4bed478bcc90cdb39ede68e31 (patch)
tree23a4889166bde810bfea2c22c5759e4099cd31ca
parent71137fed4d77e985d49ca32c79f030512767b8ce (diff)
patch 8.0.1563: timeout of getwinposx() can be too shortv8.0.1563
Problem: Timeout of getwinposx() can be too short. (lilydjwg) Solution: Add getwinpos(). (closes #2689)
-rw-r--r--runtime/doc/eval.txt17
-rw-r--r--src/evalfunc.c38
-rw-r--r--src/proto/term.pro2
-rw-r--r--src/term.c6
-rw-r--r--src/version.c2
5 files changed, 55 insertions, 10 deletions
diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt
index 578e5d327f..51f059f4e3 100644
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -2192,8 +2192,9 @@ gettabvar({nr}, {varname} [, {def}])
gettabwinvar({tabnr}, {winnr}, {name} [, {def}])
any {name} in {winnr} in tab page {tabnr}
getwininfo([{winid}]) List list of windows
-getwinposx() Number X coord in pixels of GUI Vim window
-getwinposy() Number Y coord in pixels of GUI Vim window
+getwinpos([{tmeout}]) List X and Y coord in pixels of the Vim window
+getwinposx() Number X coord in pixels of the Vim window
+getwinposy() Number Y coord in pixels of the Vim window
getwinvar({nr}, {varname} [, {def}])
any variable {varname} in window {nr}
glob({expr} [, {nosuf} [, {list} [, {alllinks}]]])
@@ -4878,16 +4879,24 @@ gettabwinvar({tabnr}, {winnr}, {varname} [, {def}]) *gettabwinvar()*
:let list_is_on = gettabwinvar(1, 2, '&list')
:echo "myvar = " . gettabwinvar(3, 1, 'myvar')
<
+getwinpos([{timeout}]) *getwinpos()*
+ The result is a list with two numbers, the result of
+ getwinposx() and getwinposy() combined:
+ [x-pos, y-pos]
+ {timeout} can be used to specify how long to wait in msec for
+ a response from the terminal. When omitted 100 msec is used.
+
*getwinposx()*
getwinposx() The result is a Number, which is the X coordinate in pixels of
the left hand side of the GUI Vim window. Also works for an
- xterm.
+ xterm (uses a timeout of 100 msec).
The result will be -1 if the information is not available.
The value can be used with `:winpos`.
*getwinposy()*
getwinposy() The result is a Number, which is the Y coordinate in pixels of
- the top of the GUI Vim window. Also works for an xterm.
+ the top of the GUI Vim window. Also works for an xterm (uses
+ a timeout of 100 msec).
The result will be -1 if the information is not available.
The value can be used with `:winpos`.
diff --git a/src/evalfunc.c b/src/evalfunc.c
index e866f4ce1c..b02c956132 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -197,6 +197,7 @@ static void f_gettabinfo(typval_T *argvars, typval_T *rettv);
static void f_gettabvar(typval_T *argvars, typval_T *rettv);
static void f_gettabwinvar(typval_T *argvars, typval_T *rettv);
static void f_getwininfo(typval_T *argvars, typval_T *rettv);
+static void f_getwinpos(typval_T *argvars, typval_T *rettv);
static void f_getwinposx(typval_T *argvars, typval_T *rettv);
static void f_getwinposy(typval_T *argvars, typval_T *rettv);
static void f_getwinvar(typval_T *argvars, typval_T *rettv);
@@ -641,6 +642,7 @@ static struct fst
{"gettabvar", 2, 3, f_gettabvar},
{"gettabwinvar", 3, 4, f_gettabwinvar},
{"getwininfo", 0, 1, f_getwininfo},
+ {"getwinpos", 0, 1, f_getwinpos},
{"getwinposx", 0, 0, f_getwinposx},
{"getwinposy", 0, 0, f_getwinposy},
{"getwinvar", 2, 3, f_getwinvar},
@@ -5527,6 +5529,38 @@ f_win_screenpos(typval_T *argvars, typval_T *rettv)
}
/*
+ * "getwinpos({timeout})" function
+ */
+ static void
+f_getwinpos(typval_T *argvars UNUSED, typval_T *rettv)
+{
+ int x = -1;
+ int y = -1;
+
+ if (rettv_list_alloc(rettv) == FAIL)
+ return;
+#ifdef FEAT_GUI
+ if (gui.in_use)
+ gui_mch_get_winpos(&x, &y);
+# if defined(HAVE_TGETENT) && defined(FEAT_TERMRESPONSE)
+ else
+# endif
+#endif
+#if defined(HAVE_TGETENT) && defined(FEAT_TERMRESPONSE)
+ {
+ varnumber_T timeout = 100;
+
+ if (argvars[0].v_type != VAR_UNKNOWN)
+ timeout = get_tv_number(&argvars[0]);
+ term_get_winpos(&x, &y, timeout);
+ }
+#endif
+ list_append_number(rettv->vval.v_list, (varnumber_T)x);
+ list_append_number(rettv->vval.v_list, (varnumber_T)y);
+}
+
+
+/*
* "getwinposx()" function
*/
static void
@@ -5547,7 +5581,7 @@ f_getwinposx(typval_T *argvars UNUSED, typval_T *rettv)
{
int x, y;
- if (term_get_winpos(&x, &y) == OK)
+ if (term_get_winpos(&x, &y, (varnumber_T)100) == OK)
rettv->vval.v_number = x;
}
#endif
@@ -5574,7 +5608,7 @@ f_getwinposy(typval_T *argvars UNUSED, typval_T *rettv)
{
int x, y;
- if (term_get_winpos(&x, &y) == OK)
+ if (term_get_winpos(&x, &y, (varnumber_T)100) == OK)
rettv->vval.v_number = y;
}
#endif
diff --git a/src/proto/term.pro b/src/proto/term.pro
index 92cb26d58b..42405dda5f 100644
--- a/src/proto/term.pro
+++ b/src/proto/term.pro
@@ -24,7 +24,7 @@ void term_cursor_right(int i);
void term_append_lines(int line_count);
void term_delete_lines(int line_count);
void term_set_winpos(int x, int y);
-int term_get_winpos(int *x, int *y);
+int term_get_winpos(int *x, int *y, varnumber_T timeout);
void term_set_winsize(int height, int width);
void term_fg_color(int n);
void term_bg_color(int n);
diff --git a/src/term.c b/src/term.c
index 12c4f2e5bd..7dbbefa49a 100644
--- a/src/term.c
+++ b/src/term.c
@@ -2789,7 +2789,7 @@ static int waiting_for_winpos = FALSE;
* Returns OK or FAIL.
*/
int
-term_get_winpos(int *x, int *y)
+term_get_winpos(int *x, int *y, varnumber_T timeout)
{
int count = 0;
@@ -2801,8 +2801,8 @@ term_get_winpos(int *x, int *y)
OUT_STR(T_CGP);
out_flush();
- /* Try reading the result for 100 msec. */
- while (count++ < 10)
+ /* Try reading the result for "timeout" msec. */
+ while (count++ < timeout / 10)
{
(void)vpeekc_nomap();
if (winpos_x >= 0 && winpos_y >= 0)
diff --git a/src/version.c b/src/version.c
index 200ed6f2ff..c780826e65 100644
--- a/src/version.c
+++ b/src/version.c
@@ -779,6 +779,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1563,
+/**/
1562,
/**/
1561,