Problem: Some commands can cause problems in terminal popup.
Solution: Disallow more commands.
char_u *p;
int old_arg_idx = curwin->w_arg_idx;
- if (ERROR_IF_POPUP_WINDOW)
+ if (ERROR_IF_ANY_POPUP_WINDOW)
return;
if (argn < 0 || argn >= ARGCOUNT)
{
static void
ex_bunload(exarg_T *eap)
{
- if (ERROR_IF_POPUP_WINDOW)
+ if (ERROR_IF_ANY_POPUP_WINDOW)
return;
eap->errmsg = do_bufdel(
eap->cmdidx == CMD_bdelete ? DOBUF_DEL
static void
ex_buffer(exarg_T *eap)
{
- if (ERROR_IF_POPUP_WINDOW)
+ if (ERROR_IF_ANY_POPUP_WINDOW)
return;
if (*eap->arg)
eap->errmsg = e_trailing;
static void
ex_bnext(exarg_T *eap)
{
- if (ERROR_IF_POPUP_WINDOW)
+ if (ERROR_IF_ANY_POPUP_WINDOW)
return;
goto_buffer(eap, DOBUF_CURRENT, FORWARD, (int)eap->line2);
static void
ex_bprevious(exarg_T *eap)
{
- if (ERROR_IF_POPUP_WINDOW)
+ if (ERROR_IF_ANY_POPUP_WINDOW)
return;
goto_buffer(eap, DOBUF_CURRENT, BACKWARD, (int)eap->line2);
static void
ex_brewind(exarg_T *eap)
{
- if (ERROR_IF_POPUP_WINDOW)
+ if (ERROR_IF_ANY_POPUP_WINDOW)
return;
goto_buffer(eap, DOBUF_FIRST, FORWARD, 0);
static void
ex_blast(exarg_T *eap)
{
- if (ERROR_IF_POPUP_WINDOW)
+ if (ERROR_IF_ANY_POPUP_WINDOW)
return;
goto_buffer(eap, DOBUF_LAST, BACKWARD, 0);
|| eap->cmdidx == CMD_tabfind
|| eap->cmdidx == CMD_tabnew;
- if (ERROR_IF_POPUP_WINDOW)
+ if (ERROR_IF_ANY_POPUP_WINDOW)
return;
#ifdef FEAT_GUI
int need_hide;
int exmode_was = exmode_active;
- if (eap->cmdidx != CMD_pedit && ERROR_IF_POPUP_WINDOW)
+ if ((eap->cmdidx != CMD_pedit && ERROR_IF_POPUP_WINDOW)
+ || ERROR_IF_TERM_POPUP_WINDOW)
return;
/*
* ":vi" command ends Ex mode.
// Give an error in curwin is a popup window and evaluate to TRUE.
#ifdef FEAT_PROP_POPUP
-# define ERROR_IF_POPUP_WINDOW error_if_popup_window()
+# define ERROR_IF_POPUP_WINDOW error_if_popup_window(FALSE)
+# define ERROR_IF_ANY_POPUP_WINDOW error_if_popup_window(TRUE)
#else
# define ERROR_IF_POPUP_WINDOW 0
+# define ERROR_IF_ANY_POPUP_WINDOW 0
#endif
#if defined(FEAT_PROP_POPUP) && defined(FEAT_TERMINAL)
# define ERROR_IF_TERM_POPUP_WINDOW error_if_term_popup_window()
int id = (int)tv_get_number(argvars);
win_T *wp;
- if (ERROR_IF_POPUP_WINDOW)
+ if (ERROR_IF_ANY_POPUP_WINDOW)
return;
wp = find_popup_win(id);
void
close_all_popups(void)
{
- if (ERROR_IF_POPUP_WINDOW)
+ if (ERROR_IF_ANY_POPUP_WINDOW)
return;
while (first_popupwin != NULL)
popup_close(first_popupwin->w_id);
}
int
-error_if_popup_window()
+error_if_popup_window(int also_with_term UNUSED)
{
// win_execute() may set "curwin" to a popup window temporarily, but many
// commands are disallowed then. When a terminal runs in the popup most
// things are allowed.
if (WIN_IS_POPUP(curwin)
# ifdef FEAT_TERMINAL
- && curbuf->b_term == NULL
+ && (also_with_term || curbuf->b_term == NULL)
# endif
)
{
void f_popup_getpos(typval_T *argvars, typval_T *rettv);
void f_popup_locate(typval_T *argvars, typval_T *rettv);
void f_popup_getoptions(typval_T *argvars, typval_T *rettv);
-int error_if_popup_window(void);
+int error_if_popup_window(int also_with_term);
int error_if_term_popup_window(void);
void popup_reset_handled(int handled_flag);
win_T *find_next_popup(int lowest, int handled_flag);
call VerifyScreenDump(buf, 'Test_terminal_popup_3', {})
call term_sendkeys(buf, ":q\<CR>")
- call term_wait(buf, 50) " wait for terminal to vanish
+ call term_wait(buf, 100) " wait for terminal to vanish
call StopVimInTerminal(buf)
call delete('XtermPopup')
static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 194,
/**/
193,
/**/
#endif
char_u cbuf[40];
- if (ERROR_IF_POPUP_WINDOW)
+ if (ERROR_IF_ANY_POPUP_WINDOW)
return;
#ifdef FEAT_CMDWIN
int
win_split(int size, int flags)
{
- if (ERROR_IF_POPUP_WINDOW)
+ if (ERROR_IF_ANY_POPUP_WINDOW)
return FAIL;
// When the ":tab" modifier was used open a new tab page instead.
win_T *wp2;
int temp;
- if (ERROR_IF_POPUP_WINDOW)
+ if (ERROR_IF_ANY_POPUP_WINDOW)
return;
if (ONE_WINDOW) // just one window
{
int had_diffmode = win->w_p_diff;
#endif
- if (ERROR_IF_POPUP_WINDOW)
+ if (ERROR_IF_ANY_POPUP_WINDOW)
return FAIL;
if (last_window())
#endif
#ifdef FEAT_PROP_POPUP
- if (ERROR_IF_POPUP_WINDOW || ERROR_IF_TERM_POPUP_WINDOW)
+ if (ERROR_IF_ANY_POPUP_WINDOW)
return;
if (popup_is_popup(wp))
{