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