diff options
Diffstat (limited to 'data/vim/patches/8.1.1391')
-rw-r--r-- | data/vim/patches/8.1.1391 | 2800 |
1 files changed, 2800 insertions, 0 deletions
diff --git a/data/vim/patches/8.1.1391 b/data/vim/patches/8.1.1391 new file mode 100644 index 000000000..4891d9b4f --- /dev/null +++ b/data/vim/patches/8.1.1391 @@ -0,0 +1,2800 @@ +To: vim_dev@googlegroups.com +Subject: Patch 8.1.1391 +Fcc: outbox +From: Bram Moolenaar <Bram@moolenaar.net> +Mime-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +------------ + +Patch 8.1.1391 +Problem: No popup window support. +Solution: Add initial code for popup windows. Add the 'wincolor' option. +Files: Filelist, runtime/doc/popup.txt, runtime/doc/options.txt, + src/Make_cyg_ming.mak, src/Make_mvc.mak, src/Make_vms.mms, + src/Makefile, src/autocmd.c, src/buffer.c, src/ex_cmds.h, + src/ex_cmdidxs.h, src/proto/buffer.pro, src/eval.c + src/evalfunc.c src/feature.h, src/globals.h, src/option.c, + src/option.h, src/popupwin.c, src/proto.h, src/proto/popupwin.pro, + src/proto/window.pro, src/screen.c, src/structs.h, src/terminal.c, + src/testdir/Make_all.mak, src/testdir/dumps/Test_popupwin_01.dump, + src/testdir/test_popupwin.vim, src/vim.h, src/window.c + + +*** ../vim-8.1.1390/Filelist 2019-05-11 17:03:55.170019762 +0200 +--- Filelist 2019-05-24 22:33:32.615127282 +0200 +*************** +*** 79,84 **** +--- 79,85 ---- + src/option.c \ + src/option.h \ + src/popupmnu.c \ ++ src/popupwin.c \ + src/quickfix.c \ + src/regexp.c \ + src/regexp_nfa.c \ +*************** +*** 200,205 **** +--- 201,207 ---- + src/proto/ops.pro \ + src/proto/option.pro \ + src/proto/popupmnu.pro \ ++ src/proto/popupwin.pro \ + src/proto/quickfix.pro \ + src/proto/regexp.pro \ + src/proto/screen.pro \ +*** ../vim-8.1.1390/runtime/doc/popup.txt 2019-05-21 23:08:56.969600854 +0200 +--- runtime/doc/popup.txt 2019-05-25 19:20:08.717613939 +0200 +*************** +*** 27,38 **** + A popup window can be used for such things as: + - briefly show a message without changing the command line + - prompt the user with a dialog +! - display information while typing + - give extra information for auto-completion + + The text in the popup window can be colored with |text-properties|. It is + also possible to use syntax highlighting. + + A popup window has a window-ID like other windows, but behaves differently. + The size can be up to the whole Vim window and it overlaps other windows. + It contains a buffer, and that buffer is always associated with the popup +--- 27,45 ---- + A popup window can be used for such things as: + - briefly show a message without changing the command line + - prompt the user with a dialog +! - display contextual information while typing + - give extra information for auto-completion + + The text in the popup window can be colored with |text-properties|. It is + also possible to use syntax highlighting. + ++ The default color used is "Pmenu". If you prefer something else use the ++ "highlight" argument or the 'wincolor' option, e.g.: > ++ hi MyPopupColor ctermbg=lightblue guibg=lightblue ++ call setwinvar(winid, '&wincolor', 'MyPopupColor') ++ ++ 'hlsearch' and match highlighting are not displayed in a popup window. ++ + A popup window has a window-ID like other windows, but behaves differently. + The size can be up to the whole Vim window and it overlaps other windows. + It contains a buffer, and that buffer is always associated with the popup +*************** +*** 46,51 **** +--- 53,72 ---- + - balloon, see |balloon-eval| + + ++ WINDOW POSITION AND SIZE *popup-position* ++ ++ The height of the window is normally equal to the number of lines in the ++ buffer. It can be limited with the "maxheight" property. You can use empty ++ lines to increase the height. ++ ++ The width of the window is normally equal to the longest line in the buffer. ++ It can be limited with the "maxwidth" property. You can use spaces to ++ increase the width. ++ ++ By default the 'wrap' option is set, so that no text disappears. However, if ++ there is not enough space, some text may be invisible. ++ ++ + TODO: + + Example how to use syntax highlighting of a code snippet. +*************** +*** 57,78 **** + the scroll offset into account. + Probably 2. is the best choice. + +- Positioning relative to the popup-menu to avoid overlapping with it; add a +- function to get the position and size of the popup-menu. +- + + IMPLEMENTATION: +! - Put code in popupwin.c +! - Use win_update() for displaying +! - At first redraw all windows NOT_VALID when the popup moves or hides. +! - At first always display the popup windows at the end of update_screen(), +! lowest zindex first. +! - Later make it more efficient and avoid flicker +! - Use a separate list of windows, one for each tab and one global. Also put +! "aucmd_win" in there. +! - add optional {buf} command to execute(). Only works for a buffer that is +! visible in a window in the current tab or in a popup window. +! E.g. for execute('syntax enable', 'silent', bufnr) + + + ============================================================================== +--- 78,91 ---- + the scroll offset into account. + Probably 2. is the best choice. + + + IMPLEMENTATION: +! - Code is in popupwin.c +! - handle screen resize in screenalloc(). +! - Support tab-local popup windows, use tp_first_popupwin and +! first_tab_popupwin. Swap like with firstwin/curwin. +! - Make redrawing more efficient and avoid flicker. +! - implement all the unimplemented features. + + + ============================================================================== +*************** +*** 89,94 **** +--- 102,108 ---- + - a string + - a list of strings + - a list of text lines with text properties ++ {not implemented yet} + {options} is a dictionary with many possible entries. + See |popup_create-usage| for details. + +*************** +*** 98,106 **** +--- 112,127 ---- + let winid = popup_create('hello', {}) + let bufnr = winbufnr(winid) + call setbufline(bufnr, 2, 'second line') ++ < In case of failure zero is returned. ++ ++ ++ popup_close({id}) *popup_close()* ++ Close popup {id}. The window and the associated buffer will ++ be deleted. + + + popup_dialog({text}, {options}) *popup_dialog()* ++ {not implemented yet} + Just like |popup_create()| but with these default options: > + call popup_create({text}, { + \ 'pos': 'center', +*************** +*** 111,116 **** +--- 132,138 ---- + + + popup_notification({text}, {options}) *popup_notification()* ++ {not implemented yet} + Show the {text} for 3 seconds at the top of the Vim window. + This works like: > + call popup_create({text}, { +*************** +*** 126,131 **** +--- 148,154 ---- + + + popup_atcursor({text}, {options}) *popup_atcursor()* ++ {not implemented yet} + Show the {text} above the cursor, and close it when the cursor + moves. This works like: > + call popup_create({text}, { +*************** +*** 137,142 **** +--- 160,166 ---- + + + popup_menu({text}, {options}) *popup_menu()* ++ {not implemented yet} + Show the {text} near the cursor, handle selecting one of the + items with cursorkeys, and close it an item is selected with + Space or Enter. {text} should have multiple lines to make this +*************** +*** 153,166 **** +--- 177,193 ---- + + + popup_show({id}) *popup_show()* ++ {not implemented yet} + If {id} is a hidden popup, show it now. + + popup_hide({id}) *popup_hide()* ++ {not implemented yet} + If {id} is a displayed popup, hide it now. If the popup has a + filter it will not be invoked for so long as the popup is + hidden. + + popup_move({id}, {options}) *popup_move()* ++ {not implemented yet} + Move popup {id} to the position speficied with {options}. + {options} may contain the items from |popup_create()| that + specify the popup position: "line", "col", "pos", "maxheight", +*************** +*** 168,173 **** +--- 195,201 ---- + + + popup_filter_menu({id}, {key}) *popup_filter_menu()* ++ {not implemented yet} + Filter that can be used for a popup. It handles the cursor + keys to move the selected index in the popup. Space and Enter + can be used to select an item. Invokes the "callback" of the +*************** +*** 176,181 **** +--- 204,210 ---- + + + popup_filter_yesno({id}, {key}) *popup_filter_yesno()* ++ {not implemented yet} + Filter that can be used for a popup. It handles only the keys + 'y', 'Y' and 'n' or 'N'. Invokes the "callback" of the + popup menu with the 1 for 'y' or 'Y' and zero for 'n' or 'N' +*************** +*** 184,198 **** + + + popup_setoptions({id}, {options}) *popup_setoptions()* + Override options in popup {id} with entries in {options}. + + + popup_getoptions({id}) *popup_getoptions()* + Return the {options} for popup {id}. + +! +! popup_close({id}) *popup_close()* +! Close popup {id}. + + *:popupclear* *:popupc* + :popupc[lear] Emergency solution to a misbehaving plugin: close all popup +--- 213,243 ---- + + + popup_setoptions({id}, {options}) *popup_setoptions()* ++ {not implemented yet} + Override options in popup {id} with entries in {options}. + + + popup_getoptions({id}) *popup_getoptions()* ++ {not implemented yet} + Return the {options} for popup {id}. + +! popup_getposition({id}) *popup_getposition()* +! {not implemented yet} +! Return the position and size of popup {id}. Returns a Dict +! with these entries: +! col screen column of the popup, one-based +! line screen line of the popup, one-based +! width width of the popup in screen cells +! height height of the popup in screen cells +! +! win_execute({id}, {command}) +! {not implemented yet} +! Like `execute()` but in the context of window {id}. +! The window will temporarily be made the current window, +! without triggering autocommands. +! Example: > +! call win_execute(winid, 'syntax enable') +! < + + *:popupclear* *:popupc* + :popupc[lear] Emergency solution to a misbehaving plugin: close all popup +*************** +*** 209,214 **** +--- 254,260 ---- + - 'swapfile' is off + - 'bufhidden' is "hide" + - 'buflisted' is off ++ - 'undolevels' is -1: no undo at all + TODO: more + + The window does have a cursor position, but the cursor is not displayed. +*************** +*** 226,231 **** +--- 272,278 ---- + - a string + - a list of strings + - a list of dictionaries, where each dictionary has these entries: ++ {not implemented yet} + text String with the text to display. + props A list of text properties. Optional. + Each entry is a dictionary, like the third argument of +*************** +*** 238,292 **** + "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. Default is "botleft". Alternatively +! "center" can be used to position the popup somewhere +! near the cursor. + flip when TRUE (the default) and the position is relative + to the cursor, flip to below or above the cursor to + avoid overlap with the |popupmenu-completion| or + another popup with a higher "zindex" + maxheight maximum height + minheight minimum height + maxwidth maximum width + minwidth minimum width + hidden when TRUE the popup exists but is not displayed; use + `popup_show()` to unhide it. + tab when -1: display the popup on all tabs; when 0 (the + default): display the popup on the current tab; + otherwise the number of the tab page the popup is + displayed on; when invalid the current tab is used + title text to be displayed above the first item in the + popup, on top of any border + wrap TRUE to make the lines wrap (default TRUE) +! highlight highlight group name to use for the text, defines the +! background and foreground color + border list with numbers, defining the border thickness + above/right/below/left of the popup; an empty list + uses a border of 1 all around + borderhighlight highlight group name to use for the border + borderchars list with characters, defining the character to use + for the top/right/bottom/left border; optionally + followed by the character to use for the + topright/botright/botleft/topleft corner; an empty + list can be used to show a double line all around + zindex priority for the popup, default 50 + time time in milliseconds after which the popup will close; + when omitted |popup_close()| must be used. + moved "cell": close the popup if the cursor moved at least + one screen cell; "word" allows for moving within + |<cword>|, "WORD" allows for moving within |<cWORD>|, + a list with two numbers specifies the start and end + column + filter a callback that can filter typed characters, see + |popup-filter| + callback a callback to be used when the popup closes, e.g. when + using |popup_filter_menu()|, see |popup-callback|. + + Depending on the "zindex" the popup goes under or above other popups. The + completion menu (|popup-menu|) has zindex 100. For messages that occur for a +--- 285,357 ---- + "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". ++ {only number is implemented} + 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" ++ {only number is implemented} + pos "topleft", "topright", "botleft" or "botright": + defines what corner of the popup "line" and "col" are + used for. Default is "botleft". 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 + avoid overlap with the |popupmenu-completion| or + another popup with a higher "zindex" ++ {not implemented yet} + maxheight maximum height + minheight minimum height ++ {not implemented yet} + maxwidth maximum width + minwidth minimum width ++ {not implemented yet} + hidden when TRUE the popup exists but is not displayed; use + `popup_show()` to unhide it. ++ {not implemented yet} + tab when -1: display the popup on all tabs; when 0 (the + default): display the popup on the current tab; + otherwise the number of the tab page the popup is + displayed on; when invalid the current tab is used ++ {only -1 and 0 are implemented} + title text to be displayed above the first item in the + popup, on top of any border ++ {not implemented yet} + wrap TRUE to make the lines wrap (default TRUE) +! {not implemented yet} +! highlight highlight group name to use for the text, stored in +! 'wincolor' +! {not implemented yet} + border list with numbers, defining the border thickness + above/right/below/left of the popup; an empty list + uses a border of 1 all around ++ {not implemented yet} + borderhighlight highlight group name to use for the border ++ {not implemented yet} + borderchars list with characters, defining the character to use + for the top/right/bottom/left border; optionally + followed by the character to use for the + topright/botright/botleft/topleft corner; an empty + list can be used to show a double line all around ++ {not implemented yet} + zindex priority for the popup, default 50 + time time in milliseconds after which the popup will close; + when omitted |popup_close()| must be used. ++ {not implemented yet} + moved "cell": close the popup if the cursor moved at least + one screen cell; "word" allows for moving within + |<cword>|, "WORD" allows for moving within |<cWORD>|, + a list with two numbers specifies the start and end + column ++ {not implemented yet} + filter a callback that can filter typed characters, see + |popup-filter| ++ {not implemented yet} + callback a callback to be used when the popup closes, e.g. when + using |popup_filter_menu()|, see |popup-callback|. ++ {not implemented yet} + + Depending on the "zindex" the popup goes under or above other popups. The + completion menu (|popup-menu|) has zindex 100. For messages that occur for a +*************** +*** 299,304 **** +--- 364,370 ---- + + POPUP TEXT PROPERTIES *popup-props* + ++ {not implemented yet} + These are similar to the third argument of |prop_add()|, but not exactly the + same, since they only apply to one line. + col starting column, counted in bytes, use one for the +*************** +*** 318,328 **** + + POPUP FILTER *popup-filter* + + A callback that gets any typed keys while a popup is displayed. The filter is +! not invoked for as long as the popup is hidden. + + The filter can return TRUE to indicate the key has been handled and is to be + discarded, or FALSE to let Vim handle the key as usual in the current state. + + The filter function is called with two arguments: the ID of the popup and the + key. +--- 384,398 ---- + + POPUP FILTER *popup-filter* + ++ {not implemented yet} + A callback that gets any typed keys while a popup is displayed. The filter is +! not invoked when the popup is hidden. + + The filter can return TRUE to indicate the key has been handled and is to be + discarded, or FALSE to let Vim handle the key as usual in the current state. ++ In case it returns FALSE and there is another popup window visible, that ++ filter is also called. The filter of the popup window with the highest zindex ++ is called first. + + The filter function is called with two arguments: the ID of the popup and the + key. +*************** +*** 342,347 **** +--- 412,418 ---- + + POPUP CALLBACK *popup-callback* + ++ {not implemented yet} + A callback that is invoked when the popup closes. Used by + |popup_filter_menu()|. Invoked with two arguments: the ID of the popup and + the result, which would usually be an index in the popup lines, or whatever +*** ../vim-8.1.1390/runtime/doc/options.txt 2019-05-23 22:11:56.288893239 +0200 +--- runtime/doc/options.txt 2019-05-25 15:00:16.330625497 +0200 +*************** +*** 1361,1366 **** +--- 1361,1368 ---- + prompt buffer where only the last line can be edited, meant + to be used by a plugin, see |prompt-buffer| + {only when compiled with the |+channel| feature} ++ popup buffer used in a popup window, see |popup|. ++ {only when compiled with the |+textprop| feature} + + This option is used together with 'bufhidden' and 'swapfile' to + specify special kinds of buffers. See |special-buffers|. +*************** +*** 8687,8692 **** +--- 8689,8700 ---- + This option is not used for <F10>; on Win32 and with GTK <F10> will + select the menu, unless it has been mapped. + ++ *'wincolor'* *'wcr'* ++ 'wincolor' 'wcr' string (default empty) ++ local to window ++ Highlight group name to use for this window instead of the Normal ++ color |hl-Normal|. ++ + *'window'* *'wi'* + 'window' 'wi' number (default screen height - 1) + global +*** ../vim-8.1.1390/src/Make_cyg_ming.mak 2019-05-24 17:17:51.056467137 +0200 +--- src/Make_cyg_ming.mak 2019-05-24 22:30:18.367968169 +0200 +*************** +*** 740,745 **** +--- 740,746 ---- + $(OUTDIR)/os_win32.o \ + $(OUTDIR)/pathdef.o \ + $(OUTDIR)/popupmnu.o \ ++ $(OUTDIR)/popupwin.o \ + $(OUTDIR)/quickfix.o \ + $(OUTDIR)/regexp.o \ + $(OUTDIR)/screen.o \ +*** ../vim-8.1.1390/src/Make_mvc.mak 2019-05-24 17:17:51.056467137 +0200 +--- src/Make_mvc.mak 2019-05-24 22:31:07.527761674 +0200 +*************** +*** 743,748 **** +--- 743,750 ---- + $(OUTDIR)\os_win32.obj \ + $(OUTDIR)\pathdef.obj \ + $(OUTDIR)\popupmnu.obj \ ++ $(OUTDIR)\popupwin.obj \ ++ $(OUTDIR)\popupwin.obj \ + $(OUTDIR)\quickfix.obj \ + $(OUTDIR)\regexp.obj \ + $(OUTDIR)\screen.obj \ +*************** +*** 1575,1580 **** +--- 1577,1584 ---- + + $(OUTDIR)/popupmnu.obj: $(OUTDIR) popupmnu.c $(INCL) + ++ $(OUTDIR)/popupwin.obj: $(OUTDIR) popupwin.c $(INCL) ++ + $(OUTDIR)/quickfix.obj: $(OUTDIR) quickfix.c $(INCL) + + $(OUTDIR)/regexp.obj: $(OUTDIR) regexp.c regexp_nfa.c $(INCL) +*************** +*** 1745,1750 **** +--- 1749,1755 ---- + proto/winclip.pro \ + proto/os_win32.pro \ + proto/popupmnu.pro \ ++ proto/popupwin.pro \ + proto/quickfix.pro \ + proto/regexp.pro \ + proto/screen.pro \ +*** ../vim-8.1.1390/src/Make_vms.mms 2019-05-11 21:50:03.941292990 +0200 +--- src/Make_vms.mms 2019-05-24 22:31:47.011592541 +0200 +*************** +*** 2,8 **** + # Makefile for Vim on OpenVMS + # + # Maintainer: Zoltan Arpadffy <arpadffy@polarhome.com> +! # Last change: 2019 May 11 + # + # This has script been tested on VMS 6.2 to 8.2 on DEC Alpha, VAX and IA64 + # with MMS and MMK +--- 2,8 ---- + # Makefile for Vim on OpenVMS + # + # Maintainer: Zoltan Arpadffy <arpadffy@polarhome.com> +! # Last change: 2019 May 24 + # + # This has script been tested on VMS 6.2 to 8.2 on DEC Alpha, VAX and IA64 + # with MMS and MMK +*************** +*** 313,319 **** + if_cscope.c if_xcmdsrv.c fileio.c findfile.c fold.c getchar.c \ + hardcopy.c hashtab.c indent.c insexpand.c json.c list.c main.c mark.c \ + menu.c mbyte.c memfile.c memline.c message.c misc1.c misc2.c move.c \ +! normal.c ops.c option.c popupmnu.c quickfix.c regexp.c search.c \ + sha256.c sign.c spell.c spellfile.c syntax.c tag.c term.c termlib.c \ + textprop.c ui.c undo.c usercmd.c userfunc.c version.c screen.c \ + window.c os_unix.c os_vms.c pathdef.c \ +--- 313,319 ---- + if_cscope.c if_xcmdsrv.c fileio.c findfile.c fold.c getchar.c \ + hardcopy.c hashtab.c indent.c insexpand.c json.c list.c main.c mark.c \ + menu.c mbyte.c memfile.c memline.c message.c misc1.c misc2.c move.c \ +! normal.c ops.c option.c popupmnu.c popupwin.c, quickfix.c regexp.c search.c \ + sha256.c sign.c spell.c spellfile.c syntax.c tag.c term.c termlib.c \ + textprop.c ui.c undo.c usercmd.c userfunc.c version.c screen.c \ + window.c os_unix.c os_vms.c pathdef.c \ +*************** +*** 327,333 **** + fileio.obj findfile.obj fold.obj getchar.obj hardcopy.obj hashtab.obj \ + indent.obj insexpand.obj json.obj list.obj main.obj mark.obj \ + menu.obj memfile.obj memline.obj message.obj misc1.obj misc2.obj \ +! move.obj mbyte.obj normal.obj ops.obj option.obj popupmnu.obj \ + quickfix.obj regexp.obj search.obj sha256.obj sign.obj spell.obj \ + spellfile.obj syntax.obj tag.obj term.obj termlib.obj textprop.obj \ + ui.obj undo.obj usercmd.obj userfunc.obj screen.obj version.obj \ +--- 327,333 ---- + fileio.obj findfile.obj fold.obj getchar.obj hardcopy.obj hashtab.obj \ + indent.obj insexpand.obj json.obj list.obj main.obj mark.obj \ + menu.obj memfile.obj memline.obj message.obj misc1.obj misc2.obj \ +! move.obj mbyte.obj normal.obj ops.obj option.obj popupmnu.obj popupwin.obj\ + quickfix.obj regexp.obj search.obj sha256.obj sign.obj spell.obj \ + spellfile.obj syntax.obj tag.obj term.obj termlib.obj textprop.obj \ + ui.obj undo.obj usercmd.obj userfunc.obj screen.obj version.obj \ +*************** +*** 688,693 **** +--- 688,697 ---- + ascii.h keymap.h term.h macros.h structs.h regexp.h \ + gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \ + globals.h ++ popupwin.obj : popupwin.c vim.h [.auto]config.h feature.h os_unix.h \ ++ ascii.h keymap.h term.h macros.h structs.h regexp.h \ ++ gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \ ++ globals.h + quickfix.obj : quickfix.c vim.h [.auto]config.h feature.h os_unix.h \ + ascii.h keymap.h term.h macros.h structs.h regexp.h \ + gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \ +*** ../vim-8.1.1390/src/Makefile 2019-05-19 21:44:03.978804771 +0200 +--- src/Makefile 2019-05-24 22:32:52.027308164 +0200 +*************** +*** 1620,1625 **** +--- 1621,1627 ---- + os_unix.c \ + auto/pathdef.c \ + popupmnu.c \ ++ popupwin.c \ + pty.c \ + quickfix.c \ + regexp.c \ +*************** +*** 1734,1739 **** +--- 1736,1742 ---- + objects/os_unix.o \ + objects/pathdef.o \ + objects/popupmnu.o \ ++ objects/popupwin.o \ + objects/pty.o \ + objects/quickfix.o \ + objects/regexp.o \ +*************** +*** 1873,1878 **** +--- 1876,1882 ---- + os_mac_conv.pro \ + os_unix.pro \ + popupmnu.pro \ ++ popupwin.pro \ + pty.pro \ + quickfix.pro \ + regexp.pro \ +*************** +*** 3208,3213 **** +--- 3212,3220 ---- + objects/popupmnu.o: popupmnu.c + $(CCC) -o $@ popupmnu.c + ++ objects/popupwin.o: popupwin.c ++ $(CCC) -o $@ popupwin.c ++ + objects/pty.o: pty.c + $(CCC) -o $@ pty.c + +*************** +*** 3612,3617 **** +--- 3619,3628 ---- + auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \ + proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \ + proto.h globals.h ++ objects/popupwin.o: popupwin.c vim.h protodef.h auto/config.h feature.h os_unix.h \ ++ auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \ ++ proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \ ++ proto.h globals.h + objects/pty.o: pty.c vim.h protodef.h auto/config.h feature.h os_unix.h \ + auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \ + proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \ +*** ../vim-8.1.1390/src/autocmd.c 2019-05-24 18:48:36.750128544 +0200 +--- src/autocmd.c 2019-05-25 17:04:32.422149360 +0200 +*************** +*** 1349,1355 **** + */ + FOR_ALL_BUFFERS(buf) + { +! if (buf->b_ml.ml_mfp != NULL) + { + // find a window for this buffer and save some values + aucmd_prepbuf(&aco, buf); +--- 1349,1355 ---- + */ + FOR_ALL_BUFFERS(buf) + { +! if (buf->b_ml.ml_mfp != NULL && !bt_popup(buf)) + { + // find a window for this buffer and save some values + aucmd_prepbuf(&aco, buf); +*************** +*** 1423,1429 **** + // back to using the current window. + if (win == NULL && aucmd_win == NULL) + { +! win_alloc_aucmd_win(); + if (aucmd_win == NULL) + win = curwin; + } +--- 1423,1429 ---- + // back to using the current window. + if (win == NULL && aucmd_win == NULL) + { +! aucmd_win = win_alloc_popup_win(); + if (aucmd_win == NULL) + win = curwin; + } +*************** +*** 1451,1470 **** + // unexpected results. + aco->use_aucmd_win = TRUE; + aucmd_win_used = TRUE; +- aucmd_win->w_buffer = buf; +- #if defined(FEAT_SYN_HL) || defined(FEAT_SPELL) +- aucmd_win->w_s = &buf->b_s; +- #endif +- ++buf->b_nwindows; +- win_init_empty(aucmd_win); // set cursor and topline to safe values + +! // Make sure w_localdir and globaldir are NULL to avoid a chdir() in +! // win_enter_ext(). +! VIM_CLEAR(aucmd_win->w_localdir); + aco->globaldir = globaldir; + globaldir = NULL; + +- + // Split the current window, put the aucmd_win in the upper half. + // We don't want the BufEnter or WinEnter autocommands. + block_autocmds(); +--- 1451,1462 ---- + // unexpected results. + aco->use_aucmd_win = TRUE; + aucmd_win_used = TRUE; + +! win_init_popup_win(aucmd_win, buf); +! + aco->globaldir = globaldir; + globaldir = NULL; + + // Split the current window, put the aucmd_win in the upper half. + // We don't want the BufEnter or WinEnter autocommands. + block_autocmds(); +*************** +*** 1620,1625 **** +--- 1612,1619 ---- + int force, // when TRUE, ignore autocmd_busy + buf_T *buf) // buffer for <abuf> + { ++ if (bt_popup(buf)) ++ return FALSE; + return apply_autocmds_group(event, fname, fname_io, force, + AUGROUP_ALL, buf, NULL); + } +*** ../vim-8.1.1390/src/buffer.c 2019-05-24 19:38:59.096545552 +0200 +--- src/buffer.c 2019-05-25 19:44:01.510535075 +0200 +*************** +*** 456,462 **** + win_T *win, /* if not NULL, set b_last_cursor */ + buf_T *buf, + int action, +! int abort_if_last UNUSED) + { + int is_curbuf; + int nwindows; +--- 456,462 ---- + win_T *win, /* if not NULL, set b_last_cursor */ + buf_T *buf, + int action, +! int abort_if_last) + { + int is_curbuf; + int nwindows; +*************** +*** 5678,5684 **** + int + bt_prompt(buf_T *buf) + { +! return buf != NULL && buf->b_p_bt[0] == 'p'; + } + + /* +--- 5678,5694 ---- + int + bt_prompt(buf_T *buf) + { +! return buf != NULL && buf->b_p_bt[0] == 'p' && buf->b_p_bt[1] == 'r'; +! } +! +! /* +! * Return TRUE if "buf" is a buffer for a popup window. +! */ +! int +! bt_popup(buf_T *buf) +! { +! return buf != NULL && buf->b_p_bt != NULL +! && buf->b_p_bt[0] == 'p' && buf->b_p_bt[1] == 'o'; + } + + /* +*** ../vim-8.1.1390/src/ex_cmds.h 2019-05-09 18:59:27.228463605 +0200 +--- src/ex_cmds.h 2019-05-25 17:30:22.174244851 +0200 +*************** +*** 1091,1096 **** +--- 1091,1099 ---- + EX(CMD_popup, "popup", ex_popup, + NEEDARG|EXTRA|BANG|TRLBAR|NOTRLCOM|CMDWIN, + ADDR_NONE), ++ EX(CMD_popupclear, "popupclear", ex_popupclear, ++ TRLBAR, ++ ADDR_NONE), + EX(CMD_ppop, "ppop", ex_ptag, + RANGE|BANG|COUNT|TRLBAR|ZEROR, + ADDR_OTHER), +*** ../vim-8.1.1390/src/ex_cmdidxs.h 2019-05-09 18:59:27.228463605 +0200 +--- src/ex_cmdidxs.h 2019-05-25 17:29:11.210621047 +0200 +*************** +*** 21,36 **** + /* n */ 285, + /* o */ 305, + /* p */ 317, +! /* q */ 356, +! /* r */ 359, +! /* s */ 379, +! /* t */ 447, +! /* u */ 492, +! /* v */ 503, +! /* w */ 521, +! /* x */ 535, +! /* y */ 545, +! /* z */ 546 + }; + + /* +--- 21,36 ---- + /* n */ 285, + /* o */ 305, + /* p */ 317, +! /* q */ 357, +! /* r */ 360, +! /* s */ 380, +! /* t */ 448, +! /* u */ 493, +! /* v */ 504, +! /* w */ 522, +! /* x */ 536, +! /* y */ 546, +! /* z */ 547 + }; + + /* +*************** +*** 56,62 **** + /* m */ { 1, 0, 0, 0, 7, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16 }, + /* n */ { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 8, 10, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0 }, + /* o */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 5, 0, 0, 0, 0, 0, 0, 9, 0, 11, 0, 0, 0 }, +! /* p */ { 1, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 0, 0, 16, 17, 26, 0, 27, 0, 28, 0 }, + /* q */ { 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + /* r */ { 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 19, 0, 0, 0, 0 }, + /* s */ { 2, 6, 15, 0, 19, 23, 0, 25, 26, 0, 0, 29, 31, 35, 39, 41, 0, 49, 0, 50, 0, 62, 63, 0, 64, 0 }, +--- 56,62 ---- + /* m */ { 1, 0, 0, 0, 7, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16 }, + /* n */ { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 8, 10, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0 }, + /* o */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 5, 0, 0, 0, 0, 0, 0, 9, 0, 11, 0, 0, 0 }, +! /* p */ { 1, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 10, 0, 0, 17, 18, 27, 0, 28, 0, 29, 0 }, + /* q */ { 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + /* r */ { 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 19, 0, 0, 0, 0 }, + /* s */ { 2, 6, 15, 0, 19, 23, 0, 25, 26, 0, 0, 29, 31, 35, 39, 41, 0, 49, 0, 50, 0, 62, 63, 0, 64, 0 }, +*************** +*** 69,72 **** + /* z */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } + }; + +! static const int command_count = 559; +--- 69,72 ---- + /* z */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } + }; + +! static const int command_count = 560; +*** ../vim-8.1.1390/src/proto/buffer.pro 2019-01-13 23:38:33.407773189 +0100 +--- src/proto/buffer.pro 2019-05-25 14:03:03.028491435 +0200 +*************** +*** 61,66 **** +--- 61,67 ---- + int bt_terminal(buf_T *buf); + int bt_help(buf_T *buf); + int bt_prompt(buf_T *buf); ++ int bt_popup(buf_T *buf); + int bt_nofile(buf_T *buf); + int bt_dontwrite(buf_T *buf); + int bt_dontwrite_msg(buf_T *buf); +*** ../vim-8.1.1390/src/eval.c 2019-05-24 19:38:59.096545552 +0200 +--- src/eval.c 2019-05-25 16:57:22.652587804 +0200 +*************** +*** 5585,5590 **** +--- 5585,5603 ---- + if (aucmd_win != NULL) + abort = abort || set_ref_in_item(&aucmd_win->w_winvar.di_tv, copyID, + NULL, NULL); ++ #ifdef FEAT_TEXT_PROP ++ for (wp = first_popupwin; wp != NULL; wp = wp->w_next) ++ abort = abort || set_ref_in_item(&wp->w_winvar.di_tv, copyID, ++ NULL, NULL); ++ for (wp = first_tab_popupwin; wp != NULL; wp = wp->w_next) ++ abort = abort || set_ref_in_item(&wp->w_winvar.di_tv, copyID, ++ NULL, NULL); ++ FOR_ALL_TABPAGES(tp) ++ if (tp != curtab) ++ for (wp = tp->tp_first_popupwin; wp != NULL; wp = wp->w_next) ++ abort = abort || set_ref_in_item(&wp->w_winvar.di_tv, copyID, ++ NULL, NULL); ++ #endif + + /* tabpage-local variables */ + FOR_ALL_TABPAGES(tp) +*************** +*** 8801,8807 **** +--- 8814,8833 ---- + break; + } + if (nr >= LOWEST_WIN_ID) ++ { ++ #ifdef FEAT_TEXT_PROP ++ // popup windows are in a separate list ++ for (wp = (tp == NULL || tp == curtab) ++ ? first_tab_popupwin : tp->tp_first_popupwin; ++ wp != NULL; wp = wp->w_next) ++ if (wp->w_id == nr) ++ return wp; ++ for (wp = first_popupwin; wp != NULL; wp = wp->w_next) ++ if (wp->w_id == nr) ++ return wp; ++ #endif + return NULL; ++ } + return wp; + } + +*** ../vim-8.1.1390/src/evalfunc.c 2019-05-24 18:48:36.754128525 +0200 +--- src/evalfunc.c 2019-05-25 16:26:56.415485375 +0200 +*************** +*** 807,812 **** +--- 807,816 ---- + #ifdef FEAT_PERL + {"perleval", 1, 1, f_perleval}, + #endif ++ #ifdef FEAT_TEXT_PROP ++ {"popup_close", 1, 1, f_popup_close}, ++ {"popup_create", 2, 2, f_popup_create}, ++ #endif + #ifdef FEAT_FLOAT + {"pow", 2, 2, f_pow}, + #endif +*** ../vim-8.1.1390/src/feature.h 2019-04-28 19:46:17.026060122 +0200 +--- src/feature.h 2019-05-24 22:14:50.440233462 +0200 +*************** +*** 477,483 **** + #endif + + /* +! * +textprop Text properties + */ + #if defined(FEAT_EVAL) && defined(FEAT_SYN_HL) + # define FEAT_TEXT_PROP +--- 477,483 ---- + #endif + + /* +! * +textprop Text properties and popup windows + */ + #if defined(FEAT_EVAL) && defined(FEAT_SYN_HL) + # define FEAT_TEXT_PROP +*** ../vim-8.1.1390/src/globals.h 2019-05-09 18:59:27.228463605 +0200 +--- src/globals.h 2019-05-24 22:20:53.310303408 +0200 +*************** +*** 550,558 **** + #endif + + /* +! * All windows are linked in a list. firstwin points to the first entry, +! * lastwin to the last entry (can be the same as firstwin) and curwin to the +! * currently active window. + */ + EXTERN win_T *firstwin; /* first window */ + EXTERN win_T *lastwin; /* last window */ +--- 550,559 ---- + #endif + + /* +! * All regular windows are linked in a list. "firstwin" points to the first +! * entry, "lastwin" to the last entry (can be the same as firstwin) and +! * "curwin" to the currently active window. +! * When switching tabs these swapped with the pointers in "tabpage_T". + */ + EXTERN win_T *firstwin; /* first window */ + EXTERN win_T *lastwin; /* last window */ +*************** +*** 580,585 **** +--- 581,591 ---- + EXTERN win_T *aucmd_win; /* window used in aucmd_prepbuf() */ + EXTERN int aucmd_win_used INIT(= FALSE); /* aucmd_win is being used */ + ++ #ifdef FEAT_TEXT_PROP ++ EXTERN win_T *first_tab_popupwin; // first popup window local to tab page ++ EXTERN win_T *first_popupwin; // first global popup window ++ #endif ++ + /* + * The window layout is kept in a tree of frames. topframe points to the top + * of the tree. +*** ../vim-8.1.1390/src/option.c 2019-05-24 18:48:36.766128461 +0200 +--- src/option.c 2019-05-25 15:05:25.377343756 +0200 +*************** +*** 196,201 **** +--- 196,202 ---- + # define PV_BRI OPT_WIN(WV_BRI) + # define PV_BRIOPT OPT_WIN(WV_BRIOPT) + #endif ++ # define PV_WCR OPT_WIN(WV_WCR) + #ifdef FEAT_DIFF + # define PV_DIFF OPT_WIN(WV_DIFF) + #endif +*************** +*** 3033,3038 **** +--- 3034,3043 ---- + {(char_u *)NULL, (char_u *)0L} + #endif + SCTX_INIT}, ++ {"wincolor", "wcr", P_STRING|P_ALLOCED|P_VI_DEF|P_RWIN, ++ (char_u *)VAR_WIN, PV_WCR, ++ {(char_u *)"", (char_u *)NULL} ++ SCTX_INIT}, + {"window", "wi", P_NUM|P_VI_DEF, + (char_u *)&p_window, PV_NONE, + {(char_u *)0L, (char_u *)0L} SCTX_INIT}, +*************** +*** 3211,3217 **** + static char *(p_scbopt_values[]) = {"ver", "hor", "jump", NULL}; + static char *(p_debug_values[]) = {"msg", "throw", "beep", NULL}; + static char *(p_ead_values[]) = {"both", "ver", "hor", NULL}; +! static char *(p_buftype_values[]) = {"nofile", "nowrite", "quickfix", "help", "terminal", "acwrite", "prompt", NULL}; + static char *(p_bufhidden_values[]) = {"hide", "unload", "delete", "wipe", NULL}; + static char *(p_bs_values[]) = {"indent", "eol", "start", NULL}; + #ifdef FEAT_FOLDING +--- 3216,3222 ---- + static char *(p_scbopt_values[]) = {"ver", "hor", "jump", NULL}; + static char *(p_debug_values[]) = {"msg", "throw", "beep", NULL}; + static char *(p_ead_values[]) = {"both", "ver", "hor", NULL}; +! static char *(p_buftype_values[]) = {"nofile", "nowrite", "quickfix", "help", "terminal", "acwrite", "prompt", "popup", NULL}; + static char *(p_bufhidden_values[]) = {"hide", "unload", "delete", "wipe", NULL}; + static char *(p_bs_values[]) = {"indent", "eol", "start", NULL}; + #ifdef FEAT_FOLDING +*************** +*** 10940,10945 **** +--- 10945,10951 ---- + case PV_BRI: return (char_u *)&(curwin->w_p_bri); + case PV_BRIOPT: return (char_u *)&(curwin->w_p_briopt); + #endif ++ case PV_WCR: return (char_u *)&(curwin->w_p_wcr); + case PV_SCBIND: return (char_u *)&(curwin->w_p_scb); + case PV_CRBIND: return (char_u *)&(curwin->w_p_crb); + #ifdef FEAT_CONCEAL +*************** +*** 11124,11129 **** +--- 11130,11136 ---- + to->wo_bri = from->wo_bri; + to->wo_briopt = vim_strsave(from->wo_briopt); + #endif ++ to->wo_wcr = vim_strsave(from->wo_wcr); + to->wo_scb = from->wo_scb; + to->wo_scb_save = from->wo_scb_save; + to->wo_crb = from->wo_crb; +*************** +*** 11221,11226 **** +--- 11228,11234 ---- + #ifdef FEAT_LINEBREAK + check_string_option(&wop->wo_briopt); + #endif ++ check_string_option(&wop->wo_wcr); + } + + /* +*************** +*** 11245,11250 **** +--- 11253,11259 ---- + #ifdef FEAT_LINEBREAK + clear_string_option(&wop->wo_briopt); + #endif ++ clear_string_option(&wop->wo_wcr); + #ifdef FEAT_RIGHTLEFT + clear_string_option(&wop->wo_rlc); + #endif +*** ../vim-8.1.1390/src/option.h 2019-05-23 15:37:41.965634969 +0200 +--- src/option.h 2019-05-25 15:02:04.434201608 +0200 +*************** +*** 1116,1121 **** +--- 1116,1122 ---- + , WV_BRI + , WV_BRIOPT + #endif ++ , WV_WCR + #ifdef FEAT_DIFF + , WV_DIFF + #endif +*** ../vim-8.1.1390/src/popupwin.c 2019-05-25 19:47:19.985538034 +0200 +--- src/popupwin.c 2019-05-25 19:08:46.369293173 +0200 +*************** +*** 0 **** +--- 1,231 ---- ++ /* vi:set ts=8 sts=4 sw=4 noet: ++ * ++ * VIM - Vi IMproved by Bram Moolenaar ++ * ++ * Do ":help uganda" in Vim to read a list of people who contributed. ++ * Do ":help credits" in Vim to see a list of people who contributed. ++ * See README.txt for an overview of the Vim source code. ++ */ ++ ++ /* ++ * Implementation of popup windows. See ":help popup". ++ */ ++ ++ #include "vim.h" ++ ++ #ifdef FEAT_TEXT_PROP ++ ++ /* ++ * Go through the options in "dict" and apply them to buffer "buf" displayed in ++ * popup window "wp". ++ */ ++ static void ++ apply_options(win_T *wp, buf_T *buf UNUSED, dict_T *dict) ++ { ++ wp->w_maxwidth = dict_get_number(dict, (char_u *)"maxwidth"); ++ wp->w_maxheight = dict_get_number(dict, (char_u *)"maxheight"); ++ wp->w_winrow = dict_get_number(dict, (char_u *)"line"); ++ wp->w_wincol = dict_get_number(dict, (char_u *)"col"); ++ wp->w_zindex = dict_get_number(dict, (char_u *)"zindex"); ++ } ++ ++ /* ++ * popup_create({text}, {options}) ++ */ ++ void ++ f_popup_create(typval_T *argvars, typval_T *rettv) ++ { ++ win_T *wp; ++ buf_T *buf; ++ dict_T *d; ++ int nr; ++ ++ // Check arguments look OK. ++ if (!(argvars[0].v_type == VAR_STRING ++ && argvars[0].vval.v_string != NULL ++ && STRLEN(argvars[0].vval.v_string) > 0) ++ && !(argvars[0].v_type == VAR_LIST ++ && argvars[0].vval.v_list != NULL ++ && argvars[0].vval.v_list->lv_len > 0)) ++ { ++ emsg(_(e_listreq)); ++ return; ++ } ++ if (argvars[1].v_type != VAR_DICT || argvars[1].vval.v_dict == NULL) ++ { ++ emsg(_(e_dictreq)); ++ return; ++ } ++ d = argvars[1].vval.v_dict; ++ ++ // Create the window and buffer. ++ wp = win_alloc_popup_win(); ++ 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) ++ return; ++ ml_open(buf); ++ curbuf = buf; ++ set_string_option_direct((char_u *)"buftype", -1, ++ (char_u *)"popup", OPT_FREE|OPT_LOCAL, 0); ++ set_string_option_direct((char_u *)"bufhidden", -1, ++ (char_u *)"hide", OPT_FREE|OPT_LOCAL, 0); ++ curbuf = curwin->w_buffer; ++ buf->b_p_ul = -1; // no undo ++ buf->b_p_swf = FALSE; // no swap file ++ buf->b_p_bl = FALSE; // unlisted buffer ++ ++ win_init_popup_win(wp, buf); ++ ++ nr = (int)dict_get_number(d, (char_u *)"tab"); ++ if (nr == 0) ++ { ++ // popup on current tab ++ wp->w_next = first_tab_popupwin; ++ first_tab_popupwin = wp; ++ } ++ else if (nr < 0) ++ { ++ // global popup ++ wp->w_next = first_popupwin; ++ first_popupwin = wp; ++ } ++ else ++ // TODO: find tab page "nr" ++ emsg("Not implemented yet"); ++ ++ // Add text to the buffer. ++ if (argvars[0].v_type == VAR_STRING) ++ // just a string ++ ml_append_buf(buf, 0, argvars[0].vval.v_string, (colnr_T)0, TRUE); ++ else if (argvars[0].vval.v_list->lv_first->li_tv.v_type == VAR_STRING) ++ { ++ listitem_T *li; ++ linenr_T lnum = 0; ++ char_u *p; ++ ++ // list of strings ++ for (li = argvars[0].vval.v_list->lv_first; li != NULL; ++ li = li->li_next) ++ if (li->li_tv.v_type == VAR_STRING) ++ { ++ p = li->li_tv.vval.v_string; ++ ml_append_buf(buf, lnum++, ++ p == NULL ? (char_u *)"" : p, (colnr_T)0, TRUE); ++ } ++ } ++ else ++ // TODO: handle a list of dictionaries ++ emsg("Not implemented yet"); ++ ++ // Delete the line of the empty buffer. ++ curbuf = buf; ++ ml_delete(buf->b_ml.ml_line_count, FALSE); ++ curbuf = curwin->w_buffer; ++ ++ // Deal with options. ++ apply_options(wp, buf, argvars[1].vval.v_dict); ++ ++ // set default values ++ if (wp->w_zindex == 0) ++ wp->w_zindex = 50; ++ ++ // TODO: Compute the size and position properly. ++ ++ // Default position is in middle of the screen, assuming a small popup ++ if (wp->w_winrow == 0) ++ wp->w_winrow = Rows > 5 ? Rows / 2 - 2 : 0; ++ else ++ --wp->w_winrow; // option value is one-based ++ if (wp->w_wincol == 0) ++ wp->w_wincol = Columns > 20 ? Columns / 2 - 10 : 0; ++ else ++ --wp->w_wincol; // option value is one-based ++ ++ ++ // TODO: set width based on longest text line and the 'wrap' option ++ wp->w_width = wp->w_maxwidth == 0 ? 20 : wp->w_maxwidth; ++ if (wp->w_maxwidth > 0 && wp->w_width > wp->w_maxwidth) ++ wp->w_width = wp->w_maxwidth; ++ if (wp->w_width > Columns - wp->w_wincol) ++ wp->w_width = Columns - wp->w_wincol; ++ ++ // TODO: adjust height for wrapped lines ++ wp->w_height = buf->b_ml.ml_line_count; ++ if (wp->w_maxheight > 0 && wp->w_height > wp->w_maxheight) ++ wp->w_height = wp->w_maxheight; ++ if (wp->w_height > Rows - wp->w_winrow) ++ wp->w_height = Rows - wp->w_winrow; ++ ++ wp->w_vsep_width = 0; ++ ++ redraw_all_later(NOT_VALID); ++ } ++ ++ /* ++ * popup_close({id}) ++ */ ++ void ++ f_popup_close(typval_T *argvars, typval_T *rettv UNUSED) ++ { ++ int nr = (int)tv_get_number(argvars); ++ ++ popup_close(nr); ++ } ++ ++ void ++ popup_close(int nr) ++ { ++ win_T *wp; ++ win_T *prev = NULL; ++ ++ for (wp = first_popupwin; wp != NULL; prev = wp, wp = wp->w_next) ++ if (wp->w_id == nr) ++ { ++ if (prev == NULL) ++ first_popupwin = wp->w_next; ++ else ++ prev->w_next = wp->w_next; ++ break; ++ } ++ ++ if (wp == NULL) ++ { ++ prev = NULL; ++ for (wp = first_tab_popupwin; wp != NULL; prev = wp, wp = wp->w_next) ++ if (wp->w_id == nr) ++ { ++ if (prev == NULL) ++ first_tab_popupwin = wp->w_next; ++ else ++ prev->w_next = wp->w_next; ++ break; ++ } ++ } ++ if (wp != NULL) ++ { ++ win_free_popup(wp); ++ redraw_all_later(NOT_VALID); ++ } ++ } ++ ++ void ++ close_all_popups(void) ++ { ++ while (first_popupwin != NULL) ++ popup_close(first_popupwin->w_id); ++ while (first_tab_popupwin != NULL) ++ popup_close(first_tab_popupwin->w_id); ++ } ++ ++ void ++ ex_popupclear(exarg_T *eap UNUSED) ++ { ++ close_all_popups(); ++ } ++ ++ #endif // FEAT_TEXT_PROP +*** ../vim-8.1.1390/src/proto.h 2019-05-11 17:03:55.170019762 +0200 +--- src/proto.h 2019-05-24 22:27:53.816544293 +0200 +*************** +*** 195,200 **** +--- 195,201 ---- + # include "termlib.pro" + # endif + # ifdef FEAT_TEXT_PROP ++ # include "popupwin.pro" + # include "textprop.pro" + # endif + # include "ui.pro" +*** ../vim-8.1.1390/src/proto/popupwin.pro 2019-05-25 19:47:19.993537992 +0200 +--- src/proto/popupwin.pro 2019-05-25 17:26:36.855434511 +0200 +*************** +*** 0 **** +--- 1,7 ---- ++ /* popupwin.c */ ++ void f_popup_create(typval_T *argvars, typval_T *rettv); ++ void f_popup_close(typval_T *argvars, typval_T *rettv); ++ void popup_close(int nr); ++ void close_all_popups(void); ++ void ex_popupclear(exarg_T *eap); ++ /* vim: set ft=c : */ +*** ../vim-8.1.1390/src/proto/window.pro 2019-04-25 22:21:56.931749183 +0200 +--- src/proto/window.pro 2019-05-25 16:50:12.447083290 +0200 +*************** +*** 19,25 **** + void curwin_init(void); + void win_init_empty(win_T *wp); + int win_alloc_first(void); +! void win_alloc_aucmd_win(void); + void win_init_size(void); + void free_tabpage(tabpage_T *tp); + int win_new_tabpage(int after); +--- 19,26 ---- + void curwin_init(void); + void win_init_empty(win_T *wp); + int win_alloc_first(void); +! win_T *win_alloc_popup_win(void); +! void win_init_popup_win(win_T *wp, buf_T *buf); + void win_init_size(void); + void free_tabpage(tabpage_T *tp); + int win_new_tabpage(int after); +*************** +*** 42,47 **** +--- 43,50 ---- + void win_enter(win_T *wp, int undo_sync); + win_T *buf_jump_open_win(buf_T *buf); + win_T *buf_jump_open_tab(buf_T *buf); ++ int win_unlisted(win_T *wp); ++ void win_free_popup(win_T *win); + void win_append(win_T *after, win_T *wp); + void win_remove(win_T *wp, tabpage_T *tp); + int win_alloc_lines(win_T *wp); +*** ../vim-8.1.1390/src/screen.c 2019-05-24 19:38:59.108545464 +0200 +--- src/screen.c 2019-05-25 18:19:31.972693309 +0200 +*************** +*** 121,126 **** +--- 121,129 ---- + */ + static schar_T *current_ScreenLine; + ++ #ifdef FEAT_TEXT_PROP ++ static void update_popups(void); ++ #endif + static void win_update(win_T *wp); + static void win_redr_status(win_T *wp, int ignore_pum); + static void win_draw_end(win_T *wp, int c1, int c2, int draw_margin, int row, int endrow, hlf_T hl); +*************** +*** 178,183 **** +--- 181,190 ---- + # define HAS_RIGHTLEFT(x) FALSE + #endif + ++ // flags for screen_line() ++ #define SLF_RIGHTLEFT 1 ++ #define SLF_POPUP 2 ++ + /* + * Redraw the current window later, with update_screen(type). + * Set must_redraw only if not already set to a higher value. +*************** +*** 406,412 **** + mch_memmove(ScreenLines2 + off, + screenline2 + r * cols, + (size_t)cols * sizeof(schar_T)); +! screen_line(cmdline_row + r, 0, cols, cols, FALSE); + } + ret = 4; + } +--- 413,419 ---- + mch_memmove(ScreenLines2 + off, + screenline2 + r * cols, + (size_t)cols * sizeof(schar_T)); +! screen_line(cmdline_row + r, 0, cols, cols, 0); + } + ret = 4; + } +*************** +*** 604,609 **** +--- 611,621 ---- + curwin->w_lines_valid = 0; /* don't use w_lines[].wl_size now */ + return FAIL; + } ++ #ifdef FEAT_TEXT_PROP ++ // TODO: avoid redrawing everything when there is a popup window. ++ if (first_popupwin != NULL || first_tab_popupwin != NULL) ++ type = NOT_VALID; ++ #endif + + updating_screen = TRUE; + #ifdef FEAT_SYN_HL +*************** +*** 811,816 **** +--- 823,833 ---- + maybe_intro_message(); + did_intro = TRUE; + ++ #ifdef FEAT_TEXT_PROP ++ // Display popup windows on top of the others. ++ update_popups(); ++ #endif ++ + #ifdef FEAT_GUI + /* Redraw the cursor and update the scrollbars when all screen updating is + * done. */ +*************** +*** 975,980 **** +--- 992,1041 ---- + } + #endif + ++ #ifdef FEAT_TEXT_PROP ++ static void ++ update_popups(void) ++ { ++ win_T *wp; ++ win_T *lowest_wp; ++ int lowest_zindex; ++ ++ // Reset all the VALID_POPUP flags. ++ for (wp = first_popupwin; wp != NULL; wp = wp->w_next) ++ wp->w_valid &= ~VALID_POPUP; ++ for (wp = first_tab_popupwin; wp != NULL; wp = wp->w_next) ++ wp->w_valid &= ~VALID_POPUP; ++ ++ // TODO: don't redraw every popup every time. ++ for (;;) ++ { ++ // Find the window with the lowest zindex that hasn't been updated yet, ++ // so that the window with a higher zindex is drawn later, thus goes on ++ // top. ++ lowest_zindex = INT_MAX; ++ lowest_wp = NULL; ++ for (wp = first_popupwin; wp != NULL; wp = wp->w_next) ++ if ((wp->w_valid & VALID_POPUP) == 0 ++ && wp->w_zindex < lowest_zindex) ++ { ++ lowest_zindex = wp->w_zindex; ++ lowest_wp = wp; ++ } ++ for (wp = first_tab_popupwin; wp != NULL; wp = wp->w_next) ++ if ((wp->w_valid & VALID_POPUP) == 0 ++ && wp->w_zindex < lowest_zindex) ++ { ++ lowest_zindex = wp->w_zindex; ++ lowest_wp = wp; ++ } ++ ++ if (lowest_wp == NULL) ++ break; ++ win_update(lowest_wp); ++ lowest_wp->w_valid |= VALID_POPUP; ++ } ++ } ++ #endif + + #if defined(FEAT_GUI) || defined(PROTO) + /* +*************** +*** 2862,2868 **** + #endif + + screen_line(row + W_WINROW(wp), wp->w_wincol, (int)wp->w_width, +! (int)wp->w_width, FALSE); + + /* + * Update w_cline_height and w_cline_folded if the cursor line was +--- 2923,2929 ---- + #endif + + screen_line(row + W_WINROW(wp), wp->w_wincol, (int)wp->w_width, +! (int)wp->w_width, 0); + + /* + * Update w_cline_height and w_cline_folded if the cursor line was +*************** +*** 3046,3052 **** + int attr_pri = FALSE; /* char_attr has priority */ + int area_highlighting = FALSE; /* Visual or incsearch highlighting + in this line */ +! int attr = 0; /* attributes for area highlighting */ + int area_attr = 0; /* attributes desired by highlighting */ + int search_attr = 0; /* attributes desired by 'hlsearch' */ + #ifdef FEAT_SYN_HL +--- 3107,3114 ---- + int attr_pri = FALSE; /* char_attr has priority */ + int area_highlighting = FALSE; /* Visual or incsearch highlighting + in this line */ +! int vi_attr = 0; /* attributes for Visual and incsearch +! highlighting */ + int area_attr = 0; /* attributes desired by highlighting */ + int search_attr = 0; /* attributes desired by 'hlsearch' */ + #ifdef FEAT_SYN_HL +*************** +*** 3127,3134 **** + #endif + #ifdef FEAT_TERMINAL + int get_term_attr = FALSE; +- int term_attr = 0; /* background for terminal window */ + #endif + + /* draw_state: items that are drawn in sequence: */ + #define WL_START 0 /* nothing done yet */ +--- 3189,3196 ---- + #endif + #ifdef FEAT_TERMINAL + int get_term_attr = FALSE; + #endif ++ int win_attr = 0; // background for whole window + + /* draw_state: items that are drawn in sequence: */ + #define WL_START 0 /* nothing done yet */ +*************** +*** 3164,3169 **** +--- 3226,3232 ---- + int feedback_col = 0; + int feedback_old_attr = -1; + #endif ++ int screen_line_flags = 0; + + #ifdef FEAT_CONCEAL + int syntax_flags = 0; +*************** +*** 3244,3250 **** + { + extra_check = TRUE; + get_term_attr = TRUE; +! term_attr = term_get_attr(wp->w_buffer, lnum, -1); + } + #endif + +--- 3307,3313 ---- + { + extra_check = TRUE; + get_term_attr = TRUE; +! win_attr = term_get_attr(wp->w_buffer, lnum, -1); + } + #endif + +*************** +*** 3362,3374 **** + if (fromcol >= 0) + { + area_highlighting = TRUE; +! attr = HL_ATTR(HLF_V); + #if defined(FEAT_CLIPBOARD) && defined(FEAT_X11) + if ((clip_star.available && !clip_star.owned +! && clip_isautosel_star()) + || (clip_plus.available && !clip_plus.owned +! && clip_isautosel_plus())) +! attr = HL_ATTR(HLF_VNC); + #endif + } + } +--- 3425,3437 ---- + if (fromcol >= 0) + { + area_highlighting = TRUE; +! vi_attr = HL_ATTR(HLF_V); + #if defined(FEAT_CLIPBOARD) && defined(FEAT_X11) + if ((clip_star.available && !clip_star.owned +! && clip_isautosel_star()) + || (clip_plus.available && !clip_plus.owned +! && clip_isautosel_plus())) +! vi_attr = HL_ATTR(HLF_VNC); + #endif + } + } +*************** +*** 3398,3404 **** + if (fromcol == tocol) + tocol = fromcol + 1; + area_highlighting = TRUE; +! attr = HL_ATTR(HLF_I); + } + } + +--- 3461,3467 ---- + if (fromcol == tocol) + tocol = fromcol + 1; + area_highlighting = TRUE; +! vi_attr = HL_ATTR(HLF_I); + } + } + +*************** +*** 3497,3502 **** +--- 3560,3589 ---- + } + } + ++ if (*wp->w_p_wcr != NUL) ++ { ++ int attr = syn_name2attr(wp->w_p_wcr); ++ ++ // 'wincolor' highlighting for the whole window ++ if (attr != 0) ++ { ++ win_attr = attr; ++ area_highlighting = TRUE; ++ } ++ } ++ #ifdef FEAT_TEXT_PROP ++ if (bt_popup(wp->w_buffer)) ++ { ++ screen_line_flags |= SLF_POPUP; ++ ++ if (win_attr == 0) ++ { ++ win_attr = HL_ATTR(HLF_PNI); ++ area_highlighting = TRUE; ++ } ++ } ++ #endif ++ + /* + * 'nowrap' or 'wrap' and a single line that doesn't fit: Advance to the + * first character to be displayed. +*************** +*** 3630,3639 **** + /* + * Handle highlighting the last used search pattern and matches. + * Do this for both search_hl and the match list. + */ + cur = wp->w_match_head; + shl_flag = FALSE; +! while ((cur != NULL || shl_flag == FALSE) && !number_only) + { + if (shl_flag == FALSE) + { +--- 3717,3728 ---- + /* + * Handle highlighting the last used search pattern and matches. + * Do this for both search_hl and the match list. ++ * Not in a popup window. + */ + cur = wp->w_match_head; + shl_flag = FALSE; +! while ((cur != NULL || shl_flag == FALSE) && !number_only +! && !(screen_line_flags & SLF_POPUP)) + { + if (shl_flag == FALSE) + { +*************** +*** 3729,3734 **** +--- 3818,3824 ---- + + off = (unsigned)(current_ScreenLine - ScreenLines); + col = 0; ++ + #ifdef FEAT_RIGHTLEFT + if (wp->w_p_rl) + { +*************** +*** 3737,3742 **** +--- 3827,3833 ---- + * rightmost column of the window. */ + col = wp->w_width - 1; + off += col; ++ screen_line_flags |= SLF_RIGHTLEFT; + } + #endif + +*************** +*** 4048,4054 **** + char_attr = saved_char_attr; + } + else +! char_attr = 0; + } + } + +--- 4139,4145 ---- + char_attr = saved_char_attr; + } + else +! char_attr = win_attr; + } + } + +*************** +*** 4064,4070 **** + || (number_only && draw_state > WL_NR)) + { + screen_line(screen_row, wp->w_wincol, col, -(int)wp->w_width, +! HAS_RIGHTLEFT(wp->w_p_rl)); + /* Pretend we have finished updating the window. Except when + * 'cursorcolumn' is set. */ + #ifdef FEAT_SYN_HL +--- 4155,4161 ---- + || (number_only && draw_state > WL_NR)) + { + screen_line(screen_row, wp->w_wincol, col, -(int)wp->w_width, +! screen_line_flags); + /* Pretend we have finished updating the window. Except when + * 'cursorcolumn' is set. */ + #ifdef FEAT_SYN_HL +*************** +*** 4089,4095 **** + || ((int)vcol_prev == fromcol_prev + && vcol_prev < vcol /* not at margin */ + && vcol < tocol)) +! area_attr = attr; /* start highlighting */ + else if (area_attr != 0 + && (vcol == tocol + || (noinvcur && (colnr_T)vcol == wp->w_virtcol))) +--- 4180,4186 ---- + || ((int)vcol_prev == fromcol_prev + && vcol_prev < vcol /* not at margin */ + && vcol < tocol)) +! area_attr = vi_attr; /* start highlighting */ + else if (area_attr != 0 + && (vcol == tocol + || (noinvcur && (colnr_T)vcol == wp->w_virtcol))) +*************** +*** 4344,4349 **** +--- 4435,4442 ---- + char_attr = 0; + } + } ++ if (char_attr == 0) ++ char_attr = win_attr; + + /* + * Get the next character to put on the screen. +*************** +*** 4672,4680 **** +--- 4765,4779 ---- + { + wp->w_s->b_syn_error = TRUE; + has_syntax = FALSE; ++ syntax_attr = 0; + } + else + did_emsg = save_did_emsg; ++ ++ // combine syntax attribute with 'wincolor' ++ if (win_attr != 0) ++ syntax_attr = hl_combine_attr(win_attr, syntax_attr); ++ + #ifdef SYN_TIME_LIMIT + if (wp->w_s->b_syn_slow) + has_syntax = FALSE; +*************** +*** 5149,5155 **** + diff_hlf != (hlf_T)0 || + # endif + # ifdef FEAT_TERMINAL +! term_attr != 0 || + # endif + line_attr != 0 + ) && ( +--- 5248,5254 ---- + diff_hlf != (hlf_T)0 || + # endif + # ifdef FEAT_TERMINAL +! win_attr != 0 || + # endif + line_attr != 0 + ) && ( +*************** +*** 5178,5184 **** + if (diff_hlf == HLF_TXD) + { + diff_hlf = HLF_CHD; +! if (attr == 0 || char_attr != attr) + { + char_attr = HL_ATTR(diff_hlf); + if (wp->w_p_cul && lnum == wp->w_cursor.lnum) +--- 5277,5283 ---- + if (diff_hlf == HLF_TXD) + { + diff_hlf = HLF_CHD; +! if (vi_attr == 0 || char_attr != vi_attr) + { + char_attr = HL_ATTR(diff_hlf); + if (wp->w_p_cul && lnum == wp->w_cursor.lnum) +*************** +*** 5188,5196 **** + } + # endif + # ifdef FEAT_TERMINAL +! if (term_attr != 0) + { +! char_attr = term_attr; + if (wp->w_p_cul && lnum == wp->w_cursor.lnum) + char_attr = hl_combine_attr(char_attr, + HL_ATTR(HLF_CUL)); +--- 5287,5295 ---- + } + # endif + # ifdef FEAT_TERMINAL +! if (win_attr != 0) + { +! char_attr = win_attr; + if (wp->w_p_cul && lnum == wp->w_cursor.lnum) + char_attr = hl_combine_attr(char_attr, + HL_ATTR(HLF_CUL)); +*************** +*** 5550,5556 **** + && (int)wp->w_virtcol < + wp->w_width * (row - startrow + 1) + v + && lnum != wp->w_cursor.lnum) +! || draw_color_col) + # ifdef FEAT_RIGHTLEFT + && !wp->w_p_rl + # endif +--- 5649,5656 ---- + && (int)wp->w_virtcol < + wp->w_width * (row - startrow + 1) + v + && lnum != wp->w_cursor.lnum) +! || draw_color_col +! || win_attr != 0) + # ifdef FEAT_RIGHTLEFT + && !wp->w_p_rl + # endif +*************** +*** 5582,5590 **** + else if (draw_color_col && VCOL_HLC == *color_cols) + ScreenAttrs[off++] = HL_ATTR(HLF_MC); + else +! ScreenAttrs[off++] = 0; + +! if (VCOL_HLC >= rightmost_vcol) + break; + + ++vcol; +--- 5682,5690 ---- + else if (draw_color_col && VCOL_HLC == *color_cols) + ScreenAttrs[off++] = HL_ATTR(HLF_MC); + else +! ScreenAttrs[off++] = win_attr; + +! if (VCOL_HLC >= rightmost_vcol && win_attr == 0) + break; + + ++vcol; +*************** +*** 5593,5599 **** + #endif + + screen_line(screen_row, wp->w_wincol, col, +! (int)wp->w_width, HAS_RIGHTLEFT(wp->w_p_rl)); + row++; + + /* +--- 5693,5699 ---- + #endif + + screen_line(screen_row, wp->w_wincol, col, +! (int)wp->w_width, screen_line_flags); + row++; + + /* +*************** +*** 5893,5903 **** + { + #ifdef FEAT_CONCEAL + screen_line(screen_row, wp->w_wincol, col - boguscols, +! (int)wp->w_width, HAS_RIGHTLEFT(wp->w_p_rl)); + boguscols = 0; + #else + screen_line(screen_row, wp->w_wincol, col, +! (int)wp->w_width, HAS_RIGHTLEFT(wp->w_p_rl)); + #endif + ++row; + ++screen_row; +--- 5993,6003 ---- + { + #ifdef FEAT_CONCEAL + screen_line(screen_row, wp->w_wincol, col - boguscols, +! (int)wp->w_width, screen_line_flags); + boguscols = 0; + #else + screen_line(screen_row, wp->w_wincol, col, +! (int)wp->w_width, screen_line_flags); + #endif + ++row; + ++screen_row; +*************** +*** 6107,6113 **** + * "endcol" gives the columns where valid characters are. + * "clear_width" is the width of the window. It's > 0 if the rest of the line + * needs to be cleared, negative otherwise. +! * "rlflag" is TRUE in a rightleft window: + * When TRUE and "clear_width" > 0, clear columns 0 to "endcol" + * When FALSE and "clear_width" > 0, clear columns "endcol" to "clear_width" + */ +--- 6207,6215 ---- + * "endcol" gives the columns where valid characters are. + * "clear_width" is the width of the window. It's > 0 if the rest of the line + * needs to be cleared, negative otherwise. +! * "flags" can have bits: +! * SLF_POPUP popup window +! * SLF_RIGHTLEFT rightleft window: + * When TRUE and "clear_width" > 0, clear columns 0 to "endcol" + * When FALSE and "clear_width" > 0, clear columns "endcol" to "clear_width" + */ +*************** +*** 6117,6123 **** + int coloff, + int endcol, + int clear_width, +! int rlflag UNUSED) + { + unsigned off_from; + unsigned off_to; +--- 6219,6225 ---- + int coloff, + int endcol, + int clear_width, +! int flags UNUSED) + { + unsigned off_from; + unsigned off_to; +*************** +*** 6153,6159 **** + max_off_to = LineOffset[row] + screen_Columns; + + #ifdef FEAT_RIGHTLEFT +! if (rlflag) + { + /* Clear rest first, because it's left of the text. */ + if (clear_width > 0) +--- 6255,6261 ---- + max_off_to = LineOffset[row] + screen_Columns; + + #ifdef FEAT_RIGHTLEFT +! if (flags & SLF_RIGHTLEFT) + { + /* Clear rest first, because it's left of the text. */ + if (clear_width > 0) +*************** +*** 6377,6383 **** + + if (clear_width > 0 + #ifdef FEAT_RIGHTLEFT +! && !rlflag + #endif + ) + { +--- 6479,6485 ---- + + if (clear_width > 0 + #ifdef FEAT_RIGHTLEFT +! && !(flags & SLF_RIGHTLEFT) + #endif + ) + { +*************** +*** 6444,6453 **** + } + } + +! if (clear_width > 0) + { +! /* For a window that's left of another, draw the separator char. */ +! if (col + coloff < Columns) + { + int c; + +--- 6546,6560 ---- + } + } + +! if (clear_width > 0 +! #ifdef FEAT_TEXT_PROP +! && !(flags & SLF_POPUP) // no separator for popup window +! #endif +! ) + { +! // For a window that has a right neighbor, draw the separator char +! // right of the window contents. +! if (coloff + col < Columns) + { + int c; + +*************** +*** 10784,10790 **** + wp->w_winbar_items[item_idx].wb_menu = NULL; /* end marker */ + + screen_line(wp->w_winrow, wp->w_wincol, (int)wp->w_width, +! (int)wp->w_width, FALSE); + } + #endif + +--- 10891,10897 ---- + wp->w_winbar_items[item_idx].wb_menu = NULL; /* end marker */ + + screen_line(wp->w_winrow, wp->w_wincol, (int)wp->w_width, +! (int)wp->w_width, 0); + } + #endif + +*** ../vim-8.1.1390/src/structs.h 2019-05-16 22:11:43.715228803 +0200 +--- src/structs.h 2019-05-25 18:07:31.536128809 +0200 +*************** +*** 163,179 **** + { + #ifdef FEAT_ARABIC + int wo_arab; +! # define w_p_arab w_onebuf_opt.wo_arab /* 'arabic' */ + #endif + #ifdef FEAT_LINEBREAK + int wo_bri; +! # define w_p_bri w_onebuf_opt.wo_bri /* 'breakindent' */ + char_u *wo_briopt; +! # define w_p_briopt w_onebuf_opt.wo_briopt /* 'breakindentopt' */ + #endif + #ifdef FEAT_DIFF + int wo_diff; +! # define w_p_diff w_onebuf_opt.wo_diff /* 'diff' */ + #endif + #ifdef FEAT_FOLDING + long wo_fdc; +--- 163,181 ---- + { + #ifdef FEAT_ARABIC + int wo_arab; +! # define w_p_arab w_onebuf_opt.wo_arab // 'arabic' + #endif + #ifdef FEAT_LINEBREAK + int wo_bri; +! # define w_p_bri w_onebuf_opt.wo_bri // 'breakindent' + char_u *wo_briopt; +! # define w_p_briopt w_onebuf_opt.wo_briopt // 'breakindentopt' + #endif ++ char_u *wo_wcr; ++ # define w_p_wcr w_onebuf_opt.wo_wcr // 'wincolor' + #ifdef FEAT_DIFF + int wo_diff; +! # define w_p_diff w_onebuf_opt.wo_diff // 'diff' + #endif + #ifdef FEAT_FOLDING + long wo_fdc; +*************** +*** 2592,2610 **** + typedef struct tabpage_S tabpage_T; + struct tabpage_S + { +! tabpage_T *tp_next; /* next tabpage or NULL */ +! frame_T *tp_topframe; /* topframe for the windows */ +! win_T *tp_curwin; /* current window in this Tab page */ +! win_T *tp_prevwin; /* previous window in this Tab page */ +! win_T *tp_firstwin; /* first window in this Tab page */ +! win_T *tp_lastwin; /* last window in this Tab page */ +! long tp_old_Rows; /* Rows when Tab page was left */ +! long tp_old_Columns; /* Columns when Tab page was left */ +! long tp_ch_used; /* value of 'cmdheight' when frame size +! was set */ + #ifdef FEAT_GUI + int tp_prev_which_scrollbars[3]; +! /* previous value of which_scrollbars */ + #endif + + char_u *tp_localdir; // absolute path of local directory or +--- 2594,2615 ---- + typedef struct tabpage_S tabpage_T; + struct tabpage_S + { +! tabpage_T *tp_next; // next tabpage or NULL +! frame_T *tp_topframe; // topframe for the windows +! win_T *tp_curwin; // current window in this Tab page +! win_T *tp_prevwin; // previous window in this Tab page +! win_T *tp_firstwin; // first window in this Tab page +! win_T *tp_lastwin; // last window in this Tab page +! #ifdef FEAT_TEXT_PROP +! win_T *tp_first_popupwin; // first popup window in this Tab page +! #endif +! long tp_old_Rows; // Rows when Tab page was left +! long tp_old_Columns; // Columns when Tab page was left +! long tp_ch_used; // value of 'cmdheight' when frame size +! // was set + #ifdef FEAT_GUI + int tp_prev_which_scrollbars[3]; +! // previous value of which_scrollbars + #endif + + char_u *tp_localdir; // absolute path of local directory or +*************** +*** 2615,2632 **** + int tp_diff_invalid; // list of diffs is outdated + int tp_diff_update; // update diffs before redrawing + #endif +! frame_T *(tp_snapshot[SNAP_COUNT]); /* window layout snapshots */ + #ifdef FEAT_EVAL +! dictitem_T tp_winvar; /* variable for "t:" Dictionary */ +! dict_T *tp_vars; /* internal variables, local to tab page */ + #endif + + #ifdef FEAT_PYTHON +! void *tp_python_ref; /* The Python value for this tab page */ + #endif + + #ifdef FEAT_PYTHON3 +! void *tp_python3_ref; /* The Python value for this tab page */ + #endif + }; + +--- 2620,2637 ---- + int tp_diff_invalid; // list of diffs is outdated + int tp_diff_update; // update diffs before redrawing + #endif +! frame_T *(tp_snapshot[SNAP_COUNT]); // window layout snapshots + #ifdef FEAT_EVAL +! dictitem_T tp_winvar; // variable for "t:" Dictionary +! dict_T *tp_vars; // internal variables, local to tab page + #endif + + #ifdef FEAT_PYTHON +! void *tp_python_ref; // The Python value for this tab page + #endif + + #ifdef FEAT_PYTHON3 +! void *tp_python3_ref; // The Python value for this tab page + #endif + }; + +*************** +*** 2775,2789 **** + { + int w_id; /* unique window ID */ + +! buf_T *w_buffer; /* buffer we are a window into (used +! often, keep it the first item!) */ + + #if defined(FEAT_SYN_HL) || defined(FEAT_SPELL) + synblock_T *w_s; /* for :ownsyntax */ + #endif + +- win_T *w_prev; /* link to previous window */ +- win_T *w_next; /* link to next window */ + int w_closing; /* window is being closed, don't let + autocommands close it too. */ + +--- 2780,2794 ---- + { + int w_id; /* unique window ID */ + +! buf_T *w_buffer; /* buffer we are a window into */ +! +! win_T *w_prev; /* link to previous window */ +! win_T *w_next; /* link to next window */ + + #if defined(FEAT_SYN_HL) || defined(FEAT_SPELL) + synblock_T *w_s; /* for :ownsyntax */ + #endif + + int w_closing; /* window is being closed, don't let + autocommands close it too. */ + +*************** +*** 2847,2852 **** +--- 2852,2862 ---- + int w_width; /* Width of window, excluding separation. */ + 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_zindex; ++ int w_maxheight; // "maxheight" for popup window ++ int w_maxwidth; // "maxwidth" for popup window ++ #endif + + + /* +*** ../vim-8.1.1390/src/terminal.c 2019-05-24 19:38:59.112545434 +0200 +--- src/terminal.c 2019-05-25 14:07:30.810843861 +0200 +*************** +*** 3257,3263 **** + else + pos.col = 0; + +! screen_line(term->tl_toprow + pos.row, 0, pos.col, Columns, FALSE); + } + + term->tl_dirty_row_start = MAX_ROW; +--- 3257,3263 ---- + else + pos.col = 0; + +! screen_line(term->tl_toprow + pos.row, 0, pos.col, Columns, 0); + } + + term->tl_dirty_row_start = MAX_ROW; +*************** +*** 3368,3374 **** + #ifdef FEAT_MENU + + winbar_height(wp) + #endif +! , wp->w_wincol, pos.col, wp->w_width, FALSE); + } + term->tl_dirty_row_start = MAX_ROW; + term->tl_dirty_row_end = 0; +--- 3368,3374 ---- + #ifdef FEAT_MENU + + winbar_height(wp) + #endif +! , wp->w_wincol, pos.col, wp->w_width, 0); + } + term->tl_dirty_row_start = MAX_ROW; + term->tl_dirty_row_end = 0; +*** ../vim-8.1.1390/src/testdir/Make_all.mak 2019-05-19 21:44:03.978804771 +0200 +--- src/testdir/Make_all.mak 2019-05-24 22:34:17.218925753 +0200 +*************** +*** 196,201 **** +--- 196,202 ---- + test_perl \ + test_plus_arg_edit \ + test_popup \ ++ test_popupwin \ + test_preview \ + test_profile \ + test_prompt_buffer \ +*************** +*** 250,257 **** + test_tagjump \ + test_taglist \ + test_tcl \ +- test_termencoding \ + test_termcodes \ + test_terminal \ + test_terminal_fail \ + test_textformat \ +--- 251,258 ---- + test_tagjump \ + test_taglist \ + test_tcl \ + test_termcodes \ ++ test_termencoding \ + test_terminal \ + test_terminal_fail \ + test_textformat \ +*************** +*** 377,382 **** +--- 378,384 ---- + test_paste.res \ + test_perl.res \ + test_plus_arg_edit.res \ ++ test_popupwin.res \ + test_preview.res \ + test_profile.res \ + test_prompt_buffer.res \ +*************** +*** 409,416 **** + test_system.res \ + test_tab.res \ + test_tcl.res \ +- test_termencoding.res \ + test_termcodes.res \ + test_terminal.res \ + test_terminal_fail.res \ + test_textformat.res \ +--- 411,418 ---- + test_system.res \ + test_tab.res \ + test_tcl.res \ + test_termcodes.res \ ++ test_termencoding.res \ + test_terminal.res \ + test_terminal_fail.res \ + test_textformat.res \ +*** ../vim-8.1.1390/src/testdir/dumps/Test_popupwin_01.dump 2019-05-25 19:47:20.021537851 +0200 +--- src/testdir/dumps/Test_popupwin_01.dump 2019-05-25 18:53:31.899050354 +0200 +*************** +*** 0 **** +--- 1,10 ---- ++ >1+0&#ffffff0| @73 ++ |2| @73 ++ |3| @8|h+0fd7ff255|e|l@1|o| |t|h|e|r|e| @8|r+0#0000001#ffd7ff255| |o|n|e| @8| +0#0000000#ffffff0@30 ++ |4| @22|a+0#0000001#ffd7ff255|n|o|t|h|e|r| |t|w|o| @8| +0#0000000#ffffff0@30 ++ |5| @22|a+0#0000001#ffd7ff255|n|o|t|h|e|r| |t|h|r|e@1| @6| +0#0000000#ffffff0@30 ++ |6| @73 ++ |7| @73 ++ |8| @73 ++ |9| @73 ++ @57|1|,|1| @10|T|o|p| +*** ../vim-8.1.1390/src/testdir/test_popupwin.vim 2019-05-25 19:47:20.025537831 +0200 +--- src/testdir/test_popupwin.vim 2019-05-25 18:53:25.743097207 +0200 +*************** +*** 0 **** +--- 1,26 ---- ++ " Tests for popup windows ++ ++ if !has('textprop') ++ finish ++ endif ++ ++ source screendump.vim ++ ++ func Test_simple_popup() ++ if !CanRunVimInTerminal() ++ return ++ endif ++ call writefile([ ++ \ "call setline(1, range(1, 100))", ++ \ "let winid = popup_create('hello there', {'line': 3, 'col': 11})", ++ \ "hi PopupColor ctermbg=lightblue", ++ \ "call setwinvar(winid, '&wincolor', 'PopupColor')", ++ \ "let winid2 = popup_create(['another one', 'another two', 'another three'], {'line': 3, 'col': 25})", ++ \], 'XtestPopup') ++ let buf = RunVimInTerminal('-S XtestPopup', {'rows': 10}) ++ call VerifyScreenDump(buf, 'Test_popupwin_01', {}) ++ ++ " clean up ++ call StopVimInTerminal(buf) ++ call delete('XtestPopup') ++ endfunc +*** ../vim-8.1.1390/src/vim.h 2019-05-23 21:35:44.459922615 +0200 +--- src/vim.h 2019-05-25 18:05:47.916620123 +0200 +*************** +*** 604,617 **** + * off off w_botline not valid + * on off not possible + */ +! #define VALID_WROW 0x01 /* w_wrow (window row) is valid */ +! #define VALID_WCOL 0x02 /* w_wcol (window col) is valid */ +! #define VALID_VIRTCOL 0x04 /* w_virtcol (file col) is valid */ +! #define VALID_CHEIGHT 0x08 /* w_cline_height and w_cline_folded valid */ +! #define VALID_CROW 0x10 /* w_cline_row is valid */ +! #define VALID_BOTLINE 0x20 /* w_botine and w_empty_rows are valid */ +! #define VALID_BOTLINE_AP 0x40 /* w_botine is approximated */ +! #define VALID_TOPLINE 0x80 /* w_topline is valid (for cursor position) */ + + /* + * Terminal highlighting attribute bits. +--- 604,618 ---- + * off off w_botline not valid + * on off not possible + */ +! #define VALID_WROW 0x01 // w_wrow (window row) is valid +! #define VALID_WCOL 0x02 // w_wcol (window col) is valid +! #define VALID_VIRTCOL 0x04 // w_virtcol (file col) is valid +! #define VALID_CHEIGHT 0x08 // w_cline_height and w_cline_folded valid +! #define VALID_CROW 0x10 // w_cline_row is valid +! #define VALID_BOTLINE 0x20 // w_botine and w_empty_rows are valid +! #define VALID_BOTLINE_AP 0x40 // w_botine is approximated +! #define VALID_TOPLINE 0x80 // w_topline is valid (for cursor position) +! #define VALID_POPUP 0x100 // popup has been redrawn + + /* + * Terminal highlighting attribute bits. +*** ../vim-8.1.1390/src/window.c 2019-05-24 19:38:59.116545403 +0200 +--- src/window.c 2019-05-25 17:22:02.300858667 +0200 +*************** +*** 1362,1367 **** +--- 1362,1382 ---- + win_copy_options(oldp, newp); + } + ++ static int ++ win_valid_popup(win_T *win) ++ { ++ #ifdef FEAT_TEXT_PROP ++ win_T *wp; ++ ++ for (wp = first_popupwin; wp != NULL; wp = wp->w_next) ++ if (wp == win) ++ return TRUE; ++ for (wp = first_tab_popupwin; wp != NULL; wp = wp->w_next) ++ if (wp == win) ++ return TRUE; ++ #endif ++ return FALSE; ++ } + + /* + * Check if "win" is a pointer to an existing window in the current tab page. +*************** +*** 1376,1382 **** + FOR_ALL_WINDOWS(wp) + if (wp == win) + return TRUE; +! return FALSE; + } + + /* +--- 1391,1397 ---- + FOR_ALL_WINDOWS(wp) + if (wp == win) + return TRUE; +! return win_valid_popup(win); + } + + /* +*************** +*** 1398,1404 **** + return TRUE; + } + } +! return FALSE; + } + + /* +--- 1413,1419 ---- + return TRUE; + } + } +! return win_valid_popup(win); + } + + /* +*************** +*** 2293,2298 **** +--- 2308,2351 ---- + } + + /* ++ * Close the buffer of "win" and unload it if "free_buf" is TRUE. ++ * "abort_if_last" is passed to close_buffer(): abort closing if all other ++ * windows are closed. ++ */ ++ static void ++ win_close_buffer(win_T *win, int free_buf, int abort_if_last) ++ { ++ #ifdef FEAT_SYN_HL ++ // Free independent synblock before the buffer is freed. ++ if (win->w_buffer != NULL) ++ reset_synblock(win); ++ #endif ++ ++ #ifdef FEAT_QUICKFIX ++ // When the quickfix/location list window is closed, unlist the buffer. ++ if (win->w_buffer != NULL && bt_quickfix(win->w_buffer)) ++ win->w_buffer->b_p_bl = FALSE; ++ #endif ++ ++ // Close the link to the buffer. ++ if (win->w_buffer != NULL) ++ { ++ bufref_T bufref; ++ ++ set_bufref(&bufref, curbuf); ++ win->w_closing = TRUE; ++ close_buffer(win, win->w_buffer, free_buf ? DOBUF_UNLOAD : 0, ++ abort_if_last); ++ if (win_valid_any_tab(win)) ++ win->w_closing = FALSE; ++ // Make sure curbuf is valid. It can become invalid if 'bufhidden' is ++ // "wipe". ++ if (!bufref_valid(&bufref)) ++ curbuf = firstbuf; ++ } ++ } ++ ++ /* + * Close window "win". Only works for the current tab page. + * If "free_buf" is TRUE related buffer may be unloaded. + * +*************** +*** 2319,2327 **** + if (win->w_closing || (win->w_buffer != NULL + && win->w_buffer->b_locked > 0)) + return FAIL; /* window is already being closed */ +! if (win == aucmd_win) + { +! emsg(_("E813: Cannot close autocmd window")); + return FAIL; + } + if ((firstwin == aucmd_win || lastwin == aucmd_win) && one_window()) +--- 2372,2380 ---- + if (win->w_closing || (win->w_buffer != NULL + && win->w_buffer->b_locked > 0)) + return FAIL; /* window is already being closed */ +! if (win_unlisted(win)) + { +! emsg(_("E813: Cannot close autocmd or popup window")); + return FAIL; + } + if ((firstwin == aucmd_win || lastwin == aucmd_win) && one_window()) +*************** +*** 2390,2424 **** + out_flush(); + #endif + +! #ifdef FEAT_SYN_HL +! // Free independent synblock before the buffer is freed. +! if (win->w_buffer != NULL) +! reset_synblock(win); +! #endif +! +! #ifdef FEAT_QUICKFIX +! // When the quickfix/location list window is closed, unlist the buffer. +! if (win->w_buffer != NULL && bt_quickfix(win->w_buffer)) +! win->w_buffer->b_p_bl = FALSE; +! #endif +! +! /* +! * Close the link to the buffer. +! */ +! if (win->w_buffer != NULL) +! { +! bufref_T bufref; +! +! set_bufref(&bufref, curbuf); +! win->w_closing = TRUE; +! close_buffer(win, win->w_buffer, free_buf ? DOBUF_UNLOAD : 0, TRUE); +! if (win_valid_any_tab(win)) +! win->w_closing = FALSE; +! /* Make sure curbuf is valid. It can become invalid if 'bufhidden' is +! * "wipe". */ +! if (!bufref_valid(&bufref)) +! curbuf = firstbuf; +! } + + if (only_one_window() && win_valid(win) && win->w_buffer == NULL + && (last_window() || curtab != prev_curtab +--- 2443,2449 ---- + out_flush(); + #endif + +! win_close_buffer(win, free_buf, TRUE); + + if (only_one_window() && win_valid(win) && win->w_buffer == NULL + && (last_window() || curtab != prev_curtab +*************** +*** 2627,2632 **** +--- 2652,2660 ---- + (void)win_free_mem(aucmd_win, &dummy, NULL); + aucmd_win = NULL; + } ++ # ifdef FEAT_TEXT_PROP ++ close_all_popups(); ++ # endif + + while (firstwin != NULL) + (void)win_free_mem(firstwin, &dummy, NULL); +*************** +*** 3458,3464 **** + wp->w_topfill = 0; + #endif + wp->w_botline = 2; +! #ifdef FEAT_SYN_HL + wp->w_s = &wp->w_buffer->b_s; + #endif + } +--- 3486,3492 ---- + wp->w_topfill = 0; + #endif + wp->w_botline = 2; +! #if defined(FEAT_SYN_HL) || defined(FEAT_SPELL) + wp->w_s = &wp->w_buffer->b_s; + #endif + } +*************** +*** 3484,3502 **** + } + + /* +! * Init "aucmd_win". This can only be done after the first +! * window is fully initialized, thus it can't be in win_alloc_first(). + */ +! void +! win_alloc_aucmd_win(void) + { +! aucmd_win = win_alloc(NULL, TRUE); +! if (aucmd_win != NULL) + { +! win_init_some(aucmd_win, curwin); +! RESET_BINDING(aucmd_win); +! new_frame(aucmd_win); + } + } + + /* +--- 3512,3552 ---- + } + + /* +! * Allocate and init a window that is not a regular window. +! * This can only be done after the first window is fully initialized, thus it +! * can't be in win_alloc_first(). + */ +! win_T * +! win_alloc_popup_win(void) + { +! win_T *wp; +! +! wp = win_alloc(NULL, TRUE); +! if (wp != NULL) + { +! // We need to initialize options with something, using the current +! // window makes most sense. +! win_init_some(wp, curwin); +! +! RESET_BINDING(wp); +! new_frame(wp); + } ++ return wp; ++ } ++ ++ /* ++ * Initialize window "wp" to display buffer "buf". ++ */ ++ void ++ win_init_popup_win(win_T *wp, buf_T *buf) ++ { ++ wp->w_buffer = buf; ++ ++buf->b_nwindows; ++ win_init_empty(wp); // set cursor and topline to safe values ++ ++ // Make sure w_localdir and globaldir are NULL to avoid a chdir() in ++ // win_enter_ext(). ++ VIM_CLEAR(wp->w_localdir); + } + + /* +*************** +*** 3619,3624 **** +--- 3669,3678 ---- + # ifdef FEAT_DIFF + diff_clear(tp); + # endif ++ # ifdef FEAT_TEXT_PROP ++ while (tp->tp_first_popupwin != NULL) ++ popup_close(tp->tp_first_popupwin->w_id); ++ #endif + for (idx = 0; idx < SNAP_COUNT; ++idx) + clear_snapshot(tp, idx); + #ifdef FEAT_EVAL +*************** +*** 4782,4788 **** + vim_free(wp->w_p_cc_cols); + #endif + +! if (wp != aucmd_win) + win_remove(wp, tp); + if (autocmd_busy) + { +--- 4836,4842 ---- + vim_free(wp->w_p_cc_cols); + #endif + +! if (win_valid_any_tab(wp)) + win_remove(wp, tp); + if (autocmd_busy) + { +*************** +*** 4796,4801 **** +--- 4850,4877 ---- + } + + /* ++ * Return TRUE if "wp" is not in the list of windows: the autocmd window or a ++ * popup window. ++ */ ++ int ++ win_unlisted(win_T *wp) ++ { ++ return wp == aucmd_win || bt_popup(wp->w_buffer); ++ } ++ ++ /* ++ * Free a popup window. This does not take the window out of the window list ++ * and assumes there is only one toplevel frame, no split. ++ */ ++ void ++ win_free_popup(win_T *win) ++ { ++ win_close_buffer(win, TRUE, FALSE); ++ vim_free(win->w_frame); ++ win_free(win, NULL); ++ } ++ ++ /* + * Append window "wp" in the window list after window "after". + */ + void +*************** +*** 6182,6188 **** + /* + * Return TRUE if there is only one window (in the current tab page), not + * counting a help or preview window, unless it is the current window. +! * Does not count "aucmd_win". + */ + int + only_one_window(void) +--- 6258,6264 ---- + /* + * Return TRUE if there is only one window (in the current tab page), not + * counting a help or preview window, unless it is the current window. +! * Does not count unlisted windows. + */ + int + only_one_window(void) +*************** +*** 6974,6979 **** +--- 7050,7065 ---- + FOR_ALL_TAB_WINDOWS(tp, wp) + if (wp->w_id == id) + return wp; ++ #ifdef FEAT_TEXT_PROP ++ // popup windows are in a separate list ++ FOR_ALL_TABPAGES(tp) ++ for (wp = tp->tp_first_popupwin; wp != NULL; wp = wp->w_next) ++ if (wp->w_id == id) ++ return wp; ++ for (wp = first_popupwin; wp != NULL; wp = wp->w_next) ++ if (wp->w_id == id) ++ return wp; ++ #endif + + return NULL; + } +*** ../vim-8.1.1390/src/version.c 2019-05-24 22:08:11.366273819 +0200 +--- src/version.c 2019-05-25 19:47:26.877503334 +0200 +*************** +*** 769,770 **** +--- 769,772 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 1391, + /**/ + +-- +I'm not familiar with this proof, but I'm aware of a significant +following of toddlers who believe that peanut butter is the solution +to all of life's problems... -- Tim Hammerquist + + /// Bram Moolenaar -- Bram@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 /// |