diff options
Diffstat (limited to 'data/vim/patches/8.1.1441')
-rw-r--r-- | data/vim/patches/8.1.1441 | 679 |
1 files changed, 0 insertions, 679 deletions
diff --git a/data/vim/patches/8.1.1441 b/data/vim/patches/8.1.1441 deleted file mode 100644 index 14cfee80c..000000000 --- a/data/vim/patches/8.1.1441 +++ /dev/null @@ -1,679 +0,0 @@ -To: vim_dev@googlegroups.com -Subject: Patch 8.1.1441 -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.1441 -Problem: Popup window filter not yet implemented. -Solution: Implement the popup filter. -Files: src/structs.h, runtime/doc/popup.txt, src/popupwin.c, - src/proto/popupwin.pro, src/window.c, src/getchar.c, src/screen.c, - src/misc2.c, src/proto/misc2.pro, src/vim.h, - src/testdir/test_popupwin.vim - - -*** ../vim-8.1.1440/src/structs.h 2019-06-01 13:28:30.265829531 +0200 ---- src/structs.h 2019-06-01 14:41:32.923095976 +0200 -*************** -*** 2890,2895 **** ---- 2890,2896 ---- - int w_wantcol; // "col" for popup window - varnumber_T w_popup_last_changedtick; // b:changedtick when position was - // computed -+ callback_T w_filter_cb; // popup filter callback - # if defined(FEAT_TIMERS) - timer_T *w_popup_timer; // timer for closing popup window - # endif -*** ../vim-8.1.1440/runtime/doc/popup.txt 2019-05-30 22:32:10.804178558 +0200 ---- runtime/doc/popup.txt 2019-06-01 17:08:46.906685908 +0200 -*************** -*** 13,21 **** - 3. Examples |popup-examples| - - -! {not available if the |+eval| feature was disabled at compile time} -! {not able to use text properties if the |+textprop| feature was disabled at -! compile time} - - ============================================================================== - 1. Introduction *popup-intro* ---- 13,19 ---- - 3. Examples |popup-examples| - - -! {not available if the |+textprop| feature was disabled at compile time} - - ============================================================================== - 1. Introduction *popup-intro* -*************** -*** 60,74 **** - - The height of the window is normally equal to the number of, possibly - wrapping, 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: ---- 58,79 ---- - - The height of the window is normally equal to the number of, possibly - wrapping, lines in the buffer. It can be limited with the "maxheight" -! property. You can use empty lines to increase the height or the "minheight" -! property. - - 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 or the "minwidth" property. - - By default the 'wrap' option is set, so that no text disappears. However, if - there is not enough space, some text may be invisible. - -+ Vim tries to show the popup in the location you specify. In some cases, e.g. -+ when the popup would go outside of the Vim window, it will show it somewhere -+ else. E.g. if you use `popup_atcursor()` the popup normally shows just above -+ the current cursor position, but if the cursor is close to the top of the Vim -+ window it will be placed below the cursor position. -+ - - - TODO: -*************** -*** 85,100 **** - - IMPLEMENTATION: - - Code is in popupwin.c -! - Implement filter. -! Check that popup_close() works in the filter. - - Implement padding - - Implement border -- - Handle screen resize in screenalloc(). - - Make redrawing more efficient and avoid flicker. - Store popup info in a mask, use the mask in screen_line() - Fix redrawing problem with completion. - Fix redrawing problem when scrolling non-current window - Fix redrawing the statusline on top of a popup - - Figure out the size and position better. - if wrapping splits a double-wide character - if wrapping inserts indent ---- 90,109 ---- - - IMPLEMENTATION: - - Code is in popupwin.c -! - Invoke filter with character before mapping? -! - Handle screen resize in screenalloc(). (Ben Jackson, #4467) -! - Why does 'nrformats' leak from the popup window buffer??? - - Implement padding - - Implement border - - Make redrawing more efficient and avoid flicker. - Store popup info in a mask, use the mask in screen_line() -+ Keep mask until next update_screen(), find differences and redraw affected -+ windows/lines - Fix redrawing problem with completion. - Fix redrawing problem when scrolling non-current window - Fix redrawing the statusline on top of a popup -+ - Disable commands, feedkeys(), CTRL-W, etc. in a popup window. -+ Use NOT_IN_POPUP_WINDOW. - - Figure out the size and position better. - if wrapping splits a double-wide character - if wrapping inserts indent -*************** -*** 114,120 **** - - 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. - ---- 123,129 ---- - - a string - - a list of strings - - a list of text lines with text properties -! - {options} is a dictionary with many possible entries. - See |popup_create-usage| for details. - -*************** -*** 376,382 **** - {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} ---- 385,390 ---- -*************** -*** 410,423 **** - type name of the text property type, as added with - |prop_type_add()| - transparent do not show these characters, show the text under it; -! if there is an border character to the right or below - it will be made transparent as well - {not implemented yet} - - - 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. - ---- 418,430 ---- - type name of the text property type, as added with - |prop_type_add()| - transparent do not show these characters, show the text under it; -! if there is a border character to the right or below - it will be made transparent as well - {not implemented yet} - - - POPUP FILTER *popup-filter* - - A callback that gets any typed keys while a popup is displayed. The filter is - not invoked when the popup is hidden. - -*************** -*** 428,437 **** - is called first. - - The filter function is called with two arguments: the ID of the popup and the -! key. - - Some common key actions: -! Esc close the popup - cursor keys select another entry - Tab accept current suggestion - ---- 435,457 ---- - is called first. - - The filter function is called with two arguments: the ID of the popup and the -! key, e.g.: > -! func MyFilter(winid, key) -! if a:key == "\<F2>" -! " do something -! return 1 -! endif -! if a:key == 'x' -! call popup_close(a:winid) -! return 1 -! endif -! return 0 -! endfunc -! -! Currently the key is what results after any mapping. This may change... - - Some common key actions: -! x close the popup (see note below) - cursor keys select another entry - Tab accept current suggestion - -*************** -*** 442,447 **** ---- 462,472 ---- - Vim provides standard filters |popup_filter_menu()| and - |popup_filter_yesno()|. - -+ Note that "x" is the normal way to close a popup. You may want to use Esc, -+ but since many keys start with an Esc character, there may be a delay before -+ Vim recognizes the Esc key. If you do use Esc, it is reecommended to set the -+ 'ttimeoutlen' option to 100 and set 'timeout' and/or 'ttimeout'. -+ - - POPUP CALLBACK *popup-callback* - -*** ../vim-8.1.1440/src/popupwin.c 2019-06-01 14:15:49.535433551 +0200 ---- src/popupwin.c 2019-06-01 16:50:12.413188030 +0200 -*************** -*** 149,173 **** - if (get_lambda_tv(&ptr, &tv, TRUE) == OK) - { - wp->w_popup_timer = create_timer(nr, 0); -! wp->w_popup_timer->tr_callback.cb_name = -! vim_strsave(partial_name(tv.vval.v_partial)); -! func_ref(wp->w_popup_timer->tr_callback.cb_name); -! wp->w_popup_timer->tr_callback.cb_partial = tv.vval.v_partial; - } - } - #endif - - // Option values resulting in setting an option. -! str = dict_get_string(dict, (char_u *)"highlight", TRUE); - if (str != NULL) - set_string_option_direct_in_win(wp, (char_u *)"wincolor", -1, - str, OPT_FREE|OPT_LOCAL, 0); - di = dict_find(dict, (char_u *)"wrap", -1); - if (di != NULL) - { - nr = dict_get_number(dict, (char_u *)"wrap"); - wp->w_p_wrap = nr != 0; - } - } - - /* ---- 149,181 ---- - if (get_lambda_tv(&ptr, &tv, TRUE) == OK) - { - wp->w_popup_timer = create_timer(nr, 0); -! wp->w_popup_timer->tr_callback = get_callback(&tv); -! clear_tv(&tv); - } - } - #endif - - // Option values resulting in setting an option. -! str = dict_get_string(dict, (char_u *)"highlight", FALSE); - if (str != NULL) - set_string_option_direct_in_win(wp, (char_u *)"wincolor", -1, - str, OPT_FREE|OPT_LOCAL, 0); -+ - di = dict_find(dict, (char_u *)"wrap", -1); - if (di != NULL) - { - nr = dict_get_number(dict, (char_u *)"wrap"); - wp->w_p_wrap = nr != 0; - } -+ -+ di = dict_find(dict, (char_u *)"filter", -1); -+ if (di != NULL) -+ { -+ callback_T callback = get_callback(&di->di_tv); -+ -+ if (callback.cb_name != NULL) -+ set_callback(&wp->w_filter_cb, &callback); -+ } - } - - /* -*************** -*** 759,762 **** ---- 767,875 ---- - return FALSE; - } - -+ /* -+ * Reset all the POPF_HANDLED flags in global popup windows and popup windows -+ * in the current tab. -+ */ -+ void -+ popup_reset_handled() -+ { -+ win_T *wp; -+ -+ for (wp = first_popupwin; wp != NULL; wp = wp->w_next) -+ wp->w_popup_flags &= ~POPF_HANDLED; -+ for (wp = curtab->tp_first_popupwin; wp != NULL; wp = wp->w_next) -+ wp->w_popup_flags &= ~POPF_HANDLED; -+ } -+ -+ /* -+ * Find the next visible popup where POPF_HANDLED is not set. -+ * Must have called popup_reset_handled() first. -+ * When "lowest" is TRUE find the popup with the lowest zindex, otherwise the -+ * popup with the highest zindex. -+ */ -+ win_T * -+ find_next_popup(int lowest) -+ { -+ win_T *wp; -+ win_T *found_wp; -+ int found_zindex; -+ -+ found_zindex = lowest ? INT_MAX : 0; -+ found_wp = NULL; -+ for (wp = first_popupwin; wp != NULL; wp = wp->w_next) -+ if ((wp->w_popup_flags & (POPF_HANDLED|POPF_HIDDEN)) == 0 -+ && (lowest ? wp->w_zindex < found_zindex -+ : wp->w_zindex > found_zindex)) -+ { -+ found_zindex = wp->w_zindex; -+ found_wp = wp; -+ } -+ for (wp = curtab->tp_first_popupwin; wp != NULL; wp = wp->w_next) -+ if ((wp->w_popup_flags & (POPF_HANDLED|POPF_HIDDEN)) == 0 -+ && (lowest ? wp->w_zindex < found_zindex -+ : wp->w_zindex > found_zindex)) -+ { -+ found_zindex = wp->w_zindex; -+ found_wp = wp; -+ } -+ -+ if (found_wp != NULL) -+ found_wp->w_popup_flags |= POPF_HANDLED; -+ return found_wp; -+ } -+ -+ /* -+ * Invoke the filter callback for window "wp" with typed character "c". -+ * Uses the global "mod_mask" for modifiers. -+ * Returns the return value of the filter. -+ * Careful: The filter may make "wp" invalid! -+ */ -+ static int -+ invoke_popup_filter(win_T *wp, int c) -+ { -+ int res; -+ typval_T rettv; -+ int dummy; -+ typval_T argv[3]; -+ char_u buf[NUMBUFLEN]; -+ -+ argv[0].v_type = VAR_NUMBER; -+ argv[0].vval.v_number = (varnumber_T)wp->w_id; -+ -+ // Convert the number to a string, so that the function can use: -+ // if a:c == "\<F2>" -+ buf[special_to_buf(c, mod_mask, TRUE, buf)] = NUL; -+ argv[1].v_type = VAR_STRING; -+ argv[1].vval.v_string = vim_strsave(buf); -+ -+ argv[2].v_type = VAR_UNKNOWN; -+ -+ call_callback(&wp->w_filter_cb, -1, -+ &rettv, 2, argv, NULL, 0L, 0L, &dummy, TRUE, NULL); -+ res = tv_get_number(&rettv); -+ vim_free(argv[1].vval.v_string); -+ clear_tv(&rettv); -+ return res; -+ } -+ -+ /* -+ * Called when "c" was typed: invoke popup filter callbacks. -+ * Returns TRUE when the character was consumed, -+ */ -+ int -+ popup_do_filter(int c) -+ { -+ int res = FALSE; -+ win_T *wp; -+ -+ popup_reset_handled(); -+ -+ while (!res && (wp = find_next_popup(FALSE)) != NULL) -+ if (wp->w_filter_cb.cb_name != NULL) -+ res = invoke_popup_filter(wp, c); -+ -+ return res; -+ } -+ - #endif // FEAT_TEXT_PROP -*** ../vim-8.1.1440/src/proto/popupwin.pro 2019-06-01 14:15:49.535433551 +0200 ---- src/proto/popupwin.pro 2019-06-01 15:27:43.874215916 +0200 -*************** -*** 14,17 **** ---- 14,20 ---- - void f_popup_getpos(typval_T *argvars, typval_T *rettv); - void f_popup_getoptions(typval_T *argvars, typval_T *rettv); - int not_in_popup_window(void); -+ void popup_reset_handled(void); -+ win_T *find_next_popup(int lowest); -+ int popup_do_filter(int c); - /* vim: set ft=c : */ -*** ../vim-8.1.1440/src/window.c 2019-06-01 14:15:49.535433551 +0200 ---- src/window.c 2019-06-01 14:45:04.693979677 +0200 -*************** -*** 4844,4849 **** ---- 4844,4852 ---- - #ifdef FEAT_MENU - remove_winbar(wp); - #endif -+ #ifdef FEAT_TEXT_PROP -+ free_callback(&wp->w_filter_cb); -+ #endif - - #ifdef FEAT_SYN_HL - vim_free(wp->w_p_cc_cols); -*** ../vim-8.1.1440/src/getchar.c 2019-05-28 23:08:12.064648717 +0200 ---- src/getchar.c 2019-06-01 15:27:15.194364518 +0200 -*************** -*** 1801,1806 **** ---- 1801,1810 ---- - ui_remove_balloon(); - } - #endif -+ #ifdef FEAT_TEXT_PROP -+ if (popup_do_filter(c)) -+ c = K_IGNORE; -+ #endif - - return c; - } -*** ../vim-8.1.1440/src/screen.c 2019-05-30 00:11:48.704086357 +0200 ---- src/screen.c 2019-06-01 15:27:52.722170128 +0200 -*************** -*** 996,1043 **** - 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_popup_flags &= ~POPF_REDRAWN; -- for (wp = curtab->tp_first_popupwin; wp != NULL; wp = wp->w_next) -- wp->w_popup_flags &= ~POPF_REDRAWN; - - // 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_popup_flags & (POPF_REDRAWN|POPF_HIDDEN)) == 0 -- && wp->w_zindex < lowest_zindex) -- { -- lowest_zindex = wp->w_zindex; -- lowest_wp = wp; -- } -- for (wp = curtab->tp_first_popupwin; wp != NULL; wp = wp->w_next) -- if ((wp->w_popup_flags & (POPF_REDRAWN|POPF_HIDDEN)) == 0 -- && wp->w_zindex < lowest_zindex) -- { -- lowest_zindex = wp->w_zindex; -- lowest_wp = wp; -- } -- -- if (lowest_wp == NULL) -- break; -- - // Recompute the position if the text changed. -! if (lowest_wp->w_popup_last_changedtick -! != CHANGEDTICK(lowest_wp->w_buffer)) -! popup_adjust_position(lowest_wp); - -! win_update(lowest_wp); -! lowest_wp->w_popup_flags |= POPF_REDRAWN; - } - } - #endif ---- 996,1014 ---- - update_popups(void) - { - win_T *wp; - -+ // 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. - // TODO: don't redraw every popup every time. -! popup_reset_handled(); -! while ((wp = find_next_popup(TRUE)) != NULL) - { - // Recompute the position if the text changed. -! if (wp->w_popup_last_changedtick != CHANGEDTICK(wp->w_buffer)) -! popup_adjust_position(wp); - -! win_update(wp); - } - } - #endif -*** ../vim-8.1.1440/src/misc2.c 2019-06-01 14:36:22.020738812 +0200 ---- src/misc2.c 2019-06-01 16:19:53.258610026 +0200 -*************** -*** 2731,2747 **** - trans_special( - char_u **srcp, - char_u *dst, -! int keycode, /* prefer key code, e.g. K_DEL instead of DEL */ -! int in_string) /* TRUE when inside a double quoted string */ - { - int modifiers = 0; - int key; -- int dlen = 0; - - key = find_special_key(srcp, &modifiers, keycode, FALSE, in_string); - if (key == 0) - return 0; - - /* Put the appropriate modifier in a string */ - if (modifiers != 0) - { ---- 2731,2761 ---- - trans_special( - char_u **srcp, - char_u *dst, -! int keycode, // prefer key code, e.g. K_DEL instead of DEL -! int in_string) // TRUE when inside a double quoted string - { - int modifiers = 0; - int key; - - key = find_special_key(srcp, &modifiers, keycode, FALSE, in_string); - if (key == 0) - return 0; - -+ return special_to_buf(key, modifiers, keycode, dst); -+ } -+ -+ /* -+ * Put the character sequence for "key" with "modifiers" into "dst" and return -+ * the resulting length. -+ * When "keycode" is TRUE prefer key code, e.g. K_DEL instead of DEL. -+ * The sequence is not NUL terminated. -+ * This is how characters in a string are encoded. -+ */ -+ int -+ special_to_buf(int key, int modifiers, int keycode, char_u *dst) -+ { -+ int dlen = 0; -+ - /* Put the appropriate modifier in a string */ - if (modifiers != 0) - { -*** ../vim-8.1.1440/src/proto/misc2.pro 2019-05-28 23:08:12.072648675 +0200 ---- src/proto/misc2.pro 2019-06-01 16:19:36.870691383 +0200 -*************** -*** 69,74 **** ---- 69,75 ---- - int handle_x_keys(int key); - char_u *get_special_key_name(int c, int modifiers); - int trans_special(char_u **srcp, char_u *dst, int keycode, int in_string); -+ int special_to_buf(int key, int modifiers, int keycode, char_u *dst); - int find_special_key(char_u **srcp, int *modp, int keycode, int keep_x_key, int in_string); - int extract_modifiers(int key, int *modp); - int find_special_key_in_table(int c); -*** ../vim-8.1.1440/src/vim.h 2019-05-28 23:08:12.080648632 +0200 ---- src/vim.h 2019-06-01 15:15:00.158051300 +0200 -*************** -*** 615,621 **** - - // Values for w_popup_flags. - #define POPF_HIDDEN 1 // popup is not displayed -! #define POPF_REDRAWN 2 // popup was just redrawn - - /* - * Terminal highlighting attribute bits. ---- 615,621 ---- - - // Values for w_popup_flags. - #define POPF_HIDDEN 1 // popup is not displayed -! #define POPF_HANDLED 2 // popup was just redrawn or filtered - - /* - * Terminal highlighting attribute bits. -*** ../vim-8.1.1440/src/testdir/test_popupwin.vim 2019-06-01 17:06:22.688018611 +0200 ---- src/testdir/test_popupwin.vim 2019-06-01 17:04:10.768916509 +0200 -*************** -*** 473,475 **** ---- 473,518 ---- - - bwipe! - endfunc -+ -+ func Test_popup_filter() -+ new -+ call setline(1, 'some text') -+ -+ func MyPopupFilter(winid, c) -+ if a:c == 'e' -+ let g:eaten = 'e' -+ return 1 -+ endif -+ if a:c == '0' -+ let g:ignored = '0' -+ return 0 -+ endif -+ if a:c == 'x' -+ call popup_close(a:winid) -+ return 1 -+ endif -+ return 0 -+ endfunc -+ -+ let winid = popup_create('something', {'filter': 'MyPopupFilter'}) -+ redraw -+ -+ " e is consumed by the filter -+ call feedkeys('e', 'xt') -+ call assert_equal('e', g:eaten) -+ -+ " 0 is ignored by the filter -+ normal $ -+ call assert_equal(9, getcurpos()[2]) -+ call feedkeys('0', 'xt') -+ call assert_equal('0', g:ignored) -+ call assert_equal(1, getcurpos()[2]) -+ -+ " x closes the popup -+ call feedkeys('x', 'xt') -+ call assert_equal('e', g:eaten) -+ call assert_equal(-1, winbufnr(winid)) -+ -+ delfunc MyPopupFilter -+ popupclear -+ endfunc -*** ../vim-8.1.1440/src/version.c 2019-06-01 17:06:22.688018611 +0200 ---- src/version.c 2019-06-01 17:07:13.767529586 +0200 -*************** -*** 769,770 **** ---- 769,772 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 1441, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -75. You start wondering whether you could actually upgrade your brain - with a Pentium Pro microprocessor 80. The upgrade works just fine. - - /// 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 /// |