1 #include "scr.h"
2 #include "dir.h"
3 #include "deco.h"
4 #include "menu.h"
5
6 /* menu handler */
7
8 menufunc setfull, setdwid, reread, setstatus, directory;
9 menufunc genhelp, view, edit, quit, setpattern, makelink;
10 menufunc viewinfo, editinfo, setlang, redraw;
11 menufunc swappanels, switchpanels, shell, usermenu, cmpdir;
12 menufunc switchcmdreg, fullscreen, delete, findname;
13 menufunc copy, renmove, makedir, histmenu;
14 menufunc setshellname, setviewname, seteditname, writeinitfile;
15 menufunc switchalign, setsort, setrevsort, settypesort;
16 menufunc tagall, untagall, menuedit, extedit, switchhidden;
17
18 #ifdef S_IFLNK
19 menufunc makeslink;
20 #endif
21
22 static struct submenu lmenu [] = {
23 { "Brief", 'b', setfull, },
24 { "Long", 'l', setfull, },
25 { "Wide", 'w', setfull, },
26 { "Full", 'f', setfull, },
27 { "Info", 'i', setfull, },
28 { "Status ^L", 's', setstatus, },
29 { "Align extensions", 'a', switchalign, },
30 { "", 0, 0, },
31 { "sort by Name", 'n', setsort, },
32 { "eXtension", 'x', setsort, },
33 { "Time", 't', setsort, },
34 { "siZe", 'z', setsort, },
35 { "Unsorted", 'u', setsort, },
36 { "Reverse", 'r', setrevsort, },
37 { "sort by tYpe", 'y', settypesort, },
38 { "", 0, 0, },
39 { "Re-read ^R", 'r', reread, },
40 { "Pattern", 'p', setpattern, },
41 { 0, 0, 0, },
42 };
43
44 static struct submenu rmenu [] = {
45 { "Brief", 'b', setfull, },
46 { "Long", 'l', setfull, },
47 { "Wide", 'w', setfull, },
48 { "Full", 'f', setfull, },
49 { "Info", 'i', setfull, },
50 { "Status ^L", 's', setstatus, },
51 { "Align extensions", 'a', switchalign, },
52 { "", 0, 0, },
53 { "sort by Name", 'n', setsort, },
54 { "eXtension", 'x', setsort, },
55 { "Time", 't', setsort, },
56 { "siZe", 'z', setsort, },
57 { "Unsorted", 'u', setsort, },
58 { "Reverse", 'r', setrevsort, },
59 { "sort by tYpe", 'y', settypesort, },
60 { "", 0, 0, },
61 { "Re-read ^R", 'r', reread, },
62 { "Pattern", 'p', setpattern, },
63 { 0, 0, 0, },
64 };
65
66 static struct submenu fmenu [] = {
67 { "Help F1", 'h', genhelp, },
68 { "User menu F2", 'u', usermenu, },
69 { "View F3", 'v', view, },
70 { "View Info", 'i', viewinfo, },
71 { "Edit F4", 'e', edit, },
72 { "Edit Info", 'n', editinfo, },
73 { "Copy F5", 'c', copy, },
74 { "Link", 'l', makelink, },
75 #ifdef S_IFLNK
76 { "Symlink", 's', makeslink, },
77 #endif
78 { "Rename/move F6", 'r', renmove, },
79 { "Make directory F7", 'm', makedir, },
80 { "Delete F8", 'd', delete, },
81 { "", 0, 0, },
82 { "select Group +", 'g', tagall, },
83 { "Unselect group -", 'u', untagall, },
84 { "", 0, 0, },
85 { "Quit F10", 'q', quit, },
86 { 0, 0, 0, },
87 };
88
89 static struct submenu cmenu [] = {
90 { "run subShell", 's', shell, },
91 { "Compare directories", 'c', cmpdir, },
92 { "Find file ^K", 'f', findname, },
93 { "hIstory ^B", 'i', histmenu, },
94 { "", 0, 0, },
95 { "hOme directory ^\\", 'o', directory, },
96 { "Root directory ^^", 'r', directory, },
97 { "reDraw screen ^]", 'd', redraw, },
98 { "", 0, 0, },
99 { "Menu file edit", 'm', menuedit, },
100 { "eXtensions file edit", 'x', extedit, },
101 { 0, 0, 0, },
102 };
103
104 static struct submenu omenu [] = {
105 { "sWitch panels ^I", 'w', switchpanels, },
106 { "Swap panels ^U", 's', swappanels, },
107 { "Full screen ^F", 'f', fullscreen, },
108 { "Double width ^W", 'd', setdwid, },
109 { "Command line mode ^P", 'c', switchcmdreg, },
110 { "show hiddeN files", 'n', switchhidden, },
111 { "", 0, 0, },
112 { "Language...", 'l', setlang, },
113 { "Viewer...", 'v', setviewname, },
114 { "Editor...", 'e', seteditname, },
115 { "sHell...", 'h', setshellname, },
116 { "", 0, 0, },
117 { "sAve setup", 'a', writeinitfile, },
118 { 0, 0, 0, },
119 };
120
121 struct menu menu [] = {
122 { "Left", 'l', lmenu, },
123 { "Files", 'f', fmenu, },
124 { "Commands", 'c', cmenu, },
125 { "Options", 'o', omenu, },
126 { "Right", 'r', rmenu, },
127 { 0, 0, 0, },
128 };
129
130 int nmenu;
131
132 static int tag (int k, int sk);
133
runmenu(int mkey)134 void runmenu (int mkey)
135 {
136 register struct menu *m;
137 register struct submenu *sm;
138 int ret;
139
140 nmenu = 0;
141 for (m=menu; m->name; ++m) {
142 if (m->key == mkey)
143 nmenu = m-menu;
144 for (sm=m->submenu; sm->name; ++sm)
145 sm->active = sm->exec != 0;
146 m->nsm = -1;
147 downmenu (m);
148 }
149 oncemore:
150 for (m=menu; m->name; ++m) {
151 for (sm=m->submenu; sm->name; ++sm) {
152 sm->active = sm->exec != 0;
153 sm->tag = tag (m->key, sm->key);
154 }
155 }
156 ret = getmenu ();
157 if (! ret)
158 return;
159 m = &menu[nmenu];
160 sm = &m->submenu[m->nsm];
161 if (sm->exec)
162 (*sm->exec) (m->key, sm->key);
163 if (ret > 1)
164 goto oncemore;
165 }
166
tag(int k,int sk)167 static int tag (int k, int sk)
168 {
169 switch (k) {
170 case 'l':
171 switch (sk) {
172 case 'b': return (left.view==VIEW_BRIEF);
173 case 'w': return (left.view==VIEW_WIDE);
174 case 'l': return (left.view==VIEW_LONG ||
175 (!widewin && left.view==VIEW_FULL));
176 case 'f': return (widewin && left.view==VIEW_FULL);
177 case 'i': return (widewin && left.view==VIEW_INFO);
178 case 's': return (right.status);
179 case 'p': return (left.pattern[0]);
180 case 'n': return (left.sort == SORTNAME);
181 case 'x': return (left.sort == SORTEXT);
182 case 't': return (left.sort == SORTTIME);
183 case 'z': return (left.sort == SORTSIZE);
184 case 'u': return (left.sort == SORTSKIP);
185 case 'a': return (left.alignext);
186 case 'y': return (left.typesort);
187 case 'r': return (left.revsort);
188 }
189 break;
190 case 'r':
191 switch (sk) {
192 case 'b': return (right.view==VIEW_BRIEF);
193 case 'w': return (right.view==VIEW_WIDE);
194 case 'l': return (right.view==VIEW_LONG ||
195 (!widewin && right.view==VIEW_FULL));
196 case 'f': return (widewin && right.view==VIEW_FULL);
197 case 'i': return (widewin && right.view==VIEW_INFO);
198 case 's': return (left.status);
199 case 'p': return (right.pattern[0]);
200 case 'n': return (right.sort == SORTNAME);
201 case 'x': return (right.sort == SORTEXT);
202 case 't': return (right.sort == SORTTIME);
203 case 'z': return (right.sort == SORTSIZE);
204 case 'u': return (right.sort == SORTSKIP);
205 case 'a': return (right.alignext);
206 case 'y': return (right.typesort);
207 case 'r': return (right.revsort);
208 }
209 break;
210 case 'o':
211 switch (sk) {
212 case 's': return (left.basecol != 0);
213 case 'f': return (H == LINES-7);
214 case 'h': return (usecshell);
215 case 'd': return (widewin);
216 case 'c': return (cmdreg);
217 case 'v': return (userview);
218 case 'e': return (useredit);
219 case 'n': return (showhidden);
220 }
221 break;
222 }
223 return (0);
224 }
225