Multics Technical Bulletin MTB 654 To: MTB Distribution From: N.S.Davids Date: 04/23/84 Subject: Extensions to menu_ Comments may be made: Via forum (method of choice): >site>forum>menus Via electronic mail: Davids.Multics Via telephone: 862-6643 HVN: 356-6643 _________________________________________________________________ Multics Project internal working documentation. Not to be reproduced outside the Multics Project. Multics Technical Bulletin MTB 654 CONTENTS INTRODUCTION. . . . . . . . . . . . . . . . 1 PROBLEMS TO BE ADDRESSED. . . . . . . . . . 1 No prompt line, no default option. . . . . 1 Fixed sized of menus. . . . . . . . . . . . 1 Display of menus already responded to. . . 1 SOLUTIONS. . . . . . . . . . . . . . . . . 2 Add prompt line and default. . . . . . . . 2 Create dynamically sized menus. . . . . . . 2 Example of dynamically sized menu, prompt line, and a default. . . . . . . . . . 4 Suppress menu display on valid type ahead. 5 IMPLEMENTATION OF SOLUTIONS. . . . . . . . 6 Changes to the menu_format structure. . . . 6 Changes to menu_$create. . . . . . . . . . 8 Changes to menu_$display. . . . . . . . . . 8 Changes to menu_$get_choice. . . . . . . . 9 A new entry: menu_$display_and_get_choice. 9 MENU_ DOCUMENTATION CHANGES. . . . . . . . 10 menu_$create. . . . . . . . . . . . . . . .10 menu_$display_and_get_choice. . . . . . . .10 menu format structure. . . . . . . . . . . 11 menu requirements structure. . . . . . . . 13 Notes on Dynamic Sizing. . . . . . . . . . 14 COMMAND DOCUMENTATION CHANGES. . . . . . . 15 menu_create (new control arguments). . . . 15 menu_create (changes to existing control arguments). . . . . . . . . . . . . . 16 menu_display_and_get_choice. . . . . . . . 16 Notes on Dynamic Sizing. . . . . . . . . . 17 FT_MENU_ DOCUMENTATION CHANGES. . . . . . 19 ft_menu_$create. . . . . . . . . . . . . . 19 ft_menu_$describe. . . . . . . . . . . . . 20 ft_menu_$set_prompt. . . . . . . . . . . . 20 ft_menu_$set_default. . . . . . . . . . . 21 ft_menu_$display_and_get_choice. . . . . . 22 Notes on Dynamic Sizing. . . . . . . . . . 24 CB_MENU_ DOCUMENTATION CHANGES. . . . . . 26 cb_menu_$create. . . . . . . . . . . . . . 26 cb_menu_$describe. . . . . . . . . . . . . 27 cb_menu_$set_prompt. . . . . . . . . . . . 27 cb_menu_$set_default. . . . . . . . . . . 28 cb_menu_$display_and_get_choice. . . . . . 29 Notes on Dynamic Sizing. . . . . . . . . . 31 Multics Technical Bulletin MTB 654 INTRODUCTION The development and investigation of menu oriented applications has made it apparent that the menu_ interface must move toward a menu_manager_ interface. This is needed to: o eliminate the need for essentially duplicate code in each application o allow functionality that cannot be provided with the current menu_ interface o guarantee a uniform display to the user The migration path from menu_ to menu_manager_ will span several releases. This MTB presents the steps for MR11.0 PROBLEMS TO BE ADDRESSED No prompt line, no default option human factors guidelines(1) for presenting menus indicate that a prompt should appear under the menu. This prompt indicates how the user should make a selection and a default value (if appropriate). Fixed size of menus Currently menus are a fixed sized which must be no larger than the window they are to be displayed in. This requires that the applications determine the size of the display window and break up large menus into multiple sub-menus. It also requires that the applications give the user the capability of moving through these multiple sub-menus (usually by way of function keys). An application's function menus are usually small enough that a minimum window size can be determined for running the application. However a minimum window size approach is not possible for "data" menus, i.e. lists of segments in a directory, mail in a mail box, components in an archive. Currently an application that presents "data" menus to the user must implement its own special handling of these menus. Display of menus already responded to When a user becomes familiar with the menus he/she can select the desired choices before the menu is displayed. There may be no point in then displaying the menu and making the user wait for the display to complete. _________________________________________________________________ (1) Human Factors Guidelines for Terminal Interface Design, CACM Vol 26 #7 July 1983 MTB 654 Multics Technical Bulletin SOLUTIONS The following solutions must be implemented in a manner that allows the current menu_ behavior to be maintained. Any changes in behavior will be accomplished via changes in versions and/or new entry points. Add prompt line and default add to the definition of a menu a prompt line and a default option. The prompt line will appear below the menu (right above the first trailer) separated from the menu by a blank line. Prompting will be optional. A default prompt of: Press number or letter indicating choice may be used. The default option will be flaged by the ">" character to the left of the option key in the menu, it will also appear on the prompt line and will be selected by pressing the return key. Press number or letter indicating choice (default X) The default option is also optional. The prompt line should only appear when the user must enter a menu option, i.e. a call to get_choice. Until that time the line containing the prompt text should be blank. Also after the user enters a valid option the prompt line should be blanked, the option the user selected will be indicated via an * as is currently done. The inclusion of the default in the menu definition means that it cannot be dynamically changed, i.e. it cannot be updated to the users last response to the menu. However, it is thought that the easier to remember static definition makes the default more useful. Create dynamically sized menus a dynamically sized menu would be automatically fragmented into sections that could fit in the display window. The original menu is fragmented when a call is made to display it and the first sub-menu is actually placed on the screen. A call to get a choice then internally processes the options that call for the next or previous sub-menu to be displayed. When the user finally makes a selection the selection index is translated back into an index corresponding to the original large menu. The last option on the first sub-menu will be: (>) MENU X+1 The first option on the last sub-menu will be: (<) MENU X-1 All other sub-menus will have both of the above options listed. Multics Technical Bulletin MTB 654 The sub-menus will have the same headers, trailers, pad characters, and prompt line as the original menu with the following 2 exceptions. The string: menu X of Y will be appended to the first header of all the sub-menus. The character X will contain the index of the current menu while Y will contain the total number of menus the original menu was divided into. If no header is defined one will be created. All sub-menus which do not contain the original menu's default option will have as their default either > or < depending on whether they are before or after the sub-menu containing the default option. If the original menu does not have a default defined then none of the sub-menus will have a default defined. MTB 654 Multics Technical Bulletin Example of dynamic menu display, use of a prompt and a default(1) ----------------------------------------------------------------- Choices (menu 1 of 3) (1) Abel (5) Carson (2) Anderson (6) Crawford (3) Baker (7) Dunn (4) Brown >(>) MENU 2 Select a name by entering its index (default >) ----------------------------------------------------------------- ----------------------------------------------------------------- Choices (menu 2 of 3) (<) MENU 1 (4) Lynch (1) Fisher >(5) Pace (2) Gordon (6) Schmidt (3) Harvey (>) MENU 3 Select a name by entering its index (default 5) ----------------------------------------------------------------- ----------------------------------------------------------------- Choices (menu 3 of 3) >(<) MENU 2 (2) Zinn (1) Tang Select a name by entering its index (default <) ----------------------------------------------------------------- _________________________________________________________________ (1) Dashes indicate the extent of the display window. Multics Technical Bulletin MTB 654 Suppress menu display on valid type ahead The display mechanism can determine if there is any input pending before it starts to display the menu. If there is and the input is valid, i.e. it corresponds to a valid option or function key then the menu display can be suppressed. Also since the input has already been checked for and validated, it makes sense to return it immediately instead of having to call menu_$get_choice. The menu_$display routine does not include arguments for function_key definition or for returning the users selection. A new entry is therefore indicated. There are two ways to handle the menu display suppression. The first is to always or never suppress the display for any valid input, the second is to allow a decision to be made for each valid input. The first is simpler; the second more powerful. I think in this case that the extra power is not called for and therefore the simpler approach is best. Note that it is user interface simplicity that is of concern - not implementation simplicity. The relative complexity of the second approach stems from where to put the suppress flags. The flags associated with the menu options can be placed in the menu definition. However, there would still need to be flags associated with the function keys. These function key flags could be a separate array or part of the function key definition structure that is passed in. However, if they are part of the structure then a translation from the function key structure returned by the ttt_info_ call would be needed. A simpler approach might be to keep all the suppress flags in a separate array that is passed in. The problem with this approach is the maintenance of keeping the array in sync with the current menu or maintaining a set of arrays each matched to one menu. MTB 654 Multics Technical Bulletin IMPLEMENTATION OF SOLUTIONS Changes to the menu format structure The current structure of menu_format is: 01 menu_format 02 version fixed bin, 02 constraints, 03 max_width fixed bin, 03 max_height fixed bin, 02 n_columns fixed bin, 02 flags, 03 center_headers bit (1) unal, 03 center_trailers bit (1) unal, 03 pad bit (34) unal, 02 pad_char char (1); where 1. version must be menu_format_version_1 2. max_width is the width of the window the menu will be displayed on. This value is used for centering headers and aligning columns. 3. max_height is the maximum height of the window, in lines. 4. n_columns is the number of columns to be used in displaying options. 5. center_headers if set, header lines will be centered using the window width supplied above. If not set they are flush left with the left edge of the window. 6. center_trailers same as center_headers, but for trailers. 7. pad must be "0"b; 8. pad_char is the character used for centering headers and/or trailers. The addition of a new field is needed to define the default option. Multics Technical Bulletin MTB 654 02 default_option fixed bin; where 9. default_option is the option index identifying the default option. A default option is selected by pressing the return key. The option index corresponds to the default option's INDEX in the choice array not to the key used to select the option. The default option will be flaged by the ">" character to the left of the option key in the menu, it will also be indicated in the prompt line by the string: (default X) where X corresponds to the KEY that must be pressed to select the default option. Note that defining a default option does not require the use of a prompt. A value of 0 indictes that no default option is defined. The addition of a new substructure is needed for defining the prompt text. 02 prompt, 03 use prompt bit (1) unal, 03 center_prompt bit (1) unal, 03 pad2 bit (34) unal, 03 prompt_text char (80) var, 10. use_prompt if set to "1"b it indicates that the menu is to have a prompt string. If set to "0"b it indicates that the menu will not have a prompt string. If the menu does not have a prompt string the two extra lines which the prompt requires will not be included in the menu. 11. center_prompt same as center_headers but for prompt. This field is ignored if the value of use_prompt is set to "0"b. 12. pad2 must be "0"b 13. prompt_text is a prompt that will be output after the last line of the menu. It will be separated from the last menu line by a blank line. The prompt line will remain blank until a call which requires the user to select a menu option is made. At that time the prompt text will be written on the prompt line. MTB 654 Multics Technical Bulletin After the user makes a selection the prompt text is deleted. The selected option's key is replaced by an *. This field is ignored if the value of use_prompt is set to "0"b; If use_prompt is set to "1"b and this field is blank a default prompt text of: Press number or letter indicating choice will be used. The OK to dynamically size a menu will be flagged by slightly changing the meaning of the max_height element. This was done instead on creating a new flag because it was a reasonable extension. 3. max_height is the maximum height of the window, in lines. If the value of max_height is zero it means that the menu should be dynamically sized to the height of the window it is being displayed in. Finally the version of the structure would be changed to version 2. Changes to menu_$create It will be modified to create a new version menu which will incorporate the new attributes in the version 2 menu format structure. It will continue to support version 1 format structures for compatibility. There will be no limit to the number of options in a dynamically sized menu. In addition, the keys argument will be ignored for a dynamically sized menu. Ignoring the keys argument for a dynamically sized menu is not ideal. However, the alternative is to create a special entry for dynamically sized menus. This new entry would have to ignore the max_height element of the menu_format structure. Of course, a new dynamic_menu_format structure could be defined which does not have the max_height element. This gives us two entries and 2 structures for doing almost exactly the same thing. This is less ideal than having 1 entry, 1 structure, and ignoring one of the arguments to that entry in certain circumstances. Changes to menu_$display It will continue to display old version menus and display new version menus as in the above example. It will fragment dynamically sized menus into sub-menus whose size depends on the display window and put the first sub-menu in the window. A sub-menu will not have more than 61 options in it, (keys 1-9 A-Z a-z). A "window too small" error will occur only if the Multics Technical Bulletin MTB 654 window is so small that each sub-menu cannot contain at least 1 option from the original menu. Changes to menu_$get_choice It will continue to support old version menus and will also support the new version menu. It will cause the prompt text to be displayed in the menu and allow the selection of the default (provided one is defined) by pressing the return key. In addition, the user will be able to display the various pages of a dynamically sized menu. A new entry: menu_$display_and_get_choice This entry will both display the menu and return the user's selection. Its calling sequence will look exactly like menu_$get_choice except for the addition of a suppress_flag following the function_key_info argument. If the suppress flag is set, a check is made before the menu is displayed for pending input. If the input is valid the menu is not displayed and the selection is return to the user. If the input is invalid the bell is rung, all other pending input is purged, the menu is displayed, the prompt (if there is one) output, and the system waits for the user to enter a new selection. If the flag is not set the menu will be displayed and the prompt (again, only if there is one) output, and the system will wait for the user to enter a selection. MTB 654 Multics Technical Bulletin MENU_ DOCUMENTATION CHANGES Where possible, only changes from existing documentation are listed. menu_$create 1. choices (Input) is an array of the names of the options. Menus may be dynamically sized or fixed at creation time (see Dynamic Sizing below). There is no limit to the number of options of a dynamically sized menu. Fixed sized menus have a limit of 61 options. The error code menu_et_$too_many_options will be returned if a fixed size menu has more than 61 options. 5. keys (Input) is ignored if the menu is to be dynamically sized. <rest of existing documentation> menu_$display_and_get_choice Entry: menu_$display_and_get_choice This entry displays a menu and returns the users choice. If a menu is to be dynamically sized, the first sub-menu is displayed. Usage declare menu_$display_and_get_choice entry (ptr, ptr, ptr, bit (1) aligned, bit (1) aligned, fixed bin, fixed bin (35)); call menu_$display_and_get_choice (window, menu, function_key_info, suppress, fkey, selection, code); where: 1. window (Input) is a pointer to the IOCB for the I/O switch used to display the menu. 2. menu (Input) is the menu object to be displayed and responded to. Multics Technical Bulletin MTB 654 3. function_key_info (Input) is a pointer to a data structure describing the function keys available on the terminal. This data structure is obtained by the caller from the ttt_info_$function_key_data subroutine. If this pointer is null no function keys are used. 4. suppress (Input) if set a check is made before the menu is displayed for pending input. If input is pending and it is valid the display of the menu is suppressed and the input is returned. If the input is not valid then all pending input is purged, the bell is rung, the menu is displayed, the prompt (if there is one) output, and the system waits for the user to enter a new selection. If suppress is not set this routine functions like the sequence of calls: menu_$display, menu_$get_choice. 5. fkey (Output) returns a value of "1"b if a function key was hit instead of a menu selection. 6. selection (Output) gives the option number or function_key number chosen by the user. For an option, it is a number between 1 and the highest defined option, inclusive. For a function key, it is the number of the function key. 7. code (Output) is a standard error code. The menu format structure A menu is described by the "menu_format" structure. It is declared in menu_dcls.incl.pl1 dcl 1 menu_format aligned based (menu_format_ptr), 2 version fixed bin, 2 constraints, 3 max_width fixed bin, 3 max_height fixed bin, 2 n_columns fixed bin, 2 flags, 3 center_headers bit (1) unal, 3 center_trailers bit (1) unal, 3 pad bit (34) unal, 2 pad_char char (1); 2 default_option fixed bin, MTB 654 Multics Technical Bulletin 2 prompt, 3 use_prompt bit (1) unal, 3 center_prompt bit (1) unal, 3 pad2 bit (34) unal, 3 prompt_text char (80) var; where 1. version may be either menu_format_version_1 or menu_format_version_2 2. max_width is the width of the window the menu will be displayed on. This value is used for centering headers and aligning columns. 3. max_height is the maximum height of the window, in lines. If the value of version is menu_format_version_2 then the value of max_height may be 0 which means that the menu should be dynamically sized to the height of the window it is being displayed in. If the value of version is menu_format_version_1 and the value of max_height is 0 an error will be returned. 4. n_columns is the number of columns to be used in displaying options. 5. center_headers if set, header lines will be centered using the window width supplied above. If not set they are flush left with the left edge of the window. 6. center_trailers same as center_headers, but for trailers. 7. pad must be "0"b; 8. pad_char is the character used for centering headers and/or trailers. 9. default_option Is used only if version is set to menu_format_version_2. It is the option index identifying the default option. A default option is selected by pressing the return key. The option index corresponds to the default option's INDEX in the choice array not to the key used to select the Multics Technical Bulletin MTB 654 option. The default option will be flaged by the ">" character to the left of the option key in the menu, it will also be indicated in the prompt line by the string: (default X) where X corresponds to the KEY that must be pressed to select the default option. It is legal to have a default option defined without defining a prompt string. Also a value of 0 indictes that no default option is defined. 10. use_prompt if set to "1"b it indicates that the menu is to have a prompt string. If set to "0"b it indicates that the menu will not have a prompt string. If the menu does not have a prompt string the two extra lines which the prompt requires will not be included in the menu. 11. center_prompt same as center_headers but for prompt. This field is ignored if the value of use_prompt is set to "0"b. 12. pad2 must be "0"b 13. prompt_text is a prompt that will be output after the last line of the menu. It will be separated from the last menu line by a blank line. The prompt line will remain blank until a call which requires the user to select a menu option is made. At that time the prompt text will be written on the prompt line. After the user makes a selection the prompt text is deleted. The selected option's key is replaced by an *. This field is ignored if the value of use_prompt is set to "0"b. If use_prompt is set to "1"b and this field is blank a default prompt text of: Press number or letter indicating choice will be used. The menu requirements structure 2. lines_needed (Output) is the number of lines required. A value of 0 indicates that the menu is to be dynamically sized. If non-zero and the window does not have this number of lines, menu display will fail. MTB 654 Multics Technical Bulletin Notes on Dynamic Sizing A dynamically sized menu is automatically fragmented into sub-menus that will fit in the display window. The original menu is fragmented when a call is made to display it and the first sub-menu is actually placed on the screen. A call to get a choice then internally processes the options that call for the next or previous sub-menu to be displayed. When the user finally makes a selection, the selection index is translated back into an index corresponding to the original large menu. The last option on the first sub-menu will be: (>) MENU X+1 The first option on the last sub-menu will be: (<) MENU X-1 All other sub-menus will have both of the above options listed. The sub-menus will have the same headers, trailers, pad characters, and prompt line as the original menu with the following 2 exceptions. The string: menu X of Y will be appended to the first header of all the sub-menus, where X is the index of the current menu and Y is the total number of sub-menus the original menu was divided into. If no header is defined one will be created. All sub-menus which do not contain the original menu's default option will have as their default either > or < depending on whether they are before or after the sub-menu containing the default option. If the original menu does not have a default defined then none of the sub-menus will have a default defined. Multics Technical Bulletin MTB 654 COMMAND DOCUMENTATION CHANGES Where possible, only changes from existing documentation are listed. menu_create (new control arguments) -prompt STR, -pmt STR specifies a prompt line that will be displayed after the last line of the menu. It will be separated from the last menu line by a blank line. A default prompt of: Press number or letter indicating choice will be used if STR is a null string. The prompt will be displayed only when a call is made that requires the user to select a menu option. After the user makes a selection the prompt text is deleted. The selected option's key is replaced by an *. -no_prompt, -npmt indicates that there should be no prompt line. This is the default. -default_option STR, -dopt STR specifies the default option which is selected by pressing the return key. If STR contains blanks or special characters it must be quoted. If multiple default_options are specified the last one becomes the default, the others are just regular options. The default option will be flaged by the ">" character to the left of the option key in the menu, it is also indicated to the user by the string (default X) appended to the prompt. X corresponds to the KEY that must be pressed to select that default option. It is legal to have a default option defined without defining a prompt string. -no_default_option, -ndopt indicates that there should be no default option. This is the default. -center_prompt, -cep causes the prompt to be centered. -no_center_prompt, -ncep causes the prompt to be flush left. This is the default -dynamic, -dyn causes the menu to be dynamically sized when it is displayed. This means that if the display window is MTB 654 Multics Technical Bulletin smaller than the menu the menu will be fragmented into several sub-menus for display purposes. See "Notes on Dynamic Sizing". -no_dynamic, -ndyn requires that the menu be displayed as one unit. This is the default. menu_create (changes to existing control arguments) -option_keys STR, -okeys STR specifies the keystrokes to be used with each option. Each character in STR is associated with the corresponding option, so that if it is typed, the corresponding option is selected. There must be at least as many characters in STR as there are options. If this control argument is not given, the string "123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" is used. This control argument is ignored if the menu is to be dynamically sized. menu_display_and_get_choice Name: menu_display_and_get_choice The menu_display_and_get_choice command, given a menu name, will display that menu and gets the user choice. Usage menu_display_and_get_choice menu_name {-control_args} Syntax as an Active Function [menu_display_and_get_choice menu_name {control_args}] where: 1. menu_name is the name assigned that was assigned to the menu to be displayed when it was stored. If the menu is to be dynamically sized the first sub-menu is displayed. 2. control_args Multics Technical Bulletin MTB 654 may be chosen from -pathname PATH, -pn PATH is the name of the value segment in which the menu has been stored. The value suffix is assumed. If this control argument is omitted, the user's default value segment is searched for the menu. -io_switch STR, -is STR where STR is the name of an I/O switch for a window. The default is user_i/o. -default_fkeys STR, -dfkeys STR specifies the keys to be used if the terminal does not have function keys or if the terminal does not have the proper set of function keys. See "Notes on Function Keys" below. -function_keys STR, -fkeys STR specifies the keys to be used to simulate function keys. This control overrides any function key definitions already established for the terminal. See "Notes on Function Keys" below. -suppress, -sup indicates that a check is to be made before the menu is displayed for any pending input. If input is pending and it is valid the display of the menu is suppressed and the input is returned. If the input is not valid then all pending input is purged, the bell is rung, the menu is displayed, the prompt (if there is one) output, and the system waits for the user to enter a new user selection. -no_suppress, -nsup indicates that this command will function like the sequence of commands: menu_display, menu_get_choice. This is the default. Notes on Dynamic Sizing A dynamically sized menu is automatically fragmented into sub-menus that will fit in the display window. The original menu is fragmented when a call is made to display it and the first sub-menu is actually placed on the screen. A call to get a choice then internally processes the options that call for the next or previous sub-menu to be displayed. When the MTB 654 Multics Technical Bulletin user finally makes a selection the selection index is translated back into an index corresponding to the original large menu. The last option on the first sub-menu will be: (>) MENU X+1 The first option on the last sub-menu will be: (<) MENU X-1 All other sub-menus will have both of the above options listed. The sub-menus will have the same headers, trailers, pad characters, and prompt line as the original menu with the following 2 exceptions. The string: menu X of Y will be appended to the first header of all the sub-menus. The character X will contain the index of the current menu while Y will contain the total number of menus the original menu was divided into. If no header is defined one will be created. All sub-menus which do not contain the original menu's default option will have as their default either > or < depending on whether they are before or after the sub-menu containing the default option. If the original menu does not have a default defined then none of the sub-menus will have a default defined. Multics Technical Bulletin MTB 654 FT_MENU_ DOCUMENTATION CHANGES Where possible, only changes from exiting documentation are listed. ft_menu_$create 1. choices (Input) is an array of character variables which are the text of the options that the user wishes to display in the menu. n1 is the length in characters, of the longest character string comprising the text of an option. m1 is the extent of the array, i.e. the number of options in the menu being described. This array must be at least extent 1. If menu_format(max_height) (see item 4 below) has a value of 0 there is no limit to the number of options that the menu may have. If the value is non-zero there may be at most 61 menu options. 4. menu_format (Input) is an array, which specifies the format of the menu being created. Prior to calling this entry point, the FORTRAN programmer is responsible for setting the following variables: menu_format(menu_version) = version number of menu format. May be 1 or 2. If 2 the menu may have a prompt text and a default option defined. See ft_menu_$set_prompt, and ft_menu_$set_default. menu_format(max_width) = maximum width of the window on which the menu will be displayed. menu_format(max_height) = maximum height of window on which menu will be displayed. If menu_format(menu_version) is equal to 2 then this may be equal to 0 which will indicate that the menu is to be dynamically sized. See "Notes on Dynamic Sizing" below. menu_format(no_of_columns) = number of columns to be used by the menu manager to display the options. menu_format(center_headers) = 0 or 1; 0 = no, 1 = yes. menu_format(center_trailers) = 0 or 1; 0 = no, 1 = yes. 6. keys (Input) is an array that identifies the keystroke to be associated with each choice. This array must be at MTB 654 Multics Technical Bulletin least as long as the number of choices in the menu. Each element in the array must be unique. If menu_format(max_height) is is zero then this argument is ignored. 7. menu_needs (Output) an array that contains menu related information on successful execution of call. Returned information: menu_needs(lines_needed) the number of lines required to display the menu. A value of 0 indicates that the menu is to be dynamically sized. menu_needs(width_needed) the number of columns required to display the menu. menu_needs(no_of_options) the number of options defined in the menu. ft_menu_$describe 2. menu_needs (Output) an array into which menu related information is returned. Returned information: menu_needs(lines_needed) the number of lines required to display the menu. A value of 0 indicates that the menu is to be dynamically sized. menu_needs(width_needed) the number of columns required to display the menu. menu_needs(no_of_options) the number of options defined in the menu. ft_menu_$set_prompt Entry: ft_menu_$set_prompt Sets the prompt line for a menu created with a menu format version equal to 2. An error will be returned if the indicated menu was created with a menu format version equal to 1. The prompt line will be output after the last line of the menu and be separated from that line by a blank line. Multics Technical Bulletin MTB 654 Usage declarations: integer menu_id character*80 prompt_string integer no_prompt integer center_prompt integer code call ft_menu_$set_prompt (menu_id, prompt_string, no_prompt, center_prompt, code) where: 1. menu_id (Input) the menu identifier returned by ft_menu_$create or ft_menu_$retrieve 2. prompt_string (Input) a new prompt string. A null string will cause the default prompt: Press number or letter indicating choice to be used. The prompt line will remain blank until a call which requires the user to select a menu option is made. At that time the prompt text will be written on the prompt line. After the user makes a selection the prompt text is deleted. The selected option's key is replaced by an *. 3. no_prompt (Input) a non-zero value indicates that the menu should not have a prompt text defined. The prompt_string and center_prompt arguments are ignored. If 0 it indicates that the menu's prompt text and the prompts centering attribute are to be defined by this call. 4. center_prompt (Input) a value of 0 indicates that the prompt should start at the menu's left margin. A non-zero value indicates that the prompt should be centered. 5. code (Output) return code (see Appendix B.) ft_menu_$set_default Entry: ft_menu_$set_default MTB 654 Multics Technical Bulletin Sets the default option for a menu created with a menu format version equal to 2. An error will be returned if the indicated menu was created with a menu format version equal to 1. The default option is selected by pressing the return key. It is flaged by the ">" character to the left of the option key in the menu, and is also indicated to the user by the string "(default X)" on the prompt line. X is the key that would be pressed to select the default option. It is legal to have a default option defined without defining a prompt string. Also a default option of 0 indicates that no default option is to be definded for the menu. Usage declarations: integer menu_id integer default_option integer code call ft_menu_$set_default (menu_id, default_option, code) where: 1. menu_id (Input) the menu identifier returned by ft_menu_$create or ft_menu_$retrieve 2. default_option (Input) The index of the default option in the choices array that was used to create the menu. A value of 0 indicates that no default option is to be defined. 3. code (Output) return code (see Appendix B.) ft_menu_$display_and_get_choice Entry: ft_menu_$display_and_get_choice This entry displays a menu and returns the users choice. If a menu is to be dynamically sized the first sub-menu is displayed. Usage Multics Technical Bulletin MTB 654 declarations: character*n1 function_key_info integer window_id integer menu_id integer suppress integer fkeys integer selection integer code call ft_menu_$display_and_get_choice (window_id, menu_id, function_key_info, suppress, fkeys, selection, code) where: 1. window_id (Input) a window identifier returned by ft_window_$create. If usage_mode = 0 this argument will be ignored. (see ft_menu_$init2). 2. menu_id (Input) the menu identifier returned by ft_menu_$create or ft_menu_$retrieve 3. function_key_info (Input) a character variable (n1 as required) used to specify the role of function keys (if they exist for the terminal being used) or an equivalent set of escape sequences if the terminal does not have function keys or not the function keys required by the application. The objective is to let the application use the terminal's function keys if possible, else specify key sequences to be used to simulate function keys. Each character in the string corresponds to one function key. If the character is a space, then it is not relevant if the corresponding function key exists or not. If the character is not a space, that character will be used to simulate a function key if the terminal does not have function keys. If the terminal does not have a function key for every non-space character in the string, then the function keys will be simulated. Thus, the string " ?p q" means that the caller does not care whether the terminal has function keys 0 or 3 but the caller does wish to use function keys 1, 2, and 4. If any of these 3 function keys is not present on the terminal, then esc-? will substitute for F1, esc-p will substitute for F2 and esc-q will substitute for F4. 4. suppress (Input) MTB 654 Multics Technical Bulletin if non-zero a check is made before the menu is displayed for pending input. If input is pending and it is valid input the display of the menu is suppressed and the input is returned. If the input is not valid then all pending input is purged, the bell is rung, the menu is displayed, the prompt (if one is defined) is output, and the system waits for the user to enter a new selection. If suppress is set to 0 then this routine functions like the sequence of calls: ft_menu_$display, ft_menu_$get_choice. 5. fkeys (Output) if fkeys = 1 user entered a function key or escape sequence if fkeys = 0 user selected an option. 6. selection (Output) is an integer representing the choice made by the user. If the user has chosen an option, it is the number between 1 and the highest defined option. If the user has entered a function key, or escape sequence simulating a function key, it is the number associated with the function key. 7. code (Output) return code (see Appendix B.) Notes on Dynamic Sizing A dynamically sized menu is automatically fragmented into sub-menus that will fit in the display window. The original menu is fragmented when a call is made to display it and the first sub-menu is actually placed on the screen. A call to get a choice then internally processes the options that call for the next or previous sub-menu to be displayed. When the user finally makes a selection, the selection index is translated back into an index corresponding to the original large menu. The last option on the first sub-menu will be: (>) MENU X+1 The first option on the last sub-menu will be: (<) MENU X-1 All other sub-menus will have both of the above options listed. The sub-menus will have the same headers, trailers, pad characters, and prompt line as the original menu with the following 2 exceptions. The string: menu X of Y Multics Technical Bulletin MTB 654 will be appended to the first header of all the sub-menus, where X is the index of the current menu and Y is the total number of sub-menus the original menu was divided into. If no header is defined one will be created. All sub-menus which do not contain the original menu's default option will have as their default either > or < depending on whether they are before or after the sub-menu containing the default option. If the original menu does not have a default defined then none of the sub-menus will have a default defined. MTB 654 Multics Technical Bulletin CB_MENU_ DOCUMENTATION CHANGES Where possible, only changes from exiting documentation are listed. cb_menu_$create 1. choices_table (Input) is a table of elementary data items which are the text of the options that the user wishes to display in the menu. n1 is the length, in characters, of the longest character string comprising the text of an option. m1 is the extent of the table, i.e. the number of options in the menu being described. This table must be at least of extent 1. If max_height (see item 4 below) has a value of 0 there is no limit to the number of options that the menu may have. If the value is non-zero there may be at most 61 menu options. 4. menu_format (Input) is a group item defining the format of the menu being created. In the COBOL program the caller is responsible for setting the following elementary data items: menu_version The version of the menu format. May be 1 or 2. If 2 the menu may have a prompt text and a default optioned defined. See cb_menu_$set_prompt and cb_menu_$set_default. max_width maximum width of the window on which the menu is to be displayed. max_height maximum height of the window on which the menu is to be displayed. If menu_version is equal to 2 then this may be equal to 0 which will indicate that the menu is to be dynamically sized. See "Notes on Dynamic Sizing" below. no_of_columns number of columns to be used to display the options. center_headers 0 or 1; 0 = no, 1 = yes center_trailers 0 or 1; (same as center_headers) 5. keys_table (Input) is a table that identifies the keystroke to be associated with each choice. This table must be at least as long as the number of choices in the menu. Each element in the table must be unique. If max_height is 0 this argument is ignored. Multics Technical Bulletin MTB 654 6. menu_needs (Output) a group item that contains menu related information on successful execution of call. Returned information: lines_needed the number of lines required to display the menu. A value of 0 indicates that the menu is to be dynamically sized. width_needed the number of columns needed to display the menu. no_of_options the number of options defined in the menu. cb_menu_$describe 2. menu_needs (Output) a group item that contains menu related information on successful execution of call. Returned information: lines_needed the number of lines required to display the menu. A value of 0 indicates that the menu is to be dynamically sized. width_needed the number of columns needed to display the menu. no_of_options the number of options defined in the menu. cb_menu_$set_prompt Entry: cb_menu_$set_prompt Sets the prompt line for a menu created with a menu format version equal to 2. An error will be returned if the indicated menu was created with a menu format version equal to 1. The prompt line will be output after the last line of the menu and be separated from that line by a blank line. Usage declarations: 77 menu_id USAGE IS COMP-6 77 prompt_string PIC X(80) MTB 654 Multics Technical Bulletin 77 no_prompt PIC 9(1) 77 center_prompt PIC 9(1) 77 ret_code USAGE IS COMP-6 call "cb_menu_$set_prompt" USING menu_id, prompt_string, no_prompt, center_prompt, ret_code. where: 1. menu_id (Input) the menu identifier returned by cb_menu_$create or cb_menu_$retrieve 2. prompt_string (Input) a new prompt string. A null string will cause the default prompt: Press number or letter indicating choice to be used. The prompt line will remain blank until a call which requires the user to select a menu option is made. At that time the prompt text will be written on the prompt line. After the user makes a selection the prompt text is deleted. The selected option's key is replaced by an *. 3. no_prompt (Input) a non-zero value indicates that the menu should not have a prompt text defined. The prompt_string and center_prompt arguments are ignored. If 0 it indicates that the menu's prompt text and the prompts centering attribute are to be defined by this call. 4. center_prompt (Input) a value of 0 indicates that the prompt should start at the menu's left margin. A non-zero value indicates that the prompt should be centered. 5. ret_code (Output) return code (see Appendix B.) cb_menu_$set_default Entry: cb_menu_$set_default Sets the default option for a menu created with a menu format version equal to 2. An error will be returned if the indicated menu was created with a menu format version equal to 1. The default option is selected by pressing the return key. It is flaged by the ">" character to the left of the option Multics Technical Bulletin MTB 654 key in the menu, and is also indicated to the user by the string "(default X)" on the prompt line. X is the key that would be pressed to select the default option. It is legal to have a default option defined without defining a prompt string. Also a default option of 0 indicates that no default option is to be definded for the menu. Usage declarations: 77 menu_id USAGE IS COMP-6 77 default_option USAGE IS COMP-6 77 ret_code USAGE IS COMP-6 call "cb_menu_$set_default" USING menu_id, default_option, ret_code where: 1. menu_id (Input) the menu identifier returned by cb_menu_$create or cb_menu_$retrieve 2. default_option (Input) The index of the default option in the choices array that was used to create the menu. A value of 0 indicates that no default option is to be defined. 3. ret_code (Output) return code (see Appendix B.) cb_menu_$display_and_get_choice Entry: cb_menu_$display_and_get_choice Returns the choice made by the user, i.e., a number representing either the menu item chosen or the function key (or its equivalent escape sequence) entered. If a menu is to be dynamically sized the first sub-menu is displayed. Usage declarations: MTB 654 Multics Technical Bulletin 77 function_key_info PIC X(n1) 77 window_id USAGE IS COMP-6 77 menu_id USAGE IS COMP-6 77 suppress USAGE IS COMP-6 77 fkeys USAGE IS COMP-6 77 selection USAGE IS COMP-6 77 ret_code USAGE IS COMP-6 call "cb_menu_$display_and_get_choice" USING window_id, menu_id, function_key_info, suppress, fkeys, selection, ret_code. where: 1. window_id (Input) a window identifier returned by cb_window_$create. If usage_mode = 0 this argument will be ignored. (see cb_menu_$init2). 2. menu_id (Input) the menu identifier returned by cb_menu_$create or cb_menu_$retrieve 3. function_key_info (Input) a character variable (n1 as required) used to specify the role of function keys (if they exist for the terminal being used) or an equivalent set of escape sequences if the terminal does not have function keys or not the function keys required by the application. The objective is to let the application use the terminal's function keys if possible, else specify key sequences to be used to simulate function keys. Each character in the string corresponds to one function key. If the character is a space, then it is not relevant if the corresponding function key exists or not. If the character is not a space, that character will be used to simulate a function key if the terminal does not have function keys. If the terminal does not have a function key for every non-space character in the string, then the function keys will be simulated. Thus, the string " ?p q" means that the caller does not care whether the terminal has function keys 0 or 3 but the caller does wish to use function keys 1, 2, and 4. If any of these 3 function keys is not present on the terminal, then esc-? will substitute for F1, esc-p will substitute for F2 and esc-q will substitute for F4. 4. suppress (Input) Multics Technical Bulletin MTB 654 if non-zero a check is made before the menu is displayed for pending input. If input is pending and it is valid input the display of the menu is suppressed and the input is returned. If the input is not valid then all pending input is purged, the bell is rung, the menu is displayed, the prompt (if one is defined) is output, and the system waits for the user to enter a new selection. If suppress is set to 0 then this routine functions like the sequence of calls: cb_menu_$display, cb_menu_$get_choice. 5. fkeys (Output) if fkeys = 1 user entered a function key or escape sequence if fkeys = 0 user selected an option. 6. selection (Output) is an integer representing the choice made by the user. If the user has chosen an option, it is the number between 1 and the highest defined option. If the user has entered a function key, or escape sequence simulating a function key, it is the number associated with the function key. 7. code (Output) return code (see Appendix B.) Notes on Dynamic Sizing A dynamically sized menu is automatically fragmented into sub-menus that will fit in the display window. The original menu is fragmented when a call is made to display it and the first sub-menu is actually placed on the screen. A call to get a choice then internally processes the options that call for the next or previous sub-menu to be displayed. When the user finally makes a selection, the selection index is translated back into an index corresponding to the original large menu. The last option on the first sub-menu will be: (>) MENU X+1 The first option on the last sub-menu will be: (<) MENU X-1 All other sub-menus will have both of the above options listed. The sub-menus will have the same headers, trailers, pad characters, and prompt line as the original menu with the following 2 exceptions. The string: menu X of Y MTB 654 Multics Technical Bulletin will be appended to the first header of all the sub-menus, where X is the index of the current menu and Y is the total number of sub-menus the original menu was divided into. If no header is defined one will be created. All sub-menus which do not contain the original menu's default option will have as their default either > or < depending on whether they are before or after the sub-menu containing the default option. If the original menu does not have a default defined then none of the sub-menus will have a default defined.