diff src/menu.c @ 13369:244ff1b6d2ad v8.0.1558

patch 8.0.1558: no right-click menu in a terminal commit https://github.com/vim/vim/commit/aef8c3da2ba59285b7cfde559ae21cdce6ba6919 Author: Bram Moolenaar <Bram@vim.org> Date: Sat Mar 3 18:59:16 2018 +0100 patch 8.0.1558: no right-click menu in a terminal Problem: No right-click menu in a terminal. Solution: Implement the right click menu for the terminal.
author Christian Brabandt <cb@256bit.org>
date Sat, 03 Mar 2018 19:00:06 +0100
parents ac42c4b11dbc
children 69517d67421f
line wrap: on
line diff
--- a/src/menu.c
+++ b/src/menu.c
@@ -34,10 +34,6 @@ static int menu_namecmp(char_u *name, ch
 static int get_menu_cmd_modes(char_u *, int, int *, int *);
 static char_u *popup_mode_name(char_u *name, int idx);
 static char_u *menu_text(char_u *text, int *mnemonic, char_u **actext);
-#ifdef FEAT_GUI
-static int get_menu_mode(void);
-static void gui_update_menus_recurse(vimmenu_T *, int);
-#endif
 
 #if defined(FEAT_GUI_W32) && defined(FEAT_TEAROFF)
 static void gui_create_tearoffs_recurse(vimmenu_T *menu, const char_u *pname, int *pri_tab, int pri_idx);
@@ -1871,7 +1867,7 @@ menu_is_tearoff(char_u *name UNUSED)
 }
 #endif
 
-#ifdef FEAT_GUI
+#if defined(FEAT_GUI) || defined(FEAT_TERM_POPUP_MENU) || defined(PROTO)
 
     static int
 get_menu_mode(void)
@@ -1896,6 +1892,60 @@ get_menu_mode(void)
 }
 
 /*
+ * Display the Special "PopUp" menu as a pop-up at the current mouse
+ * position.  The "PopUpn" menu is for Normal mode, "PopUpi" for Insert mode,
+ * etc.
+ */
+    void
+show_popupmenu(void)
+{
+    vimmenu_T	*menu;
+    int		mode;
+
+    mode = get_menu_mode();
+    if (mode == MENU_INDEX_INVALID)
+	return;
+    mode = menu_mode_chars[mode];
+
+# ifdef FEAT_AUTOCMD
+    {
+	char_u	    ename[2];
+
+	ename[0] = mode;
+	ename[1] = NUL;
+	apply_autocmds(EVENT_MENUPOPUP, ename, NULL, FALSE, curbuf);
+    }
+# endif
+
+    for (menu = root_menu; menu != NULL; menu = menu->next)
+	if (STRNCMP("PopUp", menu->name, 5) == 0 && menu->name[5] == mode)
+	    break;
+
+    /* Only show a popup when it is defined and has entries */
+    if (menu != NULL && menu->children != NULL)
+    {
+# if defined(FEAT_GUI)
+	if (gui.in_use)
+	{
+	    /* Update the menus now, in case the MenuPopup autocommand did
+	     * anything. */
+	    gui_update_menus(0);
+	    gui_mch_show_popupmenu(menu);
+	}
+# endif
+#  if defined(FEAT_GUI) && defined(FEAT_TERM_POPUP_MENU)
+	else
+#  endif
+#  if defined(FEAT_TERM_POPUP_MENU)
+	    pum_show_popupmenu(menu);
+#  endif
+    }
+}
+#endif
+
+#if defined(FEAT_GUI) || defined(PROTO)
+
+/*
  * Check that a pointer appears in the menu tree.  Used to protect from using
  * a menu that was deleted after it was selected but before the event was
  * handled.
@@ -1955,28 +2005,28 @@ gui_update_menus_recurse(vimmenu_T *menu
     while (menu)
     {
 	if ((menu->modes & menu->enabled & mode)
-#if defined(FEAT_GUI_W32) && defined(FEAT_TEAROFF)
+# if defined(FEAT_GUI_W32) && defined(FEAT_TEAROFF)
 		|| menu_is_tearoff(menu->dname)
-#endif
+# endif
 	   )
 	    grey = FALSE;
 	else
 	    grey = TRUE;
-#ifdef FEAT_GUI_ATHENA
+# ifdef FEAT_GUI_ATHENA
 	/* Hiding menus doesn't work for Athena, it can cause a crash. */
 	gui_mch_menu_grey(menu, grey);
-#else
+# else
 	/* Never hide a toplevel menu, it may make the menubar resize or
 	 * disappear. Same problem for ToolBar items. */
 	if (vim_strchr(p_go, GO_GREY) != NULL || menu->parent == NULL
-# ifdef FEAT_TOOLBAR
+#  ifdef FEAT_TOOLBAR
 		|| menu_is_toolbar(menu->parent->name)
-# endif
+#  endif
 		   )
 	    gui_mch_menu_grey(menu, grey);
 	else
 	    gui_mch_menu_hidden(menu, grey);
-#endif
+# endif
 	gui_update_menus_recurse(menu->children, mode);
 	menu = menu->next;
     }
@@ -2010,15 +2060,15 @@ gui_update_menus(int modes)
 	gui_mch_draw_menubar();
 	prev_mode = mode;
 	force_menu_update = FALSE;
-#ifdef FEAT_GUI_W32
+# ifdef FEAT_GUI_W32
 	/* This can leave a tearoff as active window - make sure we
 	 * have the focus <negri>*/
 	gui_mch_activate_window();
-#endif
+# endif
     }
 }
 
-#if defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_MOTIF) \
+# if defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_MOTIF) \
     || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_PHOTON) || defined(PROTO)
 /*
  * Check if a key is used as a mnemonic for a toplevel menu.
@@ -2037,47 +2087,7 @@ gui_is_menu_shortcut(int key)
 	    return TRUE;
     return FALSE;
 }
-#endif
-
-/*
- * Display the Special "PopUp" menu as a pop-up at the current mouse
- * position.  The "PopUpn" menu is for Normal mode, "PopUpi" for Insert mode,
- * etc.
- */
-    void
-gui_show_popupmenu(void)
-{
-    vimmenu_T	*menu;
-    int		mode;
-
-    mode = get_menu_mode();
-    if (mode == MENU_INDEX_INVALID)
-	return;
-    mode = menu_mode_chars[mode];
-
-#ifdef FEAT_AUTOCMD
-    {
-	char_u	    ename[2];
-
-	ename[0] = mode;
-	ename[1] = NUL;
-	apply_autocmds(EVENT_MENUPOPUP, ename, NULL, FALSE, curbuf);
-    }
-#endif
-
-    for (menu = root_menu; menu != NULL; menu = menu->next)
-	if (STRNCMP("PopUp", menu->name, 5) == 0 && menu->name[5] == mode)
-	    break;
-
-    /* Only show a popup when it is defined and has entries */
-    if (menu != NULL && menu->children != NULL)
-    {
-	/* Update the menus now, in case the MenuPopup autocommand did
-	 * anything. */
-	gui_update_menus(0);
-	gui_mch_show_popupmenu(menu);
-    }
-}
+# endif
 #endif /* FEAT_GUI */
 
 #if (defined(FEAT_GUI_W32) && defined(FEAT_TEAROFF)) || defined(PROTO)
@@ -2238,7 +2248,7 @@ gui_destroy_tearoffs_recurse(vimmenu_T *
  * Execute "menu".  Use by ":emenu" and the window toolbar.
  * "eap" is NULL for the window toolbar.
  */
-    static void
+    void
 execute_menu(exarg_T *eap, vimmenu_T *menu)
 {
     char_u	*mode;