Annotation of researchv10dc/630/man/src/p_man/man3/tmenuhit.3r, revision 1.1.1.1

1.1       root        1: .ds ZZ DEVELOPMENT PACKAGE
                      2: .TH TMENUHIT 3R "630 MTG"
                      3: .XE "tmenuhit()"
                      4: .XE "tm_ret()"
                      5: .SH NAME
                      6: tmenuhit \- present user with menu and get selection
                      7: .SH SYNOPSIS
                      8: .ft B
                      9: #include <dmd.h>
                     10: .br
                     11: #include <menu.h>
                     12: .sp
                     13: Titem \(**tmenuhit (m, n, flags [, p])
                     14: .br
                     15: Tmenu \(**m;  
                     16: .br
                     17: int n;
                     18: .br
                     19: int flags;
                     20: .br
                     21: Point p;
                     22: .sp
                     23: void tm_ret()
                     24: .PP
                     25: .nf
                     26: \s-1
                     27: .ft CM
                     28: typedef struct Titem
                     29: {
                     30:     char *text;     /* string for menu */
                     31:     struct {
                     32:         unsigned short uval;    /* user field */
                     33:         unsigned short grey;    /* grey this selection */
                     34:     } ufield;
                     35:     struct Tmenu *next;     /* ptr to sub-menu */
                     36:     Bitmap *icon;           /* ptr to the icons bitmap */
                     37:     struct Font *font;      /* font defined for this item */
                     38:     void (*dfn)();  /* execute function before sub-menu */
                     39:     void (*bfn)();  /* execute function after sub-menu */
                     40:     void (*hfn)();  /* execute function on selection */
                     41: } Titem;
                     42: 
                     43: typedef struct Tmenu
                     44: {
                     45:     Titem *item;        /* Titem array */
                     46:     short prevhit;      /* index to current item */
                     47:     short prevtop;      /* index to top item */
                     48:     Titem *(*generator)();      /* used if item == 0 */
                     49:     short menumap;      /* bit definition of structure */
                     50: } Tmenu;
                     51: 
                     52: /* bit definitions in menumap */
                     53: #define TM_TEXT     0x0001     /* defines the text field */
                     54: #define TM_UFIELD   0x0002     /* defines the ufield field */
                     55: #define TM_NEXT     0x0004     /* defines the next field */
                     56: #define TM_ICON     0x0008     /* defines the icon field */
                     57: #define TM_FONT     0x0010     /* defines the font field */
                     58: #define TM_DFN      0x0020     /* defines the dfn field */
                     59: #define TM_BFN      0x0040     /* defines the bfn field */
                     60: #define TM_HFN      0x0080     /* defines the hfn field */
                     61: .ft R
                     62: .fi
                     63: \s+1
                     64: .SH DESCRIPTION
                     65: The \fItmenuhit\fP function
                     66: is an enhanced version of menuhit. It adds such features as 
                     67: expanding menus, use of icons and various fonts within a menu item,
                     68: greying non-selectable items, and extended control over invocation and
                     69: specification of the menu facility.
                     70: .SS "Menu Trees"
                     71: Menu trees allow the presentation of several menus in a hierarchical
                     72: format. Each menu is specified by a \fITmenu\fP structure. 
                     73: Each \fITmenu\fP structure contains a array of one or more \fITitem\fP
                     74: structures which specify the menu items. Each item of a menu may then,
                     75: in turn, point to a submenu. Submenus appear to the right
                     76: of the parent menu. The presence of a submenu for a menu item is indicated
                     77: by an arrow icon pointing to the right. Moving the cursor to the 
                     78: arrow icon allows the user to preview the submenu. Sliding further to the
                     79: right moves the cursor into the submenu and allows the user to make a
                     80: selection in this menu. Moving the cursor back to the left exits the 
                     81: submenu and moves the cursor back into the parent menu.
                     82: .SS Usage
                     83: The \fItmenuhit\fP function
                     84: presents the user with a menu tree specified by the root \fITmenu\fP pointer
                     85: \fIm\fP
                     86: and returns a pointer to a \fITitem\fP structure indicating which item was 
                     87: selected. If no item was selected \fItmenuhit\fP returns a 0.
                     88: The \fIn\fP argument is an integer which
                     89: specifies the mouse button for user interaction: 1, 2, 3 or 0 for all
                     90: the buttons..
                     91: The \fIflags\fP
                     92: argument is a bit vector which indicates various 
                     93: modes of function in \fItmenuhit\fP.
                     94: These flags include:
                     95: .TP
                     96: .B (flags & TM_EXPAND)
                     97: If true, the menu tree will be expanded (according to the previous selection)
                     98: down to the lowest leaf on invocation of \fItmenuhit\fP.
                     99: .TP
                    100: .B (flags & TM_NORET)
                    101: If true, \fItmenuhit\fP will not return when a valid selection is made. This 
                    102: feature is useful if a lot of selections are to be made from a large menu.
                    103: .TP
                    104: .B (flags & TM_STATIC)
                    105: If true, \fItmenuhit\fP assumes that no button is depressed when it is called.
                    106: In this case, the user makes a selection by depressing the button specified
                    107: when the cursor points to the item desired. If this is false, 
                    108: \fItmenuhit\fP assumes that the button is depressed when called. The user
                    109: makes a selection by lifting the button when the cursor points to the 
                    110: desired item.
                    111: .TP
                    112: .B (flags & TM_POINT)
                    113: If true, the argument \fIp\fP must be present and the origin of the root 
                    114: menu will appear at this point on the display.
                    115: .P
                    116: The user may define one or more of these flags by or'ing them together 
                    117: within the function call (e.g. (TM_EXPAND|TM_POINT) ).
                    118: .SS "Structure and Functional Description"
                    119: This section describes the structure fields of the \fITmenu\fP and the
                    120: \fITitem\fP structures and the functions of \fItmenuhit\fP they serve.
                    121: .P
                    122: The 
                    123: .B Tmenu
                    124: structure defines a menu. It has the following fields:
                    125: .TP
                    126: .B item
                    127: This is an array of \fITitem\fP structures which defines each item in the 
                    128: menu. The last item in the array must have its \fITitem\fP text
                    129: field equal to 0.
                    130: .TP
                    131: .B prevhit
                    132: \fIprevhit\fR is used to store the menu's previous selection.
                    133: When \fItmenuhit\fP
                    134: is called the menu is displayed such that, if possible, the mouse cursor
                    135: will be displayed over the previous selection. This might not be possible
                    136: if the menu is near the border of the screen.
                    137: \fIPrevhit\fR holds the index from 
                    138: the top of the displayed menu.
                    139: The \fIprevhit\fR value is initialized to 0 and 
                    140: normally does not need to be 
                    141: manipulated by the application program.
                    142: .TP
                    143: .B prevtop
                    144: \fIprevtop\fR is used to store the topmost item
                    145: displayed in the menu when more
                    146: than sixteen menu items are defined. The maximum number of items which
                    147: may be displayed within a menu is sixteen. When there are more than sixteen
                    148: the menu becomes a 
                    149: .B scrolling menu.
                    150: In this case, 
                    151: the left portion of the menu contains a scroll bar that is
                    152: used for scrolling quickly through the menu selections.
                    153: The vertical size of the scroll bar is an indication of the size
                    154: of the user's view of the menu (16 items) relative to the number
                    155: of selections in the entire menu.
                    156: .sp
                    157: There are two ways to scroll through the menu items.
                    158: The first is to move the mouse cursor to the left side of the menu
                    159: into the scroll bar area.
                    160: By moving the mouse cursor up or down within the scroll bar area, the menu 
                    161: items will scroll accordingly.
                    162: The second method used to scroll through the menu
                    163: items is to place the mouse cursor on the top or bottom entry of the menu
                    164: list.  The menu will scroll up or down by one item at a time if
                    165: there are additional items to be displayed in that direction.
                    166: .sp
                    167: Like prevhit, the value of prevtop is initialized to 0 and 
                    168: normally does not need to be manipulated by the application program.
                    169: .TP
                    170: .B generator
                    171: Menu items may be generated dynamically from a program by specifying
                    172: a generator function in the \fITmenu\fP structure.
                    173: If the item field in the \fITmenu\fP data structure
                    174: is 0 when a menu is entered,
                    175: either by calling \fItmenuhit\fP or through the sub-menu mechanism,
                    176: then the routine specified by \fIgenerator\fR
                    177: is called with two parameters that are
                    178: an integer index beginning at 0 and the address of the current \fITmenu\fP.
                    179: The generator must return a pointer to a \fITitem\fP 
                    180: structure containing the text for the corresponding menu item.
                    181: This generator function is called repeatedly
                    182: with the index increasing by 1 until the generator returns a \s-1NULL\s+1
                    183: for the text field in the \fITitem\fP structure, 
                    184: indicating the end of the menu selections.
                    185: .TP
                    186: .B menumap
                    187: In applications where many menus are to be used,
                    188: the programmer can re-define the \fITitem\fP structure to include
                    189: only those fields that are actually used.
                    190: This has the advantage of requiring less data initialization
                    191: on the part of the programmer. It is done with a
                    192: bit vector called \fImenumap\fP in the \fITmenu\fP structure.
                    193: If used, the user defined structure replacing \fITitem\fP must contain
                    194: the specified member variables in the same order.
                    195: For example, if one wishes to use only the text, ufield, and next fields
                    196: of a \fITitem\fP structure, he may define a \fITitem\fP structure with
                    197: only those fields, and then set the menumap field of the \fITmenu\fP
                    198: structure to the value of (TM_TEXT|TM_UFIELD|TMNEXT).
                    199: Normally, this variable has the value zero when the standard \fITitem\fP
                    200: structure is used.
                    201: .PP
                    202: Each menu item is defined by a structure of the type \fITitem\fP.
                    203: The 
                    204: .B Titem 
                    205: structure has the following fields:
                    206: .TP
                    207: .B text
                    208: The text field is a pointer to a NULL terminated character string. This
                    209: is the character string that is displayed within the menu.
                    210: .sp
                    211: A facility provided by
                    212: .I tmenuhit
                    213: is that of a spread character.
                    214: A spread character is any ascii character with the high-order bit set
                    215: (e.g., an ascii space character defined as a spread character would have 
                    216: the value of \'\\240\').
                    217: The spread character acts somewhat like a spring pushing against
                    218: the adjacent text and borders within a menu entry.
                    219: The spread character can be placed at the beginning, middle, or end
                    220: of the string defining the menu entry.
                    221: If placed at the beginning of the string,
                    222: the text in the menu item will be right-justified.
                    223: If placed at the end of the string,
                    224: the text will be left justified.
                    225: If placed in the middle of the string, the text on each
                    226: side of the spread character will be pushed against the corresponding
                    227: menu border.  In each case,
                    228: the space created by the spread character will be filled in with
                    229: the ascii character contained in the spread character.
                    230: For entries without a spread character,
                    231: the default is to have the text centered.
                    232: .TP
                    233: .B uval
                    234: This is an integer to be used for any purpose the user wishes.
                    235: It is typically used to store a constant that is used by the application
                    236: to identify \fITitem\fP structures.
                    237: For instance, this field could be set to a unique value for each menu
                    238: item in the menu tree.  In this way, a switch statement
                    239: can easily determine the menu item selection regardless of the menu used
                    240: and the difference in size of different \fITitem\fP structures.
                    241: .TP
                    242: .B grey
                    243: If this field is set to 1, the item will be displayed in
                    244: the menu with a grey background. This item is non-selectable and, if 
                    245: selected, the value \fItmenuhit\fP returns is 0.
                    246: .TP
                    247: .B next
                    248: The \fInext\fP variable points to another menu structure of type \fITmenu\fP
                    249: which defines a submenu for this particular item.
                    250: .TP
                    251: .B icon
                    252: The icon field is a pointer to a Bitmap structure that is
                    253: displayed to the left of the menu item.         The size of the bitmap is
                    254: specified within the Bitmap structure and can vary from one menu item to
                    255: the next.
                    256: The icon can be displayed with or without a text string.
                    257: However, if icons are to be used without text strings, the value of \fItext\fP
                    258: field cannot be NULL, but must point to a NULL string.
                    259: .sp
                    260: When the icon field is used to display a bitmap,
                    261: all \fITitem\fP structures for the specific menu are scanned to find the largest
                    262: bitmap.         This is used to determine the vertical spacing of all the menu
                    263: items within that menu.         Smaller bitmaps on other menu entries will be
                    264: centered within the icon area.
                    265: .TP
                    266: .B font
                    267: The font field is a pointer to a font to be used for the text
                    268: is this menu item. Proportional
                    269: characters and different point size fonts will be positioned appropriately.
                    270: If a NULL value is specified, the 630 resident medium font is used.
                    271: .TP
                    272: .B dfn, bfn, hfn
                    273: These three fields may be initialized to point to functions that will 
                    274: be executed by \fItmenuhit\fP before entering
                    275: a submenu (sliding \fIdown\fP), 
                    276: after returning from a submenu (sliding \fIback\fP),
                    277: and upon making a selection in the current menu (a \fIhit\fP), respectively.
                    278: Each function is passed, as an argument,
                    279: the address of the \fITitem\fP structure from which it is called.
                    280: The hfn function provides an alternative method to using the return value of
                    281: .I tmenuhit.
                    282: .sp
                    283: In the special case of (flags & TM_NORET),
                    284: when a selection is made, the submenu the item
                    285: was in will be erased. Then
                    286: the hfn function
                    287: will be called with the selected item. If there is a parent
                    288: to this menu
                    289: the bfn and dfn functions will also be called in that order (if they 
                    290: are initialized) 
                    291: after which the menu will be redrawn.
                    292: This is due to the recursiveness of 
                    293: .I tmenuhit.
                    294: .sp
                    295: If any of the dfn, bfn, or hfn functions execute calls to the 
                    296: function 
                    297: .I tmret(), tmenuhit
                    298: will ignore the TM_NORET flag and will return the selection made.
                    299: .SH EXAMPLE
                    300: The following example is a comprehensive example of how one may use 
                    301: .I tmenuhit.
                    302: The example presents a menu tree when button 3 is depressed and,
                    303: upon selection of a menu item, it 
                    304: prints the text of that item at the bottom of the screen.
                    305: The top level menu contains six items each pointing to a submenu. 
                    306: They are 
                    307: .I font, test, bttn3, icons, spread, 
                    308: and
                    309: .I scroll.
                    310: The following is a brief explanation of each submenu and the functions it
                    311: intends to demonstrate.
                    312: .TP
                    313: .I font
                    314: The font submenu demonstrates the use of fonts and icons
                    315: (within the menu item) and the use of the hfn and dfn functions.
                    316: An hfn function called setfont is executed on selection and
                    317: sets the font to the selected font.  Before the font submenu
                    318: is displayed, a dfn function called setmark will place a checkmark icon
                    319: next to the current font in use.
                    320: .TP
                    321: .I test
                    322: This submenu contains various sized 
                    323: strings to demonstrate how \fItmenuhit\fP alters its menu item size 
                    324: according to the size of
                    325: the string. 
                    326: .TP
                    327: .I bttn3
                    328: This is a replica of the button3 menu
                    329: on the 630MTG. It demonstrates the menu greying capability. This item also 
                    330: demonstrates how one may use \fItmenuhit\fP to achieve the
                    331: simple functionality of \fImenuhit\fP plus the added capability 
                    332: of greying items. 
                    333: .TP
                    334: .I icons
                    335: This submenu demonstrates the use
                    336: of icons within menu items. 
                    337: .TP
                    338: .I spread
                    339: This submenu 
                    340: demonstrates the spread character facility. 
                    341: .TP
                    342: .I scroll
                    343: This submenu
                    344: demonstrates the use of generators and presents the scrolling menu.
                    345: .P
                    346: Another thing to notice is the use of the abbreviated \fITitem\fP
                    347: structures. There are six different types of \fITitem\fP structures. Each
                    348: one corresponds to a menumap vector which defines the fields being used.
                    349: .PP
                    350: .RS 0
                    351: \s-1
                    352: .nf
                    353: .ft CM
                    354: #include <dmd.h>
                    355: #include <font.h>
                    356: #include <menu.h>
                    357: 
                    358: void setmark(), setfont();
                    359: Titem *scrllist();
                    360: extern Tmenu menu20, menu21, menu22, menu23, menu24, menu25;
                    361: extern Tmenu menu30;
                    362: 
                    363: Word strawberry[] = {
                    364: 0x0000,0x0000,0x0000,
                    365: 0x0000,0x0000,0x0000,
                    366: 0x0000,0x0000,0x0000,
                    367: 0x0000,0x1B80,0x0000,
                    368: 0x0000,0x3D80,0x0000,
                    369: 0x01F8,0x7E80,0x0000,
                    370: 0x03FE,0x7D80,0x0000,
                    371: 0x07AF,0xFB80,0x0000,
                    372: 0x0EF9,0xF780,0x0000,
                    373: 0x1F57,0xFFFE,0x0000,
                    374: 0x1FFB,0xFEAB,0x8000,
                    375: 0x1DAD,0xF77D,0xC000,
                    376: 0x3FFA,0x65B7,0x4000,
                    377: 0x3AAF,0x8FDE,0xE000,
                    378: 0x3FFD,0xFECB,0xA000,
                    379: 0x3BB7,0x5FEE,0xE000,
                    380: 0x3EFD,0xFAAB,0xA000,
                    381: 0x3FAF,0xAFEE,0xE000,
                    382: 0x3AFA,0xFD6B,0xA000,
                    383: 0x3FAF,0xD7DF,0xE000,
                    384: 0x3EFA,0xFED5,0x4000,
                    385: 0x1FAF,0xABBF,0xC000,
                    386: 0x1EFA,0xFFAA,0x8000,
                    387: 0x1FAF,0xD77F,0x8000,
                    388: 0x1FFD,0x7ED5,0x0000,
                    389: 0x0F57,0xD9FE,0x0000,
                    390: 0x0FFE,0xF754,0x0000,
                    391: 0x07AB,0xCDFC,0x0000,
                    392: 0x03FF,0x7EA8,0x0000,
                    393: 0x00F8,0x3BF0,0x0000,
                    394: 0x0000,0x1EE0,0x0000,
                    395: 0x0000,0x0F80,0x0000,
                    396: 0x0000,0x0000,0x0000,
                    397: 0x0000,0x0000,0x0000,
                    398: };
                    399: 
                    400: Word help_icon[] = {
                    401:     0x0000, 0x0000, 0x0000, 0x0000,
                    402:     0xE0E0, 0x6060, 0x7F7E, 0x7DFF,
                    403:     0x6FFB, 0x6C7B, 0x6FFE, 0xFFF8,
                    404:     0x003C, 0x0000, 0x0000, 0x0000,
                    405: };
                    406: 
                    407: 
                    408: /* initialize Bitmap structures */
                    409: Bitmap bm_strawberry = {
                    410:     (Word*) strawberry,        3, 2, 0, 36, 34, 0
                    411: };
                    412: Bitmap bm_help = {
                    413:     (Word*) help_icon,   1, 0, 0, 16, 16, 0
                    414: };
                    415: 
                    416: /*******************************/
                    417: /* definitions for menumap     */
                    418: /*******************************/
                    419: #define TYPE1  TM_TEXT | TM_NEXT | TM_DFN
                    420: #define TYPE2  TM_TEXT
                    421: #define TYPE3  TM_TEXT | TM_NEXT
                    422: #define TYPE4  TM_TEXT | TM_UFIELD
                    423: #define TYPE5  TM_TEXT | TM_ICON
                    424: #define TYPE6  TM_TEXT | TM_ICON | TM_FONT | TM_HFN
                    425: 
                    426: /*******************************/
                    427: /*  define Titem typedef's     */
                    428: /*******************************/
                    429: 
                    430: /*
                    431:  * define a Titem structure with only text, next, and dfn fields
                    432:  */
                    433: typedef struct Titem01
                    434: {
                    435:     char *text;     /* string for menu */
                    436:     struct Tmenu *next;            /* pointer to sub-menu */
                    437:     void (*dfn)();  /* pointer function to execute on submenu */
                    438: } Titem01;
                    439: 
                    440: /*
                    441:  * define a Titem structure with only text field
                    442:  */
                    443: typedef struct Titem2
                    444: {
                    445:     char *text;             /* string for menu */
                    446: } Titem2;
                    447: 
                    448: /*
                    449:  * define a Titem structure with only text and next fields
                    450:  */
                    451: typedef struct Titem3
                    452: {
                    453:     char *text;             /* string for menu */
                    454:     struct Tmenu *next;     /* pointer to sub-menu */
                    455: } Titem3;
                    456: 
                    457: /*
                    458:  * define a Titem structure with only text and ufield fields
                    459:  */
                    460: typedef struct Titem4
                    461: {
                    462:     char *text;             /* string for menu */
                    463:     struct {
                    464:        unsigned short uval;    /* user field */
                    465:        unsigned short grey;    /* flag indicates invalid selection */
                    466:     } ufield;
                    467: } Titem4;
                    468: 
                    469: 
                    470: /*
                    471:  * define a Titem structure with only text and icon fields
                    472:  */
                    473: typedef struct Titem5
                    474: {
                    475:     char *text;     /* string for menu */
                    476:     Bitmap *icon;   /* pointer to the icons bitmap */
                    477: } Titem5;
                    478: 
                    479: 
                    480: /*
                    481:  * define a Titem structure with only text, icon, font and hfn fields
                    482:  */
                    483: typedef struct Titem6
                    484: {
                    485:     char *text;     /* string for menu */
                    486:     Bitmap *icon;   /* pointer to the icons bitmap */
                    487:     Font *font;     /* pointer to font structure */
                    488:     void (*hfn)();  /* function to execute on selection */
                    489: } Titem6;
                    490: 
                    491: /*******************************/
                    492: /* initialize Titem structures */
                    493: /*******************************/
                    494: 
                    495: /*
                    496:  * initialize the Titem structure for the main menu
                    497:  * has only text, next and dfn fields
                    498:  */
                    499: Titem01 L1_root[] =
                    500: {
                    501:     "font",         &menu20,        setmark,
                    502:     "test",         &menu21,        0,
                    503:     "bttn3",        &menu22,        0,
                    504:     "icons",        &menu23,        0,
                    505:     "spread",       &menu24,        0,
                    506:     "scroll",       &menu25,        0,
                    507:      0
                    508: };
                    509: 
                    510: 
                    511: /*
                    512:  * initialize the Titem structure for menu20
                    513:  * has only text, icon, font, hfn fields
                    514:  */
                    515: Titem6 L2_font[] =
                    516: {
                    517:     "smallfont",    0,        0,    setfont,
                    518:     "mediumfont",   0,        0,    setfont,
                    519:     "largefont",    0,        0,    setfont,
                    520:      0
                    521: };
                    522: 
                    523: /*
                    524:  * initialize the Titem structure for menu21
                    525:  * has only text and next fields
                    526:  */
                    527: Titem3 L2_test[] =
                    528: {
                    529:     "A long test string so we can see what happens", 0,
                    530:     "Short strings", &menu30,
                    531:      0
                    532: };
                    533: 
                    534: /*
                    535:  * initialize the Titem structure for menu22
                    536:  * has only text and ufield fields
                    537:  */
                    538: Titem4 L2_bttn3[] =
                    539: {
                    540:     "New",          0, 1,
                    541:     "Reshape",      0, 1,      
                    542:     "Top",          0, 1,                      
                    543:     "Bottom",       0, 1,              
                    544:     "Current",      0, 1,              
                    545:     "Delete",       0, 1,              
                    546:     "Exit",         0, 0,      
                    547:      0
                    548: };
                    549: 
                    550: /*
                    551:  * initialize the Titem structure for menu23
                    552:  * has only text and icon fields
                    553:  */
                    554: Titem5 L2_icons[] =
                    555: {
                    556:     "strawberry", &bm_strawberry,
                    557:     "help", &bm_help,
                    558:      0
                    559: };
                    560: 
                    561: 
                    562: /*
                    563:  * initialize the Titem structure for menu24
                    564:  * has only text field
                    565:  */
                    566: Titem2 L2_spread[] =
                    567: {
                    568:     "left\\240",    /* space character with high bit set */
                    569:     "\\256right",   /* . char with high bit set          */
                    570:     "middle",
                    571:     "left\\337right", /* _ char with high bit set */
                    572:     "a very long string",
                    573:      0
                    574: };
                    575: 
                    576: /*
                    577:  * initialize the Titem structure for menu30
                    578:  * has only text field
                    579:  */
                    580: Titem2 L3_shorts[] =
                    581: {
                    582:     "abc",
                    583:     "xyz",
                    584:     "123",
                    585:     "XYZ",
                    586:     "ABC",
                    587:      0
                    588: };
                    589: 
                    590: 
                    591: /*******************************/
                    592: /* initialize Tmenu structures */
                    593: /*******************************/
                    594: /*
                    595: * menu(xy), where x is the level and y is the menu number
                    596: */
                    597: Tmenu menu10   = { (Titem *) L1_root, 0, 0, 0, TYPE1 };
                    598: Tmenu menu20   = { (Titem *) L2_font, 2, 0, 0, TYPE6 };
                    599: Tmenu menu21   = { (Titem *) L2_test, 0, 0, 0, TYPE3 };
                    600: Tmenu menu22   = { (Titem *) L2_bttn3, 0, 0, 0, TYPE4 };
                    601: Tmenu menu23   = { (Titem *) L2_icons, 0, 0, 0, TYPE5 };
                    602: Tmenu menu24   = { (Titem *) L2_spread, 0, 0, 0, TYPE2 };
                    603: Tmenu menu25   = { (Titem *) 0, 0, 0, scrllist, 0 };
                    604: Tmenu menu30   = { (Titem *) L3_shorts, 0, 0, 0, TYPE2 };
                    605: 
                    606: char noselect[] = "no selection";
                    607: Font *font;
                    608: 
                    609: main()
                    610: {
                    611:     Titem *ret;
                    612: 
                    613:     /* set the font and icon fields in the proper menu */
                    614:     L2_font[0].font = &smallfont;
                    615:     L2_font[1].font = &mediumfont;
                    616:     L2_font[2].font = &largefont;
                    617:     L2_font[1].icon = &B_checkmark;
                    618:     font = &largefont  /* use the medium font to start with */
                    619:     request(MOUSE);
                    620:     while(wait(MOUSE)) {
                    621:        if (button3()) {
                    622:            /* clear the text area for writing strings */
                    623:            cursinhibit();
                    624:            rectf(&display,
                    625:                Rpt(Pt(Drect.origin.x, Drect.corner.y-18), Drect.corner),
                    626:                F_CLR);
                    627:            cursallow();
                    628:            if(ret = tmenuhit (&menu10, 3, TM_EXPAND)) {
                    629:                /* write the menu string in text area */
                    630:                string(font, ret->text, &display,
                    631:                   Pt(Drect.origin.x+5, Drect.corner.y-18),
                    632:                   F_XOR);
                    633:            }
                    634:            else {  /* no selection was made */
                    635:                string(font, noselect, &display,
                    636:                   Pt(Drect.origin.x+5, Drect.corner.y-18),
                    637:                   F_XOR);
                    638:            }
                    639:        }
                    640:        else if (button1()) 
                    641:            exit();
                    642:     }
                    643: }
                    644: 
                    645: char digits[10];
                    646: Titem scrlitem;
                    647: char scrlstr[] = "scroll";
                    648: 
                    649: /*
                    650:  * generator for scroll menu
                    651:  * generate 99 menu items
                    652:  */
                    653: Titem *scrllist(i, m)
                    654: int i;
                    655: Tmenu *m;
                    656: {
                    657:     int j;
                    658: 
                    659:     if (i > 99) {      /* generator stopping condition */
                    660:        scrlitem.text = 0;
                    661:     }
                    662:     else {             /* generate text for items (i.e. "scroll56") */
                    663:        scrlitem.text = digits;
                    664:        for (j=0; scrlstr[j] != '\\0'; j++) digits[j] = scrlstr[j];
                    665:        digits[j++] = i/10 + '0';
                    666:        digits[j++] = i - (i/10 * 10) + '0';
                    667:        digits[j] = '\\0';
                    668:     }
                    669:     return ( &scrlitem );
                    670: }
                    671: 
                    672: /*
                    673:  * a dfn function.
                    674:  * This is executed before the font submenu is entered
                    675:  * place the checkmark by the proper font
                    676:  */
                    677: void setmark(mi)
                    678: Titem01 *mi;
                    679: {
                    680:     Tmenu *tm;
                    681:     Titem6 *tmi;
                    682:     int    index;
                    683:     int    hit;
                    684: 
                    685:     tm = mi->next;
                    686:     hit = tm->prevhit + tm->prevtop;
                    687:     for (index=0, tmi=(Titem6 *)tm->item; tmi->text; index++, tmi++) {
                    688:        tmi->icon = (index == hit) ? &B_checkmark:0;
                    689:     }
                    690: }
                    691: 
                    692: /*
                    693:  * an hfn function
                    694:  * this is executed after a selection is made
                    695:  */
                    696: void setfont(mi)
                    697: Titem6 *mi;
                    698: {
                    699:     /* set the font to the selected font */
                    700:     font = mi->font;
                    701: }
                    702: \fR
                    703: .fi
                    704: .RE
                    705: \s+1
                    706: .SH SEE ALSO
                    707: menuhit(3L), structures(3R).
                    708: .SH WARNINGS
                    709: Common uses for user-provided functions in the \fITitem\fP structure
                    710: include modifying the members of menu data structures 
                    711: such as the \fIicon\fP
                    712: and \fIgrey\fP fields.  The user must be careful that such menu structures are
                    713: properly initialized.
                    714: .PP
                    715: Whenever a menu is displayed, the screen image obscured by the menu is
                    716: saved in a bitmap and then later restored when the menu disappears.
                    717: If the terminal is
                    718: out of memory and therefore cannot save the screen image,
                    719: then the menu will be displayed in \s-1XOR\s+1 (exclusive or)
                    720: mode on top of the existing screen image.
                    721: Menu items may still be selected in this mode but 
                    722: may be difficult to read.
                    723: To remedy this problem,
                    724: memory may be freed up by either deleting or
                    725: reshaping windows before the menu is displayed.
                    726: .PP
                    727: Because the \fItmenuhit\fR code is recursive, 
                    728: an arbitrary limit to a depth of eight 
                    729: menus is defined to avoid stack overflow. 
                    730: .PP
                    731: The user should be careful not to perform screen writes from within the
                    732: dfn, bfn, or hfn functions.  Any writes to the screen from within these
                    733: functions can corrupt the displayed menu.

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.