|
|
1.1 ! root 1: .TH MENUHIT 9 ! 2: .CT 2 comm_term ! 3: .SH NAME ! 4: menuhit, hmenuhit \- present user with menu and get selection ! 5: .SH SYNOPSIS ! 6: .nf ! 7: .B #include <jerq.h> ! 8: .PP ! 9: .B int menuhit(m, b) ! 10: .B Menu *m; ! 11: .PP ! 12: .B #include <menu.h> ! 13: .PP ! 14: .B NMitem *hmenuhit(m, b) ! 15: .B NMenu *m; ! 16: .fi ! 17: .SH DESCRIPTION ! 18: .I Menuhit ! 19: presents the user with a menu specified by the Menu pointer ! 20: .I m ! 21: and returns an integer indicating the selection made, ! 22: or ! 23: \-1 ! 24: for no selection. ! 25: The integer ! 26: .I b ! 27: specifies which button to use for the interaction: 1, 2 or 3. ! 28: .I Menuhit ! 29: assumes that the button is already depressed when it is called. ! 30: The user makes a selection by lifting the button when the cursor ! 31: points at the desired selection; ! 32: lifting the button outside the menu indicates no selection. ! 33: .PP ! 34: Menus can be built in two ways, either as an array of ! 35: strings or with a generator function: ! 36: .IP ! 37: .EX ! 38: typedef struct { ! 39: char **item; /* string array, ending with 0 */ ! 40: char *(*generator)(); /* used if item == 0 */ ! 41: short prevhit; /* offset from top of last select */ ! 42: short prevtop; /* topmost item displayed */ ! 43: } Menu; ! 44: ! 45: char *menutext[]={"Item 0", "Item 1", "Item 2", 0}; ! 46: Menu stringsmenu={ menutext }; ! 47: .EE ! 48: .LP ! 49: or ! 50: .IP ! 51: .EX ! 52: char *menugen(); ! 53: Menu genmenu={ (char **)0, menugen }; ! 54: .EE ! 55: .PP ! 56: The generator function is passed an integer parameter ! 57: .IR n , ! 58: and must return the string for the ! 59: .IR n th ! 60: menu entry, or 0 if ! 61: .I n ! 62: is beyond the number of entries in the menu. ! 63: The ! 64: .IR n 's ! 65: may come in any order but the result is only needed until the next call. ! 66: .PP ! 67: Regardless of the method of generation, characters with the ! 68: .B 0200 ! 69: bit set are regarded as fill characters. ! 70: For example, the string ! 71: .L ! 72: "\e240X" ! 73: will appear in the menu as a right-justified ! 74: .L X ! 75: .RL ( 040 ! 76: is the ! 77: .SM ASCII ! 78: space character). ! 79: Menu strings without fill characters are drawn centered in the menu. ! 80: .PP ! 81: The fields ! 82: .I prevhit ! 83: and ! 84: .I prevtop ! 85: are used to guide which items are displayed and which item ! 86: the mouse points to initially. ! 87: They should be nonnegative. ! 88: Both ! 89: .I menuhit ! 90: and ! 91: .I hmenuhit ! 92: may choose to ignore these fields. ! 93: .PP ! 94: .I Hmenuhit ! 95: supports hierarchical menus. ! 96: Submenus are denoted graphically by a right-pointing arrow. ! 97: Moving the cursor onto the arrow causes the submenu to appear. ! 98: Hierarchical menus are built of ! 99: .BR NMitem s ! 100: defined as ! 101: .IP ! 102: .EX ! 103: typedef struct NMenu { ! 104: char *text; ! 105: char *help; ! 106: struct NMenu *next; ! 107: void (*dfn)(), (*bfn)(), (*hfn)(); ! 108: long data; ! 109: } NMitem; ! 110: .EE ! 111: .PP ! 112: The ! 113: .B text ! 114: field is shown to the user; ! 115: characters with the ! 116: .B 0200 ! 117: bit set behave as above. ! 118: The contents of the ! 119: .B help ! 120: field are shown whenever the user holds down button 1 at the same time ! 121: as the button specified by the parameter ! 122: .IR b . ! 123: If ! 124: .I b ! 125: is 1, ! 126: you get help all the time. ! 127: The ! 128: .B next ! 129: field is the address of a submenu or ! 130: .B "(NMenu *)0" ! 131: if there is none. ! 132: The two functions ! 133: .B (*dfn)() ! 134: and ! 135: .B (*bfn)() ! 136: support dynamic submenus. ! 137: .I Dfn ! 138: is called just before the submenu is invoked. ! 139: Its argument is the current menu item. ! 140: Similarly, ! 141: .I bfn ! 142: is called with the current menu item just after the submenu has finished. ! 143: .I Hfn ! 144: is called only when a menu item is selected; ! 145: its argument is the current menu item. ! 146: The menu has been undrawn before ! 147: .I hfn ! 148: is called. ! 149: The return value from ! 150: .I hmenuhit ! 151: is the menu item selected or ! 152: .B "(NMenu *)0" ! 153: if none was selected. ! 154: To permit communication between menu functions and the calling program, ! 155: the ! 156: .I data ! 157: field is available for the user; ! 158: it is ignored by ! 159: .IR hmenuhit . ! 160: .PP ! 161: An ! 162: .BR NMenu , ! 163: like a ! 164: .BR Menu , ! 165: may be built by list or by generator. ! 166: An ! 167: .B NMenu ! 168: generator takes an integer parameter ! 169: .I n ! 170: and returns a pointer to an ! 171: .LR NMitem . ! 172: In either case, ! 173: the list of menu items is terminated by an item with a 0 ! 174: .B text ! 175: field. ! 176: .SH EXAMPLES ! 177: Simple code to use ! 178: .B stringsmenu ! 179: declared above: ! 180: .IP ! 181: .EX ! 182: .ta \w'case -1: 'u ! 183: switch(menuhit(&stringsmenu, 3)){ ! 184: case 0: item_0(); ! 185: break; ! 186: case 1: item_1(); ! 187: break; ! 188: case 2: item_2(); ! 189: break; ! 190: case -1: noselection(); ! 191: break; ! 192: } ! 193: .EE ! 194: .PP ! 195: To provide a submenu for item 1: ! 196: .IP ! 197: .DT ! 198: .EX ! 199: NMitem *gen(); ! 200: NMenu i1list = { 0, gen }; ! 201: void item_2(), item_3(); ! 202: NMitem imenu = { ! 203: { "item 1", "item 1 help", &i1list }, ! 204: { "item 2", "item 2 help", 0, 0, 0, item_2 }, ! 205: { "item 3", 0, 0, 0, 0, item_3 }, ! 206: { 0 } ! 207: }; ! 208: NMenu b3 = { imenu }; ! 209: (void)hmenuhit(&b3, 3); ! 210: .EE
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.