annotate src/menu.c @ 34219:a0a4a774117b v9.1.0058

patch 9.1.0058: Cannot map Super Keys in GTK UI Commit: https://github.com/vim/vim/commit/92e90a1e102825aa9149262cacfc991264db05df Author: Casey Tucker <dctucker@hotmail.com> Date: Thu Jan 25 22:44:00 2024 +0100 patch 9.1.0058: Cannot map Super Keys in GTK UI Problem: Cannot map Super Keys in GTK UI (Casey Tucker) Solution: Enable Super Key mappings in GTK using <D-Key> (Casey Tucker) As a developer who works in both Mac and Linux using the same keyboard, it can be frustrating having to remember different key combinations or having to rely on system utilities to remap keys. This change allows `<D-z>` `<D-x>` `<D-c>` `<D-v>` etc. to be recognized by the `map` commands, along with the `<D-S-...>` shifted variants. ```vimrc if has('gui_gtk') nnoremap <D-z> u nnoremap <D-S-Z> <C-r> vnoremap <D-x> "+d vnoremap <D-c> "+y cnoremap <D-v> <C-R>+ inoremap <D-v> <C-o>"+gP nnoremap <D-v> "+P vnoremap <D-v> "-d"+P nnoremap <D-s> :w<CR> inoremap <D-s> <C-o>:w<CR> nnoremap <D-w> :q<CR> nnoremap <D-q> :qa<CR> nnoremap <D-t> :tabe<CR> nnoremap <D-S-T> :vs#<CR><C-w>T nnoremap <D-a> ggVG vnoremap <D-a> <ESC>ggVG inoremap <D-a> <ESC>ggVG nnoremap <D-f> / nnoremap <D-g> n nnoremap <D-S-G> N vnoremap <D-x> "+x endif ``` closes: #12698 Signed-off-by: Casey Tucker <dctucker@hotmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
author Christian Brabandt <cb@256bit.org>
date Thu, 25 Jan 2024 23:00:03 +0100
parents 161ae1985d81
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10042
4aead6a9b7a9 commit https://github.com/vim/vim/commit/edf3f97ae2af024708ebb4ac614227327033ca47
Christian Brabandt <cb@256bit.org>
parents: 9536
diff changeset
1 /* vi:set ts=8 sts=4 sw=4 noet:
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3 * VIM - Vi IMproved by Bram Moolenaar
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4 * GUI/Motif support by Robert Webb
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6 * Do ":help uganda" in Vim to read copying and usage conditions.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7 * Do ":help credits" in Vim to see a list of people who contributed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8 * See README.txt for an overview of the Vim source code.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
11 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
12 * Code for menus. Used for the GUI and 'wildmenu'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
13 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
14
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
15 #include "vim.h"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
16
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
17 #if defined(FEAT_MENU) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
18
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
19 #define MENUDEPTH 10 // maximum depth of menus
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
20
15868
7fad90423bd2 patch 8.1.0941: macros for MS-Windows are inconsistent
Bram Moolenaar <Bram@vim.org>
parents: 15636
diff changeset
21 #ifdef FEAT_GUI_MSWIN
7803
37c929c4a073 commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents: 5735
diff changeset
22 static int add_menu_path(char_u *, vimmenu_T *, int *, char_u *, int);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
23 #else
7803
37c929c4a073 commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents: 5735
diff changeset
24 static int add_menu_path(char_u *, vimmenu_T *, int *, char_u *);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
25 #endif
7803
37c929c4a073 commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents: 5735
diff changeset
26 static int menu_nable_recurse(vimmenu_T *menu, char_u *name, int modes, int enable);
37c929c4a073 commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents: 5735
diff changeset
27 static int remove_menu(vimmenu_T **, char_u *, int, int silent);
37c929c4a073 commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents: 5735
diff changeset
28 static void free_menu(vimmenu_T **menup);
37c929c4a073 commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents: 5735
diff changeset
29 static void free_menu_string(vimmenu_T *, int);
37c929c4a073 commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents: 5735
diff changeset
30 static int show_menus(char_u *, int);
37c929c4a073 commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents: 5735
diff changeset
31 static void show_menus_recursive(vimmenu_T *, int, int);
17789
0f7ae8010787 patch 8.1.1891: functions used in one file are global
Bram Moolenaar <Bram@vim.org>
parents: 17781
diff changeset
32 static char_u *menu_name_skip(char_u *name);
7803
37c929c4a073 commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents: 5735
diff changeset
33 static int menu_name_equal(char_u *name, vimmenu_T *menu);
37c929c4a073 commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents: 5735
diff changeset
34 static int menu_namecmp(char_u *name, char_u *mname);
37c929c4a073 commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents: 5735
diff changeset
35 static int get_menu_cmd_modes(char_u *, int, int *, int *);
37c929c4a073 commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents: 5735
diff changeset
36 static char_u *popup_mode_name(char_u *name, int idx);
37c929c4a073 commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents: 5735
diff changeset
37 static char_u *menu_text(char_u *text, int *mnemonic, char_u **actext);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
38
15868
7fad90423bd2 patch 8.1.0941: macros for MS-Windows are inconsistent
Bram Moolenaar <Bram@vim.org>
parents: 15636
diff changeset
39 #if defined(FEAT_GUI_MSWIN) && defined(FEAT_TEAROFF)
7803
37c929c4a073 commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents: 5735
diff changeset
40 static void gui_create_tearoffs_recurse(vimmenu_T *menu, const char_u *pname, int *pri_tab, int pri_idx);
37c929c4a073 commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents: 5735
diff changeset
41 static void gui_add_tearoff(char_u *tearpath, int *pri_tab, int pri_idx);
37c929c4a073 commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents: 5735
diff changeset
42 static void gui_destroy_tearoffs_recurse(vimmenu_T *menu);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
43 static int s_tearoffs = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
44 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
45
7803
37c929c4a073 commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents: 5735
diff changeset
46 static int menu_is_hidden(char_u *name);
37c929c4a073 commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents: 5735
diff changeset
47 static int menu_is_tearoff(char_u *name);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
48
31079
082f526cfb96 patch 9.0.0874: using freed memory when executing unmenu at more prompt
Bram Moolenaar <Bram@vim.org>
parents: 30239
diff changeset
49 // When non-zero no menu must be added or cleared. Prevents the list of menus
082f526cfb96 patch 9.0.0874: using freed memory when executing unmenu at more prompt
Bram Moolenaar <Bram@vim.org>
parents: 30239
diff changeset
50 // changing while listing them.
082f526cfb96 patch 9.0.0874: using freed memory when executing unmenu at more prompt
Bram Moolenaar <Bram@vim.org>
parents: 30239
diff changeset
51 static int menus_locked = 0;
082f526cfb96 patch 9.0.0874: using freed memory when executing unmenu at more prompt
Bram Moolenaar <Bram@vim.org>
parents: 30239
diff changeset
52
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
53 #if defined(FEAT_MULTI_LANG) || defined(FEAT_TOOLBAR)
7803
37c929c4a073 commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents: 5735
diff changeset
54 static char_u *menu_skip_part(char_u *p);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
55 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
56 #ifdef FEAT_MULTI_LANG
7803
37c929c4a073 commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents: 5735
diff changeset
57 static char_u *menutrans_lookup(char_u *name, int len);
37c929c4a073 commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents: 5735
diff changeset
58 static void menu_unescape_name(char_u *p);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
59 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
60
7803
37c929c4a073 commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents: 5735
diff changeset
61 static char_u *menu_translate_tab_and_shift(char_u *arg_start);
2150
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
62
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
63 // The character for each menu mode
14952
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
64 static char *menu_mode_chars[] = {"n", "v", "s", "o", "i", "c", "tl", "t"};
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
65
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
66 #ifdef FEAT_TOOLBAR
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
67 static const char *toolbar_names[] =
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
68 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
69 /* 0 */ "New", "Open", "Save", "Undo", "Redo",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
70 /* 5 */ "Cut", "Copy", "Paste", "Print", "Help",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
71 /* 10 */ "Find", "SaveAll", "SaveSesn", "NewSesn", "LoadSesn",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
72 /* 15 */ "RunScript", "Replace", "WinClose", "WinMax", "WinMin",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
73 /* 20 */ "WinSplit", "Shell", "FindPrev", "FindNext", "FindHelp",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
74 /* 25 */ "Make", "TagJump", "RunCtags", "WinVSplit", "WinMaxWidth",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
75 /* 30 */ "WinMinWidth", "Exit"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
76 };
24768
7334bf933510 patch 8.2.2922: computing array length is done in various ways
Bram Moolenaar <Bram@vim.org>
parents: 23390
diff changeset
77 # define TOOLBAR_NAME_COUNT ARRAY_LENGTH(toolbar_names)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
78 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
79
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
80 /*
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
81 * Return TRUE if "name" is a window toolbar menu name.
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
82 */
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
83 static int
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
84 menu_is_winbar(char_u *name)
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
85 {
12527
259983a729fa patch 8.0.1142: window toolbar menu gets a tear-off item
Christian Brabandt <cb@256bit.org>
parents: 12521
diff changeset
86 return (STRNCMP(name, "WinBar", 6) == 0);
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
87 }
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
88
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
89 int
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
90 winbar_height(win_T *wp)
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
91 {
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
92 if (wp->w_winbar != NULL && wp->w_winbar->children != NULL)
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
93 return 1;
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
94 return 0;
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
95 }
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
96
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
97 static vimmenu_T **
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
98 get_root_menu(char_u *name)
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
99 {
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
100 if (menu_is_winbar(name))
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
101 return &curwin->w_winbar;
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
102 return &root_menu;
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
103 }
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
104
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
105 /*
31079
082f526cfb96 patch 9.0.0874: using freed memory when executing unmenu at more prompt
Bram Moolenaar <Bram@vim.org>
parents: 30239
diff changeset
106 * If "menus_locked" is set then give an error and return TRUE.
082f526cfb96 patch 9.0.0874: using freed memory when executing unmenu at more prompt
Bram Moolenaar <Bram@vim.org>
parents: 30239
diff changeset
107 * Otherwise return FALSE.
082f526cfb96 patch 9.0.0874: using freed memory when executing unmenu at more prompt
Bram Moolenaar <Bram@vim.org>
parents: 30239
diff changeset
108 */
082f526cfb96 patch 9.0.0874: using freed memory when executing unmenu at more prompt
Bram Moolenaar <Bram@vim.org>
parents: 30239
diff changeset
109 static int
082f526cfb96 patch 9.0.0874: using freed memory when executing unmenu at more prompt
Bram Moolenaar <Bram@vim.org>
parents: 30239
diff changeset
110 is_menus_locked(void)
082f526cfb96 patch 9.0.0874: using freed memory when executing unmenu at more prompt
Bram Moolenaar <Bram@vim.org>
parents: 30239
diff changeset
111 {
082f526cfb96 patch 9.0.0874: using freed memory when executing unmenu at more prompt
Bram Moolenaar <Bram@vim.org>
parents: 30239
diff changeset
112 if (menus_locked > 0)
082f526cfb96 patch 9.0.0874: using freed memory when executing unmenu at more prompt
Bram Moolenaar <Bram@vim.org>
parents: 30239
diff changeset
113 {
082f526cfb96 patch 9.0.0874: using freed memory when executing unmenu at more prompt
Bram Moolenaar <Bram@vim.org>
parents: 30239
diff changeset
114 emsg(_(e_cannot_change_menus_while_listing));
082f526cfb96 patch 9.0.0874: using freed memory when executing unmenu at more prompt
Bram Moolenaar <Bram@vim.org>
parents: 30239
diff changeset
115 return TRUE;
082f526cfb96 patch 9.0.0874: using freed memory when executing unmenu at more prompt
Bram Moolenaar <Bram@vim.org>
parents: 30239
diff changeset
116 }
082f526cfb96 patch 9.0.0874: using freed memory when executing unmenu at more prompt
Bram Moolenaar <Bram@vim.org>
parents: 30239
diff changeset
117 return FALSE;
082f526cfb96 patch 9.0.0874: using freed memory when executing unmenu at more prompt
Bram Moolenaar <Bram@vim.org>
parents: 30239
diff changeset
118 }
082f526cfb96 patch 9.0.0874: using freed memory when executing unmenu at more prompt
Bram Moolenaar <Bram@vim.org>
parents: 30239
diff changeset
119
082f526cfb96 patch 9.0.0874: using freed memory when executing unmenu at more prompt
Bram Moolenaar <Bram@vim.org>
parents: 30239
diff changeset
120 /*
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
121 * Do the :menu command and relatives.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
122 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
123 void
7827
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
124 ex_menu(
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
125 exarg_T *eap) // Ex command arguments
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
126 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
127 char_u *menu_path;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
128 int modes;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
129 char_u *map_to;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
130 int noremap;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
131 int silent = FALSE;
860
2fe516aa3710 updated for version 7.0g02
vimboss
parents: 856
diff changeset
132 int special = FALSE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
133 int unmenu;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
134 char_u *map_buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
135 char_u *arg;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
136 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
137 int i;
575
f1d46f948241 updated for version 7.0163
vimboss
parents: 533
diff changeset
138 #if defined(FEAT_GUI) && !defined(FEAT_GUI_GTK)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
139 int old_menu_height;
15868
7fad90423bd2 patch 8.1.0941: macros for MS-Windows are inconsistent
Bram Moolenaar <Bram@vim.org>
parents: 15636
diff changeset
140 # if defined(FEAT_TOOLBAR) && !defined(FEAT_GUI_MSWIN)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
141 int old_toolbar_height;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
142 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
143 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
144 int pri_tab[MENUDEPTH + 1];
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
145 int enable = MAYBE; // TRUE for "menu enable", FALSE for "menu
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
146 // disable
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
147 #ifdef FEAT_TOOLBAR
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
148 char_u *icon = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
149 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
150 vimmenu_T menuarg;
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
151 vimmenu_T **root_menu_ptr;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
152
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
153 modes = get_menu_cmd_modes(eap->cmd, eap->forceit, &noremap, &unmenu);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
154 arg = eap->arg;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
155
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
156 for (;;)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
157 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
158 if (STRNCMP(arg, "<script>", 8) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
159 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
160 noremap = REMAP_SCRIPT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
161 arg = skipwhite(arg + 8);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
162 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
163 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
164 if (STRNCMP(arg, "<silent>", 8) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
165 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
166 silent = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
167 arg = skipwhite(arg + 8);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
168 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
169 }
860
2fe516aa3710 updated for version 7.0g02
vimboss
parents: 856
diff changeset
170 if (STRNCMP(arg, "<special>", 9) == 0)
2fe516aa3710 updated for version 7.0g02
vimboss
parents: 856
diff changeset
171 {
2fe516aa3710 updated for version 7.0g02
vimboss
parents: 856
diff changeset
172 special = TRUE;
2fe516aa3710 updated for version 7.0g02
vimboss
parents: 856
diff changeset
173 arg = skipwhite(arg + 9);
2fe516aa3710 updated for version 7.0g02
vimboss
parents: 856
diff changeset
174 continue;
2fe516aa3710 updated for version 7.0g02
vimboss
parents: 856
diff changeset
175 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
176 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
177 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
178
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
179
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
180 // Locate an optional "icon=filename" argument.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
181 if (STRNCMP(arg, "icon=", 5) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
182 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
183 arg += 5;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
184 #ifdef FEAT_TOOLBAR
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
185 icon = arg;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
186 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
187 while (*arg != NUL && *arg != ' ')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
188 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
189 if (*arg == '\\')
1624
18ee39301b82 updated for version 7.2a
vimboss
parents: 1050
diff changeset
190 STRMOVE(arg, arg + 1);
11127
506f5d8b7d8b patch 8.0.0451: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents: 11044
diff changeset
191 MB_PTR_ADV(arg);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
192 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
193 if (*arg != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
194 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
195 *arg++ = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
196 arg = skipwhite(arg);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
197 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
198 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
199
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
200 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
201 * Fill in the priority table.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
202 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
203 for (p = arg; *p; ++p)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
204 if (!VIM_ISDIGIT(*p) && *p != '.')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
205 break;
11129
f4ea50924c6d patch 8.0.0452: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents: 11127
diff changeset
206 if (VIM_ISWHITE(*p))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
207 {
11129
f4ea50924c6d patch 8.0.0452: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents: 11127
diff changeset
208 for (i = 0; i < MENUDEPTH && !VIM_ISWHITE(*arg); ++i)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
209 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
210 pri_tab[i] = getdigits(&arg);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
211 if (pri_tab[i] == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
212 pri_tab[i] = 500;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
213 if (*arg == '.')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
214 ++arg;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
215 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
216 arg = skipwhite(arg);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
217 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
218 else if (eap->addr_count && eap->line2 != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
219 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
220 pri_tab[0] = eap->line2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
221 i = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
222 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
223 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
224 i = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
225 while (i < MENUDEPTH)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
226 pri_tab[i++] = 500;
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
227 pri_tab[MENUDEPTH] = -1; // mark end of the table
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
228
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
229 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
230 * Check for "disable" or "enable" argument.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
231 */
11129
f4ea50924c6d patch 8.0.0452: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents: 11127
diff changeset
232 if (STRNCMP(arg, "enable", 6) == 0 && VIM_ISWHITE(arg[6]))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
233 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
234 enable = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
235 arg = skipwhite(arg + 6);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
236 }
11129
f4ea50924c6d patch 8.0.0452: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents: 11127
diff changeset
237 else if (STRNCMP(arg, "disable", 7) == 0 && VIM_ISWHITE(arg[7]))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
238 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
239 enable = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
240 arg = skipwhite(arg + 7);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
241 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
242
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
243 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
244 * If there is no argument, display all menus.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
245 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
246 if (*arg == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
247 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
248 show_menus(arg, modes);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
249 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
250 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
251
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
252 #ifdef FEAT_TOOLBAR
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
253 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
254 * Need to get the toolbar icon index before doing the translation.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
255 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
256 menuarg.iconidx = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
257 menuarg.icon_builtin = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
258 if (menu_is_toolbar(arg))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
259 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
260 menu_path = menu_skip_part(arg);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
261 if (*menu_path == '.')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
262 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
263 p = menu_skip_part(++menu_path);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
264 if (STRNCMP(menu_path, "BuiltIn", 7) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
265 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
266 if (skipdigits(menu_path + 7) == p)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
267 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
268 menuarg.iconidx = atoi((char *)menu_path + 7);
1880
e5602d92da8c updated for version 7.2-177
vimboss
parents: 1704
diff changeset
269 if (menuarg.iconidx >= (int)TOOLBAR_NAME_COUNT)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
270 menuarg.iconidx = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
271 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
272 menuarg.icon_builtin = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
273 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
274 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
275 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
276 {
1880
e5602d92da8c updated for version 7.2-177
vimboss
parents: 1704
diff changeset
277 for (i = 0; i < (int)TOOLBAR_NAME_COUNT; ++i)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
278 if (STRNCMP(toolbar_names[i], menu_path, p - menu_path)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
279 == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
280 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
281 menuarg.iconidx = i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
282 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
283 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
284 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
285 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
286 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
287 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
288
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
289 menu_path = arg;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
290 if (*menu_path == '.')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
291 {
26865
bce848ec8b1b patch 8.2.3961: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
292 semsg(_(e_invalid_argument_str), menu_path);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
293 goto theend;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
294 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
295
2150
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
296 map_to = menu_translate_tab_and_shift(arg);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
297
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
298 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
299 * If there is only a menu name, display menus with that name.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
300 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
301 if (*map_to == NUL && !unmenu && enable == MAYBE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
302 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
303 show_menus(menu_path, modes);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
304 goto theend;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
305 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
306 else if (*map_to != NUL && (unmenu || enable != MAYBE))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
307 {
26883
7f150a4936f2 patch 8.2.3970: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26865
diff changeset
308 semsg(_(e_trailing_characters_str), map_to);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
309 goto theend;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
310 }
575
f1d46f948241 updated for version 7.0163
vimboss
parents: 533
diff changeset
311 #if defined(FEAT_GUI) && !(defined(FEAT_GUI_GTK) || defined(FEAT_GUI_PHOTON))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
312 old_menu_height = gui.menu_height;
15868
7fad90423bd2 patch 8.1.0941: macros for MS-Windows are inconsistent
Bram Moolenaar <Bram@vim.org>
parents: 15636
diff changeset
313 # if defined(FEAT_TOOLBAR) && !defined(FEAT_GUI_MSWIN)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
314 old_toolbar_height = gui.toolbar_height;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
315 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
316 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
317
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
318 root_menu_ptr = get_root_menu(menu_path);
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
319 if (root_menu_ptr == &curwin->w_winbar)
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
320 // Assume the window toolbar menu will change.
29732
89e1d67814a9 patch 9.0.0206: redraw flags are not named specifically
Bram Moolenaar <Bram@vim.org>
parents: 29344
diff changeset
321 redraw_later(UPD_NOT_VALID);
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
322
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
323 if (enable != MAYBE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
324 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
325 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
326 * Change sensitivity of the menu.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
327 * For the PopUp menu, remove a menu for each mode separately.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
328 * Careful: menu_nable_recurse() changes menu_path.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
329 */
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
330 if (STRCMP(menu_path, "*") == 0) // meaning: do all menus
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
331 menu_path = (char_u *)"";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
332
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
333 if (menu_is_popup(menu_path))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
334 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
335 for (i = 0; i < MENU_INDEX_TIP; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
336 if (modes & (1 << i))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
337 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
338 p = popup_mode_name(menu_path, i);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
339 if (p != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
340 {
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
341 menu_nable_recurse(*root_menu_ptr, p, MENU_ALL_MODES,
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
342 enable);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
343 vim_free(p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
344 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
345 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
346 }
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
347 menu_nable_recurse(*root_menu_ptr, menu_path, modes, enable);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
348 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
349 else if (unmenu)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
350 {
31079
082f526cfb96 patch 9.0.0874: using freed memory when executing unmenu at more prompt
Bram Moolenaar <Bram@vim.org>
parents: 30239
diff changeset
351 if (is_menus_locked())
082f526cfb96 patch 9.0.0874: using freed memory when executing unmenu at more prompt
Bram Moolenaar <Bram@vim.org>
parents: 30239
diff changeset
352 goto theend;
082f526cfb96 patch 9.0.0874: using freed memory when executing unmenu at more prompt
Bram Moolenaar <Bram@vim.org>
parents: 30239
diff changeset
353
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
354 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
355 * Delete menu(s).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
356 */
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
357 if (STRCMP(menu_path, "*") == 0) // meaning: remove all menus
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
358 menu_path = (char_u *)"";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
359
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
360 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
361 * For the PopUp menu, remove a menu for each mode separately.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
362 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
363 if (menu_is_popup(menu_path))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
364 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
365 for (i = 0; i < MENU_INDEX_TIP; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
366 if (modes & (1 << i))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
367 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
368 p = popup_mode_name(menu_path, i);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
369 if (p != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
370 {
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
371 remove_menu(root_menu_ptr, p, MENU_ALL_MODES, TRUE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
372 vim_free(p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
373 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
374 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
375 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
376
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
377 // Careful: remove_menu() changes menu_path
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
378 remove_menu(root_menu_ptr, menu_path, modes, FALSE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
379 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
380 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
381 {
31079
082f526cfb96 patch 9.0.0874: using freed memory when executing unmenu at more prompt
Bram Moolenaar <Bram@vim.org>
parents: 30239
diff changeset
382 if (is_menus_locked())
082f526cfb96 patch 9.0.0874: using freed memory when executing unmenu at more prompt
Bram Moolenaar <Bram@vim.org>
parents: 30239
diff changeset
383 goto theend;
082f526cfb96 patch 9.0.0874: using freed memory when executing unmenu at more prompt
Bram Moolenaar <Bram@vim.org>
parents: 30239
diff changeset
384
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
385 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
386 * Add menu(s).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
387 * Replace special key codes.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
388 */
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
389 if (STRICMP(map_to, "<nop>") == 0) // "<Nop>" means nothing
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
390 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
391 map_to = (char_u *)"";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
392 map_buf = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
393 }
26
404aac550f35 updated for version 7.0017
vimboss
parents: 11
diff changeset
394 else if (modes & MENU_TIP_MODE)
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
395 map_buf = NULL; // Menu tips are plain text.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
396 else
32736
161ae1985d81 patch 9.0.1687: mapset() not properly handling script ID
Christian Brabandt <cb@256bit.org>
parents: 32295
diff changeset
397 map_to = replace_termcodes(map_to, &map_buf, 0,
18301
506bf60a30a0 patch 8.1.2145: cannot map <C-H> when modifyOtherKeys is enabled
Bram Moolenaar <Bram@vim.org>
parents: 17789
diff changeset
398 REPTERM_DO_LT | (special ? REPTERM_SPECIAL : 0), NULL);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
399 menuarg.modes = modes;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
400 #ifdef FEAT_TOOLBAR
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
401 menuarg.iconfile = icon;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
402 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
403 menuarg.noremap[0] = noremap;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
404 menuarg.silent[0] = silent;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
405 add_menu_path(menu_path, &menuarg, pri_tab, map_to
15868
7fad90423bd2 patch 8.1.0941: macros for MS-Windows are inconsistent
Bram Moolenaar <Bram@vim.org>
parents: 15636
diff changeset
406 #ifdef FEAT_GUI_MSWIN
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
407 , TRUE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
408 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
409 );
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
410
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
411 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
412 * For the PopUp menu, add a menu for each mode separately.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
413 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
414 if (menu_is_popup(menu_path))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
415 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
416 for (i = 0; i < MENU_INDEX_TIP; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
417 if (modes & (1 << i))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
418 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
419 p = popup_mode_name(menu_path, i);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
420 if (p != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
421 {
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
422 // Include all modes, to make ":amenu" work
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
423 menuarg.modes = modes;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
424 #ifdef FEAT_TOOLBAR
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
425 menuarg.iconfile = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
426 menuarg.iconidx = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
427 menuarg.icon_builtin = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
428 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
429 add_menu_path(p, &menuarg, pri_tab, map_to
15868
7fad90423bd2 patch 8.1.0941: macros for MS-Windows are inconsistent
Bram Moolenaar <Bram@vim.org>
parents: 15636
diff changeset
430 #ifdef FEAT_GUI_MSWIN
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
431 , TRUE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
432 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
433 );
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
434 vim_free(p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
435 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
436 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
437 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
438
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
439 vim_free(map_buf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
440 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
441
575
f1d46f948241 updated for version 7.0163
vimboss
parents: 533
diff changeset
442 #if defined(FEAT_GUI) && !(defined(FEAT_GUI_GTK))
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
443 // If the menubar height changed, resize the window
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
444 if (gui.in_use
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
445 && (gui.menu_height != old_menu_height
15868
7fad90423bd2 patch 8.1.0941: macros for MS-Windows are inconsistent
Bram Moolenaar <Bram@vim.org>
parents: 15636
diff changeset
446 # if defined(FEAT_TOOLBAR) && !defined(FEAT_GUI_MSWIN)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
447 || gui.toolbar_height != old_toolbar_height
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
448 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
449 ))
814
f40f1a8520ff updated for version 7.0c01
vimboss
parents: 791
diff changeset
450 gui_set_shellsize(FALSE, FALSE, RESIZE_VERT);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
451 #endif
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
452 if (root_menu_ptr == &curwin->w_winbar)
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
453 {
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
454 int h = winbar_height(curwin);
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
455
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
456 if (h != curwin->w_winbar_height)
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
457 {
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
458 if (h == 0)
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
459 ++curwin->w_height;
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
460 else if (curwin->w_height > 0)
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
461 --curwin->w_height;
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
462 curwin->w_winbar_height = h;
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
463 }
30239
91ecee475811 patch 9.0.0455: a few problems with 'splitscroll'
Bram Moolenaar <Bram@vim.org>
parents: 30226
diff changeset
464 curwin->w_prev_height = curwin->w_height;
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
465 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
466
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
467 theend:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
468 ;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
469 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
470
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
471 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
472 * Add the menu with the given name to the menu hierarchy
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
473 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
474 static int
7827
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
475 add_menu_path(
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
476 char_u *menu_path,
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
477 vimmenu_T *menuarg, // passes modes, iconfile, iconidx,
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
478 // icon_builtin, silent[0], noremap[0]
7827
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
479 int *pri_tab,
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
480 char_u *call_data
15868
7fad90423bd2 patch 8.1.0941: macros for MS-Windows are inconsistent
Bram Moolenaar <Bram@vim.org>
parents: 15636
diff changeset
481 #ifdef FEAT_GUI_MSWIN
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
482 , int addtearoff // may add tearoff item
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
483 #endif
7827
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
484 )
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
485 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
486 char_u *path_name;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
487 int modes = menuarg->modes;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
488 vimmenu_T **menup;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
489 vimmenu_T *menu = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
490 vimmenu_T *parent;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
491 vimmenu_T **lower_pri;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
492 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
493 char_u *name;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
494 char_u *dname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
495 char_u *next_name;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
496 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
497 int c;
2149
4c8008ab94d8 updated for version 7.2.431
Bram Moolenaar <bram@zimbu.org>
parents: 1883
diff changeset
498 int d;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
499 #ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
500 int idx;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
501 int new_idx;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
502 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
503 int pri_idx = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
504 int old_modes = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
505 int amenu;
2150
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
506 #ifdef FEAT_MULTI_LANG
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
507 char_u *en_name;
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
508 char_u *map_to = NULL;
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
509 #endif
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
510 vimmenu_T **root_menu_ptr;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
511
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
512 // Make a copy so we can stuff around with it, since it could be const
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
513 path_name = vim_strsave(menu_path);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
514 if (path_name == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
515 return FAIL;
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
516 root_menu_ptr = get_root_menu(menu_path);
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
517 menup = root_menu_ptr;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
518 parent = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
519 name = path_name;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
520 while (*name)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
521 {
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
522 // Get name of this element in the menu hierarchy, and the simplified
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
523 // name (without mnemonic and accelerator text).
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
524 next_name = menu_name_skip(name);
2150
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
525 #ifdef FEAT_MULTI_LANG
2217
120502692d82 Improve the MS-Windows installer.
Bram Moolenaar <bram@vim.org>
parents: 2166
diff changeset
526 map_to = menutrans_lookup(name, (int)STRLEN(name));
2150
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
527 if (map_to != NULL)
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
528 {
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
529 en_name = name;
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
530 name = map_to;
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
531 }
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
532 else
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
533 en_name = NULL;
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
534 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
535 dname = menu_text(name, NULL, NULL);
928
03c4ceec6bec updated for version 7.0-054
vimboss
parents: 860
diff changeset
536 if (dname == NULL)
03c4ceec6bec updated for version 7.0-054
vimboss
parents: 860
diff changeset
537 goto erret;
03c4ceec6bec updated for version 7.0-054
vimboss
parents: 860
diff changeset
538 if (*dname == NUL)
03c4ceec6bec updated for version 7.0-054
vimboss
parents: 860
diff changeset
539 {
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
540 // Only a mnemonic or accelerator is not valid.
26958
d92e0d85923f patch 8.2.4008: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26948
diff changeset
541 emsg(_(e_empty_menu_name));
928
03c4ceec6bec updated for version 7.0-054
vimboss
parents: 860
diff changeset
542 goto erret;
03c4ceec6bec updated for version 7.0-054
vimboss
parents: 860
diff changeset
543 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
544
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
545 // See if it's already there
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
546 lower_pri = menup;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
547 #ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
548 idx = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
549 new_idx = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
550 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
551 menu = *menup;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
552 while (menu != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
553 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
554 if (menu_name_equal(name, menu) || menu_name_equal(dname, menu))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
555 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
556 if (*next_name == NUL && menu->children != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
557 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
558 if (!sys_menu)
26948
51ddf6740ac6 patch 8.2.4003: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26909
diff changeset
559 emsg(_(e_menu_path_must_not_lead_to_sub_menu));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
560 goto erret;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
561 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
562 if (*next_name != NUL && menu->children == NULL
15868
7fad90423bd2 patch 8.1.0941: macros for MS-Windows are inconsistent
Bram Moolenaar <Bram@vim.org>
parents: 15636
diff changeset
563 #ifdef FEAT_GUI_MSWIN
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
564 && addtearoff
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
565 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
566 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
567 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
568 if (!sys_menu)
26909
aa65d1808bd0 patch 8.2.3983: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26887
diff changeset
569 emsg(_(e_part_of_menu_item_path_is_not_sub_menu));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
570 goto erret;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
571 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
572 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
573 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
574 menup = &menu->next;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
575
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
576 // Count menus, to find where this one needs to be inserted.
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
577 // Ignore menus that are not in the menubar (PopUp and Toolbar)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
578 if (parent != NULL || menu_is_menubar(menu->name))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
579 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
580 #ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
581 ++idx;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
582 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
583 if (menu->priority <= pri_tab[pri_idx])
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
584 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
585 lower_pri = menup;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
586 #ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
587 new_idx = idx;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
588 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
589 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
590 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
591 menu = menu->next;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
592 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
593
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
594 if (menu == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
595 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
596 if (*next_name == NUL && parent == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
597 {
26909
aa65d1808bd0 patch 8.2.3983: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26887
diff changeset
598 emsg(_(e_must_not_add_menu_items_directly_to_menu_bar));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
599 goto erret;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
600 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
601
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
602 if (menu_is_separator(dname) && *next_name != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
603 {
26909
aa65d1808bd0 patch 8.2.3983: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26887
diff changeset
604 emsg(_(e_separator_cannot_be_part_of_menu_path));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
605 goto erret;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
606 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
607
26771
fc859aea8cec patch 8.2.3914: various spelling mistakes in comments
Bram Moolenaar <Bram@vim.org>
parents: 25850
diff changeset
608 // Not already there, so let's add it
17262
041156ce1d22 patch 8.1.1630: various small problems
Bram Moolenaar <Bram@vim.org>
parents: 16768
diff changeset
609 menu = ALLOC_CLEAR_ONE(vimmenu_T);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
610 if (menu == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
611 goto erret;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
612
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
613 menu->modes = modes;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
614 menu->enabled = MENU_ALL_MODES;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
615 menu->name = vim_strsave(name);
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
616 // separate mnemonic and accelerator text from actual menu name
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
617 menu->dname = menu_text(name, &menu->mnemonic, &menu->actext);
2150
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
618 #ifdef FEAT_MULTI_LANG
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
619 if (en_name != NULL)
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
620 {
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
621 menu->en_name = vim_strsave(en_name);
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
622 menu->en_dname = menu_text(en_name, NULL, NULL);
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
623 }
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
624 else
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
625 {
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
626 menu->en_name = NULL;
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
627 menu->en_dname = NULL;
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
628 }
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
629 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
630 menu->priority = pri_tab[pri_idx];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
631 menu->parent = parent;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
632 #ifdef FEAT_GUI_MOTIF
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
633 menu->sensitive = TRUE; // the default
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
634 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
635 #ifdef FEAT_BEVAL_TIP
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
636 menu->tip = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
637 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
638 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
639 * Add after menu that has lower priority.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
640 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
641 menu->next = *lower_pri;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
642 *lower_pri = menu;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
643
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
644 old_modes = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
645
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
646 #ifdef FEAT_TOOLBAR
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
647 menu->iconidx = menuarg->iconidx;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
648 menu->icon_builtin = menuarg->icon_builtin;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
649 if (*next_name == NUL && menuarg->iconfile != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
650 menu->iconfile = vim_strsave(menuarg->iconfile);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
651 #endif
15868
7fad90423bd2 patch 8.1.0941: macros for MS-Windows are inconsistent
Bram Moolenaar <Bram@vim.org>
parents: 15636
diff changeset
652 #if defined(FEAT_GUI_MSWIN) && defined(FEAT_TEAROFF)
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
653 // the tearoff item must be present in the modes of each item.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
654 if (parent != NULL && menu_is_tearoff(parent->children->dname))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
655 parent->children->modes |= modes;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
656 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
657 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
658 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
659 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
660 old_modes = menu->modes;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
661
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
662 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
663 * If this menu option was previously only available in other
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
664 * modes, then make sure it's available for this one now
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
665 * Also enable a menu when it's created or changed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
666 */
15868
7fad90423bd2 patch 8.1.0941: macros for MS-Windows are inconsistent
Bram Moolenaar <Bram@vim.org>
parents: 15636
diff changeset
667 #ifdef FEAT_GUI_MSWIN
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
668 // If adding a tearbar (addtearoff == FALSE) don't update modes
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
669 if (addtearoff)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
670 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
671 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
672 menu->modes |= modes;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
673 menu->enabled |= modes;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
674 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
675 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
676
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
677 #ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
678 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
679 * Add the menu item when it's used in one of the modes, but not when
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
680 * only a tooltip is defined.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
681 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
682 if ((old_modes & MENU_ALL_MODES) == 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
683 && (menu->modes & MENU_ALL_MODES) != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
684 {
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
685 if (gui.in_use) // Otherwise it will be added when GUI starts
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
686 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
687 if (*next_name == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
688 {
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
689 // Real menu item, not sub-menu
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
690 gui_mch_add_menu_item(menu, new_idx);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
691
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
692 // Want to update menus now even if mode not changed
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
693 force_menu_update = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
694 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
695 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
696 {
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
697 // Sub-menu (not at end of path yet)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
698 gui_mch_add_menu(menu, new_idx);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
699 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
700 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
701
27523
4c7bb6fd383f patch 8.2.4289: warnings reported by MSVC
Bram Moolenaar <Bram@vim.org>
parents: 27028
diff changeset
702 # if defined(FEAT_GUI_MSWIN) && defined(FEAT_TEAROFF)
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
703 // When adding a new submenu, may add a tearoff item
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
704 if ( addtearoff
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
705 && *next_name
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
706 && vim_strchr(p_go, GO_TEAROFF) != NULL
18742
e9b2ade1adbd patch 8.1.2361: MS-Windows: test failures related to VIMDLL
Bram Moolenaar <Bram@vim.org>
parents: 18301
diff changeset
707 && menu_is_menubar(name)
e9b2ade1adbd patch 8.1.2361: MS-Windows: test failures related to VIMDLL
Bram Moolenaar <Bram@vim.org>
parents: 18301
diff changeset
708 # ifdef VIMDLL
e9b2ade1adbd patch 8.1.2361: MS-Windows: test failures related to VIMDLL
Bram Moolenaar <Bram@vim.org>
parents: 18301
diff changeset
709 && (gui.in_use || gui.starting)
e9b2ade1adbd patch 8.1.2361: MS-Windows: test failures related to VIMDLL
Bram Moolenaar <Bram@vim.org>
parents: 18301
diff changeset
710 # endif
e9b2ade1adbd patch 8.1.2361: MS-Windows: test failures related to VIMDLL
Bram Moolenaar <Bram@vim.org>
parents: 18301
diff changeset
711 )
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
712 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
713 char_u *tearpath;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
714
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
715 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
716 * The pointers next_name & path_name refer to a string with
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
717 * \'s and ^V's stripped out. But menu_path is a "raw"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
718 * string, so we must correct for special characters.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
719 */
16764
ef00b6bc186b patch 8.1.1384: using "int" for alloc() often results in compiler warnings
Bram Moolenaar <Bram@vim.org>
parents: 16541
diff changeset
720 tearpath = alloc(STRLEN(menu_path) + TEAR_LEN + 2);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
721 if (tearpath != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
722 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
723 char_u *s;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
724 int idx;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
725
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
726 STRCPY(tearpath, menu_path);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
727 idx = (int)(next_name - path_name - 1);
11127
506f5d8b7d8b patch 8.0.0451: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents: 11044
diff changeset
728 for (s = tearpath; *s && s < tearpath + idx; MB_PTR_ADV(s))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
729 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
730 if ((*s == '\\' || *s == Ctrl_V) && s[1])
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
731 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
732 ++idx;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
733 ++s;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
734 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
735 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
736 tearpath[idx] = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
737 gui_add_tearoff(tearpath, pri_tab, pri_idx);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
738 vim_free(tearpath);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
739 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
740 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
741 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
742 }
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
743 #endif // FEAT_GUI
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
744
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
745 menup = &menu->children;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
746 parent = menu;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
747 name = next_name;
13244
ac42c4b11dbc patch 8.0.1496: clearing a pointer takes two lines
Christian Brabandt <cb@256bit.org>
parents: 12871
diff changeset
748 VIM_CLEAR(dname);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
749 if (pri_tab[pri_idx + 1] != -1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
750 ++pri_idx;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
751 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
752 vim_free(path_name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
753
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
754 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
755 * Only add system menu items which have not been defined yet.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
756 * First check if this was an ":amenu".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
757 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
758 amenu = ((modes & (MENU_NORMAL_MODE | MENU_INSERT_MODE)) ==
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
759 (MENU_NORMAL_MODE | MENU_INSERT_MODE));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
760 if (sys_menu)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
761 modes &= ~old_modes;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
762
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
763 if (menu != NULL && modes)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
764 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
765 #ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
766 menu->cb = gui_menu_cb;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
767 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
768 p = (call_data == NULL) ? NULL : vim_strsave(call_data);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
769
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
770 // loop over all modes, may add more than one
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
771 for (i = 0; i < MENU_MODES; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
772 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
773 if (modes & (1 << i))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
774 {
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
775 // free any old menu
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
776 free_menu_string(menu, i);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
777
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
778 // For "amenu", may insert an extra character.
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
779 // Don't do this if adding a tearbar (addtearoff == FALSE).
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
780 // Don't do this for "<Nop>".
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
781 c = 0;
2149
4c8008ab94d8 updated for version 7.2.431
Bram Moolenaar <bram@zimbu.org>
parents: 1883
diff changeset
782 d = 0;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
783 if (amenu && call_data != NULL && *call_data != NUL
15868
7fad90423bd2 patch 8.1.0941: macros for MS-Windows are inconsistent
Bram Moolenaar <Bram@vim.org>
parents: 15636
diff changeset
784 #ifdef FEAT_GUI_MSWIN
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
785 && addtearoff
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
786 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
787 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
788 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
789 switch (1 << i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
790 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
791 case MENU_VISUAL_MODE:
791
98a88a884610 updated for version 7.0230
vimboss
parents: 700
diff changeset
792 case MENU_SELECT_MODE:
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
793 case MENU_OP_PENDING_MODE:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
794 case MENU_CMDLINE_MODE:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
795 c = Ctrl_C;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
796 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
797 case MENU_INSERT_MODE:
2149
4c8008ab94d8 updated for version 7.2.431
Bram Moolenaar <bram@zimbu.org>
parents: 1883
diff changeset
798 c = Ctrl_BSL;
4c8008ab94d8 updated for version 7.2.431
Bram Moolenaar <bram@zimbu.org>
parents: 1883
diff changeset
799 d = Ctrl_O;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
800 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
801 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
802 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
803
2149
4c8008ab94d8 updated for version 7.2.431
Bram Moolenaar <bram@zimbu.org>
parents: 1883
diff changeset
804 if (c != 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
805 {
16764
ef00b6bc186b patch 8.1.1384: using "int" for alloc() often results in compiler warnings
Bram Moolenaar <Bram@vim.org>
parents: 16541
diff changeset
806 menu->strings[i] = alloc(STRLEN(call_data) + 5);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
807 if (menu->strings[i] != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
808 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
809 menu->strings[i][0] = c;
2149
4c8008ab94d8 updated for version 7.2.431
Bram Moolenaar <bram@zimbu.org>
parents: 1883
diff changeset
810 if (d == 0)
4c8008ab94d8 updated for version 7.2.431
Bram Moolenaar <bram@zimbu.org>
parents: 1883
diff changeset
811 STRCPY(menu->strings[i] + 1, call_data);
4c8008ab94d8 updated for version 7.2.431
Bram Moolenaar <bram@zimbu.org>
parents: 1883
diff changeset
812 else
4c8008ab94d8 updated for version 7.2.431
Bram Moolenaar <bram@zimbu.org>
parents: 1883
diff changeset
813 {
4c8008ab94d8 updated for version 7.2.431
Bram Moolenaar <bram@zimbu.org>
parents: 1883
diff changeset
814 menu->strings[i][1] = d;
4c8008ab94d8 updated for version 7.2.431
Bram Moolenaar <bram@zimbu.org>
parents: 1883
diff changeset
815 STRCPY(menu->strings[i] + 2, call_data);
4c8008ab94d8 updated for version 7.2.431
Bram Moolenaar <bram@zimbu.org>
parents: 1883
diff changeset
816 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
817 if (c == Ctrl_C)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
818 {
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 814
diff changeset
819 int len = (int)STRLEN(menu->strings[i]);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
820
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
821 // Append CTRL-\ CTRL-G to obey 'insertmode'.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
822 menu->strings[i][len] = Ctrl_BSL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
823 menu->strings[i][len + 1] = Ctrl_G;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
824 menu->strings[i][len + 2] = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
825 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
826 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
827 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
828 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
829 menu->strings[i] = p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
830 menu->noremap[i] = menuarg->noremap[0];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
831 menu->silent[i] = menuarg->silent[0];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
832 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
833 }
15868
7fad90423bd2 patch 8.1.0941: macros for MS-Windows are inconsistent
Bram Moolenaar <Bram@vim.org>
parents: 15636
diff changeset
834 #if defined(FEAT_TOOLBAR) && !defined(FEAT_GUI_MSWIN) \
12871
1a450ce6980c patch 8.0.1312: balloon_show() only works in terminal when compiled with GUI
Christian Brabandt <cb@256bit.org>
parents: 12527
diff changeset
835 && (defined(FEAT_BEVAL_GUI) || defined(FEAT_GUI_GTK))
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
836 // Need to update the menu tip.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
837 if (modes & MENU_TIP_MODE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
838 gui_mch_menu_set_tip(menu);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
839 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
840 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
841 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
842
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
843 erret:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
844 vim_free(path_name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
845 vim_free(dname);
928
03c4ceec6bec updated for version 7.0-054
vimboss
parents: 860
diff changeset
846
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
847 // Delete any empty submenu we added before discovering the error. Repeat
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
848 // for higher levels.
928
03c4ceec6bec updated for version 7.0-054
vimboss
parents: 860
diff changeset
849 while (parent != NULL && parent->children == NULL)
03c4ceec6bec updated for version 7.0-054
vimboss
parents: 860
diff changeset
850 {
03c4ceec6bec updated for version 7.0-054
vimboss
parents: 860
diff changeset
851 if (parent->parent == NULL)
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
852 menup = root_menu_ptr;
928
03c4ceec6bec updated for version 7.0-054
vimboss
parents: 860
diff changeset
853 else
03c4ceec6bec updated for version 7.0-054
vimboss
parents: 860
diff changeset
854 menup = &parent->parent->children;
03c4ceec6bec updated for version 7.0-054
vimboss
parents: 860
diff changeset
855 for ( ; *menup != NULL && *menup != parent; menup = &((*menup)->next))
03c4ceec6bec updated for version 7.0-054
vimboss
parents: 860
diff changeset
856 ;
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
857 if (*menup == NULL) // safety check
928
03c4ceec6bec updated for version 7.0-054
vimboss
parents: 860
diff changeset
858 break;
03c4ceec6bec updated for version 7.0-054
vimboss
parents: 860
diff changeset
859 parent = parent->parent;
03c4ceec6bec updated for version 7.0-054
vimboss
parents: 860
diff changeset
860 free_menu(menup);
03c4ceec6bec updated for version 7.0-054
vimboss
parents: 860
diff changeset
861 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
862 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
863 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
864
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
865 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
866 * Set the (sub)menu with the given name to enabled or disabled.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
867 * Called recursively.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
868 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
869 static int
7827
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
870 menu_nable_recurse(
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
871 vimmenu_T *menu,
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
872 char_u *name,
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
873 int modes,
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
874 int enable)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
875 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
876 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
877
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
878 if (menu == NULL)
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
879 return OK; // Got to bottom of hierarchy
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
880
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
881 // Get name of this element in the menu hierarchy
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
882 p = menu_name_skip(name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
883
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
884 // Find the menu
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
885 while (menu != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
886 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
887 if (*name == NUL || *name == '*' || menu_name_equal(name, menu))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
888 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
889 if (*p != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
890 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
891 if (menu->children == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
892 {
26909
aa65d1808bd0 patch 8.2.3983: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26887
diff changeset
893 emsg(_(e_part_of_menu_item_path_is_not_sub_menu));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
894 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
895 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
896 if (menu_nable_recurse(menu->children, p, modes, enable)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
897 == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
898 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
899 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
900 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
901 if (enable)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
902 menu->enabled |= modes;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
903 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
904 menu->enabled &= ~modes;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
905
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
906 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
907 * When name is empty, we are doing all menu items for the given
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
908 * modes, so keep looping, otherwise we are just doing the named
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
909 * menu item (which has been found) so break here.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
910 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
911 if (*name != NUL && *name != '*')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
912 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
913 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
914 menu = menu->next;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
915 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
916 if (*name != NUL && *name != '*' && menu == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
917 {
26909
aa65d1808bd0 patch 8.2.3983: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26887
diff changeset
918 semsg(_(e_no_menu_str), name);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
919 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
920 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
921
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
922 #ifdef FEAT_GUI
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
923 // Want to update menus now even if mode not changed
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
924 force_menu_update = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
925 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
926
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
927 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
928 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
929
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
930 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
931 * Remove the (sub)menu with the given name from the menu hierarchy
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
932 * Called recursively.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
933 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
934 static int
7827
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
935 remove_menu(
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
936 vimmenu_T **menup,
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
937 char_u *name,
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
938 int modes,
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
939 int silent) // don't give error messages
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
940 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
941 vimmenu_T *menu;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
942 vimmenu_T *child;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
943 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
944
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
945 if (*menup == NULL)
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
946 return OK; // Got to bottom of hierarchy
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
947
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
948 // Get name of this element in the menu hierarchy
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
949 p = menu_name_skip(name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
950
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
951 // Find the menu
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
952 while ((menu = *menup) != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
953 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
954 if (*name == NUL || menu_name_equal(name, menu))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
955 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
956 if (*p != NUL && menu->children == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
957 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
958 if (!silent)
26909
aa65d1808bd0 patch 8.2.3983: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26887
diff changeset
959 emsg(_(e_part_of_menu_item_path_is_not_sub_menu));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
960 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
961 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
962 if ((menu->modes & modes) != 0x0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
963 {
15868
7fad90423bd2 patch 8.1.0941: macros for MS-Windows are inconsistent
Bram Moolenaar <Bram@vim.org>
parents: 15636
diff changeset
964 #if defined(FEAT_GUI_MSWIN) & defined(FEAT_TEAROFF)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
965 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
966 * If we are removing all entries for this menu,MENU_ALL_MODES,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
967 * Then kill any tearoff before we start
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
968 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
969 if (*p == NUL && modes == MENU_ALL_MODES)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
970 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
971 if (IsWindow(menu->tearoff_handle))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
972 DestroyWindow(menu->tearoff_handle);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
973 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
974 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
975 if (remove_menu(&menu->children, p, modes, silent) == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
976 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
977 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
978 else if (*name != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
979 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
980 if (!silent)
26887
612339679616 patch 8.2.3972: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26883
diff changeset
981 emsg(_(e_menu_only_exists_in_another_mode));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
982 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
983 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
984
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
985 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
986 * When name is empty, we are removing all menu items for the given
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
987 * modes, so keep looping, otherwise we are just removing the named
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
988 * menu item (which has been found) so break here.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
989 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
990 if (*name != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
991 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
992
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
993 // Remove the menu item for the given mode[s]. If the menu item
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
994 // is no longer valid in ANY mode, delete it
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
995 menu->modes &= ~modes;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
996 if (modes & MENU_TIP_MODE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
997 free_menu_string(menu, MENU_INDEX_TIP);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
998 if ((menu->modes & MENU_ALL_MODES) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
999 free_menu(menup);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1000 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1001 menup = &menu->next;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1002 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1003 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1004 menup = &menu->next;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1005 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1006 if (*name != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1007 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1008 if (menu == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1009 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1010 if (!silent)
26909
aa65d1808bd0 patch 8.2.3983: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26887
diff changeset
1011 semsg(_(e_no_menu_str), name);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1012 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1013 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1014
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1015
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
1016 // Recalculate modes for menu based on the new updated children
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1017 menu->modes &= ~modes;
15868
7fad90423bd2 patch 8.1.0941: macros for MS-Windows are inconsistent
Bram Moolenaar <Bram@vim.org>
parents: 15636
diff changeset
1018 #if defined(FEAT_GUI_MSWIN) & defined(FEAT_TEAROFF)
26771
fc859aea8cec patch 8.2.3914: various spelling mistakes in comments
Bram Moolenaar <Bram@vim.org>
parents: 25850
diff changeset
1019 if ((s_tearoffs) && (menu->children != NULL)) // there's a tear bar.
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
1020 child = menu->children->next; // don't count tearoff bar
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1021 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1022 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1023 child = menu->children;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1024 for ( ; child != NULL; child = child->next)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1025 menu->modes |= child->modes;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1026 if (modes & MENU_TIP_MODE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1027 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1028 free_menu_string(menu, MENU_INDEX_TIP);
15868
7fad90423bd2 patch 8.1.0941: macros for MS-Windows are inconsistent
Bram Moolenaar <Bram@vim.org>
parents: 15636
diff changeset
1029 #if defined(FEAT_TOOLBAR) && !defined(FEAT_GUI_MSWIN) \
12871
1a450ce6980c patch 8.0.1312: balloon_show() only works in terminal when compiled with GUI
Christian Brabandt <cb@256bit.org>
parents: 12527
diff changeset
1030 && (defined(FEAT_BEVAL_GUI) || defined(FEAT_GUI_GTK))
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
1031 // Need to update the menu tip.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1032 if (gui.in_use)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1033 gui_mch_menu_set_tip(menu);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1034 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1035 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1036 if ((menu->modes & MENU_ALL_MODES) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1037 {
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
1038 // The menu item is no longer valid in ANY mode, so delete it
15868
7fad90423bd2 patch 8.1.0941: macros for MS-Windows are inconsistent
Bram Moolenaar <Bram@vim.org>
parents: 15636
diff changeset
1039 #if defined(FEAT_GUI_MSWIN) & defined(FEAT_TEAROFF)
26771
fc859aea8cec patch 8.2.3914: various spelling mistakes in comments
Bram Moolenaar <Bram@vim.org>
parents: 25850
diff changeset
1040 if (s_tearoffs && menu->children != NULL) // there's a tear bar.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1041 free_menu(&menu->children);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1042 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1043 *menup = menu;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1044 free_menu(menup);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1045 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1046 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1047
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1048 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1049 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1050
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1051 /*
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1052 * Remove the WinBar menu from window "wp".
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1053 */
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1054 void
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1055 remove_winbar(win_T *wp)
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1056 {
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1057 remove_menu(&wp->w_winbar, (char_u *)"", MENU_ALL_MODES, TRUE);
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1058 vim_free(wp->w_winbar_items);
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1059 }
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1060
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1061 /*
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1062 * Free the given menu structure and remove it from the linked list.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1063 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1064 static void
7827
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1065 free_menu(vimmenu_T **menup)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1066 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1067 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1068 vimmenu_T *menu;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1069
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1070 menu = *menup;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1071
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1072 #ifdef FEAT_GUI
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
1073 // Free machine specific menu structures (only when already created)
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
1074 // Also may rebuild a tearoff'ed menu
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1075 if (gui.in_use)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1076 gui_mch_destroy_menu(menu);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1077 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1078
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
1079 // Don't change *menup until after calling gui_mch_destroy_menu(). The
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
1080 // MacOS code needs the original structure to properly delete the menu.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1081 *menup = menu->next;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1082 vim_free(menu->name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1083 vim_free(menu->dname);
2150
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1084 #ifdef FEAT_MULTI_LANG
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1085 vim_free(menu->en_name);
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1086 vim_free(menu->en_dname);
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1087 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1088 vim_free(menu->actext);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1089 #ifdef FEAT_TOOLBAR
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1090 vim_free(menu->iconfile);
162
7e6c3b196717 updated for version 7.0049
vimboss
parents: 41
diff changeset
1091 # ifdef FEAT_GUI_MOTIF
7e6c3b196717 updated for version 7.0049
vimboss
parents: 41
diff changeset
1092 vim_free(menu->xpm_fname);
7e6c3b196717 updated for version 7.0049
vimboss
parents: 41
diff changeset
1093 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1094 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1095 for (i = 0; i < MENU_MODES; i++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1096 free_menu_string(menu, i);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1097 vim_free(menu);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1098
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1099 #ifdef FEAT_GUI
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
1100 // Want to update menus now even if mode not changed
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1101 force_menu_update = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1102 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1103 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1104
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1105 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1106 * Free the menu->string with the given index.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1107 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1108 static void
7827
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1109 free_menu_string(vimmenu_T *menu, int idx)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1110 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1111 int count = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1112 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1113
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1114 for (i = 0; i < MENU_MODES; i++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1115 if (menu->strings[i] == menu->strings[idx])
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1116 count++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1117 if (count == 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1118 vim_free(menu->strings[idx]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1119 menu->strings[idx] = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1120 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1121
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1122 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1123 * Show the mapping associated with a menu item or hierarchy in a sub-menu.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1124 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1125 static int
7827
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1126 show_menus(char_u *path_name, int modes)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1127 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1128 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1129 char_u *name;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1130 vimmenu_T *menu;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1131 vimmenu_T *parent = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1132
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1133 name = path_name = vim_strsave(path_name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1134 if (path_name == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1135 return FAIL;
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1136 menu = *get_root_menu(path_name);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1137
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
1138 // First, find the (sub)menu with the given name
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1139 while (*name)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1140 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1141 p = menu_name_skip(name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1142 while (menu != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1143 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1144 if (menu_name_equal(name, menu))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1145 {
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
1146 // Found menu
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1147 if (*p != NUL && menu->children == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1148 {
26909
aa65d1808bd0 patch 8.2.3983: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26887
diff changeset
1149 emsg(_(e_part_of_menu_item_path_is_not_sub_menu));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1150 vim_free(path_name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1151 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1152 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1153 else if ((menu->modes & modes) == 0x0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1154 {
26887
612339679616 patch 8.2.3972: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26883
diff changeset
1155 emsg(_(e_menu_only_exists_in_another_mode));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1156 vim_free(path_name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1157 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1158 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1159 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1160 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1161 menu = menu->next;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1162 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1163 if (menu == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1164 {
26909
aa65d1808bd0 patch 8.2.3983: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26887
diff changeset
1165 semsg(_(e_no_menu_str), name);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1166 vim_free(path_name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1167 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1168 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1169 name = p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1170 parent = menu;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1171 menu = menu->children;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1172 }
1704
421a77b136c2 updated for version 7.2-002
vimboss
parents: 1624
diff changeset
1173 vim_free(path_name);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1174
31079
082f526cfb96 patch 9.0.0874: using freed memory when executing unmenu at more prompt
Bram Moolenaar <Bram@vim.org>
parents: 30239
diff changeset
1175 // make sure the list of menus doesn't change while listing them
082f526cfb96 patch 9.0.0874: using freed memory when executing unmenu at more prompt
Bram Moolenaar <Bram@vim.org>
parents: 30239
diff changeset
1176 ++menus_locked;
082f526cfb96 patch 9.0.0874: using freed memory when executing unmenu at more prompt
Bram Moolenaar <Bram@vim.org>
parents: 30239
diff changeset
1177
082f526cfb96 patch 9.0.0874: using freed memory when executing unmenu at more prompt
Bram Moolenaar <Bram@vim.org>
parents: 30239
diff changeset
1178 // list the matching menu mappings
15543
dd725a8ab112 patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents: 15470
diff changeset
1179 msg_puts_title(_("\n--- Menus ---"));
31079
082f526cfb96 patch 9.0.0874: using freed memory when executing unmenu at more prompt
Bram Moolenaar <Bram@vim.org>
parents: 30239
diff changeset
1180 show_menus_recursive(parent, modes, 0);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1181
31079
082f526cfb96 patch 9.0.0874: using freed memory when executing unmenu at more prompt
Bram Moolenaar <Bram@vim.org>
parents: 30239
diff changeset
1182 --menus_locked;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1183 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1184 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1185
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1186 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1187 * Recursively show the mappings associated with the menus under the given one
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1188 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1189 static void
7827
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1190 show_menus_recursive(vimmenu_T *menu, int modes, int depth)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1191 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1192 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1193 int bit;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1194
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1195 if (menu != NULL && (menu->modes & modes) == 0x0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1196 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1197
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1198 if (menu != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1199 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1200 msg_putchar('\n');
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
1201 if (got_int) // "q" hit for "--more--"
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1202 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1203 for (i = 0; i < depth; i++)
15543
dd725a8ab112 patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents: 15470
diff changeset
1204 msg_puts(" ");
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1205 if (menu->priority)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1206 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1207 msg_outnum((long)menu->priority);
15543
dd725a8ab112 patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents: 15470
diff changeset
1208 msg_puts(" ");
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1209 }
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
1210 // Same highlighting as for directories!?
11158
501f46f7644c patch 8.0.0466: still macros that should be all-caps
Christian Brabandt <cb@256bit.org>
parents: 11129
diff changeset
1211 msg_outtrans_attr(menu->name, HL_ATTR(HLF_D));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1212 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1213
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1214 if (menu != NULL && menu->children == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1215 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1216 for (bit = 0; bit < MENU_MODES; bit++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1217 if ((menu->modes & modes & (1 << bit)) != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1218 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1219 msg_putchar('\n');
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
1220 if (got_int) // "q" hit for "--more--"
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1221 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1222 for (i = 0; i < depth + 2; i++)
15543
dd725a8ab112 patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents: 15470
diff changeset
1223 msg_puts(" ");
dd725a8ab112 patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents: 15470
diff changeset
1224 msg_puts(menu_mode_chars[bit]);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1225 if (menu->noremap[bit] == REMAP_NONE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1226 msg_putchar('*');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1227 else if (menu->noremap[bit] == REMAP_SCRIPT)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1228 msg_putchar('&');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1229 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1230 msg_putchar(' ');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1231 if (menu->silent[bit])
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1232 msg_putchar('s');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1233 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1234 msg_putchar(' ');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1235 if ((menu->modes & menu->enabled & (1 << bit)) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1236 msg_putchar('-');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1237 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1238 msg_putchar(' ');
15543
dd725a8ab112 patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents: 15470
diff changeset
1239 msg_puts(" ");
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1240 if (*menu->strings[bit] == NUL)
15543
dd725a8ab112 patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents: 15470
diff changeset
1241 msg_puts_attr("<Nop>", HL_ATTR(HLF_8));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1242 else
16393
c1c25e2523a6 patch 8.1.1201: output of :command is hard to read
Bram Moolenaar <Bram@vim.org>
parents: 16162
diff changeset
1243 msg_outtrans_special(menu->strings[bit], FALSE, 0);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1244 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1245 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1246 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1247 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1248 if (menu == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1249 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1250 menu = root_menu;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1251 depth--;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1252 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1253 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1254 menu = menu->children;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1255
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
1256 // recursively show all children. Skip PopUp[nvoci].
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1257 for (; menu != NULL && !got_int; menu = menu->next)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1258 if (!menu_is_hidden(menu->dname))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1259 show_menus_recursive(menu, modes, depth + 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1260 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1261 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1262
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1263 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1264 * Used when expanding menu names.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1265 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1266 static vimmenu_T *expand_menu = NULL;
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1267 static vimmenu_T *expand_menu_alt = NULL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1268 static int expand_modes = 0x0;
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
1269 static int expand_emenu; // TRUE for ":emenu" command
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1270
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1271 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1272 * Work out what to complete when doing command line completion of menu names.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1273 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1274 char_u *
7827
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1275 set_context_in_menu_cmd(
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1276 expand_T *xp,
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1277 char_u *cmd,
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1278 char_u *arg,
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1279 int forceit)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1280 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1281 char_u *after_dot;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1282 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1283 char_u *path_name = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1284 char_u *name;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1285 int unmenu;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1286 vimmenu_T *menu;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1287 int expand_menus;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1288
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1289 xp->xp_context = EXPAND_UNSUCCESSFUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1290
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1291
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
1292 // Check for priority numbers, enable and disable
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1293 for (p = arg; *p; ++p)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1294 if (!VIM_ISDIGIT(*p) && *p != '.')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1295 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1296
11129
f4ea50924c6d patch 8.0.0452: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents: 11127
diff changeset
1297 if (!VIM_ISWHITE(*p))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1298 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1299 if (STRNCMP(arg, "enable", 6) == 0
11129
f4ea50924c6d patch 8.0.0452: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents: 11127
diff changeset
1300 && (arg[6] == NUL || VIM_ISWHITE(arg[6])))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1301 p = arg + 6;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1302 else if (STRNCMP(arg, "disable", 7) == 0
11129
f4ea50924c6d patch 8.0.0452: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents: 11127
diff changeset
1303 && (arg[7] == NUL || VIM_ISWHITE(arg[7])))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1304 p = arg + 7;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1305 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1306 p = arg;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1307 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1308
11129
f4ea50924c6d patch 8.0.0452: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents: 11127
diff changeset
1309 while (*p != NUL && VIM_ISWHITE(*p))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1310 ++p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1311
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1312 arg = after_dot = p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1313
11129
f4ea50924c6d patch 8.0.0452: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents: 11127
diff changeset
1314 for (; *p && !VIM_ISWHITE(*p); ++p)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1315 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1316 if ((*p == '\\' || *p == Ctrl_V) && p[1] != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1317 p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1318 else if (*p == '.')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1319 after_dot = p + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1320 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1321
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
1322 // ":tearoff" and ":popup" only use menus, not entries
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1323 expand_menus = !((*cmd == 't' && cmd[1] == 'e') || *cmd == 'p');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1324 expand_emenu = (*cmd == 'e');
11129
f4ea50924c6d patch 8.0.0452: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents: 11127
diff changeset
1325 if (expand_menus && VIM_ISWHITE(*p))
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
1326 return NULL; // TODO: check for next command?
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
1327 if (*p == NUL) // Complete the menu name
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1328 {
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1329 int try_alt_menu = TRUE;
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1330
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1331 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1332 * With :unmenu, you only want to match menus for the appropriate mode.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1333 * With :menu though you might want to add a menu with the same name as
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1334 * one in another mode, so match menus from other modes too.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1335 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1336 expand_modes = get_menu_cmd_modes(cmd, forceit, NULL, &unmenu);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1337 if (!unmenu)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1338 expand_modes = MENU_ALL_MODES;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1339
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1340 menu = root_menu;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1341 if (after_dot != arg)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1342 {
16764
ef00b6bc186b patch 8.1.1384: using "int" for alloc() often results in compiler warnings
Bram Moolenaar <Bram@vim.org>
parents: 16541
diff changeset
1343 path_name = alloc(after_dot - arg);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1344 if (path_name == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1345 return NULL;
419
f713fc55bf7b updated for version 7.0109
vimboss
parents: 162
diff changeset
1346 vim_strncpy(path_name, arg, after_dot - arg - 1);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1347 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1348 name = path_name;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1349 while (name != NULL && *name)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1350 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1351 p = menu_name_skip(name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1352 while (menu != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1353 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1354 if (menu_name_equal(name, menu))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1355 {
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
1356 // Found menu
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1357 if ((*p != NUL && menu->children == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1358 || ((menu->modes & expand_modes) == 0x0))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1359 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1360 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1361 * Menu path continues, but we have reached a leaf.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1362 * Or menu exists only in another mode.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1363 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1364 vim_free(path_name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1365 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1366 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1367 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1368 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1369 menu = menu->next;
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1370 if (menu == NULL && try_alt_menu)
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1371 {
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1372 menu = curwin->w_winbar;
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1373 try_alt_menu = FALSE;
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1374 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1375 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1376 if (menu == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1377 {
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
1378 // No menu found with the name we were looking for
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1379 vim_free(path_name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1380 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1381 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1382 name = p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1383 menu = menu->children;
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1384 try_alt_menu = FALSE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1385 }
840
2c885fab04e3 updated for version 7.0e06
vimboss
parents: 838
diff changeset
1386 vim_free(path_name);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1387
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1388 xp->xp_context = expand_menus ? EXPAND_MENUNAMES : EXPAND_MENUS;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1389 xp->xp_pattern = after_dot;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1390 expand_menu = menu;
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1391 if (expand_menu == root_menu)
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1392 expand_menu_alt = curwin->w_winbar;
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1393 else
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1394 expand_menu_alt = NULL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1395 }
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
1396 else // We're in the mapping part
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1397 xp->xp_context = EXPAND_NOTHING;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1398 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1399 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1400
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1401 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1402 * Function given to ExpandGeneric() to obtain the list of (sub)menus (not
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1403 * entries).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1404 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1405 char_u *
7827
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1406 get_menu_name(expand_T *xp UNUSED, int idx)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1407 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1408 static vimmenu_T *menu = NULL;
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1409 static int did_alt_menu = FALSE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1410 char_u *str;
2150
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1411 #ifdef FEAT_MULTI_LANG
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1412 static int should_advance = FALSE;
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1413 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1414
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
1415 if (idx == 0) // first call: start at first item
2150
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1416 {
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1417 menu = expand_menu;
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1418 did_alt_menu = FALSE;
2166
04c39cb3a10f Merge patch 7.2.434.
Bram Moolenaar <bram@vim.org>
parents: 2150
diff changeset
1419 #ifdef FEAT_MULTI_LANG
2150
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1420 should_advance = FALSE;
2166
04c39cb3a10f Merge patch 7.2.434.
Bram Moolenaar <bram@vim.org>
parents: 2150
diff changeset
1421 #endif
2150
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1422 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1423
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
1424 // Skip PopUp[nvoci].
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1425 while (menu != NULL && (menu_is_hidden(menu->dname)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1426 || menu_is_separator(menu->dname)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1427 || menu_is_tearoff(menu->dname)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1428 || menu->children == NULL))
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1429 {
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1430 menu = menu->next;
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1431 if (menu == NULL && !did_alt_menu)
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1432 {
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1433 menu = expand_menu_alt;
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1434 did_alt_menu = TRUE;
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1435 }
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1436 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1437
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
1438 if (menu == NULL) // at end of linked list
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1439 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1440
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1441 if (menu->modes & expand_modes)
2150
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1442 #ifdef FEAT_MULTI_LANG
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1443 if (should_advance)
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1444 str = menu->en_dname;
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1445 else
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1446 {
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1447 #endif
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1448 str = menu->dname;
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1449 #ifdef FEAT_MULTI_LANG
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1450 if (menu->en_dname == NULL)
2311
ccda151dde4e Support completion for ":find". (Nazri Ramliy)
Bram Moolenaar <bram@vim.org>
parents: 2251
diff changeset
1451 should_advance = TRUE;
2150
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1452 }
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1453 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1454 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1455 str = (char_u *)"";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1456
2150
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1457 #ifdef FEAT_MULTI_LANG
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1458 if (should_advance)
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1459 #endif
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1460 {
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
1461 // Advance to next menu entry.
2311
ccda151dde4e Support completion for ":find". (Nazri Ramliy)
Bram Moolenaar <bram@vim.org>
parents: 2251
diff changeset
1462 menu = menu->next;
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1463 if (menu == NULL && !did_alt_menu)
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1464 {
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1465 menu = expand_menu_alt;
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1466 did_alt_menu = TRUE;
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1467 }
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1468 }
2150
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1469
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1470 #ifdef FEAT_MULTI_LANG
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1471 should_advance = !should_advance;
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1472 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1473
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1474 return str;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1475 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1476
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1477 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1478 * Function given to ExpandGeneric() to obtain the list of menus and menu
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1479 * entries.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1480 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1481 char_u *
7827
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1482 get_menu_names(expand_T *xp UNUSED, int idx)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1483 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1484 static vimmenu_T *menu = NULL;
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1485 static int did_alt_menu = FALSE;
2768
c5e47b752f07 updated for version 7.3.160
Bram Moolenaar <bram@vim.org>
parents: 2676
diff changeset
1486 #define TBUFFER_LEN 256
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
1487 static char_u tbuffer[TBUFFER_LEN]; //hack
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1488 char_u *str;
2150
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1489 #ifdef FEAT_MULTI_LANG
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1490 static int should_advance = FALSE;
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1491 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1492
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
1493 if (idx == 0) // first call: start at first item
2150
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1494 {
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1495 menu = expand_menu;
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1496 did_alt_menu = FALSE;
2166
04c39cb3a10f Merge patch 7.2.434.
Bram Moolenaar <bram@vim.org>
parents: 2150
diff changeset
1497 #ifdef FEAT_MULTI_LANG
2150
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1498 should_advance = FALSE;
2166
04c39cb3a10f Merge patch 7.2.434.
Bram Moolenaar <bram@vim.org>
parents: 2150
diff changeset
1499 #endif
2150
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1500 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1501
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
1502 // Skip Browse-style entries, popup menus and separators.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1503 while (menu != NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1504 && ( menu_is_hidden(menu->dname)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1505 || (expand_emenu && menu_is_separator(menu->dname))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1506 || menu_is_tearoff(menu->dname)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1507 #ifndef FEAT_BROWSE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1508 || menu->dname[STRLEN(menu->dname) - 1] == '.'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1509 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1510 ))
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1511 {
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1512 menu = menu->next;
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1513 if (menu == NULL && !did_alt_menu)
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1514 {
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1515 menu = expand_menu_alt;
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1516 did_alt_menu = TRUE;
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1517 }
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1518 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1519
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
1520 if (menu == NULL) // at end of linked list
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1521 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1522
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1523 if (menu->modes & expand_modes)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1524 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1525 if (menu->children != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1526 {
2150
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1527 #ifdef FEAT_MULTI_LANG
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1528 if (should_advance)
2768
c5e47b752f07 updated for version 7.3.160
Bram Moolenaar <bram@vim.org>
parents: 2676
diff changeset
1529 vim_strncpy(tbuffer, menu->en_dname, TBUFFER_LEN - 2);
2150
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1530 else
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1531 {
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1532 #endif
2768
c5e47b752f07 updated for version 7.3.160
Bram Moolenaar <bram@vim.org>
parents: 2676
diff changeset
1533 vim_strncpy(tbuffer, menu->dname, TBUFFER_LEN - 2);
2150
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1534 #ifdef FEAT_MULTI_LANG
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1535 if (menu->en_dname == NULL)
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1536 should_advance = TRUE;
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1537 }
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1538 #endif
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
1539 // hack on menu separators: use a 'magic' char for the separator
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
1540 // so that '.' in names gets escaped properly
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1541 STRCAT(tbuffer, "\001");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1542 str = tbuffer;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1543 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1544 else
2150
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1545 #ifdef FEAT_MULTI_LANG
2311
ccda151dde4e Support completion for ":find". (Nazri Ramliy)
Bram Moolenaar <bram@vim.org>
parents: 2251
diff changeset
1546 {
ccda151dde4e Support completion for ":find". (Nazri Ramliy)
Bram Moolenaar <bram@vim.org>
parents: 2251
diff changeset
1547 if (should_advance)
ccda151dde4e Support completion for ":find". (Nazri Ramliy)
Bram Moolenaar <bram@vim.org>
parents: 2251
diff changeset
1548 str = menu->en_dname;
ccda151dde4e Support completion for ":find". (Nazri Ramliy)
Bram Moolenaar <bram@vim.org>
parents: 2251
diff changeset
1549 else
ccda151dde4e Support completion for ":find". (Nazri Ramliy)
Bram Moolenaar <bram@vim.org>
parents: 2251
diff changeset
1550 {
2150
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1551 #endif
2311
ccda151dde4e Support completion for ":find". (Nazri Ramliy)
Bram Moolenaar <bram@vim.org>
parents: 2251
diff changeset
1552 str = menu->dname;
2150
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1553 #ifdef FEAT_MULTI_LANG
2311
ccda151dde4e Support completion for ":find". (Nazri Ramliy)
Bram Moolenaar <bram@vim.org>
parents: 2251
diff changeset
1554 if (menu->en_dname == NULL)
ccda151dde4e Support completion for ":find". (Nazri Ramliy)
Bram Moolenaar <bram@vim.org>
parents: 2251
diff changeset
1555 should_advance = TRUE;
ccda151dde4e Support completion for ":find". (Nazri Ramliy)
Bram Moolenaar <bram@vim.org>
parents: 2251
diff changeset
1556 }
ccda151dde4e Support completion for ":find". (Nazri Ramliy)
Bram Moolenaar <bram@vim.org>
parents: 2251
diff changeset
1557 }
2150
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1558 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1559 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1560 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1561 str = (char_u *)"";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1562
2150
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1563 #ifdef FEAT_MULTI_LANG
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1564 if (should_advance)
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1565 #endif
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1566 {
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
1567 // Advance to next menu entry.
2311
ccda151dde4e Support completion for ":find". (Nazri Ramliy)
Bram Moolenaar <bram@vim.org>
parents: 2251
diff changeset
1568 menu = menu->next;
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1569 if (menu == NULL && !did_alt_menu)
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1570 {
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1571 menu = expand_menu_alt;
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1572 did_alt_menu = TRUE;
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1573 }
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
1574 }
2150
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1575
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1576 #ifdef FEAT_MULTI_LANG
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1577 should_advance = !should_advance;
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1578 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1579
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1580 return str;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1581 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1582
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1583 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1584 * Skip over this element of the menu path and return the start of the next
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1585 * element. Any \ and ^Vs are removed from the current element.
436
a1c5a6cb2675 updated for version 7.0112
vimboss
parents: 419
diff changeset
1586 * "name" may be modified.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1587 */
17789
0f7ae8010787 patch 8.1.1891: functions used in one file are global
Bram Moolenaar <Bram@vim.org>
parents: 17781
diff changeset
1588 static char_u *
7827
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1589 menu_name_skip(char_u *name)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1590 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1591 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1592
11127
506f5d8b7d8b patch 8.0.0451: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents: 11044
diff changeset
1593 for (p = name; *p && *p != '.'; MB_PTR_ADV(p))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1594 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1595 if (*p == '\\' || *p == Ctrl_V)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1596 {
1624
18ee39301b82 updated for version 7.2a
vimboss
parents: 1050
diff changeset
1597 STRMOVE(p, p + 1);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1598 if (*p == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1599 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1600 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1601 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1602 if (*p)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1603 *p++ = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1604 return p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1605 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1606
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1607 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1608 * Return TRUE when "name" matches with menu "menu". The name is compared in
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1609 * two ways: raw menu name and menu name without '&'. ignore part after a TAB.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1610 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1611 static int
7827
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1612 menu_name_equal(char_u *name, vimmenu_T *menu)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1613 {
2166
04c39cb3a10f Merge patch 7.2.434.
Bram Moolenaar <bram@vim.org>
parents: 2150
diff changeset
1614 #ifdef FEAT_MULTI_LANG
2150
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1615 if (menu->en_name != NULL
2676
8464d084fa74 updated for version 7.3.095
Bram Moolenaar <bram@vim.org>
parents: 2311
diff changeset
1616 && (menu_namecmp(name, menu->en_name)
8464d084fa74 updated for version 7.3.095
Bram Moolenaar <bram@vim.org>
parents: 2311
diff changeset
1617 || menu_namecmp(name, menu->en_dname)))
2311
ccda151dde4e Support completion for ":find". (Nazri Ramliy)
Bram Moolenaar <bram@vim.org>
parents: 2251
diff changeset
1618 return TRUE;
2166
04c39cb3a10f Merge patch 7.2.434.
Bram Moolenaar <bram@vim.org>
parents: 2150
diff changeset
1619 #endif
2150
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
1620 return menu_namecmp(name, menu->name) || menu_namecmp(name, menu->dname);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1621 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1622
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1623 static int
7827
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1624 menu_namecmp(char_u *name, char_u *mname)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1625 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1626 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1627
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1628 for (i = 0; name[i] != NUL && name[i] != TAB; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1629 if (name[i] != mname[i])
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1630 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1631 return ((name[i] == NUL || name[i] == TAB)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1632 && (mname[i] == NUL || mname[i] == TAB));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1633 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1634
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1635 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1636 * Return the modes specified by the given menu command (eg :menu! returns
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1637 * MENU_CMDLINE_MODE | MENU_INSERT_MODE).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1638 * If "noremap" is not NULL, then the flag it points to is set according to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1639 * whether the command is a "nore" command.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1640 * If "unmenu" is not NULL, then the flag it points to is set according to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1641 * whether the command is an "unmenu" command.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1642 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1643 static int
7827
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1644 get_menu_cmd_modes(
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1645 char_u *cmd,
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
1646 int forceit, // Was there a "!" after the command?
7827
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1647 int *noremap,
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1648 int *unmenu)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1649 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1650 int modes;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1651
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1652 switch (*cmd++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1653 {
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
1654 case 'v': // vmenu, vunmenu, vnoremenu
791
98a88a884610 updated for version 7.0230
vimboss
parents: 700
diff changeset
1655 modes = MENU_VISUAL_MODE | MENU_SELECT_MODE;
98a88a884610 updated for version 7.0230
vimboss
parents: 700
diff changeset
1656 break;
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
1657 case 'x': // xmenu, xunmenu, xnoremenu
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1658 modes = MENU_VISUAL_MODE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1659 break;
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
1660 case 's': // smenu, sunmenu, snoremenu
791
98a88a884610 updated for version 7.0230
vimboss
parents: 700
diff changeset
1661 modes = MENU_SELECT_MODE;
98a88a884610 updated for version 7.0230
vimboss
parents: 700
diff changeset
1662 break;
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
1663 case 'o': // omenu
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1664 modes = MENU_OP_PENDING_MODE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1665 break;
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
1666 case 'i': // imenu
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1667 modes = MENU_INSERT_MODE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1668 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1669 case 't':
28809
d0241e74bfdb patch 8.2.4928: various white space and cosmetic mistakes
Bram Moolenaar <Bram@vim.org>
parents: 28773
diff changeset
1670 if (*cmd == 'l') // tlmenu, tlunmenu, tlnoremenu
14952
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
1671 {
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
1672 modes = MENU_TERMINAL_MODE;
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
1673 ++cmd;
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
1674 break;
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
1675 }
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
1676 modes = MENU_TIP_MODE; // tmenu
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1677 break;
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
1678 case 'c': // cmenu
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1679 modes = MENU_CMDLINE_MODE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1680 break;
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
1681 case 'a': // amenu
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1682 modes = MENU_INSERT_MODE | MENU_CMDLINE_MODE | MENU_NORMAL_MODE
791
98a88a884610 updated for version 7.0230
vimboss
parents: 700
diff changeset
1683 | MENU_VISUAL_MODE | MENU_SELECT_MODE
856
8cd729851562 updated for version 7.0g
vimboss
parents: 840
diff changeset
1684 | MENU_OP_PENDING_MODE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1685 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1686 case 'n':
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
1687 if (*cmd != 'o') // nmenu, not noremenu
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1688 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1689 modes = MENU_NORMAL_MODE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1690 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1691 }
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
1692 // FALLTHROUGH
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1693 default:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1694 --cmd;
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
1695 if (forceit) // menu!!
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1696 modes = MENU_INSERT_MODE | MENU_CMDLINE_MODE;
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
1697 else // menu
791
98a88a884610 updated for version 7.0230
vimboss
parents: 700
diff changeset
1698 modes = MENU_NORMAL_MODE | MENU_VISUAL_MODE | MENU_SELECT_MODE
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1699 | MENU_OP_PENDING_MODE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1700 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1701
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1702 if (noremap != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1703 *noremap = (*cmd == 'n' ? REMAP_NONE : REMAP_YES);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1704 if (unmenu != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1705 *unmenu = (*cmd == 'u');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1706 return modes;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1707 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1708
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1709 /*
19657
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
1710 * Return the string representation of the menu modes. Does the opposite
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
1711 * of get_menu_cmd_modes().
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
1712 */
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
1713 static char_u *
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
1714 get_menu_mode_str(int modes)
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
1715 {
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
1716 if ((modes & (MENU_INSERT_MODE | MENU_CMDLINE_MODE | MENU_NORMAL_MODE |
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
1717 MENU_VISUAL_MODE | MENU_SELECT_MODE | MENU_OP_PENDING_MODE))
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
1718 == (MENU_INSERT_MODE | MENU_CMDLINE_MODE | MENU_NORMAL_MODE |
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
1719 MENU_VISUAL_MODE | MENU_SELECT_MODE | MENU_OP_PENDING_MODE))
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
1720 return (char_u *)"a";
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
1721 if ((modes & (MENU_NORMAL_MODE | MENU_VISUAL_MODE | MENU_SELECT_MODE |
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
1722 MENU_OP_PENDING_MODE))
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
1723 == (MENU_NORMAL_MODE | MENU_VISUAL_MODE | MENU_SELECT_MODE |
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
1724 MENU_OP_PENDING_MODE))
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
1725 return (char_u *)" ";
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
1726 if ((modes & (MENU_INSERT_MODE | MENU_CMDLINE_MODE))
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
1727 == (MENU_INSERT_MODE | MENU_CMDLINE_MODE))
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
1728 return (char_u *)"!";
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
1729 if ((modes & (MENU_VISUAL_MODE | MENU_SELECT_MODE))
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
1730 == (MENU_VISUAL_MODE | MENU_SELECT_MODE))
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
1731 return (char_u *)"v";
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
1732 if (modes & MENU_VISUAL_MODE)
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
1733 return (char_u *)"x";
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
1734 if (modes & MENU_SELECT_MODE)
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
1735 return (char_u *)"s";
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
1736 if (modes & MENU_OP_PENDING_MODE)
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
1737 return (char_u *)"o";
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
1738 if (modes & MENU_INSERT_MODE)
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
1739 return (char_u *)"i";
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
1740 if (modes & MENU_TERMINAL_MODE)
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
1741 return (char_u *)"tl";
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
1742 if (modes & MENU_CMDLINE_MODE)
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
1743 return (char_u *)"c";
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
1744 if (modes & MENU_NORMAL_MODE)
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
1745 return (char_u *)"n";
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
1746 if (modes & MENU_TIP_MODE)
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
1747 return (char_u *)"t";
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
1748
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
1749 return (char_u *)"";
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
1750 }
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
1751
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
1752 /*
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1753 * Modify a menu name starting with "PopUp" to include the mode character.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1754 * Returns the name in allocated memory (NULL for failure).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1755 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1756 static char_u *
7827
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1757 popup_mode_name(char_u *name, int idx)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1758 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1759 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1760 int len = (int)STRLEN(name);
14952
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
1761 char *mode_chars = menu_mode_chars[idx];
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
1762 int mode_chars_len = (int)strlen(mode_chars);
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
1763 int i;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1764
14952
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
1765 p = vim_strnsave(name, len + mode_chars_len);
31728
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
1766 if (p == NULL)
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
1767 return NULL;
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
1768
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
1769 mch_memmove(p + 5 + mode_chars_len, p + 5, (size_t)(len - 4));
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
1770 for (i = 0; i < mode_chars_len; ++i)
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
1771 p[5 + i] = menu_mode_chars[idx][i];
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1772 return p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1773 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1774
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1775 #if defined(FEAT_GUI) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1776 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1777 * Return the index into the menu->strings or menu->noremap arrays for the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1778 * current state. Returns MENU_INDEX_INVALID if there is no mapping for the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1779 * given menu in the current mode.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1780 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1781 int
7827
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1782 get_menu_index(vimmenu_T *menu, int state)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1783 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1784 int idx;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1785
28773
d770568e6c98 patch 8.2.4911: the mode #defines are not clearly named
Bram Moolenaar <Bram@vim.org>
parents: 28303
diff changeset
1786 if ((state & MODE_INSERT))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1787 idx = MENU_INDEX_INSERT;
28773
d770568e6c98 patch 8.2.4911: the mode #defines are not clearly named
Bram Moolenaar <Bram@vim.org>
parents: 28303
diff changeset
1788 else if (state & MODE_CMDLINE)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1789 idx = MENU_INDEX_CMDLINE;
14952
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
1790 #ifdef FEAT_TERMINAL
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
1791 else if (term_use_loop())
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
1792 idx = MENU_INDEX_TERMINAL;
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
1793 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1794 else if (VIsual_active)
791
98a88a884610 updated for version 7.0230
vimboss
parents: 700
diff changeset
1795 {
856
8cd729851562 updated for version 7.0g
vimboss
parents: 840
diff changeset
1796 if (VIsual_select)
8cd729851562 updated for version 7.0g
vimboss
parents: 840
diff changeset
1797 idx = MENU_INDEX_SELECT;
8cd729851562 updated for version 7.0g
vimboss
parents: 840
diff changeset
1798 else
8cd729851562 updated for version 7.0g
vimboss
parents: 840
diff changeset
1799 idx = MENU_INDEX_VISUAL;
791
98a88a884610 updated for version 7.0230
vimboss
parents: 700
diff changeset
1800 }
28773
d770568e6c98 patch 8.2.4911: the mode #defines are not clearly named
Bram Moolenaar <Bram@vim.org>
parents: 28303
diff changeset
1801 else if (state == MODE_HITRETURN || state == MODE_ASKMORE)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1802 idx = MENU_INDEX_CMDLINE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1803 else if (finish_op)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1804 idx = MENU_INDEX_OP_PENDING;
28773
d770568e6c98 patch 8.2.4911: the mode #defines are not clearly named
Bram Moolenaar <Bram@vim.org>
parents: 28303
diff changeset
1805 else if ((state & MODE_NORMAL))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1806 idx = MENU_INDEX_NORMAL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1807 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1808 idx = MENU_INDEX_INVALID;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1809
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1810 if (idx != MENU_INDEX_INVALID && menu->strings[idx] == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1811 idx = MENU_INDEX_INVALID;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1812 return idx;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1813 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1814 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1815
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1816 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1817 * Duplicate the menu item text and then process to see if a mnemonic key
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1818 * and/or accelerator text has been identified.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1819 * Returns a pointer to allocated memory, or NULL for failure.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1820 * If mnemonic != NULL, *mnemonic is set to the character after the first '&'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1821 * If actext != NULL, *actext is set to the text after the first TAB.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1822 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1823 static char_u *
7827
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1824 menu_text(char_u *str, int *mnemonic, char_u **actext)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1825 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1826 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1827 char_u *text;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1828
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
1829 // Locate accelerator text, after the first TAB
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1830 p = vim_strchr(str, TAB);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1831 if (p != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1832 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1833 if (actext != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1834 *actext = vim_strsave(p + 1);
20830
9064044fd4f6 patch 8.2.0967: unnecessary type casts for vim_strnsave()
Bram Moolenaar <Bram@vim.org>
parents: 20116
diff changeset
1835 text = vim_strnsave(str, p - str);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1836 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1837 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1838 text = vim_strsave(str);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1839
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
1840 // Find mnemonic characters "&a" and reduce "&&" to "&".
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1841 for (p = text; p != NULL; )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1842 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1843 p = vim_strchr(p, '&');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1844 if (p != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1845 {
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
1846 if (p[1] == NUL) // trailing "&"
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1847 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1848 if (mnemonic != NULL && p[1] != '&')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1849 #if !defined(__MVS__) || defined(MOTIF390_MNEMONIC_FIXED)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1850 *mnemonic = p[1];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1851 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1852 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1853 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1854 * Well there is a bug in the Motif libraries on OS390 Unix.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1855 * The mnemonic keys needs to be converted to ASCII values
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1856 * first.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1857 * This behavior has been seen in 2.8 and 2.9.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1858 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1859 char c = p[1];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1860 __etoa_l(&c, 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1861 *mnemonic = c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1862 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1863 #endif
1624
18ee39301b82 updated for version 7.2a
vimboss
parents: 1050
diff changeset
1864 STRMOVE(p, p + 1);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1865 p = p + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1866 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1867 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1868 return text;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1869 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1870
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1871 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1872 * Return TRUE if "name" can be a menu in the MenuBar.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1873 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1874 int
7827
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1875 menu_is_menubar(char_u *name)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1876 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1877 return (!menu_is_popup(name)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1878 && !menu_is_toolbar(name)
12527
259983a729fa patch 8.0.1142: window toolbar menu gets a tear-off item
Christian Brabandt <cb@256bit.org>
parents: 12521
diff changeset
1879 && !menu_is_winbar(name)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1880 && *name != MNU_HIDDEN_CHAR);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1881 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1882
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1883 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1884 * Return TRUE if "name" is a popup menu name.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1885 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1886 int
7827
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1887 menu_is_popup(char_u *name)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1888 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1889 return (STRNCMP(name, "PopUp", 5) == 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1890 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1891
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1892 #if (defined(FEAT_GUI_MOTIF) && (XmVersion <= 1002)) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1893 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1894 * Return TRUE if "name" is part of a popup menu.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1895 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1896 int
7827
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1897 menu_is_child_of_popup(vimmenu_T *menu)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1898 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1899 while (menu->parent != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1900 menu = menu->parent;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1901 return menu_is_popup(menu->name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1902 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1903 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1904
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1905 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1906 * Return TRUE if "name" is a toolbar menu name.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1907 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1908 int
7827
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1909 menu_is_toolbar(char_u *name)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1910 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1911 return (STRNCMP(name, "ToolBar", 7) == 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1912 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1913
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1914 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1915 * Return TRUE if the name is a menu separator identifier: Starts and ends
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1916 * with '-'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1917 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1918 int
7827
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1919 menu_is_separator(char_u *name)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1920 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1921 return (name[0] == '-' && name[STRLEN(name) - 1] == '-');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1922 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1923
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1924 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1925 * Return TRUE if the menu is hidden: Starts with ']'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1926 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1927 static int
7827
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1928 menu_is_hidden(char_u *name)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1929 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1930 return (name[0] == ']') || (menu_is_popup(name) && name[5] != NUL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1931 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1932
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1933 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1934 * Return TRUE if the menu is the tearoff menu.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1935 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1936 static int
7827
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1937 menu_is_tearoff(char_u *name UNUSED)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1938 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1939 #ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1940 return (STRCMP(name, TEAR_STRING) == 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1941 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1942 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1943 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1944 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1945
13369
244ff1b6d2ad patch 8.0.1558: no right-click menu in a terminal
Christian Brabandt <cb@256bit.org>
parents: 13244
diff changeset
1946 #if defined(FEAT_GUI) || defined(FEAT_TERM_POPUP_MENU) || defined(PROTO)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1947
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1948 static int
7827
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
1949 get_menu_mode(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1950 {
14952
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
1951 #ifdef FEAT_TERMINAL
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
1952 if (term_use_loop())
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
1953 return MENU_INDEX_TERMINAL;
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
1954 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1955 if (VIsual_active)
791
98a88a884610 updated for version 7.0230
vimboss
parents: 700
diff changeset
1956 {
856
8cd729851562 updated for version 7.0g
vimboss
parents: 840
diff changeset
1957 if (VIsual_select)
8cd729851562 updated for version 7.0g
vimboss
parents: 840
diff changeset
1958 return MENU_INDEX_SELECT;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1959 return MENU_INDEX_VISUAL;
791
98a88a884610 updated for version 7.0230
vimboss
parents: 700
diff changeset
1960 }
28773
d770568e6c98 patch 8.2.4911: the mode #defines are not clearly named
Bram Moolenaar <Bram@vim.org>
parents: 28303
diff changeset
1961 if (State & MODE_INSERT)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1962 return MENU_INDEX_INSERT;
28773
d770568e6c98 patch 8.2.4911: the mode #defines are not clearly named
Bram Moolenaar <Bram@vim.org>
parents: 28303
diff changeset
1963 if ((State & MODE_CMDLINE) || State == MODE_ASKMORE
d770568e6c98 patch 8.2.4911: the mode #defines are not clearly named
Bram Moolenaar <Bram@vim.org>
parents: 28303
diff changeset
1964 || State == MODE_HITRETURN)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1965 return MENU_INDEX_CMDLINE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1966 if (finish_op)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1967 return MENU_INDEX_OP_PENDING;
28773
d770568e6c98 patch 8.2.4911: the mode #defines are not clearly named
Bram Moolenaar <Bram@vim.org>
parents: 28303
diff changeset
1968 if (State & MODE_NORMAL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1969 return MENU_INDEX_NORMAL;
28773
d770568e6c98 patch 8.2.4911: the mode #defines are not clearly named
Bram Moolenaar <Bram@vim.org>
parents: 28303
diff changeset
1970 if (State & MODE_LANGMAP) // must be a "r" command, like Insert mode
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1971 return MENU_INDEX_INSERT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1972 return MENU_INDEX_INVALID;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1973 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1974
13392
d5347779fb20 patch 8.0.1570: can't use :popup for a menu in the terminal
Christian Brabandt <cb@256bit.org>
parents: 13380
diff changeset
1975 int
d5347779fb20 patch 8.0.1570: can't use :popup for a menu in the terminal
Christian Brabandt <cb@256bit.org>
parents: 13380
diff changeset
1976 get_menu_mode_flag(void)
d5347779fb20 patch 8.0.1570: can't use :popup for a menu in the terminal
Christian Brabandt <cb@256bit.org>
parents: 13380
diff changeset
1977 {
d5347779fb20 patch 8.0.1570: can't use :popup for a menu in the terminal
Christian Brabandt <cb@256bit.org>
parents: 13380
diff changeset
1978 int mode = get_menu_mode();
d5347779fb20 patch 8.0.1570: can't use :popup for a menu in the terminal
Christian Brabandt <cb@256bit.org>
parents: 13380
diff changeset
1979
d5347779fb20 patch 8.0.1570: can't use :popup for a menu in the terminal
Christian Brabandt <cb@256bit.org>
parents: 13380
diff changeset
1980 if (mode == MENU_INDEX_INVALID)
d5347779fb20 patch 8.0.1570: can't use :popup for a menu in the terminal
Christian Brabandt <cb@256bit.org>
parents: 13380
diff changeset
1981 return 0;
d5347779fb20 patch 8.0.1570: can't use :popup for a menu in the terminal
Christian Brabandt <cb@256bit.org>
parents: 13380
diff changeset
1982 return 1 << mode;
d5347779fb20 patch 8.0.1570: can't use :popup for a menu in the terminal
Christian Brabandt <cb@256bit.org>
parents: 13380
diff changeset
1983 }
d5347779fb20 patch 8.0.1570: can't use :popup for a menu in the terminal
Christian Brabandt <cb@256bit.org>
parents: 13380
diff changeset
1984
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1985 /*
13369
244ff1b6d2ad patch 8.0.1558: no right-click menu in a terminal
Christian Brabandt <cb@256bit.org>
parents: 13244
diff changeset
1986 * Display the Special "PopUp" menu as a pop-up at the current mouse
244ff1b6d2ad patch 8.0.1558: no right-click menu in a terminal
Christian Brabandt <cb@256bit.org>
parents: 13244
diff changeset
1987 * position. The "PopUpn" menu is for Normal mode, "PopUpi" for Insert mode,
244ff1b6d2ad patch 8.0.1558: no right-click menu in a terminal
Christian Brabandt <cb@256bit.org>
parents: 13244
diff changeset
1988 * etc.
244ff1b6d2ad patch 8.0.1558: no right-click menu in a terminal
Christian Brabandt <cb@256bit.org>
parents: 13244
diff changeset
1989 */
244ff1b6d2ad patch 8.0.1558: no right-click menu in a terminal
Christian Brabandt <cb@256bit.org>
parents: 13244
diff changeset
1990 void
244ff1b6d2ad patch 8.0.1558: no right-click menu in a terminal
Christian Brabandt <cb@256bit.org>
parents: 13244
diff changeset
1991 show_popupmenu(void)
244ff1b6d2ad patch 8.0.1558: no right-click menu in a terminal
Christian Brabandt <cb@256bit.org>
parents: 13244
diff changeset
1992 {
244ff1b6d2ad patch 8.0.1558: no right-click menu in a terminal
Christian Brabandt <cb@256bit.org>
parents: 13244
diff changeset
1993 vimmenu_T *menu;
14952
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
1994 int menu_mode;
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
1995 char* mode;
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
1996 int mode_len;
13369
244ff1b6d2ad patch 8.0.1558: no right-click menu in a terminal
Christian Brabandt <cb@256bit.org>
parents: 13244
diff changeset
1997
14952
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
1998 menu_mode = get_menu_mode();
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
1999 if (menu_mode == MENU_INDEX_INVALID)
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2000 return;
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2001 mode = menu_mode_chars[menu_mode];
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2002 mode_len = (int)strlen(mode);
13369
244ff1b6d2ad patch 8.0.1558: no right-click menu in a terminal
Christian Brabandt <cb@256bit.org>
parents: 13244
diff changeset
2003
14952
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2004 apply_autocmds(EVENT_MENUPOPUP, (char_u*)mode, NULL, FALSE, curbuf);
13369
244ff1b6d2ad patch 8.0.1558: no right-click menu in a terminal
Christian Brabandt <cb@256bit.org>
parents: 13244
diff changeset
2005
19934
3ff714d765ba patch 8.2.0523: loops are repeated
Bram Moolenaar <Bram@vim.org>
parents: 19685
diff changeset
2006 FOR_ALL_MENUS(menu)
14952
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2007 if (STRNCMP("PopUp", menu->name, 5) == 0 && STRNCMP(menu->name + 5, mode, mode_len) == 0)
13369
244ff1b6d2ad patch 8.0.1558: no right-click menu in a terminal
Christian Brabandt <cb@256bit.org>
parents: 13244
diff changeset
2008 break;
244ff1b6d2ad patch 8.0.1558: no right-click menu in a terminal
Christian Brabandt <cb@256bit.org>
parents: 13244
diff changeset
2009
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
2010 // Only show a popup when it is defined and has entries
31728
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
2011 if (menu == NULL || menu->children == NULL)
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
2012 return;
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
2013
13369
244ff1b6d2ad patch 8.0.1558: no right-click menu in a terminal
Christian Brabandt <cb@256bit.org>
parents: 13244
diff changeset
2014 # if defined(FEAT_GUI)
31728
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
2015 if (gui.in_use)
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
2016 {
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
2017 // Update the menus now, in case the MenuPopup autocommand did
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
2018 // anything.
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
2019 gui_update_menus(0);
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
2020 gui_mch_show_popupmenu(menu);
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
2021 }
13369
244ff1b6d2ad patch 8.0.1558: no right-click menu in a terminal
Christian Brabandt <cb@256bit.org>
parents: 13244
diff changeset
2022 # endif
244ff1b6d2ad patch 8.0.1558: no right-click menu in a terminal
Christian Brabandt <cb@256bit.org>
parents: 13244
diff changeset
2023 # if defined(FEAT_GUI) && defined(FEAT_TERM_POPUP_MENU)
31728
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
2024 else
13369
244ff1b6d2ad patch 8.0.1558: no right-click menu in a terminal
Christian Brabandt <cb@256bit.org>
parents: 13244
diff changeset
2025 # endif
244ff1b6d2ad patch 8.0.1558: no right-click menu in a terminal
Christian Brabandt <cb@256bit.org>
parents: 13244
diff changeset
2026 # if defined(FEAT_TERM_POPUP_MENU)
31728
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
2027 pum_show_popupmenu(menu);
13369
244ff1b6d2ad patch 8.0.1558: no right-click menu in a terminal
Christian Brabandt <cb@256bit.org>
parents: 13244
diff changeset
2028 # endif
244ff1b6d2ad patch 8.0.1558: no right-click menu in a terminal
Christian Brabandt <cb@256bit.org>
parents: 13244
diff changeset
2029 }
244ff1b6d2ad patch 8.0.1558: no right-click menu in a terminal
Christian Brabandt <cb@256bit.org>
parents: 13244
diff changeset
2030 #endif
244ff1b6d2ad patch 8.0.1558: no right-click menu in a terminal
Christian Brabandt <cb@256bit.org>
parents: 13244
diff changeset
2031
244ff1b6d2ad patch 8.0.1558: no right-click menu in a terminal
Christian Brabandt <cb@256bit.org>
parents: 13244
diff changeset
2032 #if defined(FEAT_GUI) || defined(PROTO)
244ff1b6d2ad patch 8.0.1558: no right-click menu in a terminal
Christian Brabandt <cb@256bit.org>
parents: 13244
diff changeset
2033
244ff1b6d2ad patch 8.0.1558: no right-click menu in a terminal
Christian Brabandt <cb@256bit.org>
parents: 13244
diff changeset
2034 /*
936
77f8a648d2e6 updated for version 7.0-062
vimboss
parents: 928
diff changeset
2035 * Check that a pointer appears in the menu tree. Used to protect from using
77f8a648d2e6 updated for version 7.0-062
vimboss
parents: 928
diff changeset
2036 * a menu that was deleted after it was selected but before the event was
77f8a648d2e6 updated for version 7.0-062
vimboss
parents: 928
diff changeset
2037 * handled.
77f8a648d2e6 updated for version 7.0-062
vimboss
parents: 928
diff changeset
2038 * Return OK or FAIL. Used recursively.
77f8a648d2e6 updated for version 7.0-062
vimboss
parents: 928
diff changeset
2039 */
77f8a648d2e6 updated for version 7.0-062
vimboss
parents: 928
diff changeset
2040 int
7827
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
2041 check_menu_pointer(vimmenu_T *root, vimmenu_T *menu_to_check)
936
77f8a648d2e6 updated for version 7.0-062
vimboss
parents: 928
diff changeset
2042 {
77f8a648d2e6 updated for version 7.0-062
vimboss
parents: 928
diff changeset
2043 vimmenu_T *p;
77f8a648d2e6 updated for version 7.0-062
vimboss
parents: 928
diff changeset
2044
77f8a648d2e6 updated for version 7.0-062
vimboss
parents: 928
diff changeset
2045 for (p = root; p != NULL; p = p->next)
77f8a648d2e6 updated for version 7.0-062
vimboss
parents: 928
diff changeset
2046 if (p == menu_to_check
77f8a648d2e6 updated for version 7.0-062
vimboss
parents: 928
diff changeset
2047 || (p->children != NULL
77f8a648d2e6 updated for version 7.0-062
vimboss
parents: 928
diff changeset
2048 && check_menu_pointer(p->children, menu_to_check) == OK))
77f8a648d2e6 updated for version 7.0-062
vimboss
parents: 928
diff changeset
2049 return OK;
77f8a648d2e6 updated for version 7.0-062
vimboss
parents: 928
diff changeset
2050 return FAIL;
77f8a648d2e6 updated for version 7.0-062
vimboss
parents: 928
diff changeset
2051 }
77f8a648d2e6 updated for version 7.0-062
vimboss
parents: 928
diff changeset
2052
77f8a648d2e6 updated for version 7.0-062
vimboss
parents: 928
diff changeset
2053 /*
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2054 * After we have started the GUI, then we can create any menus that have been
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2055 * defined. This is done once here. add_menu_path() may have already been
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2056 * called to define these menus, and may be called again. This function calls
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2057 * itself recursively. Should be called at the top level with:
9536
b2aada04d84e commit https://github.com/vim/vim/commit/a06ecab7a5159e744448ace731036f0dc5f87dd4
Christian Brabandt <cb@256bit.org>
parents: 9264
diff changeset
2058 * gui_create_initial_menus(root_menu);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2059 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2060 void
7827
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
2061 gui_create_initial_menus(vimmenu_T *menu)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2062 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2063 int idx = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2064
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2065 while (menu != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2066 {
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
2067 // Don't add a menu when only a tip was defined.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2068 if (menu->modes & MENU_ALL_MODES)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2069 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2070 if (menu->children != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2071 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2072 gui_mch_add_menu(menu, idx);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2073 gui_create_initial_menus(menu->children);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2074 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2075 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2076 gui_mch_add_menu_item(menu, idx);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2077 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2078 menu = menu->next;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2079 ++idx;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2080 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2081 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2082
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2083 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2084 * Used recursively by gui_update_menus (see below)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2085 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2086 static void
7827
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
2087 gui_update_menus_recurse(vimmenu_T *menu, int mode)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2088 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2089 int grey;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2090
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2091 while (menu)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2092 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2093 if ((menu->modes & menu->enabled & mode)
15868
7fad90423bd2 patch 8.1.0941: macros for MS-Windows are inconsistent
Bram Moolenaar <Bram@vim.org>
parents: 15636
diff changeset
2094 # if defined(FEAT_GUI_MSWIN) && defined(FEAT_TEAROFF)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2095 || menu_is_tearoff(menu->dname)
13369
244ff1b6d2ad patch 8.0.1558: no right-click menu in a terminal
Christian Brabandt <cb@256bit.org>
parents: 13244
diff changeset
2096 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2097 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2098 grey = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2099 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2100 grey = TRUE;
28303
9849df834f1d patch 8.2.4677: the Athena GUI support is outdated
Bram Moolenaar <Bram@vim.org>
parents: 27523
diff changeset
2101
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
2102 // Never hide a toplevel menu, it may make the menubar resize or
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
2103 // disappear. Same problem for ToolBar items.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2104 if (vim_strchr(p_go, GO_GREY) != NULL || menu->parent == NULL
13369
244ff1b6d2ad patch 8.0.1558: no right-click menu in a terminal
Christian Brabandt <cb@256bit.org>
parents: 13244
diff changeset
2105 # ifdef FEAT_TOOLBAR
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2106 || menu_is_toolbar(menu->parent->name)
13369
244ff1b6d2ad patch 8.0.1558: no right-click menu in a terminal
Christian Brabandt <cb@256bit.org>
parents: 13244
diff changeset
2107 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2108 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2109 gui_mch_menu_grey(menu, grey);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2110 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2111 gui_mch_menu_hidden(menu, grey);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2112 gui_update_menus_recurse(menu->children, mode);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2113 menu = menu->next;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2114 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2115 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2116
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2117 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2118 * Make sure only the valid menu items appear for this mode. If
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2119 * force_menu_update is not TRUE, then we only do this if the mode has changed
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2120 * since last time. If "modes" is not 0, then we use these modes instead.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2121 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2122 void
7827
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
2123 gui_update_menus(int modes)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2124 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2125 static int prev_mode = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2126 int mode = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2127
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2128 if (modes != 0x0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2129 mode = modes;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2130 else
13392
d5347779fb20 patch 8.0.1570: can't use :popup for a menu in the terminal
Christian Brabandt <cb@256bit.org>
parents: 13380
diff changeset
2131 mode = get_menu_mode_flag();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2132
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2133 if (force_menu_update || mode != prev_mode)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2134 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2135 gui_update_menus_recurse(root_menu, mode);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2136 gui_mch_draw_menubar();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2137 prev_mode = mode;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2138 force_menu_update = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2139 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2140 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2141
13369
244ff1b6d2ad patch 8.0.1558: no right-click menu in a terminal
Christian Brabandt <cb@256bit.org>
parents: 13244
diff changeset
2142 # if defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_MOTIF) \
575
f1d46f948241 updated for version 7.0163
vimboss
parents: 533
diff changeset
2143 || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_PHOTON) || defined(PROTO)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2144 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2145 * Check if a key is used as a mnemonic for a toplevel menu.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2146 * Case of the key is ignored.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2147 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2148 int
7827
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
2149 gui_is_menu_shortcut(int key)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2150 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2151 vimmenu_T *menu;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2152
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2153 if (key < 256)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2154 key = TOLOWER_LOC(key);
19934
3ff714d765ba patch 8.2.0523: loops are repeated
Bram Moolenaar <Bram@vim.org>
parents: 19685
diff changeset
2155 FOR_ALL_MENUS(menu)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2156 if (menu->mnemonic == key
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2157 || (menu->mnemonic < 256 && TOLOWER_LOC(menu->mnemonic) == key))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2158 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2159 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2160 }
13369
244ff1b6d2ad patch 8.0.1558: no right-click menu in a terminal
Christian Brabandt <cb@256bit.org>
parents: 13244
diff changeset
2161 # endif
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
2162 #endif // FEAT_GUI
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2163
15868
7fad90423bd2 patch 8.1.0941: macros for MS-Windows are inconsistent
Bram Moolenaar <Bram@vim.org>
parents: 15636
diff changeset
2164 #if (defined(FEAT_GUI_MSWIN) && defined(FEAT_TEAROFF)) || defined(PROTO)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2165
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2166 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2167 * Deal with tearoff items that are added like a menu item.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2168 * Currently only for Win32 GUI. Others may follow later.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2169 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2170
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2171 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2172 gui_mch_toggle_tearoffs(int enable)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2173 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2174 int pri_tab[MENUDEPTH + 1];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2175 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2176
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2177 if (enable)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2178 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2179 for (i = 0; i < MENUDEPTH; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2180 pri_tab[i] = 500;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2181 pri_tab[MENUDEPTH] = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2182 gui_create_tearoffs_recurse(root_menu, (char_u *)"", pri_tab, 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2183 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2184 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2185 gui_destroy_tearoffs_recurse(root_menu);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2186 s_tearoffs = enable;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2187 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2188
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2189 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2190 * Recursively add tearoff items
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2191 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2192 static void
7827
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
2193 gui_create_tearoffs_recurse(
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
2194 vimmenu_T *menu,
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
2195 const char_u *pname,
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
2196 int *pri_tab,
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
2197 int pri_idx)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2198 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2199 char_u *newpname = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2200 int len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2201 char_u *s;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2202 char_u *d;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2203
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2204 if (pri_tab[pri_idx + 1] != -1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2205 ++pri_idx;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2206 while (menu != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2207 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2208 if (menu->children != NULL && menu_is_menubar(menu->name))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2209 {
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
2210 // Add the menu name to the menu path. Insert a backslash before
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
2211 // dots (it's used to separate menu names).
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2212 len = (int)STRLEN(pname) + (int)STRLEN(menu->name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2213 for (s = menu->name; *s; ++s)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2214 if (*s == '.' || *s == '\\')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2215 ++len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2216 newpname = alloc(len + TEAR_LEN + 2);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2217 if (newpname != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2218 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2219 STRCPY(newpname, pname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2220 d = newpname + STRLEN(newpname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2221 for (s = menu->name; *s; ++s)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2222 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2223 if (*s == '.' || *s == '\\')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2224 *d++ = '\\';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2225 *d++ = *s;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2226 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2227 *d = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2228
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
2229 // check if tearoff already exists
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2230 if (STRCMP(menu->children->name, TEAR_STRING) != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2231 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2232 gui_add_tearoff(newpname, pri_tab, pri_idx - 1);
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
2233 *d = NUL; // remove TEAR_STRING
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2234 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2235
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2236 STRCAT(newpname, ".");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2237 gui_create_tearoffs_recurse(menu->children, newpname,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2238 pri_tab, pri_idx);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2239 vim_free(newpname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2240 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2241 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2242 menu = menu->next;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2243 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2244 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2245
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2246 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2247 * Add tear-off menu item for a submenu.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2248 * "tearpath" is the menu path, and must have room to add TEAR_STRING.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2249 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2250 static void
7827
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
2251 gui_add_tearoff(char_u *tearpath, int *pri_tab, int pri_idx)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2252 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2253 char_u *tbuf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2254 int t;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2255 vimmenu_T menuarg;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2256
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2257 tbuf = alloc(5 + (unsigned int)STRLEN(tearpath));
31728
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
2258 if (tbuf == NULL)
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
2259 return;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2260
31728
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
2261 tbuf[0] = K_SPECIAL;
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
2262 tbuf[1] = K_SECOND(K_TEAROFF);
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
2263 tbuf[2] = K_THIRD(K_TEAROFF);
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
2264 STRCPY(tbuf + 3, tearpath);
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
2265 STRCAT(tbuf + 3, "\r");
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2266
31728
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
2267 STRCAT(tearpath, ".");
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
2268 STRCAT(tearpath, TEAR_STRING);
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
2269
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
2270 // Priority of tear-off is always 1
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
2271 t = pri_tab[pri_idx + 1];
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
2272 pri_tab[pri_idx + 1] = 1;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2273
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2274 #ifdef FEAT_TOOLBAR
31728
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
2275 menuarg.iconfile = NULL;
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
2276 menuarg.iconidx = -1;
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
2277 menuarg.icon_builtin = FALSE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2278 #endif
31728
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
2279 menuarg.noremap[0] = REMAP_NONE;
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
2280 menuarg.silent[0] = TRUE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2281
31728
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
2282 menuarg.modes = MENU_ALL_MODES;
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
2283 add_menu_path(tearpath, &menuarg, pri_tab, tbuf, FALSE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2284
31728
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
2285 menuarg.modes = MENU_TIP_MODE;
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
2286 add_menu_path(tearpath, &menuarg, pri_tab,
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
2287 (char_u *)_("Tear off this menu"), FALSE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2288
31728
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
2289 pri_tab[pri_idx + 1] = t;
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
2290 vim_free(tbuf);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2291 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2292
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2293 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2294 * Recursively destroy tearoff items
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2295 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2296 static void
7827
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
2297 gui_destroy_tearoffs_recurse(vimmenu_T *menu)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2298 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2299 while (menu)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2300 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2301 if (menu->children)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2302 {
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
2303 // check if tearoff exists
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2304 if (STRCMP(menu->children->name, TEAR_STRING) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2305 {
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
2306 // Disconnect the item and free the memory
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2307 free_menu(&menu->children);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2308 }
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
2309 if (menu->children != NULL) // if not the last one
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2310 gui_destroy_tearoffs_recurse(menu->children);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2311 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2312 menu = menu->next;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2313 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2314 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2315
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
2316 #endif // FEAT_GUI_MSWIN && FEAT_TEAROFF
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2317
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2318 /*
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2319 * Execute "menu". Use by ":emenu" and the window toolbar.
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2320 * "eap" is NULL for the window toolbar.
32295
bea4ebf594c6 patch 9.0.1479: small source file problems; outdated list of distrib. files
Bram Moolenaar <Bram@vim.org>
parents: 31728
diff changeset
2321 * "mode_idx" specifies a MENU_INDEX_ value, use MENU_INDEX_INVALID to depend
bea4ebf594c6 patch 9.0.1479: small source file problems; outdated list of distrib. files
Bram Moolenaar <Bram@vim.org>
parents: 31728
diff changeset
2322 * on the current state.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2323 */
13369
244ff1b6d2ad patch 8.0.1558: no right-click menu in a terminal
Christian Brabandt <cb@256bit.org>
parents: 13244
diff changeset
2324 void
14952
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2325 execute_menu(exarg_T *eap, vimmenu_T *menu, int mode_idx)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2326 {
14952
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2327 int idx = mode_idx;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2328
14952
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2329 if (idx < 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2330 {
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
2331 // Use the Insert mode entry when returning to Insert mode.
32295
bea4ebf594c6 patch 9.0.1479: small source file problems; outdated list of distrib. files
Bram Moolenaar <Bram@vim.org>
parents: 31728
diff changeset
2332 if (restart_edit && current_sctx.sc_sid == 0)
14952
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2333 {
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2334 idx = MENU_INDEX_INSERT;
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2335 }
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2336 #ifdef FEAT_TERMINAL
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2337 else if (term_use_loop())
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2338 {
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2339 idx = MENU_INDEX_TERMINAL;
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2340 }
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2341 #endif
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2342 else if (VIsual_active)
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2343 {
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2344 idx = MENU_INDEX_VISUAL;
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2345 }
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2346 else if (eap != NULL && eap->addr_count)
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2347 {
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2348 pos_T tpos;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2349
14952
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2350 idx = MENU_INDEX_VISUAL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2351
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
2352 // GEDDES: This is not perfect - but it is a
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
2353 // quick way of detecting whether we are doing this from a
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
2354 // selection - see if the range matches up with the visual
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
2355 // select start and end.
14952
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2356 if ((curbuf->b_visual.vi_start.lnum == eap->line1)
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2357 && (curbuf->b_visual.vi_end.lnum) == eap->line2)
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2358 {
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
2359 // Set it up for visual mode - equivalent to gv.
14952
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2360 VIsual_mode = curbuf->b_visual.vi_mode;
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2361 tpos = curbuf->b_visual.vi_end;
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2362 curwin->w_cursor = curbuf->b_visual.vi_start;
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2363 curwin->w_curswant = curbuf->b_visual.vi_curswant;
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2364 }
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2365 else
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2366 {
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
2367 // Set it up for line-wise visual mode
14952
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2368 VIsual_mode = 'V';
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2369 curwin->w_cursor.lnum = eap->line1;
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2370 curwin->w_cursor.col = 1;
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2371 tpos.lnum = eap->line2;
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2372 tpos.col = MAXCOL;
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2373 tpos.coladd = 0;
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2374 }
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2375
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
2376 // Activate visual mode
14952
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2377 VIsual_active = TRUE;
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2378 VIsual_reselect = TRUE;
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2379 check_cursor();
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2380 VIsual = curwin->w_cursor;
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2381 curwin->w_cursor = tpos;
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2382
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2383 check_cursor();
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2384
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
2385 // Adjust the cursor to make sure it is in the correct pos
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
2386 // for exclusive mode
14952
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2387 if (*p_sel == 'e' && gchar_cursor() != NUL)
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2388 ++curwin->w_cursor.col;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2389 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2390 }
12521
718787498836 patch 8.0.1139: using window toolbar changes state
Christian Brabandt <cb@256bit.org>
parents: 12487
diff changeset
2391
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
2392 // For the WinBar menu always use the Normal mode menu.
29344
5f0039383340 patch 9.0.0015: with EXITFREE defined terminal menus are not cleared
Bram Moolenaar <Bram@vim.org>
parents: 29175
diff changeset
2393 if (idx == MENU_INDEX_INVALID || eap == NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2394 idx = MENU_INDEX_NORMAL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2395
29344
5f0039383340 patch 9.0.0015: with EXITFREE defined terminal menus are not cleared
Bram Moolenaar <Bram@vim.org>
parents: 29175
diff changeset
2396 if (menu->strings[idx] != NULL && (menu->modes & (1 << idx)))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2397 {
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
2398 // When executing a script or function execute the commands right now.
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
2399 // Also for the window toolbar.
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
2400 // Otherwise put them in the typeahead buffer.
23390
9a5f12b36273 patch 8.2.2238: Vim9: cannot load a Vim9 script without the +eval feature
Bram Moolenaar <Bram@vim.org>
parents: 22442
diff changeset
2401 if (eap == NULL || current_sctx.sc_sid != 0)
12521
718787498836 patch 8.0.1139: using window toolbar changes state
Christian Brabandt <cb@256bit.org>
parents: 12487
diff changeset
2402 {
718787498836 patch 8.0.1139: using window toolbar changes state
Christian Brabandt <cb@256bit.org>
parents: 12487
diff changeset
2403 save_state_T save_state;
718787498836 patch 8.0.1139: using window toolbar changes state
Christian Brabandt <cb@256bit.org>
parents: 12487
diff changeset
2404
718787498836 patch 8.0.1139: using window toolbar changes state
Christian Brabandt <cb@256bit.org>
parents: 12487
diff changeset
2405 ++ex_normal_busy;
718787498836 patch 8.0.1139: using window toolbar changes state
Christian Brabandt <cb@256bit.org>
parents: 12487
diff changeset
2406 if (save_current_state(&save_state))
718787498836 patch 8.0.1139: using window toolbar changes state
Christian Brabandt <cb@256bit.org>
parents: 12487
diff changeset
2407 exec_normal_cmd(menu->strings[idx], menu->noremap[idx],
36
125e80798a85 updated for version 7.0021
vimboss
parents: 26
diff changeset
2408 menu->silent[idx]);
12521
718787498836 patch 8.0.1139: using window toolbar changes state
Christian Brabandt <cb@256bit.org>
parents: 12487
diff changeset
2409 restore_current_state(&save_state);
718787498836 patch 8.0.1139: using window toolbar changes state
Christian Brabandt <cb@256bit.org>
parents: 12487
diff changeset
2410 --ex_normal_busy;
718787498836 patch 8.0.1139: using window toolbar changes state
Christian Brabandt <cb@256bit.org>
parents: 12487
diff changeset
2411 }
36
125e80798a85 updated for version 7.0021
vimboss
parents: 26
diff changeset
2412 else
125e80798a85 updated for version 7.0021
vimboss
parents: 26
diff changeset
2413 ins_typebuf(menu->strings[idx], menu->noremap[idx], 0,
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2414 TRUE, menu->silent[idx]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2415 }
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2416 else if (eap != NULL)
14952
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2417 {
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2418 char_u *mode;
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2419
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2420 switch (idx)
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2421 {
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2422 case MENU_INDEX_VISUAL:
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2423 mode = (char_u *)"Visual";
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2424 break;
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2425 case MENU_INDEX_SELECT:
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2426 mode = (char_u *)"Select";
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2427 break;
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2428 case MENU_INDEX_OP_PENDING:
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2429 mode = (char_u *)"Op-pending";
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2430 break;
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2431 case MENU_INDEX_TERMINAL:
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2432 mode = (char_u *)"Terminal";
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2433 break;
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2434 case MENU_INDEX_INSERT:
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2435 mode = (char_u *)"Insert";
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2436 break;
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2437 case MENU_INDEX_CMDLINE:
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2438 mode = (char_u *)"Cmdline";
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2439 break;
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2440 // case MENU_INDEX_TIP: cannot happen
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2441 default:
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2442 mode = (char_u *)"Normal";
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2443 }
26909
aa65d1808bd0 patch 8.2.3983: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26887
diff changeset
2444 semsg(_(e_menu_not_defined_for_str_mode), mode);
14952
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2445 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2446 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2447
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2448 /*
19657
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2449 * Lookup a menu by the descriptor name e.g. "File.New"
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2450 * Returns NULL if the menu is not found
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2451 */
19657
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2452 static vimmenu_T *
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2453 menu_getbyname(char_u *name_arg)
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2454 {
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2455 char_u *name;
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2456 char_u *saved_name;
19657
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2457 vimmenu_T *menu;
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2458 char_u *p;
14952
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2459 int gave_emsg = FALSE;
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2460
19657
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2461 saved_name = vim_strsave(name_arg);
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2462 if (saved_name == NULL)
19657
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2463 return NULL;
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2464
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2465 menu = *get_root_menu(saved_name);
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2466 name = saved_name;
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2467 while (*name)
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2468 {
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
2469 // Find in the menu hierarchy
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2470 p = menu_name_skip(name);
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2471
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2472 while (menu != NULL)
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2473 {
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2474 if (menu_name_equal(name, menu))
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2475 {
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2476 if (*p == NUL && menu->children != NULL)
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2477 {
26909
aa65d1808bd0 patch 8.2.3983: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26887
diff changeset
2478 emsg(_(e_menu_path_must_lead_to_menu_item));
14952
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2479 gave_emsg = TRUE;
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2480 menu = NULL;
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2481 }
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2482 else if (*p != NUL && menu->children == NULL)
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2483 {
26909
aa65d1808bd0 patch 8.2.3983: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26887
diff changeset
2484 emsg(_(e_part_of_menu_item_path_is_not_sub_menu));
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2485 menu = NULL;
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2486 }
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2487 break;
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2488 }
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2489 menu = menu->next;
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2490 }
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2491 if (menu == NULL || *p == NUL)
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2492 break;
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2493 menu = menu->children;
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2494 name = p;
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2495 }
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2496 vim_free(saved_name);
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2497 if (menu == NULL)
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2498 {
14952
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2499 if (!gave_emsg)
26909
aa65d1808bd0 patch 8.2.3983: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26887
diff changeset
2500 semsg(_(e_menu_not_found_str), name_arg);
19657
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2501 return NULL;
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2502 }
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2503
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2504 return menu;
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2505 }
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2506
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2507 /*
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2508 * Given a menu descriptor, e.g. "File.New", find it in the menu hierarchy and
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2509 * execute it.
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2510 */
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2511 void
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2512 ex_emenu(exarg_T *eap)
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2513 {
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2514 vimmenu_T *menu;
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2515 char_u *arg = eap->arg;
32295
bea4ebf594c6 patch 9.0.1479: small source file problems; outdated list of distrib. files
Bram Moolenaar <Bram@vim.org>
parents: 31728
diff changeset
2516 int mode_idx = MENU_INDEX_INVALID;
19657
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2517
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2518 if (arg[0] && VIM_ISWHITE(arg[1]))
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2519 {
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2520 switch (arg[0])
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2521 {
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2522 case 'n': mode_idx = MENU_INDEX_NORMAL; break;
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2523 case 'v': mode_idx = MENU_INDEX_VISUAL; break;
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2524 case 's': mode_idx = MENU_INDEX_SELECT; break;
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2525 case 'o': mode_idx = MENU_INDEX_OP_PENDING; break;
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2526 case 't': mode_idx = MENU_INDEX_TERMINAL; break;
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2527 case 'i': mode_idx = MENU_INDEX_INSERT; break;
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2528 case 'c': mode_idx = MENU_INDEX_CMDLINE; break;
26865
bce848ec8b1b patch 8.2.3961: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
2529 default: semsg(_(e_invalid_argument_str), arg);
19657
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2530 return;
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2531 }
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2532 arg = skipwhite(arg + 2);
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2533 }
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2534
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2535 menu = menu_getbyname(arg);
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2536 if (menu == NULL)
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2537 return;
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2538
14952
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2539 // Found the menu, so execute.
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2540 execute_menu(eap, menu, mode_idx);
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2541 }
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2542
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2543 /*
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2544 * Handle a click in the window toolbar of "wp" at column "col".
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2545 */
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2546 void
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2547 winbar_click(win_T *wp, int col)
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2548 {
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2549 int idx;
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2550
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2551 if (wp->w_winbar_items == NULL)
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2552 return;
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2553 for (idx = 0; wp->w_winbar_items[idx].wb_menu != NULL; ++idx)
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2554 {
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2555 winbar_item_T *item = &wp->w_winbar_items[idx];
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2556
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2557 if (col >= item->wb_startcol && col <= item->wb_endcol)
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2558 {
16521
a7299d144bb9 patch 8.1.1264: crash when closing window from WinBar click
Bram Moolenaar <Bram@vim.org>
parents: 16393
diff changeset
2559 win_T *save_curwin = NULL;
12521
718787498836 patch 8.0.1139: using window toolbar changes state
Christian Brabandt <cb@256bit.org>
parents: 12487
diff changeset
2560 pos_T save_visual = VIsual;
718787498836 patch 8.0.1139: using window toolbar changes state
Christian Brabandt <cb@256bit.org>
parents: 12487
diff changeset
2561 int save_visual_active = VIsual_active;
718787498836 patch 8.0.1139: using window toolbar changes state
Christian Brabandt <cb@256bit.org>
parents: 12487
diff changeset
2562 int save_visual_select = VIsual_select;
718787498836 patch 8.0.1139: using window toolbar changes state
Christian Brabandt <cb@256bit.org>
parents: 12487
diff changeset
2563 int save_visual_reselect = VIsual_reselect;
718787498836 patch 8.0.1139: using window toolbar changes state
Christian Brabandt <cb@256bit.org>
parents: 12487
diff changeset
2564 int save_visual_mode = VIsual_mode;
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2565
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2566 if (wp != curwin)
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2567 {
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
2568 // Clicking in the window toolbar of a not-current window.
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
2569 // Make that window the current one and save Visual mode.
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2570 save_curwin = curwin;
12521
718787498836 patch 8.0.1139: using window toolbar changes state
Christian Brabandt <cb@256bit.org>
parents: 12487
diff changeset
2571 VIsual_active = FALSE;
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2572 curwin = wp;
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2573 curbuf = curwin->w_buffer;
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2574 check_cursor();
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2575 }
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2576
16521
a7299d144bb9 patch 8.1.1264: crash when closing window from WinBar click
Bram Moolenaar <Bram@vim.org>
parents: 16393
diff changeset
2577 // Note: the command might close the current window.
14952
405309f9dd13 patch 8.1.0487: no menus specifically for the terminal window
Bram Moolenaar <Bram@vim.org>
parents: 14700
diff changeset
2578 execute_menu(NULL, item->wb_menu, -1);
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2579
16521
a7299d144bb9 patch 8.1.1264: crash when closing window from WinBar click
Bram Moolenaar <Bram@vim.org>
parents: 16393
diff changeset
2580 if (save_curwin != NULL && win_valid(save_curwin))
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2581 {
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2582 curwin = save_curwin;
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2583 curbuf = curwin->w_buffer;
12521
718787498836 patch 8.0.1139: using window toolbar changes state
Christian Brabandt <cb@256bit.org>
parents: 12487
diff changeset
2584 VIsual = save_visual;
718787498836 patch 8.0.1139: using window toolbar changes state
Christian Brabandt <cb@256bit.org>
parents: 12487
diff changeset
2585 VIsual_active = save_visual_active;
718787498836 patch 8.0.1139: using window toolbar changes state
Christian Brabandt <cb@256bit.org>
parents: 12487
diff changeset
2586 VIsual_select = save_visual_select;
718787498836 patch 8.0.1139: using window toolbar changes state
Christian Brabandt <cb@256bit.org>
parents: 12487
diff changeset
2587 VIsual_reselect = save_visual_reselect;
718787498836 patch 8.0.1139: using window toolbar changes state
Christian Brabandt <cb@256bit.org>
parents: 12487
diff changeset
2588 VIsual_mode = save_visual_mode;
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2589 }
16521
a7299d144bb9 patch 8.1.1264: crash when closing window from WinBar click
Bram Moolenaar <Bram@vim.org>
parents: 16393
diff changeset
2590 if (!win_valid(wp))
a7299d144bb9 patch 8.1.1264: crash when closing window from WinBar click
Bram Moolenaar <Bram@vim.org>
parents: 16393
diff changeset
2591 break;
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2592 }
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2593 }
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2594 }
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2595
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2596 #if defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_GTK) \
19526
22f0dda71638 patch 8.2.0320: no Haiku support
Bram Moolenaar <Bram@vim.org>
parents: 18800
diff changeset
2597 || defined(FEAT_TERM_POPUP_MENU) || defined(FEAT_GUI_HAIKU) \
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2598 || defined(FEAT_BEVAL_TIP) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2599 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2600 * Given a menu descriptor, e.g. "File.New", find it in the menu hierarchy.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2601 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2602 vimmenu_T *
7827
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
2603 gui_find_menu(char_u *path_name)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2604 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2605 vimmenu_T *menu = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2606 char_u *name;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2607 char_u *saved_name;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2608 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2609
12487
3f16cf18386c patch 8.0.1123: cannot define a toolbar for a window
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
2610 menu = *get_root_menu(path_name);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2611
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2612 saved_name = vim_strsave(path_name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2613 if (saved_name == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2614 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2615
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2616 name = saved_name;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2617 while (*name)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2618 {
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
2619 // find the end of one dot-separated name and put a NUL at the dot
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2620 p = menu_name_skip(name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2621
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2622 while (menu != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2623 {
2676
8464d084fa74 updated for version 7.3.095
Bram Moolenaar <bram@vim.org>
parents: 2311
diff changeset
2624 if (menu_name_equal(name, menu))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2625 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2626 if (menu->children == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2627 {
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
2628 // found a menu item instead of a sub-menu
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2629 if (*p == NUL)
26909
aa65d1808bd0 patch 8.2.3983: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26887
diff changeset
2630 emsg(_(e_menu_path_must_lead_to_sub_menu));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2631 else
26909
aa65d1808bd0 patch 8.2.3983: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26887
diff changeset
2632 emsg(_(e_part_of_menu_item_path_is_not_sub_menu));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2633 menu = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2634 goto theend;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2635 }
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
2636 if (*p == NUL) // found a full match
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2637 goto theend;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2638 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2639 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2640 menu = menu->next;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2641 }
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
2642 if (menu == NULL) // didn't find it
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2643 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2644
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
2645 // Found a match, search the sub-menu.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2646 menu = menu->children;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2647 name = p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2648 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2649
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2650 if (menu == NULL)
26909
aa65d1808bd0 patch 8.2.3983: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26887
diff changeset
2651 emsg(_(e_menu_not_found_check_menu_names));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2652 theend:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2653 vim_free(saved_name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2654 return menu;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2655 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2656 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2657
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2658 #ifdef FEAT_MULTI_LANG
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2659 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2660 * Translation of menu names. Just a simple lookup table.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2661 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2662
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2663 typedef struct
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2664 {
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
2665 char_u *from; // English name
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
2666 char_u *from_noamp; // same, without '&'
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
2667 char_u *to; // translated name
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2668 } menutrans_T;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2669
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2670 static garray_T menutrans_ga = {0, 0, 0, 0, NULL};
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2671 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2672
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2673 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2674 * ":menutrans".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2675 * This function is also defined without the +multi_lang feature, in which
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2676 * case the commands are ignored.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2677 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2678 void
7827
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
2679 ex_menutranslate(exarg_T *eap UNUSED)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2680 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2681 #ifdef FEAT_MULTI_LANG
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2682 char_u *arg = eap->arg;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2683 menutrans_T *tp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2684 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2685 char_u *from, *from_noamp, *to;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2686
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2687 if (menutrans_ga.ga_itemsize == 0)
27028
c9474ae175f4 patch 8.2.4043: using int for second argument of ga_init2()
Bram Moolenaar <Bram@vim.org>
parents: 26958
diff changeset
2688 ga_init2(&menutrans_ga, sizeof(menutrans_T), 5);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2689
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2690 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2691 * ":menutrans clear": clear all translations.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2692 */
20116
513c62184ed8 patch 8.2.0613: Vim9: no check for space before #comment
Bram Moolenaar <Bram@vim.org>
parents: 19934
diff changeset
2693 if (STRNCMP(arg, "clear", 5) == 0 && ends_excmd2(arg, skipwhite(arg + 5)))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2694 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2695 tp = (menutrans_T *)menutrans_ga.ga_data;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2696 for (i = 0; i < menutrans_ga.ga_len; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2697 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2698 vim_free(tp[i].from);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2699 vim_free(tp[i].from_noamp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2700 vim_free(tp[i].to);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2701 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2702 ga_clear(&menutrans_ga);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2703 # ifdef FEAT_EVAL
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
2704 // Delete all "menutrans_" global variables.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2705 del_menutrans_vars();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2706 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2707 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2708 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2709 {
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
2710 // ":menutrans from to": add translation
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2711 from = arg;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2712 arg = menu_skip_part(arg);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2713 to = skipwhite(arg);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2714 *arg = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2715 arg = menu_skip_part(to);
20116
513c62184ed8 patch 8.2.0613: Vim9: no check for space before #comment
Bram Moolenaar <Bram@vim.org>
parents: 19934
diff changeset
2716 if (arg == to || ends_excmd2(eap->arg, from)
513c62184ed8 patch 8.2.0613: Vim9: no check for space before #comment
Bram Moolenaar <Bram@vim.org>
parents: 19934
diff changeset
2717 || ends_excmd2(eap->arg, to)
513c62184ed8 patch 8.2.0613: Vim9: no check for space before #comment
Bram Moolenaar <Bram@vim.org>
parents: 19934
diff changeset
2718 || !ends_excmd2(eap->arg, skipwhite(arg)))
26865
bce848ec8b1b patch 8.2.3961: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
2719 emsg(_(e_invalid_argument));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2720 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2721 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2722 if (ga_grow(&menutrans_ga, 1) == OK)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2723 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2724 tp = (menutrans_T *)menutrans_ga.ga_data;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2725 from = vim_strsave(from);
838
8e5830943bff updated for version 7.0e04
vimboss
parents: 835
diff changeset
2726 if (from != NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2727 {
838
8e5830943bff updated for version 7.0e04
vimboss
parents: 835
diff changeset
2728 from_noamp = menu_text(from, NULL, NULL);
20830
9064044fd4f6 patch 8.2.0967: unnecessary type casts for vim_strnsave()
Bram Moolenaar <Bram@vim.org>
parents: 20116
diff changeset
2729 to = vim_strnsave(to, arg - to);
838
8e5830943bff updated for version 7.0e04
vimboss
parents: 835
diff changeset
2730 if (from_noamp != NULL && to != NULL)
8e5830943bff updated for version 7.0e04
vimboss
parents: 835
diff changeset
2731 {
2150
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
2732 menu_translate_tab_and_shift(from);
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
2733 menu_translate_tab_and_shift(to);
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
2734 menu_unescape_name(from);
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
2735 menu_unescape_name(to);
838
8e5830943bff updated for version 7.0e04
vimboss
parents: 835
diff changeset
2736 tp[menutrans_ga.ga_len].from = from;
8e5830943bff updated for version 7.0e04
vimboss
parents: 835
diff changeset
2737 tp[menutrans_ga.ga_len].from_noamp = from_noamp;
8e5830943bff updated for version 7.0e04
vimboss
parents: 835
diff changeset
2738 tp[menutrans_ga.ga_len].to = to;
8e5830943bff updated for version 7.0e04
vimboss
parents: 835
diff changeset
2739 ++menutrans_ga.ga_len;
8e5830943bff updated for version 7.0e04
vimboss
parents: 835
diff changeset
2740 }
8e5830943bff updated for version 7.0e04
vimboss
parents: 835
diff changeset
2741 else
8e5830943bff updated for version 7.0e04
vimboss
parents: 835
diff changeset
2742 {
8e5830943bff updated for version 7.0e04
vimboss
parents: 835
diff changeset
2743 vim_free(from);
8e5830943bff updated for version 7.0e04
vimboss
parents: 835
diff changeset
2744 vim_free(from_noamp);
8e5830943bff updated for version 7.0e04
vimboss
parents: 835
diff changeset
2745 vim_free(to);
8e5830943bff updated for version 7.0e04
vimboss
parents: 835
diff changeset
2746 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2747 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2748 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2749 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2750 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2751 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2752 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2753
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2754 #if defined(FEAT_MULTI_LANG) || defined(FEAT_TOOLBAR)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2755 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2756 * Find the character just after one part of a menu name.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2757 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2758 static char_u *
7827
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
2759 menu_skip_part(char_u *p)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2760 {
11129
f4ea50924c6d patch 8.0.0452: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents: 11127
diff changeset
2761 while (*p != NUL && *p != '.' && !VIM_ISWHITE(*p))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2762 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2763 if ((*p == '\\' || *p == Ctrl_V) && p[1] != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2764 ++p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2765 ++p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2766 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2767 return p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2768 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2769 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2770
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2771 #ifdef FEAT_MULTI_LANG
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2772 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2773 * Lookup part of a menu name in the translations.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2774 * Return a pointer to the translation or NULL if not found.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2775 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2776 static char_u *
7827
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
2777 menutrans_lookup(char_u *name, int len)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2778 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2779 menutrans_T *tp = (menutrans_T *)menutrans_ga.ga_data;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2780 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2781 char_u *dname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2782
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2783 for (i = 0; i < menutrans_ga.ga_len; ++i)
11044
eb3a2ff3309a patch 8.0.0411: menu translations don't match when case is changed.
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
2784 if (STRNICMP(name, tp[i].from, len) == 0 && tp[i].from[len] == NUL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2785 return tp[i].to;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2786
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
2787 // Now try again while ignoring '&' characters.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2788 i = name[len];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2789 name[len] = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2790 dname = menu_text(name, NULL, NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2791 name[len] = i;
31728
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
2792 if (dname == NULL)
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
2793 return NULL;
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
2794
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
2795 for (i = 0; i < menutrans_ga.ga_len; ++i)
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
2796 if (STRICMP(dname, tp[i].from_noamp) == 0)
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
2797 {
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
2798 vim_free(dname);
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
2799 return tp[i].to;
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
2800 }
238ca27dbfd2 patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31079
diff changeset
2801 vim_free(dname);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2802
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2803 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2804 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2805
2150
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
2806 /*
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
2807 * Unescape the name in the translate dictionary table.
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
2808 */
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
2809 static void
7827
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
2810 menu_unescape_name(char_u *name)
2150
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
2811 {
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
2812 char_u *p;
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
2813
11127
506f5d8b7d8b patch 8.0.0451: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents: 11044
diff changeset
2814 for (p = name; *p && *p != '.'; MB_PTR_ADV(p))
2150
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
2815 if (*p == '\\')
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
2816 STRMOVE(p, p + 1);
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
2817 }
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
2818 #endif // FEAT_MULTI_LANG
2150
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
2819
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
2820 /*
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
2821 * Isolate the menu name.
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
2822 * Skip the menu name, and translate <Tab> into a real TAB.
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
2823 */
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
2824 static char_u *
7827
41789f16d6b2 commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents: 7803
diff changeset
2825 menu_translate_tab_and_shift(char_u *arg_start)
2150
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
2826 {
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
2827 char_u *arg = arg_start;
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
2828
11129
f4ea50924c6d patch 8.0.0452: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents: 11127
diff changeset
2829 while (*arg && !VIM_ISWHITE(*arg))
2150
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
2830 {
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
2831 if ((*arg == '\\' || *arg == Ctrl_V) && arg[1] != NUL)
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
2832 arg++;
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
2833 else if (STRNICMP(arg, "<TAB>", 5) == 0)
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
2834 {
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
2835 *arg = TAB;
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
2836 STRMOVE(arg + 1, arg + 5);
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
2837 }
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
2838 arg++;
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
2839 }
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
2840 if (*arg != NUL)
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
2841 *arg++ = NUL;
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
2842 arg = skipwhite(arg);
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
2843
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
2844 return arg;
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
2845 }
4269a0673478 updated for version 7.2.432
Bram Moolenaar <bram@zimbu.org>
parents: 2149
diff changeset
2846
19657
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2847 /*
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2848 * Get the information about a menu item in mode 'which'
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2849 */
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2850 static int
25850
6f615b2fdc66 patch 8.2.3459: Vim9: need more tests for empty string arguments
Bram Moolenaar <Bram@vim.org>
parents: 25384
diff changeset
2851 menuitem_getinfo(char_u *menu_name, vimmenu_T *menu, int modes, dict_T *dict)
19657
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2852 {
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2853 int status;
25850
6f615b2fdc66 patch 8.2.3459: Vim9: need more tests for empty string arguments
Bram Moolenaar <Bram@vim.org>
parents: 25384
diff changeset
2854 list_T *l;
6f615b2fdc66 patch 8.2.3459: Vim9: need more tests for empty string arguments
Bram Moolenaar <Bram@vim.org>
parents: 25384
diff changeset
2855
6f615b2fdc66 patch 8.2.3459: Vim9: need more tests for empty string arguments
Bram Moolenaar <Bram@vim.org>
parents: 25384
diff changeset
2856 if (*menu_name == NUL)
6f615b2fdc66 patch 8.2.3459: Vim9: need more tests for empty string arguments
Bram Moolenaar <Bram@vim.org>
parents: 25384
diff changeset
2857 {
6f615b2fdc66 patch 8.2.3459: Vim9: need more tests for empty string arguments
Bram Moolenaar <Bram@vim.org>
parents: 25384
diff changeset
2858 // Return all the top-level menus
6f615b2fdc66 patch 8.2.3459: Vim9: need more tests for empty string arguments
Bram Moolenaar <Bram@vim.org>
parents: 25384
diff changeset
2859 vimmenu_T *topmenu;
6f615b2fdc66 patch 8.2.3459: Vim9: need more tests for empty string arguments
Bram Moolenaar <Bram@vim.org>
parents: 25384
diff changeset
2860
6f615b2fdc66 patch 8.2.3459: Vim9: need more tests for empty string arguments
Bram Moolenaar <Bram@vim.org>
parents: 25384
diff changeset
2861 l = list_alloc();
6f615b2fdc66 patch 8.2.3459: Vim9: need more tests for empty string arguments
Bram Moolenaar <Bram@vim.org>
parents: 25384
diff changeset
2862 if (l == NULL)
6f615b2fdc66 patch 8.2.3459: Vim9: need more tests for empty string arguments
Bram Moolenaar <Bram@vim.org>
parents: 25384
diff changeset
2863 return FAIL;
6f615b2fdc66 patch 8.2.3459: Vim9: need more tests for empty string arguments
Bram Moolenaar <Bram@vim.org>
parents: 25384
diff changeset
2864
6f615b2fdc66 patch 8.2.3459: Vim9: need more tests for empty string arguments
Bram Moolenaar <Bram@vim.org>
parents: 25384
diff changeset
2865 dict_add_list(dict, "submenus", l);
6f615b2fdc66 patch 8.2.3459: Vim9: need more tests for empty string arguments
Bram Moolenaar <Bram@vim.org>
parents: 25384
diff changeset
2866 // get all the children. Skip PopUp[nvoci].
6f615b2fdc66 patch 8.2.3459: Vim9: need more tests for empty string arguments
Bram Moolenaar <Bram@vim.org>
parents: 25384
diff changeset
2867 for (topmenu = menu; topmenu != NULL; topmenu = topmenu->next)
6f615b2fdc66 patch 8.2.3459: Vim9: need more tests for empty string arguments
Bram Moolenaar <Bram@vim.org>
parents: 25384
diff changeset
2868 if (!menu_is_hidden(topmenu->dname))
6f615b2fdc66 patch 8.2.3459: Vim9: need more tests for empty string arguments
Bram Moolenaar <Bram@vim.org>
parents: 25384
diff changeset
2869 list_append_string(l, topmenu->dname, -1);
6f615b2fdc66 patch 8.2.3459: Vim9: need more tests for empty string arguments
Bram Moolenaar <Bram@vim.org>
parents: 25384
diff changeset
2870 return OK;
6f615b2fdc66 patch 8.2.3459: Vim9: need more tests for empty string arguments
Bram Moolenaar <Bram@vim.org>
parents: 25384
diff changeset
2871 }
19657
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2872
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2873 if (menu_is_tearoff(menu->dname)) // skip tearoff menu item
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2874 return OK;
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2875
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2876 status = dict_add_string(dict, "name", menu->name);
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2877 if (status == OK)
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2878 status = dict_add_string(dict, "display", menu->dname);
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2879 if (status == OK && menu->actext != NULL)
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2880 status = dict_add_string(dict, "accel", menu->actext);
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2881 if (status == OK)
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2882 status = dict_add_number(dict, "priority", menu->priority);
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2883 if (status == OK)
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2884 status = dict_add_string(dict, "modes",
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2885 get_menu_mode_str(menu->modes));
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2886 #ifdef FEAT_TOOLBAR
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2887 if (status == OK && menu->iconfile != NULL)
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2888 status = dict_add_string(dict, "icon", menu->iconfile);
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2889 if (status == OK && menu->iconidx >= 0)
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2890 status = dict_add_number(dict, "iconidx", menu->iconidx);
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2891 #endif
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2892 if (status == OK)
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2893 {
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2894 char_u buf[NUMBUFLEN];
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2895
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2896 if (has_mbyte)
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2897 buf[utf_char2bytes(menu->mnemonic, buf)] = NUL;
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2898 else
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2899 {
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2900 buf[0] = (char_u)menu->mnemonic;
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2901 buf[1] = NUL;
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2902 }
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2903 status = dict_add_string(dict, "shortcut", buf);
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2904 }
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2905 if (status == OK && menu->children == NULL)
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2906 {
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2907 int bit;
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2908
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2909 // Get the first mode in which the menu is available
19671
897cb43a5c72 patch 8.2.0392: Coverity warns for using array index out of range
Bram Moolenaar <Bram@vim.org>
parents: 19657
diff changeset
2910 for (bit = 0; bit < MENU_MODES && !((1 << bit) & modes); bit++)
19657
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2911 ;
19671
897cb43a5c72 patch 8.2.0392: Coverity warns for using array index out of range
Bram Moolenaar <Bram@vim.org>
parents: 19657
diff changeset
2912 if (bit < MENU_MODES) // just in case, avoid Coverity warning
897cb43a5c72 patch 8.2.0392: Coverity warns for using array index out of range
Bram Moolenaar <Bram@vim.org>
parents: 19657
diff changeset
2913 {
897cb43a5c72 patch 8.2.0392: Coverity warns for using array index out of range
Bram Moolenaar <Bram@vim.org>
parents: 19657
diff changeset
2914 if (menu->strings[bit] != NULL)
19685
d64f403289db patch 8.2.0399: various memory leaks
Bram Moolenaar <Bram@vim.org>
parents: 19671
diff changeset
2915 {
d64f403289db patch 8.2.0399: various memory leaks
Bram Moolenaar <Bram@vim.org>
parents: 19671
diff changeset
2916 char_u *tofree = NULL;
d64f403289db patch 8.2.0399: various memory leaks
Bram Moolenaar <Bram@vim.org>
parents: 19671
diff changeset
2917
19671
897cb43a5c72 patch 8.2.0392: Coverity warns for using array index out of range
Bram Moolenaar <Bram@vim.org>
parents: 19657
diff changeset
2918 status = dict_add_string(dict, "rhs",
897cb43a5c72 patch 8.2.0392: Coverity warns for using array index out of range
Bram Moolenaar <Bram@vim.org>
parents: 19657
diff changeset
2919 *menu->strings[bit] == NUL
19685
d64f403289db patch 8.2.0399: various memory leaks
Bram Moolenaar <Bram@vim.org>
parents: 19671
diff changeset
2920 ? (char_u *)"<Nop>"
d64f403289db patch 8.2.0399: various memory leaks
Bram Moolenaar <Bram@vim.org>
parents: 19671
diff changeset
2921 : (tofree = str2special_save(
30226
b6b803ed4a53 patch 9.0.0449: there is no easy way to translate a key code into a string
Bram Moolenaar <Bram@vim.org>
parents: 29732
diff changeset
2922 menu->strings[bit], FALSE, FALSE)));
19685
d64f403289db patch 8.2.0399: various memory leaks
Bram Moolenaar <Bram@vim.org>
parents: 19671
diff changeset
2923 vim_free(tofree);
d64f403289db patch 8.2.0399: various memory leaks
Bram Moolenaar <Bram@vim.org>
parents: 19671
diff changeset
2924 }
19671
897cb43a5c72 patch 8.2.0392: Coverity warns for using array index out of range
Bram Moolenaar <Bram@vim.org>
parents: 19657
diff changeset
2925 if (status == OK)
897cb43a5c72 patch 8.2.0392: Coverity warns for using array index out of range
Bram Moolenaar <Bram@vim.org>
parents: 19657
diff changeset
2926 status = dict_add_bool(dict, "noremenu",
897cb43a5c72 patch 8.2.0392: Coverity warns for using array index out of range
Bram Moolenaar <Bram@vim.org>
parents: 19657
diff changeset
2927 menu->noremap[bit] == REMAP_NONE);
897cb43a5c72 patch 8.2.0392: Coverity warns for using array index out of range
Bram Moolenaar <Bram@vim.org>
parents: 19657
diff changeset
2928 if (status == OK)
897cb43a5c72 patch 8.2.0392: Coverity warns for using array index out of range
Bram Moolenaar <Bram@vim.org>
parents: 19657
diff changeset
2929 status = dict_add_bool(dict, "script",
897cb43a5c72 patch 8.2.0392: Coverity warns for using array index out of range
Bram Moolenaar <Bram@vim.org>
parents: 19657
diff changeset
2930 menu->noremap[bit] == REMAP_SCRIPT);
897cb43a5c72 patch 8.2.0392: Coverity warns for using array index out of range
Bram Moolenaar <Bram@vim.org>
parents: 19657
diff changeset
2931 if (status == OK)
897cb43a5c72 patch 8.2.0392: Coverity warns for using array index out of range
Bram Moolenaar <Bram@vim.org>
parents: 19657
diff changeset
2932 status = dict_add_bool(dict, "silent", menu->silent[bit]);
897cb43a5c72 patch 8.2.0392: Coverity warns for using array index out of range
Bram Moolenaar <Bram@vim.org>
parents: 19657
diff changeset
2933 if (status == OK)
897cb43a5c72 patch 8.2.0392: Coverity warns for using array index out of range
Bram Moolenaar <Bram@vim.org>
parents: 19657
diff changeset
2934 status = dict_add_bool(dict, "enabled",
897cb43a5c72 patch 8.2.0392: Coverity warns for using array index out of range
Bram Moolenaar <Bram@vim.org>
parents: 19657
diff changeset
2935 ((menu->enabled & (1 << bit)) != 0));
897cb43a5c72 patch 8.2.0392: Coverity warns for using array index out of range
Bram Moolenaar <Bram@vim.org>
parents: 19657
diff changeset
2936 }
19657
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2937 }
19671
897cb43a5c72 patch 8.2.0392: Coverity warns for using array index out of range
Bram Moolenaar <Bram@vim.org>
parents: 19657
diff changeset
2938
19657
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2939 // If there are submenus, add all the submenu display names
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2940 if (status == OK && menu->children != NULL)
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2941 {
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2942 vimmenu_T *child;
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2943
25850
6f615b2fdc66 patch 8.2.3459: Vim9: need more tests for empty string arguments
Bram Moolenaar <Bram@vim.org>
parents: 25384
diff changeset
2944 l = list_alloc();
19657
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2945 if (l == NULL)
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2946 return FAIL;
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2947
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2948 dict_add_list(dict, "submenus", l);
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2949 child = menu->children;
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2950 while (child)
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2951 {
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2952 if (!menu_is_tearoff(child->dname)) // skip tearoff menu
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2953 list_append_string(l, child->dname, -1);
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2954 child = child->next;
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2955 }
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2956 }
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2957
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2958 return status;
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2959 }
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2960
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2961 /*
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2962 * "menu_info()" function
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2963 * Return information about a menu (including all the child menus)
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2964 */
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2965 void
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2966 f_menu_info(typval_T *argvars, typval_T *rettv)
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2967 {
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2968 char_u *menu_name;
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2969 char_u *which;
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2970 int modes;
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2971 char_u *saved_name;
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2972 char_u *name;
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2973 vimmenu_T *menu;
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2974 dict_T *retdict;
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2975
29175
755ab148288b patch 8.2.5107: some callers of rettv_list_alloc() check for not OK
Bram Moolenaar <Bram@vim.org>
parents: 28809
diff changeset
2976 if (rettv_dict_alloc(rettv) == FAIL)
19657
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2977 return;
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2978 retdict = rettv->vval.v_dict;
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2979
25384
e8e2c4d33b9b patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents: 24768
diff changeset
2980 if (in_vim9script()
e8e2c4d33b9b patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents: 24768
diff changeset
2981 && (check_for_string_arg(argvars, 0) == FAIL
e8e2c4d33b9b patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents: 24768
diff changeset
2982 || check_for_opt_string_arg(argvars, 1) == FAIL))
e8e2c4d33b9b patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents: 24768
diff changeset
2983 return;
e8e2c4d33b9b patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents: 24768
diff changeset
2984
19657
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2985 menu_name = tv_get_string_chk(&argvars[0]);
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2986 if (menu_name == NULL)
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2987 return;
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2988
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2989 // menu mode
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2990 if (argvars[1].v_type != VAR_UNKNOWN)
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2991 which = tv_get_string_chk(&argvars[1]);
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2992 else
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2993 which = (char_u *)""; // Default is modes for "menu"
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2994 if (which == NULL)
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2995 return;
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2996
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2997 modes = get_menu_cmd_modes(which, *which == '!', NULL, NULL);
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2998
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
2999 // Locate the specified menu or menu item
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
3000 menu = *get_root_menu(menu_name);
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
3001 saved_name = vim_strsave(menu_name);
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
3002 if (saved_name == NULL)
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
3003 return;
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
3004 if (*saved_name != NUL)
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
3005 {
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
3006 char_u *p;
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
3007
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
3008 name = saved_name;
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
3009 while (*name)
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
3010 {
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
3011 // Find in the menu hierarchy
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
3012 p = menu_name_skip(name);
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
3013 while (menu != NULL)
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
3014 {
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
3015 if (menu_name_equal(name, menu))
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
3016 break;
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
3017 menu = menu->next;
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
3018 }
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
3019 if (menu == NULL || *p == NUL)
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
3020 break;
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
3021 menu = menu->children;
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
3022 name = p;
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
3023 }
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
3024 }
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
3025 vim_free(saved_name);
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
3026
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
3027 if (menu == NULL) // specified menu not found
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
3028 return;
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
3029
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
3030 if (menu->modes & modes)
25850
6f615b2fdc66 patch 8.2.3459: Vim9: need more tests for empty string arguments
Bram Moolenaar <Bram@vim.org>
parents: 25384
diff changeset
3031 menuitem_getinfo(menu_name, menu, modes, retdict);
19657
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
3032 }
da791e5c0139 patch 8.2.0385: menu functionality insufficiently tested
Bram Moolenaar <Bram@vim.org>
parents: 19526
diff changeset
3033
18800
f41b55f9357c patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18742
diff changeset
3034 #endif // FEAT_MENU