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:
@@ -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`.
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
@@ -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);
|
||||||
|
@@ -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)
|
||||||
|
@@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user