|
|
1.1 root 1: .ds ZZ DEVELOPMENT PACKAGE
2: .TH MENUHIT 3L "630 MTG"
3: .XE "menuhit()"
4: .SH NAME
5: menuhit \- present user with menu and get selection
6: .SH SYNOPSIS
7: .ft B
8: #include <dmd.h>
9: .sp
10: int menuhit (m, n)
11: .sp
12: Menu \(**m;
13: .br
14: int n;
15: .PP
16: .nf
17: \s-2
18: .ft CM
19: typedef struct Menu {
20: char **item; /* string array, ending with 0 */
21: short prevhit; /* retained from previous call */
22: short prevtop; /* retained from previous call */
23: char *(*generator)(); /* used if item == 0 */
24: } Menu;
25: .ft R
26: .fi
27: \s+2
28: .SH DESCRIPTION
29: The
30: .I menuhit
31: function
32: presents the user with a menu specified by the Menu pointer
33: .I m
34: and returns an integer indicating the selection made.
35: A returned 0 would indicate that the first item in the menu had been
36: selected; if a 1 is returned, the second item has been selected, etc.
37: A -1 indicates no selection.
38: The
39: .I n
40: argument is an integer which
41: specifies which button to use for the interaction: 1, 2 or 3.
42: The
43: .I menuhit
44: function
45: assumes that the button is already depressed when it is called.
46: The user makes a selection by lifting the button when the cursor
47: points to the desired selection.
48: Lifting the button outside the menu indicates no selection.
49: .PP
50: The maximum number of menu items displayed at any one time is 16 items.
51: When the number of items is 16 or less,
52: all the items are displayed and are centered one entry per line in the menu.
53: This is the normal menu mode.
54: When there are more than 16 menu items to be displayed, the menu becomes a
55: .B scrolling
56: menu.
57: The left portion of the menu contains a scroll bar which is
58: used for scrolling quickly through the menu selections.
59: The vertical size of the scroll bar is an indication of the size
60: of the user's view of the menu (16 items) relative to the number
61: of selections in the entire menu.
62: .PP
63: There are two ways to scroll through the menu items.
64: The first is to move the mouse cursor to the left side of the menu
65: into the scroll bar area.
66: By moving the mouse cursor up or down within the scroll bar area, the menu items
67: will scroll accordingly.
68: The second method used to scroll through the menu
69: items is to place the mouse cursor on the top or bottom entry of the menu
70: list. The menu will scroll up or down by one item at a time if
71: there are additional items to be displayed in that direction.
72: .PP
73: The \fIprevhit\fR variable is used to store the menu's previous selection.
74: When \fImenuhit\fR is called, the menu is displayed such that, if possible,
75: the mouse cursor will be displayed over the previous selection.
76: \f2Prevhit\f1 holds the index from the top of the displayed menu. The \fIprevtop\fR
77: variable is used to store the previous topmost item displayed in a scrolling menu.
78: The values of \f2prevhit\f1 and \f2prevtop\f1 are initialized to 0 and need not normally
79: be manipulated by the application program.
80: .PP
81: Menus may be generated dynamically from a program by specifying
82: a generator
83: function in the \f2Menu\f1 structure.
84: If
85: .I item
86: is set to 0 when \f2menuhit\f1 is called,
87: then the routine specified by \f2generator\f1
88: is called with one parameter which is an integer index beginning at 0.
89: The generator must return a pointer to a character string containing the text
90: for the corresponding menu item.
91: This generator function is called repeatedly
92: with the index increasing by 1 until the generator returns a \s-1NULL\s+1,
93: indicating the end of the menu selections.
94: The generator function is called
95: each time the \f2menuhit\f1 routine is called with item set to NULL (i.e., 0).
96: .PP
97: Another facility provided by
98: .I menuhit
99: is that of a spread character.
100: A spread character is any ascii character with the high-order bit set.
101: The spread character acts somewhat like a spring pushing against the adjacent text
102: and borders within a menu entry.
103: The spread character can be placed at the beginning, middle, or end
104: of the string defining the menu entry.
105: If placed at the beginning of the string,
106: the text in the menu item will be right-justified.
107: If placed at the end of the string,
108: the text will be left-justified.
109: If placed in the middle of the string, the text on each
110: side of the spread character will be pushed against the corresponding
111: menu border.
112: In each case,
113: the space created by the spread character will be filled in with
114: the ascii character contained in the spread character.
115: For entries without a spread character,
116: the default is to have the text centered.
117: .PP
118: Whenever a menu is displayed, the original screen image obscured by the menu is
119: saved in the terminal and then later restored when the menu disappears.
120: If the terminal is
121: out of memory and therefore cannot save the screen image,
122: then the menu will be displayed in \s-1XOR\s+1 (exclusive or) mode on top of the existing screen image.
123: Menu items may still be selected in this mode but the items might be hard to read.
124: To remedy this problem,
125: memory may be freed up by either deleting or
126: reshaping windows before the menu is displayed.
127: .SH EXAMPLE
128: The following example includes both a menu with the spread character
129: and a menu that is dynamically generated. Button 2 and Button 3 are used to
130: bring up the two menus and Button 1 exits.
131: .PP
132: .RS 0
133: \s-1
134: .nf
135: .ft CM
136: #include <dmd.h>
137:
138: char *menutext[] = {
139: "left\e240", /* space char with
140: high bit set */
141: "\e256right", /* . char with high
142: bit set */
143: "middle",
144: "left\e337right", /* _ char with high
145: bit set */
146: "a very long string",
147: NULL };
148: Menu menu = { menutext }; /* static menu */
149:
150: /* Note the above menu will appear as:
151:
152: --------------------
153: |left |
154: |.............right|
155: | middle |
156: |left_________right|
157: |a very long string|
158: --------------------
159: */
160:
161: char scrlstr[8]="scroll";
162:
163: char *
164: generate(i)
165: int i;
166: {
167: if (i>99) /* generator stopping condition */
168: return NULL;
169: else { /* generate test for items (ie. "scroll56") */
170: scrlstr[6] = i/10 + '0';
171: scrlstr[7] = i - (i/10 *10) + '0';
172: scrlstr[8] = '\\0';
173: }
174: return scrlstr;
175:
176: }
177:
178:
179: Menu menugen = {0, 0, 0, generate};
180: /* dynamically generated menu */
181:
182:
183: main()
184: {
185: int m;
186:
187: for (;;) {
188: request(MOUSE);
189: wait(MOUSE);
190: if (button1())
191: break;
192: else if (button2()) {
193: m = menuhit(&menugen,2);
194: lprintf("your selection was %d\en",m);
195: }
196: else if (button3()) {
197: m = menuhit(&menu,3);
198: lprintf("your selection was %d\en",m);
199: }
200: }
201:
202: }
203: \fR
204: .fi
205: .RE
206: \s+1
207: .SH SEE ALSO
208: tmenuhit(3R).
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.