Patch 8.0.1558
Problem:    No right-click menu in a terminal.
Solution:   Implement the right click menu for the terminal.
Files:      src/popupmnu.c, src/proto/popupmnu.pro, src/normal.c, src/menu.c,
            src/proto/menu.pro, src/feature.h


*** ../vim-8.0.1557/src/popupmnu.c      2018-02-24 21:25:25.198496653 +0100
--- src/popupmnu.c      2018-03-03 18:58:06.048938213 +0100
***************
*** 422,430 ****
                        char_u  *st;
                        int     saved = *p;
  
!                       *p = NUL;
                        st = transstr(s);
!                       *p = saved;
  #ifdef FEAT_RIGHTLEFT
                        if (curwin->w_p_rl)
                        {
--- 422,432 ----
                        char_u  *st;
                        int     saved = *p;
  
!                       if (saved != NUL)
!                           *p = NUL;
                        st = transstr(s);
!                       if (saved != NUL)
!                           *p = saved;
  #ifdef FEAT_RIGHTLEFT
                        if (curwin->w_p_rl)
                        {
***************
*** 830,835 ****
--- 832,874 ----
      return pum_height;
  }
  
+ # if defined(FEAT_BEVAL_TERM) || defined(FEAT_TERM_POPUP_MENU) || 
defined(PROTO)
+     static void
+ pum_position_at_mouse(int min_width)
+ {
+     if (Rows - mouse_row > pum_size)
+     {
+       /* Enough space below the mouse row. */
+       pum_row = mouse_row + 1;
+       if (pum_height > Rows - pum_row)
+           pum_height = Rows - pum_row;
+     }
+     else
+     {
+       /* Show above the mouse row, reduce height if it does not fit. */
+       pum_row = mouse_row - pum_size;
+       if (pum_row < 0)
+       {
+           pum_height += pum_row;
+           pum_row = 0;
+       }
+     }
+     if (Columns - mouse_col >= pum_base_width
+           || Columns - mouse_col > min_width)
+       /* Enough space to show at mouse column. */
+       pum_col = mouse_col;
+     else
+       /* Not enough space, right align with window. */
+       pum_col = Columns - (pum_base_width > min_width
+                                                ? min_width : pum_base_width);
+ 
+     pum_width = Columns - pum_col;
+     if (pum_width > pum_base_width + 1)
+       pum_width = pum_base_width + 1;
+ }
+ 
+ # endif
+ 
  # if defined(FEAT_BEVAL_TERM) || defined(PROTO)
  static pumitem_T *balloon_array = NULL;
  static int balloon_arraysize;
***************
*** 1028,1063 ****
        pum_scrollbar = 0;
        pum_height = balloon_arraysize;
  
!       if (Rows - mouse_row > pum_size)
!       {
!           /* Enough space below the mouse row. */
!           pum_row = mouse_row + 1;
!           if (pum_height > Rows - pum_row)
!               pum_height = Rows - pum_row;
!       }
!       else
!       {
!           /* Show above the mouse row, reduce height if it does not fit. */
!           pum_row = mouse_row - pum_size;
!           if (pum_row < 0)
!           {
!               pum_height += pum_row;
!               pum_row = 0;
!           }
!       }
!       if (Columns - mouse_col >= pum_base_width
!               || Columns - mouse_col > BALLOON_MIN_WIDTH)
!           /* Enough space to show at mouse column. */
!           pum_col = mouse_col;
!       else
!           /* Not enough space, right align with window. */
!           pum_col = Columns - (pum_base_width > BALLOON_MIN_WIDTH
!                                        ? BALLOON_MIN_WIDTH : pum_base_width);
! 
!       pum_width = Columns - pum_col;
!       if (pum_width > pum_base_width + 1)
!           pum_width = pum_base_width + 1;
! 
        pum_selected = -1;
        pum_first = 0;
        pum_redraw();
--- 1067,1073 ----
        pum_scrollbar = 0;
        pum_height = balloon_arraysize;
  
!       pum_position_at_mouse(BALLOON_MIN_WIDTH);
        pum_selected = -1;
        pum_first = 0;
        pum_redraw();
***************
*** 1075,1078 ****
--- 1085,1237 ----
  }
  # endif
  
+ # if defined(FEAT_TERM_POPUP_MENU) || defined(PROTO)
+ /*
+  * Select the pum entry at the mouse position.
+  */
+     static void
+ pum_select_mouse_pos(void)
+ {
+     int idx = mouse_row - pum_row;
+ 
+     if (idx < 0 || idx >= pum_size)
+       pum_selected = -1;
+     else if (*pum_array[idx].pum_text != NUL)
+       pum_selected = idx;
+ }
+ 
+ /*
+  * Execute the currently selected popup menu item.
+  */
+     static void
+ pum_execute_menu(vimmenu_T *menu)
+ {
+     vimmenu_T   *mp;
+     int               idx = 0;
+     exarg_T   ea;
+ 
+     for (mp = menu->children; mp != NULL; mp = mp->next)
+       if (idx++ == pum_selected)
+       {
+           vim_memset(&ea, 0, sizeof(ea));
+           execute_menu(&ea, mp);
+           break;
+       }
+ }
+ 
+ /*
+  * Open the terminal version of the popup menu and don't return until it is
+  * closed.
+  */
+     void
+ pum_show_popupmenu(vimmenu_T *menu)
+ {
+     vimmenu_T   *mp;
+     int               idx = 0;
+     pumitem_T *array;
+ #ifdef FEAT_BEVAL_TERM
+     int               save_bevalterm = p_bevalterm;
+ #endif
+ 
+     pum_undisplay();
+     pum_size = 0;
+ 
+     for (mp = menu->children; mp != NULL; mp = mp->next)
+       ++pum_size;
+ 
+     array = (pumitem_T *)alloc_clear((unsigned)sizeof(pumitem_T) * pum_size);
+     if (array == NULL)
+       return;
+ 
+     for (mp = menu->children; mp != NULL; mp = mp->next)
+       if (menu_is_separator(mp->dname))
+           array[idx++].pum_text = (char_u *)"";
+       else
+           array[idx++].pum_text = mp->dname;
+ 
+     pum_array = array;
+     pum_compute_size();
+     pum_scrollbar = 0;
+     pum_height = pum_size;
+     pum_position_at_mouse(20);
+ 
+     pum_selected = -1;
+     pum_first = 0;
+ #  ifdef FEAT_BEVAL_TERM
+     p_bevalterm = TRUE;  /* track mouse movement */
+     mch_setmouse(TRUE);
+ #  endif
+ 
+     for (;;)
+     {
+       int     c;
+ 
+       pum_redraw();
+       setcursor();
+       out_flush();
+ 
+       c = vgetc();
+       if (c == ESC)
+           break;
+       else if (c == CAR || c == NL)
+       {
+           /* enter: select current item, if any, and close */
+           pum_execute_menu(menu);
+           break;
+       }
+       else if (c == 'k' || c == K_UP || c == K_MOUSEUP)
+       {
+           /* cursor up: select previous item */
+           while (pum_selected > 0)
+           {
+               --pum_selected;
+               if (*array[pum_selected].pum_text != NUL)
+                   break;
+           }
+       }
+       else if (c == 'j' || c == K_DOWN || c == K_MOUSEDOWN)
+       {
+           /* cursor down: select next item */
+           while (pum_selected < pum_size - 1)
+           {
+               ++pum_selected;
+               if (*array[pum_selected].pum_text != NUL)
+                   break;
+           }
+       }
+       else if (c == K_RIGHTMOUSE)
+       {
+           /* Right mouse down: reposition the menu. */
+           vungetc(c);
+           break;
+       }
+       else if (c == K_LEFTDRAG || c == K_RIGHTDRAG || c == K_MOUSEMOVE)
+       {
+           /* mouse moved: selec item in the mouse row */
+           pum_select_mouse_pos();
+       }
+       else if (c == K_LEFTMOUSE || c == K_LEFTMOUSE_NM || c == K_RIGHTRELEASE)
+       {
+           /* left mouse click: select clicked item, if any, and close;
+            * right mouse release: select clicked item, close if any */
+           pum_select_mouse_pos();
+           if (pum_selected >= 0)
+           {
+               pum_execute_menu(menu);
+               break;
+           }
+           if (c == K_LEFTMOUSE || c == K_LEFTMOUSE_NM)
+               break;
+       }
+     }
+ 
+     vim_free(array);
+     pum_undisplay();
+ #  ifdef FEAT_BEVAL_TERM
+     p_bevalterm = save_bevalterm;
+     mch_setmouse(TRUE);
+ #  endif
+ }
+ # endif
+ 
  #endif
*** ../vim-8.0.1557/src/proto/popupmnu.pro      2017-11-19 19:56:21.609895094 
+0100
--- src/proto/popupmnu.pro      2018-03-03 16:04:27.149889136 +0100
***************
*** 9,12 ****
--- 9,13 ----
  void ui_remove_balloon(void);
  void ui_post_balloon(char_u *mesg, list_T *list);
  void ui_may_remove_balloon(void);
+ void pum_show_popupmenu(vimmenu_T *menu);
  /* vim: set ft=c : */
*** ../vim-8.0.1557/src/normal.c        2018-02-18 22:13:06.261057963 +0100
--- src/normal.c        2018-03-03 17:32:51.768702404 +0100
***************
*** 2286,2297 ****
   * Do the appropriate action for the current mouse click in the current mode.
   * Not used for Command-line mode.
   *
!  * Normal Mode:
   * event       modi-  position      visual       change   action
   *             fier   cursor                     window
   * left press   -     yes         end             yes
   * left press   C     yes         end             yes     "^]" (2)
!  * left press   S     yes         end             yes     "*" (2)
   * left drag    -     yes     start if moved      no
   * left relse   -     yes     start if moved      no
   * middle press         -     yes      if not active      no      put register
--- 2286,2297 ----
   * Do the appropriate action for the current mouse click in the current mode.
   * Not used for Command-line mode.
   *
!  * Normal and Visual Mode:
   * event       modi-  position      visual       change   action
   *             fier   cursor                     window
   * left press   -     yes         end             yes
   * left press   C     yes         end             yes     "^]" (2)
!  * left press   S     yes     end (popup: extend) yes     "*" (2)
   * left drag    -     yes     start if moved      no
   * left relse   -     yes     start if moved      no
   * middle press         -     yes      if not active      no      put register
***************
*** 2670,2751 ****
        if (which_button == MOUSE_RIGHT
                            && !(mod_mask & (MOD_MASK_SHIFT | MOD_MASK_CTRL)))
        {
-           /*
-            * NOTE: Ignore right button down and drag mouse events.
-            * Windows only shows the popup menu on the button up event.
-            */
  #if defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_GTK) \
                          || defined(FEAT_GUI_PHOTON) || defined(FEAT_GUI_MAC)
            if (!is_click)
                return FALSE;
  #endif
! #if defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_MSWIN)
!           if (is_click || is_drag)
!               return FALSE;
! #endif
! #if defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_GTK) \
!           || defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_MSWIN) \
!           || defined(FEAT_GUI_MAC) || defined(FEAT_GUI_PHOTON)
!           if (gui.in_use)
            {
!               jump_flags = 0;
!               if (STRCMP(p_mousem, "popup_setpos") == 0)
                {
!                   /* First set the cursor position before showing the popup
!                    * menu. */
!                   if (VIsual_active)
!                   {
!                       pos_T    m_pos;
  
!                       /*
!                        * set MOUSE_MAY_STOP_VIS if we are outside the
!                        * selection or the current window (might have false
!                        * negative here)
!                        */
!                       if (mouse_row < curwin->w_winrow
!                            || mouse_row
!                                     > (curwin->w_winrow + curwin->w_height))
!                           jump_flags = MOUSE_MAY_STOP_VIS;
!                       else if (get_fpos_of_mouse(&m_pos) != IN_BUFFER)
                            jump_flags = MOUSE_MAY_STOP_VIS;
!                       else
                        {
!                           if ((LT_POS(curwin->w_cursor, VIsual)
!                                       && (LT_POS(m_pos, curwin->w_cursor)
!                                           || LT_POS(VIsual, m_pos)))
!                                   || (LT_POS(VIsual, curwin->w_cursor)
!                                       && (LT_POS(m_pos, VIsual)
!                                         || LT_POS(curwin->w_cursor, m_pos))))
!                           {
                                jump_flags = MOUSE_MAY_STOP_VIS;
-                           }
-                           else if (VIsual_mode == Ctrl_V)
-                           {
-                               getvcols(curwin, &curwin->w_cursor, &VIsual,
-                                                        &leftcol, &rightcol);
-                               getvcol(curwin, &m_pos, NULL, &m_pos.col, NULL);
-                               if (m_pos.col < leftcol || m_pos.col > rightcol)
-                                   jump_flags = MOUSE_MAY_STOP_VIS;
-                           }
                        }
                    }
-                   else
-                       jump_flags = MOUSE_MAY_STOP_VIS;
-               }
-               if (jump_flags)
-               {
-                   jump_flags = jump_to_mouse(jump_flags, NULL, which_button);
-                   update_curbuf(VIsual_active ? INVERTED : VALID);
-                   setcursor();
-                   out_flush();    /* Update before showing popup menu */
                }
  # ifdef FEAT_MENU
!               gui_show_popupmenu();
  # endif
!               return (jump_flags & CURSOR_MOVED) != 0;
!           }
!           else
!               return FALSE;
  #else
            return FALSE;
  #endif
--- 2670,2763 ----
        if (which_button == MOUSE_RIGHT
                            && !(mod_mask & (MOD_MASK_SHIFT | MOD_MASK_CTRL)))
        {
  #if defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_GTK) \
+           || defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_MSWIN) \
+           || defined(FEAT_GUI_MAC) || defined(FEAT_GUI_PHOTON) \
+           || defined(FEAT_TERM_POPUP_MENU)
+ # ifdef FEAT_GUI
+           if (gui.in_use)
+           {
+ #  if defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_GTK) \
                          || defined(FEAT_GUI_PHOTON) || defined(FEAT_GUI_MAC)
+               if (!is_click)
+                   /* Ignore right button release events, only shows the popup
+                    * menu on the button down event. */
+                   return FALSE;
+ #  endif
+ #  if defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_MSWIN)
+               if (is_click || is_drag)
+                   /* Ignore right button down and drag mouse events.  Windows
+                    * only shows the popup menu on the button up event. */
+                   return FALSE;
+ #  endif
+           }
+ # endif
+ # if defined(FEAT_GUI) && defined(FEAT_TERM_POPUP_MENU)
+           else
+ # endif
+ # if defined(FEAT_TERM_POPUP_MENU)
            if (!is_click)
+               /* Ignore right button release events, only shows the popup
+                * menu on the button down event. */
                return FALSE;
  #endif
! 
!           jump_flags = 0;
!           if (STRCMP(p_mousem, "popup_setpos") == 0)
            {
!               /* First set the cursor position before showing the popup
!                * menu. */
!               if (VIsual_active)
                {
!                   pos_T    m_pos;
  
!                   /*
!                    * set MOUSE_MAY_STOP_VIS if we are outside the
!                    * selection or the current window (might have false
!                    * negative here)
!                    */
!                   if (mouse_row < curwin->w_winrow
!                        || mouse_row
!                                 > (curwin->w_winrow + curwin->w_height))
!                       jump_flags = MOUSE_MAY_STOP_VIS;
!                   else if (get_fpos_of_mouse(&m_pos) != IN_BUFFER)
!                       jump_flags = MOUSE_MAY_STOP_VIS;
!                   else
!                   {
!                       if ((LT_POS(curwin->w_cursor, VIsual)
!                                   && (LT_POS(m_pos, curwin->w_cursor)
!                                       || LT_POS(VIsual, m_pos)))
!                               || (LT_POS(VIsual, curwin->w_cursor)
!                                   && (LT_POS(m_pos, VIsual)
!                                     || LT_POS(curwin->w_cursor, m_pos))))
!                       {
                            jump_flags = MOUSE_MAY_STOP_VIS;
!                       }
!                       else if (VIsual_mode == Ctrl_V)
                        {
!                           getvcols(curwin, &curwin->w_cursor, &VIsual,
!                                                    &leftcol, &rightcol);
!                           getvcol(curwin, &m_pos, NULL, &m_pos.col, NULL);
!                           if (m_pos.col < leftcol || m_pos.col > rightcol)
                                jump_flags = MOUSE_MAY_STOP_VIS;
                        }
                    }
                }
+               else
+                   jump_flags = MOUSE_MAY_STOP_VIS;
+           }
+           if (jump_flags)
+           {
+               jump_flags = jump_to_mouse(jump_flags, NULL, which_button);
+               update_curbuf(VIsual_active ? INVERTED : VALID);
+               setcursor();
+               out_flush();    /* Update before showing popup menu */
+           }
  # ifdef FEAT_MENU
!           show_popupmenu();
!           got_click = FALSE;  /* ignore release events */
  # endif
!           return (jump_flags & CURSOR_MOVED) != 0;
  #else
            return FALSE;
  #endif
*** ../vim-8.0.1557/src/menu.c  2018-02-10 18:45:21.068822158 +0100
--- src/menu.c  2018-03-03 18:01:33.381966313 +0100
***************
*** 34,43 ****
  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);
--- 34,39 ----
***************
*** 1871,1877 ****
  }
  #endif
  
! #ifdef FEAT_GUI
  
      static int
  get_menu_mode(void)
--- 1867,1873 ----
  }
  #endif
  
! #if defined(FEAT_GUI) || defined(FEAT_TERM_POPUP_MENU) || defined(PROTO)
  
      static int
  get_menu_mode(void)
***************
*** 1896,1901 ****
--- 1892,1951 ----
  }
  
  /*
+  * 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,1982 ****
      while (menu)
      {
        if ((menu->modes & menu->enabled & mode)
! #if defined(FEAT_GUI_W32) && defined(FEAT_TEAROFF)
                || menu_is_tearoff(menu->dname)
! #endif
           )
            grey = FALSE;
        else
            grey = TRUE;
! #ifdef FEAT_GUI_ATHENA
        /* Hiding menus doesn't work for Athena, it can cause a crash. */
        gui_mch_menu_grey(menu, grey);
! #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
                || menu_is_toolbar(menu->parent->name)
! # endif
                   )
            gui_mch_menu_grey(menu, grey);
        else
            gui_mch_menu_hidden(menu, grey);
! #endif
        gui_update_menus_recurse(menu->children, mode);
        menu = menu->next;
      }
--- 2005,2032 ----
      while (menu)
      {
        if ((menu->modes & menu->enabled & mode)
! # if defined(FEAT_GUI_W32) && defined(FEAT_TEAROFF)
                || menu_is_tearoff(menu->dname)
! # endif
           )
            grey = FALSE;
        else
            grey = TRUE;
! # ifdef FEAT_GUI_ATHENA
        /* Hiding menus doesn't work for Athena, it can cause a crash. */
        gui_mch_menu_grey(menu, grey);
! # 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
                || menu_is_toolbar(menu->parent->name)
! #  endif
                   )
            gui_mch_menu_grey(menu, grey);
        else
            gui_mch_menu_hidden(menu, grey);
! # endif
        gui_update_menus_recurse(menu->children, mode);
        menu = menu->next;
      }
***************
*** 2010,2024 ****
        gui_mch_draw_menubar();
        prev_mode = mode;
        force_menu_update = FALSE;
! #ifdef FEAT_GUI_W32
        /* This can leave a tearoff as active window - make sure we
         * have the focus <negri>*/
        gui_mch_activate_window();
! #endif
      }
  }
  
! #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.
--- 2060,2074 ----
        gui_mch_draw_menubar();
        prev_mode = mode;
        force_menu_update = FALSE;
! # ifdef FEAT_GUI_W32
        /* This can leave a tearoff as active window - make sure we
         * have the focus <negri>*/
        gui_mch_activate_window();
! # endif
      }
  }
  
! # 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,2083 ****
            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 /* FEAT_GUI */
  
  #if (defined(FEAT_GUI_W32) && defined(FEAT_TEAROFF)) || defined(PROTO)
--- 2087,2093 ----
            return TRUE;
      return FALSE;
  }
! # endif
  #endif /* FEAT_GUI */
  
  #if (defined(FEAT_GUI_W32) && defined(FEAT_TEAROFF)) || defined(PROTO)
***************
*** 2238,2244 ****
   * Execute "menu".  Use by ":emenu" and the window toolbar.
   * "eap" is NULL for the window toolbar.
   */
!     static void
  execute_menu(exarg_T *eap, vimmenu_T *menu)
  {
      char_u    *mode;
--- 2248,2254 ----
   * Execute "menu".  Use by ":emenu" and the window toolbar.
   * "eap" is NULL for the window toolbar.
   */
!     void
  execute_menu(exarg_T *eap, vimmenu_T *menu)
  {
      char_u    *mode;
*** ../vim-8.0.1557/src/proto/menu.pro  2017-09-17 23:02:17.168074448 +0200
--- src/proto/menu.pro  2018-03-03 18:01:49.837863865 +0100
***************
*** 12,23 ****
  int menu_is_child_of_popup(vimmenu_T *menu);
  int menu_is_toolbar(char_u *name);
  int menu_is_separator(char_u *name);
  int check_menu_pointer(vimmenu_T *root, vimmenu_T *menu_to_check);
  void gui_create_initial_menus(vimmenu_T *menu);
  void gui_update_menus(int modes);
  int gui_is_menu_shortcut(int key);
- void gui_show_popupmenu(void);
  void gui_mch_toggle_tearoffs(int enable);
  void ex_emenu(exarg_T *eap);
  void winbar_click(win_T *wp, int col);
  vimmenu_T *gui_find_menu(char_u *path_name);
--- 12,24 ----
  int menu_is_child_of_popup(vimmenu_T *menu);
  int menu_is_toolbar(char_u *name);
  int menu_is_separator(char_u *name);
+ void show_popupmenu(void);
  int check_menu_pointer(vimmenu_T *root, vimmenu_T *menu_to_check);
  void gui_create_initial_menus(vimmenu_T *menu);
  void gui_update_menus(int modes);
  int gui_is_menu_shortcut(int key);
  void gui_mch_toggle_tearoffs(int enable);
+ void execute_menu(exarg_T *eap, vimmenu_T *menu);
  void ex_emenu(exarg_T *eap);
  void winbar_click(win_T *wp, int col);
  vimmenu_T *gui_find_menu(char_u *path_name);
*** ../vim-8.0.1557/src/feature.h       2018-02-22 21:06:44.558819084 +0100
--- src/feature.h       2018-03-03 15:47:57.728028840 +0100
***************
*** 726,731 ****
--- 726,738 ----
  # endif
  #endif
  
+ /*
+  * popup menu in a terminal
+  */
+ #if defined(FEAT_MENU) && !defined(ALWAYS_USE_GUI) && defined(FEAT_INS_EXPAND)
+ # define FEAT_TERM_POPUP_MENU
+ #endif
+ 
  /* There are two ways to use XPM. */
  #if (defined(HAVE_XM_XPMP_H) && defined(FEAT_GUI_MOTIF)) \
                || defined(HAVE_X11_XPM_H)
*** ../vim-8.0.1557/src/version.c       2018-03-03 15:06:48.383228973 +0100
--- src/version.c       2018-03-03 18:57:14.553257576 +0100
***************
*** 780,781 ****
--- 780,783 ----
  {   /* Add new patch number below this line */
+ /**/
+     1558,
  /**/

-- 
I am always surprised in the Linux world how quickly solutions can be
obtained.  (Imagine sending an email to Bill Gates, asking why Windows
crashed, and how to fix it...  and then getting an answer that fixed the
problem... <0>_<0> !)                         -- Mark Langdon

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui