patch 8.1.1402: "timer" option of popup windows not supported

Problem:    "timer" option of popup windows not supported.
Solution:   Implement the "timer" option. (Yasuhiro Matsumoto, closes #4439)
diff --git a/src/popupwin.c b/src/popupwin.c
index 5439c64..f08f784 100644
--- a/src/popupwin.c
+++ b/src/popupwin.c
@@ -22,11 +22,34 @@
     static void
 apply_options(win_T *wp, buf_T *buf UNUSED, dict_T *dict)
 {
+    int	    nr;
+
     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");
+
+    // Add timer to close the popup after some time.
+    nr = dict_get_number(dict, (char_u *)"time");
+    if (nr > 0)
+    {
+	char_u	    cbbuf[50];
+	char_u	    *ptr = cbbuf;
+	typval_T    tv;
+
+	vim_snprintf((char *)cbbuf, sizeof(cbbuf),
+					   "{_ -> popup_close(%d)}", wp->w_id);
+	if (get_lambda_tv(&ptr, &tv, TRUE) == OK)
+	{
+	    wp->w_popup_timer = create_timer(nr, 0);
+	    wp->w_popup_timer->tr_callback =
+				  vim_strsave(partial_name(tv.vval.v_partial));
+	    func_ref(wp->w_popup_timer->tr_callback);
+	    wp->w_popup_timer->tr_partial = tv.vval.v_partial;
+	}
+    }
+
 }
 
 /*
@@ -177,6 +200,15 @@
     popup_close(nr);
 }
 
+    static void
+popup_undisplay(win_T *wp)
+{
+    if (wp->w_winrow + wp->w_height >= cmdline_row)
+	clear_cmdline = TRUE;
+    win_free_popup(wp);
+    redraw_all_later(NOT_VALID);
+}
+
 /*
  * Close a popup window by Window-id.
  */
@@ -195,8 +227,7 @@
 		first_popupwin = wp->w_next;
 	    else
 		prev->w_next = wp->w_next;
-	    win_free_popup(wp);
-	    redraw_all_later(NOT_VALID);
+	    popup_undisplay(wp);
 	    return;
 	}
 
@@ -222,8 +253,7 @@
 		*root = wp->w_next;
 	    else
 		prev->w_next = wp->w_next;
-	    win_free_popup(wp);
-	    redraw_all_later(NOT_VALID);
+	    popup_undisplay(wp);
 	    return;
 	}
 }