Mercurial > vim
diff src/popupwin.c @ 18558:e5ef5d820b5b v8.1.2273
patch 8.1.2273: wrong default when "pos" is changed with popup_atcursor()
Commit: https://github.com/vim/vim/commit/4dd8fe0b4f49ec267640fb457672452825b11df0
Author: Bram Moolenaar <Bram@vim.org>
Date: Sat Nov 9 15:33:31 2019 +0100
patch 8.1.2273: wrong default when "pos" is changed with popup_atcursor()
Problem: Wrong default when "pos" is changed with popup_atcursor().
Solution: Adjust the default line and col when "pos" is not the default
value. (#5151)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sat, 09 Nov 2019 15:45:04 +0100 |
parents | a6dbbedddce1 |
children | 351659cbadb4 |
line wrap: on
line diff
--- a/src/popupwin.c +++ b/src/popupwin.c @@ -390,6 +390,25 @@ popup_add_timeout(win_T *wp, int time) } #endif + static poppos_T +get_pos_entry(dict_T *d, int give_error) +{ + char_u *str = dict_get_string(d, (char_u *)"pos", FALSE); + int nr; + + if (str == NULL) + return POPPOS_NONE; + + for (nr = 0; nr < (int)(sizeof(poppos_entries) / sizeof(poppos_entry_T)); + ++nr) + if (STRCMP(str, poppos_entries[nr].pp_name) == 0) + return poppos_entries[nr].pp_val; + + if (give_error) + semsg(_(e_invarg2), str); + return POPPOS_NONE; +} + /* * Shared between popup_create() and f_popup_move(). */ @@ -420,20 +439,11 @@ apply_move_options(win_T *wp, dict_T *d) if (di != NULL) wp->w_popup_fixed = dict_get_number(d, (char_u *)"fixed") != 0; - str = dict_get_string(d, (char_u *)"pos", FALSE); - if (str != NULL) { - for (nr = 0; - nr < (int)(sizeof(poppos_entries) / sizeof(poppos_entry_T)); - ++nr) - if (STRCMP(str, poppos_entries[nr].pp_name) == 0) - { - wp->w_popup_pos = poppos_entries[nr].pp_val; - nr = -1; - break; - } - if (nr != -1) - semsg(_(e_invarg2), str); + poppos_T ppt = get_pos_entry(d, TRUE); + + if (ppt != POPPOS_NONE) + wp->w_popup_pos = ppt; } str = dict_get_string(d, (char_u *)"textprop", FALSE); @@ -512,6 +522,8 @@ handle_moved_argument(win_T *wp, dictite else wp->w_popup_lnum = nr; li = li->li_next; + if (nr == 0) + wp->w_popup_curwin = NULL; } mincol = tv_get_number(&li->li_tv); @@ -1634,14 +1646,27 @@ parse_completepopup(win_T *wp) * Keep at least "width" columns from the right of the screen. */ void -popup_set_wantpos_cursor(win_T *wp, int width) +popup_set_wantpos_cursor(win_T *wp, int width, dict_T *d) { + poppos_T ppt = POPPOS_NONE; + + if (d != NULL) + ppt = get_pos_entry(d, FALSE); + setcursor_mayforce(TRUE); - wp->w_wantline = curwin->w_winrow + curwin->w_wrow; - if (wp->w_wantline == 0) // cursor in first line + if (ppt == POPPOS_TOPRIGHT || ppt == POPPOS_TOPLEFT) + { + wp->w_wantline = curwin->w_winrow + curwin->w_wrow + 2; + } + else { - wp->w_wantline = 2; - wp->w_popup_pos = POPPOS_TOPLEFT; + wp->w_wantline = curwin->w_winrow + curwin->w_wrow; + if (wp->w_wantline == 0) // cursor in first line + { + wp->w_wantline = 2; + wp->w_popup_pos = ppt == POPPOS_BOTRIGHT + ? POPPOS_TOPRIGHT : POPPOS_TOPLEFT; + } } wp->w_wantcol = curwin->w_wincol + curwin->w_wcol + 1; @@ -1651,6 +1676,7 @@ popup_set_wantpos_cursor(win_T *wp, int if (wp->w_wantcol < 1) wp->w_wantcol = 1; } + popup_adjust_position(wp); } @@ -1834,7 +1860,7 @@ popup_create(typval_T *argvars, typval_T } if (type == TYPE_ATCURSOR) { - popup_set_wantpos_cursor(wp, 0); + popup_set_wantpos_cursor(wp, 0, d); set_moved_values(wp); set_moved_columns(wp, FIND_STRING); } @@ -1935,7 +1961,7 @@ popup_create(typval_T *argvars, typval_T for (i = 0; i < 4; ++i) wp->w_popup_border[i] = 1; parse_previewpopup(wp); - popup_set_wantpos_cursor(wp, wp->w_minwidth); + popup_set_wantpos_cursor(wp, wp->w_minwidth, d); } # ifdef FEAT_QUICKFIX if (type == TYPE_INFO)