Mercurial > vim
diff src/popupwin.c @ 17149:c90fdb999393 v8.1.1574
patch 8.1.1574: tabpage option not yet implemented for popup window
commit https://github.com/vim/vim/commit/a3fce62c911c204ae144b55018f6dc9295088850
Author: Bram Moolenaar <Bram@vim.org>
Date: Thu Jun 20 02:31:49 2019 +0200
patch 8.1.1574: tabpage option not yet implemented for popup window
Problem: Tabpage option not yet implemented for popup window.
Solution: Implement tabpage option, also for popup_getoptions().
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Thu, 20 Jun 2019 02:45:05 +0200 |
parents | b4eb06233448 |
children | ebe9aab81898 |
line wrap: on
line diff
--- a/src/popupwin.c +++ b/src/popupwin.c @@ -827,11 +827,13 @@ popup_set_buffer_text(buf_T *buf, typval static win_T * popup_create(typval_T *argvars, typval_T *rettv, create_type_T type) { - win_T *wp; - buf_T *buf; - dict_T *d; - int nr; - int i; + win_T *wp; + tabpage_T *tp = NULL; + int tabnr; + buf_T *buf; + dict_T *d; + int nr; + int i; // Check arguments look OK. if (!(argvars[0].v_type == VAR_STRING && argvars[0].vval.v_string != NULL) @@ -847,6 +849,22 @@ popup_create(typval_T *argvars, typval_T } d = argvars[1].vval.v_dict; + if (dict_find(d, (char_u *)"tabpage", -1) != NULL) + tabnr = (int)dict_get_number(d, (char_u *)"tabpage"); + else if (type == TYPE_NOTIFICATION) + tabnr = -1; // notifications are global by default + else + tabnr = 0; + if (tabnr > 0) + { + tp = find_tabpage(tabnr); + if (tp == NULL) + { + semsg(_("E996: Tabpage not found: %d"), tabnr); + return NULL; + } + } + // Create the window and buffer. wp = win_alloc_popup_win(); if (wp == NULL) @@ -875,20 +893,19 @@ popup_create(typval_T *argvars, typval_T // Avoid that 'buftype' is reset when this buffer is entered. buf->b_p_initialized = TRUE; - if (dict_find(d, (char_u *)"tabpage", -1) != NULL) - nr = (int)dict_get_number(d, (char_u *)"tabpage"); - else if (type == TYPE_NOTIFICATION) - nr = -1; // notifications are global by default - else - nr = 0; - - if (nr == 0) + if (tp != NULL) + { + // popup on specified tab page + wp->w_next = tp->tp_first_popupwin; + tp->tp_first_popupwin = wp; + } + else if (tabnr == 0) { // popup on current tab page wp->w_next = curtab->tp_first_popupwin; curtab->tp_first_popupwin = wp; } - else if (nr < 0) + else // (tabnr < 0) { win_T *prev = first_popupwin; @@ -903,9 +920,6 @@ popup_create(typval_T *argvars, typval_T prev->w_next = wp; } } - else - // TODO: find tab page "nr" - emsg("Not implemented yet"); popup_set_buffer_text(buf, argvars[0]); @@ -1592,6 +1606,7 @@ f_popup_getoptions(typval_T *argvars, ty dict_T *dict; int id = (int)tv_get_number(argvars); win_T *wp = find_popup_win(id); + tabpage_T *tp; int i; if (rettv_dict_alloc(rettv) == OK) @@ -1614,6 +1629,25 @@ f_popup_getoptions(typval_T *argvars, ty dict_add_number(dict, "drag", wp->w_popup_drag); dict_add_string(dict, "highlight", wp->w_p_wcr); + // find the tabpage that holds this popup + i = 1; + FOR_ALL_TABPAGES(tp) + { + win_T *p; + + for (p = tp->tp_first_popupwin; p != NULL; p = wp->w_next) + if (p->w_id == id) + break; + if (p != NULL) + break; + ++i; + } + if (tp == NULL) + i = -1; // must be global + else if (tp == curtab) + i = 0; + dict_add_number(dict, "tabpage", i); + get_padding_border(dict, wp->w_popup_padding, "padding"); get_padding_border(dict, wp->w_popup_border, "border"); get_borderhighlight(dict, wp);