Patch 8.1.1429

12 views
Skip to first unread message

Bram Moolenaar

unread,
May 30, 2019, 3:24:53 PM5/30/19
to vim...@googlegroups.com

Patch 8.1.1429
Problem: "pos" option of popup window not supported yet.
Solution: Implement the option. Rename popup_getposition() to
popup_getpos().
Files: src/structs.h, src/popupwin.c, src/proto/popupwin.pro,
runtime/doc/popup.txt


*** ../vim-8.1.1428/src/structs.h 2019-05-30 00:11:48.704086357 +0200
--- src/structs.h 2019-05-30 19:48:48.436658475 +0200
***************
*** 1982,1987 ****
--- 1982,1996 ----
// # define CRYPT_NOT_INPLACE 1
#endif

+ #ifdef FEAT_TEXT_PROP
+ typedef enum {
+ POPPOS_BOTLEFT,
+ POPPOS_TOPLEFT,
+ POPPOS_BOTRIGHT,
+ POPPOS_TOPRIGHT,
+ POPPOS_CENTER
+ } poppos_T;
+ #endif

/*
* These are items normally related to a buffer. But when using ":ownsyntax"
***************
*** 2873,2879 ****
int w_vsep_width; /* Number of separator columns (0 or 1). */
pos_save_T w_save_cursor; /* backup of cursor pos and topline */
#ifdef FEAT_TEXT_PROP
! int w_popup_flags; // PFL_ values
int w_zindex;
int w_minheight; // "minheight" for popup window
int w_minwidth; // "minwidth" for popup window
--- 2882,2889 ----
int w_vsep_width; /* Number of separator columns (0 or 1). */
pos_save_T w_save_cursor; /* backup of cursor pos and topline */
#ifdef FEAT_TEXT_PROP
! int w_popup_flags; // POPF_ values
! poppos_T w_popup_pos;
int w_zindex;
int w_minheight; // "minheight" for popup window
int w_minwidth; // "minwidth" for popup window
*** ../vim-8.1.1428/src/popupwin.c 2019-05-30 19:24:57.615269014 +0200
--- src/popupwin.c 2019-05-30 21:18:23.603081264 +0200
***************
*** 15,26 ****

#ifdef FEAT_TEXT_PROP

/*
* Get option value for"key", which is "line" or "col".
* Handles "cursor+N" and "cursor-N".
*/
static int
! popup_options_pos(dict_T *dict, char_u *key)
{
dictitem_T *di;
char_u *val;
--- 15,39 ----

#ifdef FEAT_TEXT_PROP

+ typedef struct {
+ char *pp_name;
+ poppos_T pp_val;
+ } poppos_entry_T;
+
+ static poppos_entry_T poppos_entries[] = {
+ {"botleft", POPPOS_BOTLEFT},
+ {"topleft", POPPOS_TOPLEFT},
+ {"botright", POPPOS_BOTRIGHT},
+ {"topright", POPPOS_TOPRIGHT},
+ {"center", POPPOS_CENTER}
+ };
+
/*
* Get option value for"key", which is "line" or "col".
* Handles "cursor+N" and "cursor-N".
*/
static int
! popup_options_one(dict_T *dict, char_u *key)
{
dictitem_T *di;
char_u *val;
***************
*** 58,63 ****
--- 71,106 ----
return n;
}

+ static void
+ get_pos_options(win_T *wp, dict_T *dict)
+ {
+ char_u *str;
+ int nr;
+
+ nr = popup_options_one(dict, (char_u *)"line");
+ if (nr > 0)
+ wp->w_wantline = nr;
+ nr = popup_options_one(dict, (char_u *)"col");
+ if (nr > 0)
+ wp->w_wantcol = nr;
+
+ str = dict_get_string(dict, (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);
+ }
+ }
+
/*
* Go through the options in "dict" and apply them to buffer "buf" displayed in
* popup window "wp".
***************
*** 66,72 ****
--- 109,117 ----
static void
apply_options(win_T *wp, buf_T *buf UNUSED, dict_T *dict, int atcursor)
{
+ #if defined(FEAT_TIMERS)
int nr;
+ #endif
char_u *str;

wp->w_minwidth = dict_get_number(dict, (char_u *)"minwidth");
***************
*** 76,92 ****

if (atcursor)
{
setcursor_mayforce(TRUE);
wp->w_wantline = screen_screenrow();
wp->w_wantcol = screen_screencol() + 1;
}

! nr = popup_options_pos(dict, (char_u *)"line");
! if (nr > 0)
! wp->w_wantline = nr;
! nr = popup_options_pos(dict, (char_u *)"col");
! if (nr > 0)
! wp->w_wantcol = nr;

wp->w_zindex = dict_get_number(dict, (char_u *)"zindex");

--- 121,138 ----

if (atcursor)
{
+ wp->w_popup_pos = POPPOS_BOTLEFT;
setcursor_mayforce(TRUE);
wp->w_wantline = screen_screenrow();
+ if (wp->w_wantline == 0) // cursor in first line
+ {
+ wp->w_wantline = 2;
+ wp->w_popup_pos = POPPOS_TOPLEFT;
+ }
wp->w_wantcol = screen_screencol() + 1;
}

! get_pos_options(wp, dict);

wp->w_zindex = dict_get_number(dict, (char_u *)"zindex");

***************
*** 212,235 ****
linenr_T lnum;
int wrapped = 0;
int maxwidth;

! // TODO: Compute the size and position properly.
! if (wp->w_wantline > 0)
! wp->w_winrow = wp->w_wantline - 1;
else
! // TODO: better default
! wp->w_winrow = Rows > 5 ? Rows / 2 - 2 : 0;
! if (wp->w_winrow >= Rows)
! wp->w_winrow = Rows - 1;

! if (wp->w_wantcol > 0)
! wp->w_wincol = wp->w_wantcol - 1;
! else
! // TODO: better default
! wp->w_wincol = Columns > 20 ? Columns / 2 - 10 : 0;
! if (wp->w_wincol >= Columns - 3)
! wp->w_wincol = Columns - 3;

maxwidth = Columns - wp->w_wincol;
if (wp->w_maxwidth > 0 && maxwidth > wp->w_maxwidth)
maxwidth = wp->w_maxwidth;
--- 258,299 ----
linenr_T lnum;
int wrapped = 0;
int maxwidth;
+ int center_vert = FALSE;
+ int center_hor = FALSE;

! wp->w_winrow = 0;
! wp->w_wincol = 0;
! if (wp->w_popup_pos == POPPOS_CENTER)
! {
! // center after computing the size
! center_vert = TRUE;
! center_hor = TRUE;
! }
else
! {
! if (wp->w_wantline == 0)
! center_vert = TRUE;
! else if (wp->w_popup_pos == POPPOS_TOPLEFT
! || wp->w_popup_pos == POPPOS_TOPRIGHT)
! {
! wp->w_winrow = wp->w_wantline - 1;
! if (wp->w_winrow >= Rows)
! wp->w_winrow = Rows - 1;
! }

! if (wp->w_wantcol == 0)
! center_hor = TRUE;
! else if (wp->w_popup_pos == POPPOS_TOPLEFT
! || wp->w_popup_pos == POPPOS_BOTLEFT)
! {
! wp->w_wincol = wp->w_wantcol - 1;
! if (wp->w_wincol >= Columns - 3)
! wp->w_wincol = Columns - 3;
! }
! }

+ // When centering or right aligned, use maximum width.
+ // When left aligned use the space available.
maxwidth = Columns - wp->w_wincol;
if (wp->w_maxwidth > 0 && maxwidth > wp->w_maxwidth)
maxwidth = wp->w_maxwidth;
***************
*** 255,260 ****
--- 319,334 ----
wp->w_width = wp->w_minwidth;
if (wp->w_width > maxwidth)
wp->w_width = maxwidth;
+ if (center_hor)
+ wp->w_wincol = (Columns - wp->w_width) / 2;
+ else if (wp->w_popup_pos == POPPOS_BOTRIGHT
+ || wp->w_popup_pos == POPPOS_TOPRIGHT)
+ {
+ // Right aligned: move to the right if needed.
+ // No truncation, because that would change the height.
+ if (wp->w_width < wp->w_wantcol)
+ wp->w_wincol = wp->w_wantcol - wp->w_width;
+ }

if (wp->w_height <= 1)
wp->w_height = wp->w_buffer->b_ml.ml_line_count + wrapped;
***************
*** 265,270 ****
--- 339,357 ----
if (wp->w_height > Rows - wp->w_winrow)
wp->w_height = Rows - wp->w_winrow;

+ if (center_vert)
+ wp->w_winrow = (Rows - wp->w_height) / 2;
+ else if (wp->w_popup_pos == POPPOS_BOTRIGHT
+ || wp->w_popup_pos == POPPOS_BOTLEFT)
+ {
+ if (wp->w_height <= wp->w_wantline)
+ // bottom aligned: may move down
+ wp->w_winrow = wp->w_wantline - wp->w_height;
+ else
+ // not enough space, make top aligned
+ wp->w_winrow = wp->w_wantline + 1;
+ }
+
wp->w_popup_last_changedtick = CHANGEDTICK(wp->w_buffer);
}

***************
*** 304,310 ****
if (wp == NULL)
return;
rettv->vval.v_number = wp->w_id;
! wp->w_p_wrap = TRUE; // 'wrap' is default on

buf = buflist_new(NULL, NULL, (linenr_T)0, BLN_NEW|BLN_LISTED|BLN_DUMMY);
if (buf == NULL)
--- 391,397 ----
if (wp == NULL)
return;
rettv->vval.v_number = wp->w_id;
! wp->w_popup_pos = POPPOS_TOPLEFT;

buf = buflist_new(NULL, NULL, (linenr_T)0, BLN_NEW|BLN_LISTED|BLN_DUMMY);
if (buf == NULL)
***************
*** 322,327 ****
--- 409,416 ----
buf->b_p_swf = FALSE; // no swap file
buf->b_p_bl = FALSE; // unlisted buffer
buf->b_locked = TRUE;
+ wp->w_p_wrap = TRUE; // 'wrap' is default on
+
// Avoid that 'buftype' is reset when this buffer is entered.
buf->b_p_initialized = TRUE;

***************
*** 578,588 ****
wp->w_maxwidth = nr;
if ((nr = dict_get_number(d, (char_u *)"maxheight")) > 0)
wp->w_maxheight = nr;
! if ((nr = dict_get_number(d, (char_u *)"line")) > 0)
! wp->w_wantline = nr;
! if ((nr = dict_get_number(d, (char_u *)"col")) > 0)
! wp->w_wantcol = nr;
! // TODO: "pos"

if (wp->w_winrow + wp->w_height >= cmdline_row)
clear_cmdline = TRUE;
--- 667,673 ----
wp->w_maxwidth = nr;
if ((nr = dict_get_number(d, (char_u *)"maxheight")) > 0)
wp->w_maxheight = nr;
! get_pos_options(wp, d);

if (wp->w_winrow + wp->w_height >= cmdline_row)
clear_cmdline = TRUE;
***************
*** 591,600 ****
}

/*
! * popup_getposition({id})
*/
void
! f_popup_getposition(typval_T *argvars, typval_T *rettv)
{
dict_T *dict;
int id = (int)tv_get_number(argvars);
--- 676,685 ----
}

/*
! * popup_getpos({id})
*/
void
! f_popup_getpos(typval_T *argvars, typval_T *rettv)
{
dict_T *dict;
int id = (int)tv_get_number(argvars);
***************
*** 623,628 ****
--- 708,714 ----
dict_T *dict;
int id = (int)tv_get_number(argvars);
win_T *wp = find_popup_win(id);
+ int i;

if (rettv_dict_alloc(rettv) == OK)
{
***************
*** 637,642 ****
--- 723,738 ----
dict_add_number(dict, "maxheight", wp->w_maxheight);
dict_add_number(dict, "maxwidth", wp->w_maxwidth);
dict_add_number(dict, "zindex", wp->w_zindex);
+
+ for (i = 0; i < (int)(sizeof(poppos_entries) / sizeof(poppos_entry_T));
+ ++i)
+ if (wp->w_popup_pos == poppos_entries[i].pp_val)
+ {
+ dict_add_string(dict, "pos",
+ (char_u *)poppos_entries[i].pp_name);
+ break;
+ }
+
# if defined(FEAT_TIMERS)
dict_add_number(dict, "time", wp->w_popup_timer != NULL
? (long)wp->w_popup_timer->tr_interval : 0L);
*** ../vim-8.1.1428/src/proto/popupwin.pro 2019-05-30 19:24:57.615269014 +0200
--- src/proto/popupwin.pro 2019-05-30 21:19:20.050800869 +0200
***************
*** 1,16 ****
/* popupwin.c */
! int popup_any_visible(void);
! void close_all_popups(void);
! void ex_popupclear(exarg_T *eap);
void f_popup_atcursor(typval_T *argvars, typval_T *rettv);
void f_popup_close(typval_T *argvars, typval_T *rettv);
- void f_popup_create(typval_T *argvars, typval_T *rettv);
- void f_popup_getoptions(typval_T *argvars, typval_T *rettv);
- void f_popup_getposition(typval_T *argvars, typval_T *rettv);
void f_popup_hide(typval_T *argvars, typval_T *rettv);
- void f_popup_move(typval_T *argvars, typval_T *rettv);
void f_popup_show(typval_T *argvars, typval_T *rettv);
- void popup_adjust_position(win_T *wp);
void popup_close(int id);
void popup_close_tabpage(tabpage_T *tp, int id);
/* vim: set ft=c : */
--- 1,16 ----
/* popupwin.c */
! void popup_adjust_position(win_T *wp);
! void f_popup_create(typval_T *argvars, typval_T *rettv);
void f_popup_atcursor(typval_T *argvars, typval_T *rettv);
+ int popup_any_visible(void);
void f_popup_close(typval_T *argvars, typval_T *rettv);
void f_popup_hide(typval_T *argvars, typval_T *rettv);
void f_popup_show(typval_T *argvars, typval_T *rettv);
void popup_close(int id);
void popup_close_tabpage(tabpage_T *tp, int id);
+ void close_all_popups(void);
+ void ex_popupclear(exarg_T *eap);
+ void f_popup_move(typval_T *argvars, typval_T *rettv);
+ void f_popup_getpos(typval_T *argvars, typval_T *rettv);
+ void f_popup_getoptions(typval_T *argvars, typval_T *rettv);
/* vim: set ft=c : */
*** ../vim-8.1.1428/runtime/doc/popup.txt 2019-05-30 19:24:57.615269014 +0200
--- runtime/doc/popup.txt 2019-05-30 21:17:46.191262945 +0200
***************
*** 232,238 ****

popup_getoptions({id}) *popup_getoptions()*
Return the {options} for popup {id} in a Dict.
! A zero value means the option was not set.

The "highlight" entry is omitted, use the 'wincolor' option
for that: >
--- 232,239 ----

popup_getoptions({id}) *popup_getoptions()*
Return the {options} for popup {id} in a Dict.
! A zero value means the option was not set. For "zindex" the
! default value is returned, not zero.

The "highlight" entry is omitted, use the 'wincolor' option
for that: >
***************
*** 240,246 ****

< If popup window {id} is not found an empty Dict is returned.

! popup_getposition({id}) *popup_getposition()*
Return the position and size of popup {id}. Returns a Dict
with these entries:
col screen column of the popup, one-based
--- 241,247 ----

< If popup window {id} is not found an empty Dict is returned.

! popup_getpos({id}) *popup_getpos()*
Return the position and size of popup {id}. Returns a Dict
with these entries:
col screen column of the popup, one-based
***************
*** 303,321 ****
|popup-props|.

The second argument of |popup_create()| is a dictionary with options:
! line screen line where to position the popup; can use
! "cursor", "cursor+1" or "cursor-1" to use the line of
! the cursor and add or subtract a number of lines;
! default is "cursor-1".
! col screen column where to position the popup; can use
! "cursor" to use the column of the cursor, "cursor+99"
! and "cursor-99" to add or subtract a number of
! columns; default is "cursor"
pos "topleft", "topright", "botleft" or "botright":
defines what corner of the popup "line" and "col" are
used for. When not set "topleft" is used.
Alternatively "center" can be used to position the
! popup in the center of the Vim window.
{not implemented yet}
flip when TRUE (the default) and the position is relative
to the cursor, flip to below or above the cursor to
--- 304,325 ----
|popup-props|.

The second argument of |popup_create()| is a dictionary with options:
! line screen line where to position the popup; can use a
! number or "cursor", "cursor+1" or "cursor-1" to use
! the line of the cursor and add or subtract a number of
! lines; if omitted the popup is vertically centered,
! otherwise "pos" is used.
! col screen column where to position the popup; can use a
! number or "cursor" to use the column of the cursor,
! "cursor+99" and "cursor-99" to add or subtract a
! number of columns; if omitted the popup is
! horizontally centered, otherwise "pos" is used
pos "topleft", "topright", "botleft" or "botright":
defines what corner of the popup "line" and "col" are
used for. When not set "topleft" is used.
Alternatively "center" can be used to position the
! popup in the center of the Vim window, in which case
! "line" and "col" are ignored.
{not implemented yet}
flip when TRUE (the default) and the position is relative
to the cursor, flip to below or above the cursor to
*** ../vim-8.1.1428/src/version.c 2019-05-30 19:24:57.615269014 +0200
--- src/version.c 2019-05-30 21:22:31.477803848 +0200
***************
*** 769,770 ****
--- 769,772 ----
{ /* Add new patch number below this line */
+ /**/
+ 1429,
/**/

--
ERROR 047: Keyboard not found. Press RETURN to continue.

/// Bram Moolenaar -- Br...@Moolenaar.net -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
Reply all
Reply to author
Forward
0 new messages