mirror of
				https://github.com/vim/vim.git
				synced 2025-10-31 09:57:14 -04:00 
			
		
		
		
	patch 9.1.1230: inconsistent CTRL-C behaviour for popup windows
Problem:  Ctrl-C closes popup windows that have a filter callback,
          but does not close popups without a filter callback.
Solution: Modified popup_do_filter() to also close popups without
          filter callback when Ctrl-C is pressed (glepnir).
fixes: #16839
closes: #16928
Signed-off-by: glepnir <glephunter@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
			
			
This commit is contained in:
		
				
					committed by
					
						 Christian Brabandt
						Christian Brabandt
					
				
			
			
				
	
			
			
			
						parent
						
							9712a2534f
						
					
				
				
					commit
					8a63529a2f
				
			| @@ -1,4 +1,4 @@ | |||||||
| *pattern.txt*   For Vim version 9.1.  Last change: 2024 Dec 26 | *pattern.txt*   For Vim version 9.1.  Last change: 2025 Mar 21 | ||||||
|  |  | ||||||
|  |  | ||||||
| 		  VIM REFERENCE MANUAL    by Bram Moolenaar | 		  VIM REFERENCE MANUAL    by Bram Moolenaar | ||||||
| @@ -141,6 +141,7 @@ CTRL-C			Interrupt current (search) command.  Use CTRL-Break on | |||||||
| 			help users who use "vim file | grep word" and don't | 			help users who use "vim file | grep word" and don't | ||||||
| 			know how to get out (blindly typing :qa<CR> would | 			know how to get out (blindly typing :qa<CR> would | ||||||
| 			work). | 			work). | ||||||
|  | 			If a popup is open, the active popup will be closed. | ||||||
|  |  | ||||||
| 							*:noh* *:nohlsearch* | 							*:noh* *:nohlsearch* | ||||||
| :noh[lsearch]		Stop the highlighting for the 'hlsearch' option.  It | :noh[lsearch]		Stop the highlighting for the 'hlsearch' option.  It | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| *version9.txt*  For Vim version 9.1.  Last change: 2025 Mar 19 | *version9.txt*  For Vim version 9.1.  Last change: 2025 Mar 21 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 		  VIM REFERENCE MANUAL    by Bram Moolenaar | 		  VIM REFERENCE MANUAL    by Bram Moolenaar | ||||||
| @@ -41653,6 +41653,7 @@ Others: ~ | |||||||
| - add |dist#vim9#Launch()| and |dist#vim9#Open()| to the |vim-script-library| | - add |dist#vim9#Launch()| and |dist#vim9#Open()| to the |vim-script-library| | ||||||
|   and decouple it from |netrw| |   and decouple it from |netrw| | ||||||
| - new digraph "APPROACHES THE LIMIT" using ".=" | - new digraph "APPROACHES THE LIMIT" using ".=" | ||||||
|  | - |CTRL-C| always closes the active |popup-window|. | ||||||
| 
 | 
 | ||||||
| 							*added-9.2* | 							*added-9.2* | ||||||
| Added ~ | Added ~ | ||||||
|   | |||||||
| @@ -3586,6 +3586,20 @@ popup_do_filter(int c) | |||||||
| 		&& (wp->w_filter_mode & state) != 0) | 		&& (wp->w_filter_mode & state) != 0) | ||||||
| 	    res = invoke_popup_filter(wp, c); | 	    res = invoke_popup_filter(wp, c); | ||||||
|  |  | ||||||
|  |     // when Ctrl-C and no popup has been processed (res is still FALSE) | ||||||
|  |     // Try to find and close a popup that has no filter callback | ||||||
|  |     if (c == Ctrl_C && res == FALSE) | ||||||
|  |     { | ||||||
|  | 	popup_reset_handled(POPUP_HANDLED_2); | ||||||
|  | 	wp = find_next_popup(FALSE, POPUP_HANDLED_2); | ||||||
|  |         if (wp != NULL) | ||||||
|  |         { | ||||||
|  | 	    popup_close_with_retval(wp, -1); | ||||||
|  | 	    res = TRUE; | ||||||
|  | 	} | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|     if (must_redraw > was_must_redraw) |     if (must_redraw > was_must_redraw) | ||||||
|     { |     { | ||||||
| 	int save_got_int = got_int; | 	int save_got_int = got_int; | ||||||
|   | |||||||
| @@ -3898,6 +3898,24 @@ func Test_popupwin_cancel() | |||||||
|   call assert_equal({}, popup_getpos(win3)) |   call assert_equal({}, popup_getpos(win3)) | ||||||
| endfunc | endfunc | ||||||
|  |  | ||||||
|  | func Test_popupwin_cancel_with_without_filter() | ||||||
|  |   let win1 = popup_create('with filter', #{line: 5, filter: {... -> 0}}) | ||||||
|  |   let win2 = popup_create('no filter', #{line: 10}) | ||||||
|  |  | ||||||
|  |   call assert_equal(5, popup_getpos(win1).line) | ||||||
|  |   call assert_equal(10, popup_getpos(win2).line) | ||||||
|  |  | ||||||
|  |   call feedkeys("\<C-C>", 'xt') | ||||||
|  |   call assert_equal({}, popup_getpos(win1)) | ||||||
|  |   call assert_equal(10, popup_getpos(win2).line) | ||||||
|  |  | ||||||
|  |   call feedkeys("\<C-C>", 'xt') | ||||||
|  |   call assert_equal({}, popup_getpos(win1)) | ||||||
|  |   call assert_equal({}, popup_getpos(win2)) | ||||||
|  |  | ||||||
|  |   call popup_clear() | ||||||
|  | endfunc | ||||||
|  |  | ||||||
| func Test_popupwin_filter_redraw() | func Test_popupwin_filter_redraw() | ||||||
|   " Create two popups with a filter that closes the popup when typing "0". |   " Create two popups with a filter that closes the popup when typing "0". | ||||||
|   " Both popups should close, even though the redraw also calls |   " Both popups should close, even though the redraw also calls | ||||||
|   | |||||||
| @@ -704,6 +704,8 @@ static char *(features[]) = | |||||||
|  |  | ||||||
| static int included_patches[] = | static int included_patches[] = | ||||||
| {   /* Add new patch number below this line */ | {   /* Add new patch number below this line */ | ||||||
|  | /**/ | ||||||
|  |     1230, | ||||||
| /**/ | /**/ | ||||||
|     1229, |     1229, | ||||||
| /**/ | /**/ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user