patch 8.1.1799: cannot avoid mapping for a popup window

Problem:    Cannot avoid mapping for a popup window.
Solution:   Add the "mapping" property, default TRUE.
diff --git a/src/getchar.c b/src/getchar.c
index fe1cc7e..4a3587c 100644
--- a/src/getchar.c
+++ b/src/getchar.c
@@ -1575,6 +1575,9 @@
 #if defined(FEAT_XIM) && defined(FEAT_GUI_GTK)
 		    || im_is_preediting()
 #endif
+#if defined(FEAT_TEXT_PROP)
+		    || popup_no_mapping()
+#endif
 		    )
 	    {
 		// no mapping after modifier has been read
diff --git a/src/popupwin.c b/src/popupwin.c
index 4ca6d9f..28ad48c 100644
--- a/src/popupwin.c
+++ b/src/popupwin.c
@@ -800,6 +800,15 @@
 	    set_callback(&wp->w_filter_cb, &callback);
 	}
     }
+    di = dict_find(dict, (char_u *)"mapping", -1);
+    if (di != NULL)
+    {
+	nr = dict_get_number(dict, (char_u *)"mapping");
+	if (nr)
+	    wp->w_popup_flags |= POPF_MAPPING;
+	else
+	    wp->w_popup_flags &= ~POPF_MAPPING;
+    }
 
     di = dict_find(dict, (char_u *)"callback", -1);
     if (di != NULL)
@@ -1413,7 +1422,7 @@
     if (rettv != NULL)
 	rettv->vval.v_number = wp->w_id;
     wp->w_popup_pos = POPPOS_TOPLEFT;
-    wp->w_popup_flags = POPF_IS_POPUP;
+    wp->w_popup_flags = POPF_IS_POPUP | POPF_MAPPING;
 
     if (buf != NULL)
     {
@@ -1561,6 +1570,7 @@
 	wp->w_popup_pos = POPPOS_CENTER;
 	wp->w_zindex = POPUPWIN_DIALOG_ZINDEX;
 	wp->w_popup_flags |= POPF_DRAG;
+	wp->w_popup_flags &= ~POPF_MAPPING;
 	for (i = 0; i < 4; ++i)
 	{
 	    wp->w_popup_border[i] = 1;
@@ -2502,6 +2512,25 @@
 }
 
 /*
+ * Return TRUE if there is a popup visible with a filter callback and the
+ * "mapping" property off.
+ */
+    int
+popup_no_mapping(void)
+{
+    int	    round;
+    win_T   *wp;
+
+    for (round = 1; round <= 2; ++round)
+	for (wp = round == 1 ? first_popupwin : curtab->tp_first_popupwin;
+						   wp != NULL; wp = wp->w_next)
+	    if (wp->w_filter_cb.cb_name != NULL
+		    && (wp->w_popup_flags & (POPF_HIDDEN | POPF_MAPPING)) == 0)
+		return TRUE;
+    return FALSE;
+}
+
+/*
  * Called when the cursor moved: check if any popup needs to be closed if the
  * cursor moved far enough.
  */
diff --git a/src/proto/popupwin.pro b/src/proto/popupwin.pro
index b964fc0..f1d0d2b 100644
--- a/src/proto/popupwin.pro
+++ b/src/proto/popupwin.pro
@@ -38,6 +38,7 @@
 void popup_reset_handled(void);
 win_T *find_next_popup(int lowest);
 int popup_do_filter(int c);
+int popup_no_mapping(void);
 void popup_check_cursor_pos(void);
 void may_update_popup_mask(int type);
 void update_popups(void (*win_update)(win_T *wp));
diff --git a/src/testdir/test_popupwin.vim b/src/testdir/test_popupwin.vim
index d4b98ae..e5d1631 100644
--- a/src/testdir/test_popupwin.vim
+++ b/src/testdir/test_popupwin.vim
@@ -657,6 +657,7 @@
   call assert_fails('call popup_create("text", #{mask: ["asdf"]})', 'E475:')
   call popup_clear()
   call assert_fails('call popup_create("text", #{mask: test_null_list()})', 'E475:')
+  call assert_fails('call popup_create("text", #{mapping: []})', 'E745:')
   call popup_clear()
 endfunc
 
@@ -1203,6 +1204,8 @@
     let s:cb_winid = a:id
     let s:cb_res = a:res
   endfunc
+  " mapping won't be used in popup
+  map j k
 
   let winid = ShowMenu(" ", 1)
   let winid = ShowMenu("j \<CR>", 2)
@@ -1215,6 +1218,7 @@
   let winid = ShowMenu("\<C-C>", -1)
 
   delfunc QuitCallback
+  unmap j
 endfunc
 
 func Test_popup_menu_screenshot()
@@ -2194,6 +2198,9 @@
   call term_sendkeys(buf, "/another\<CR>\<C-W>}")
   call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_4', {})
 
+  call term_sendkeys(buf, ":cd ..\<CR>:\<CR>")
+  call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_5', {})
+
   call StopVimInTerminal(buf)
   call delete('Xtags')
   call delete('Xtagfile')
diff --git a/src/version.c b/src/version.c
index ec67fe4..b2c4416 100644
--- a/src/version.c
+++ b/src/version.c
@@ -774,6 +774,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1799,
+/**/
     1798,
 /**/
     1797,
diff --git a/src/vim.h b/src/vim.h
index 02b4c03..70fcf3a 100644
--- a/src/vim.h
+++ b/src/vim.h
@@ -621,6 +621,7 @@
 #define POPF_ON_CMDLINE	0x10	// popup overlaps command line
 #define POPF_DRAG	0x20	// popup can be moved by dragging
 #define POPF_RESIZE	0x40	// popup can be resized by dragging
+#define POPF_MAPPING	0x80	// mapping keys
 
 #ifdef FEAT_TEXT_PROP
 # define WIN_IS_POPUP(wp) ((wp)->w_popup_flags != 0)