0
0
mirror of https://github.com/vim/vim.git synced 2025-09-28 04:24:06 -04:00

patch 8.0.1563: timeout of getwinposx() can be too short

Problem:    Timeout of getwinposx() can be too short. (lilydjwg)
Solution:   Add getwinpos(). (closes #2689)
This commit is contained in:
Bram Moolenaar
2018-03-03 21:29:55 +01:00
parent 71137fed4d
commit 3f54fd319f
5 changed files with 55 additions and 10 deletions

View File

@@ -2192,8 +2192,9 @@ gettabvar({nr}, {varname} [, {def}])
gettabwinvar({tabnr}, {winnr}, {name} [, {def}]) gettabwinvar({tabnr}, {winnr}, {name} [, {def}])
any {name} in {winnr} in tab page {tabnr} any {name} in {winnr} in tab page {tabnr}
getwininfo([{winid}]) List list of windows getwininfo([{winid}]) List list of windows
getwinposx() Number X coord in pixels of GUI Vim window getwinpos([{tmeout}]) List X and Y coord in pixels of the Vim window
getwinposy() Number Y coord in pixels of GUI 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}]) getwinvar({nr}, {varname} [, {def}])
any variable {varname} in window {nr} any variable {varname} in window {nr}
glob({expr} [, {nosuf} [, {list} [, {alllinks}]]]) glob({expr} [, {nosuf} [, {list} [, {alllinks}]]])
@@ -4878,16 +4879,24 @@ gettabwinvar({tabnr}, {winnr}, {varname} [, {def}]) *gettabwinvar()*
:let list_is_on = gettabwinvar(1, 2, '&list') :let list_is_on = gettabwinvar(1, 2, '&list')
:echo "myvar = " . gettabwinvar(3, 1, 'myvar') :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()*
getwinposx() The result is a Number, which is the X coordinate in pixels of 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 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 result will be -1 if the information is not available.
The value can be used with `:winpos`. The value can be used with `:winpos`.
*getwinposy()* *getwinposy()*
getwinposy() The result is a Number, which is the Y coordinate in pixels of 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 result will be -1 if the information is not available.
The value can be used with `:winpos`. The value can be used with `:winpos`.

View File

@@ -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_gettabvar(typval_T *argvars, typval_T *rettv);
static void f_gettabwinvar(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_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_getwinposx(typval_T *argvars, typval_T *rettv);
static void f_getwinposy(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); static void f_getwinvar(typval_T *argvars, typval_T *rettv);
@@ -641,6 +642,7 @@ static struct fst
{"gettabvar", 2, 3, f_gettabvar}, {"gettabvar", 2, 3, f_gettabvar},
{"gettabwinvar", 3, 4, f_gettabwinvar}, {"gettabwinvar", 3, 4, f_gettabwinvar},
{"getwininfo", 0, 1, f_getwininfo}, {"getwininfo", 0, 1, f_getwininfo},
{"getwinpos", 0, 1, f_getwinpos},
{"getwinposx", 0, 0, f_getwinposx}, {"getwinposx", 0, 0, f_getwinposx},
{"getwinposy", 0, 0, f_getwinposy}, {"getwinposy", 0, 0, f_getwinposy},
{"getwinvar", 2, 3, f_getwinvar}, {"getwinvar", 2, 3, f_getwinvar},
@@ -5526,6 +5528,38 @@ f_win_screenpos(typval_T *argvars, typval_T *rettv)
list_append_number(rettv->vval.v_list, wp == NULL ? 0 : wp->w_wincol + 1); list_append_number(rettv->vval.v_list, wp == NULL ? 0 : wp->w_wincol + 1);
} }
/*
* "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 * "getwinposx()" function
*/ */
@@ -5547,7 +5581,7 @@ f_getwinposx(typval_T *argvars UNUSED, typval_T *rettv)
{ {
int x, y; 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; rettv->vval.v_number = x;
} }
#endif #endif
@@ -5574,7 +5608,7 @@ f_getwinposy(typval_T *argvars UNUSED, typval_T *rettv)
{ {
int x, y; 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; rettv->vval.v_number = y;
} }
#endif #endif

View File

@@ -24,7 +24,7 @@ void term_cursor_right(int i);
void term_append_lines(int line_count); void term_append_lines(int line_count);
void term_delete_lines(int line_count); void term_delete_lines(int line_count);
void term_set_winpos(int x, int y); 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_set_winsize(int height, int width);
void term_fg_color(int n); void term_fg_color(int n);
void term_bg_color(int n); void term_bg_color(int n);

View File

@@ -2789,7 +2789,7 @@ static int waiting_for_winpos = FALSE;
* Returns OK or FAIL. * Returns OK or FAIL.
*/ */
int int
term_get_winpos(int *x, int *y) term_get_winpos(int *x, int *y, varnumber_T timeout)
{ {
int count = 0; int count = 0;
@@ -2801,8 +2801,8 @@ term_get_winpos(int *x, int *y)
OUT_STR(T_CGP); OUT_STR(T_CGP);
out_flush(); out_flush();
/* Try reading the result for 100 msec. */ /* Try reading the result for "timeout" msec. */
while (count++ < 10) while (count++ < timeout / 10)
{ {
(void)vpeekc_nomap(); (void)vpeekc_nomap();
if (winpos_x >= 0 && winpos_y >= 0) if (winpos_x >= 0 && winpos_y >= 0)

View File

@@ -778,6 +778,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1563,
/**/ /**/
1562, 1562,
/**/ /**/