comparison src/evalfunc.c @ 13379:0f9dd1b43244

patch 8.0.1563: timeout of getwinposx() can be too short commit https://github.com/vim/vim/commit/3f54fd319f6641b4bed478bcc90cdb39ede68e31 Author: Bram Moolenaar <Bram@vim.org> Date: Sat Mar 3 21:29:55 2018 +0100 patch 8.0.1563: timeout of getwinposx() can be too short Problem: Timeout of getwinposx() can be too short. (lilydjwg) Solution: Add getwinpos(). (closes https://github.com/vim/vim/issues/2689)
author Christian Brabandt <cb@256bit.org>
date Sat, 03 Mar 2018 21:30:06 +0100
parents 53f15c99a9fd
children 69517d67421f
comparison
equal deleted inserted replaced
13378:6099b4bc3dc2 13379:0f9dd1b43244
195 static void f_getregtype(typval_T *argvars, typval_T *rettv); 195 static void f_getregtype(typval_T *argvars, typval_T *rettv);
196 static void f_gettabinfo(typval_T *argvars, typval_T *rettv); 196 static void f_gettabinfo(typval_T *argvars, typval_T *rettv);
197 static void f_gettabvar(typval_T *argvars, typval_T *rettv); 197 static void f_gettabvar(typval_T *argvars, typval_T *rettv);
198 static void f_gettabwinvar(typval_T *argvars, typval_T *rettv); 198 static void f_gettabwinvar(typval_T *argvars, typval_T *rettv);
199 static void f_getwininfo(typval_T *argvars, typval_T *rettv); 199 static void f_getwininfo(typval_T *argvars, typval_T *rettv);
200 static void f_getwinpos(typval_T *argvars, typval_T *rettv);
200 static void f_getwinposx(typval_T *argvars, typval_T *rettv); 201 static void f_getwinposx(typval_T *argvars, typval_T *rettv);
201 static void f_getwinposy(typval_T *argvars, typval_T *rettv); 202 static void f_getwinposy(typval_T *argvars, typval_T *rettv);
202 static void f_getwinvar(typval_T *argvars, typval_T *rettv); 203 static void f_getwinvar(typval_T *argvars, typval_T *rettv);
203 static void f_glob(typval_T *argvars, typval_T *rettv); 204 static void f_glob(typval_T *argvars, typval_T *rettv);
204 static void f_globpath(typval_T *argvars, typval_T *rettv); 205 static void f_globpath(typval_T *argvars, typval_T *rettv);
639 {"getregtype", 0, 1, f_getregtype}, 640 {"getregtype", 0, 1, f_getregtype},
640 {"gettabinfo", 0, 1, f_gettabinfo}, 641 {"gettabinfo", 0, 1, f_gettabinfo},
641 {"gettabvar", 2, 3, f_gettabvar}, 642 {"gettabvar", 2, 3, f_gettabvar},
642 {"gettabwinvar", 3, 4, f_gettabwinvar}, 643 {"gettabwinvar", 3, 4, f_gettabwinvar},
643 {"getwininfo", 0, 1, f_getwininfo}, 644 {"getwininfo", 0, 1, f_getwininfo},
645 {"getwinpos", 0, 1, f_getwinpos},
644 {"getwinposx", 0, 0, f_getwinposx}, 646 {"getwinposx", 0, 0, f_getwinposx},
645 {"getwinposy", 0, 0, f_getwinposy}, 647 {"getwinposy", 0, 0, f_getwinposy},
646 {"getwinvar", 2, 3, f_getwinvar}, 648 {"getwinvar", 2, 3, f_getwinvar},
647 {"glob", 1, 4, f_glob}, 649 {"glob", 1, 4, f_glob},
648 {"glob2regpat", 1, 1, f_glob2regpat}, 650 {"glob2regpat", 1, 1, f_glob2regpat},
5525 list_append_number(rettv->vval.v_list, wp == NULL ? 0 : wp->w_winrow + 1); 5527 list_append_number(rettv->vval.v_list, wp == NULL ? 0 : wp->w_winrow + 1);
5526 list_append_number(rettv->vval.v_list, wp == NULL ? 0 : wp->w_wincol + 1); 5528 list_append_number(rettv->vval.v_list, wp == NULL ? 0 : wp->w_wincol + 1);
5527 } 5529 }
5528 5530
5529 /* 5531 /*
5532 * "getwinpos({timeout})" function
5533 */
5534 static void
5535 f_getwinpos(typval_T *argvars UNUSED, typval_T *rettv)
5536 {
5537 int x = -1;
5538 int y = -1;
5539
5540 if (rettv_list_alloc(rettv) == FAIL)
5541 return;
5542 #ifdef FEAT_GUI
5543 if (gui.in_use)
5544 gui_mch_get_winpos(&x, &y);
5545 # if defined(HAVE_TGETENT) && defined(FEAT_TERMRESPONSE)
5546 else
5547 # endif
5548 #endif
5549 #if defined(HAVE_TGETENT) && defined(FEAT_TERMRESPONSE)
5550 {
5551 varnumber_T timeout = 100;
5552
5553 if (argvars[0].v_type != VAR_UNKNOWN)
5554 timeout = get_tv_number(&argvars[0]);
5555 term_get_winpos(&x, &y, timeout);
5556 }
5557 #endif
5558 list_append_number(rettv->vval.v_list, (varnumber_T)x);
5559 list_append_number(rettv->vval.v_list, (varnumber_T)y);
5560 }
5561
5562
5563 /*
5530 * "getwinposx()" function 5564 * "getwinposx()" function
5531 */ 5565 */
5532 static void 5566 static void
5533 f_getwinposx(typval_T *argvars UNUSED, typval_T *rettv) 5567 f_getwinposx(typval_T *argvars UNUSED, typval_T *rettv)
5534 { 5568 {
5545 #endif 5579 #endif
5546 #if defined(HAVE_TGETENT) && defined(FEAT_TERMRESPONSE) 5580 #if defined(HAVE_TGETENT) && defined(FEAT_TERMRESPONSE)
5547 { 5581 {
5548 int x, y; 5582 int x, y;
5549 5583
5550 if (term_get_winpos(&x, &y) == OK) 5584 if (term_get_winpos(&x, &y, (varnumber_T)100) == OK)
5551 rettv->vval.v_number = x; 5585 rettv->vval.v_number = x;
5552 } 5586 }
5553 #endif 5587 #endif
5554 } 5588 }
5555 5589
5572 #endif 5606 #endif
5573 #if defined(HAVE_TGETENT) && defined(FEAT_TERMRESPONSE) 5607 #if defined(HAVE_TGETENT) && defined(FEAT_TERMRESPONSE)
5574 { 5608 {
5575 int x, y; 5609 int x, y;
5576 5610
5577 if (term_get_winpos(&x, &y) == OK) 5611 if (term_get_winpos(&x, &y, (varnumber_T)100) == OK)
5578 rettv->vval.v_number = y; 5612 rettv->vval.v_number = y;
5579 } 5613 }
5580 #endif 5614 #endif
5581 } 5615 }
5582 5616