|
|
1.1 ! root 1: .TH XMENU 3X "29 January 1986" "X Version 10" ! 2: .SH NAME ! 3: XMenu - X Deck of cards Menu System ! 4: .SH SYNOPSIS ! 5: .nf ! 6: .B #include <X/XMenu.h> ! 7: .PP ! 8: .B XMenu *XMenuCreate(parent, xdef_env) ! 9: .B Window parent; ! 10: .B char *xdef_env; ! 11: .PP ! 12: .B int XMenuAddPane(menu, label, active) ! 13: .B XMenu *menu; ! 14: .B char *label; ! 15: .B int active; ! 16: .PP ! 17: .B int XMenuAddSelection(menu, pane, data, label, active) ! 18: .B XMenu *menu; ! 19: .B int pane; ! 20: .B char *data; ! 21: .B char *label; ! 22: .B int active; ! 23: .PP ! 24: .B int XMenuInsertPane(menu, pane, label, active) ! 25: .B XMenu *menu; ! 26: .B int pane; ! 27: .B char *label; ! 28: .B int active; ! 29: .PP ! 30: .B int XMenuInsertSelection(menu, pane,selection, data, label, active) ! 31: .B XMenu *menu; ! 32: .B int pane, selection; ! 33: .B caddr_d data; ! 34: .B char *label; ! 35: .B int active; ! 36: .PP ! 37: .B int XMenuFindPane(menu, label) ! 38: .B XMenu *menu; ! 39: .B char *label; ! 40: .PP ! 41: .B int XMenuFindSelection(menu, pane, label) ! 42: .B XMenu *menu; ! 43: .B int pane; ! 44: .B char *label; ! 45: .PP ! 46: .B int XMenuChangePane(menu, pane, label) ! 47: .B XMenu *menu; ! 48: .B int pane; ! 49: .B char *label; ! 50: .PP ! 51: .B int XMenuChangeSelection(menu, pane,selection, data,d_sw, label,l_sw) ! 52: .B XMenu *menu; ! 53: .B int pane, selection; ! 54: .B char *data; ! 55: .B int d_sw; ! 56: .B char *label; ! 57: .B int l_sw; ! 58: .PP ! 59: .B int XMenuSetPane(menu, pane, active) ! 60: .B XMenu *menu; ! 61: .B int pane; ! 62: .B int active; ! 63: .PP ! 64: .B int XMenuSetSelection(menu, pane, selection, active) ! 65: .B XMenu *menu; ! 66: .B int pane, selection; ! 67: .B int active; ! 68: .PP ! 69: .B int XMenuDeletePane(menu, pane) ! 70: .B XMenu *menu; ! 71: .B int pane; ! 72: .PP ! 73: .B int XMenuDeleteSelection(menu, pane, selection) ! 74: .B XMenu menu; ! 75: .B int pane, selection; ! 76: .PP ! 77: .B int XMenuRecompute(menu) ! 78: .B XMenu *menu; ! 79: .PP ! 80: .B XMenuEventHandler(handler) ! 81: .B int (*handler)(); ! 82: .PP ! 83: .B int XMenuLocate(menu, pane,selection, x,y, ulx,uly, width,height) ! 84: .B XMenu *menu; ! 85: .B int pane, selection; ! 86: .B int x, y; ! 87: .B int *ulx, *uly; ! 88: .B int *width, *height; ! 89: .PP ! 90: .B XMenuSetFreeze(menu, freeze) ! 91: .B XMenu *menu; ! 92: .B int freeze; ! 93: .PP ! 94: .B int XMenuActivate(menu, pane,selection, x,y, event_mask, data) ! 95: .B XMenu *menu; ! 96: .B int *pane, *selection; ! 97: .B int x, y; ! 98: .B int event_mask; ! 99: .B char **data; ! 100: .PP ! 101: .B XMenuDestroy(menu) ! 102: .B XMenu *menu; ! 103: .PP ! 104: .B char *XMenuError() ! 105: .fi ! 106: .SH DESCRIPTION ! 107: .PP ! 108: .I XMenu ! 109: is an ! 110: .I X ! 111: Window System Utility Package that implements a `deck of cards' ! 112: menu system. ! 113: .I XMenu ! 114: is intended for use in conjunction with ! 115: .I Xlib, ! 116: the \fIC Language X Window System Interface Library.\fP ! 117: .PP ! 118: In a `deck of cards' menu system a menu is composed ! 119: of several cards or panes. The panes are stacked as if they were a ! 120: deck of playing cards that were fanned out. Each of these ! 121: panes has one or more selections. ! 122: A user interacts with a `deck of cards' menu by sliding the mouse cursor ! 123: across the panes of the menu. As the mouse cursor enters each pane it ! 124: will rise to the top of the deck and become `current'. ! 125: If the current pane is an active pane it will be `activated', or made ! 126: available for selection. To indicate this its background will then change ! 127: from the patterned inactive background to a solid color and the ! 128: selections on that pane will be activated. ! 129: If the current pane is not an active pane (a setable state) then it ! 130: will not be activated. To indicate this its background will continue ! 131: to be the patterned inactive background and no selections on the ! 132: pane will be activated. ! 133: The pane previously containing the mouse will lower (preserving its ! 134: stacking order). If it was activated it will then become deactivated, ! 135: its background changing back to the inactive pattern. ! 136: Because of this action it is not possible to have more than one current ! 137: pane at any one time. ! 138: When the mouse cursor enters an active selection in a pane that has been ! 139: activated then that selection will become activated and be high lighted. ! 140: If the selection is not active or the pane has not been activated ! 141: then the selection will not be activated and will not be high lighted. ! 142: Selection high lighting is accomplished in one of two ways depending ! 143: upon the state of the user's ! 144: .I Xdefaults ! 145: variables. ! 146: If `box' mode high lighting is in effect, the menu selection will be ! 147: activated by placing a high light box around the selection as the mouse ! 148: cursor enters the selection's active region and removing it (deactivating ! 149: the selection) as the cursor leaves. ! 150: If `invert' mode high lighting is in effect, the menu selection will be ! 151: activated by inverting the background and foreground colors within the ! 152: selection's active region as the mouse cursor enters it and reinverting ! 153: them as the cursor leaves. ! 154: .PP ! 155: The application specifies a mouse event that will signify that the user ! 156: has made a selection. Any time that the selection mouse event is received by ! 157: .I XMenu ! 158: one of several results will occur, depending upon the state of the menu system ! 159: at the time of the event. If the selection event occurs while the mouse ! 160: cursor is in an activated selection the data that has been stored with that ! 161: selection will be returned to the application program. ! 162: The data stored is in the form of a generic pointer to memory (char *). ! 163: This allows the application programmer to completely define the interpretation ! 164: of the selection data by recasting the data pointer as is desired. ! 165: .PP ! 166: An application constructs a menu by first creating the ! 167: .I XMenu ! 168: object. Once the ! 169: .I XMenu ! 170: object has been created then panes and selections are added in order as ! 171: is needed. Typically panes contain related selections that are `described' ! 172: by the pane's label. For example, you might create a pane labeled `Mail' ! 173: that has selections labeled `Read', `Send', `Forward', `Refile' and `Delete'. ! 174: There is no real need for the panes in a menu to be related to each other but ! 175: typically they are related by default by the fact that they are all being ! 176: utilized the application that created the menu. ! 177: .PP ! 178: The ! 179: .I XMenu ! 180: system is maintained (menus, panes and selections) via routines in ! 181: the ! 182: .I XMenu ! 183: library. The library contains the following routines: ! 184: .PP ! 185: .TP 8 ! 186: .B XMenuCreate ! 187: In order for a process to create a menu, it is necessary for that process ! 188: to have opened a connection to an ! 189: .I X ! 190: display server and have a window in hand that will be designated as the ! 191: parent window of the menu being created (remember that ! 192: .I X ! 193: is designed such that child windows of a parent window are clipped to the ! 194: borders of the parent). Typically the ! 195: .I X ! 196: root window ( ! 197: .I RootWindow ! 198: ) is used for this purpose. When the connection is open and a parent ! 199: window chosen, the application calls ! 200: .I XMenuCreate ! 201: passing it the parent window and a null-terminated string. ! 202: The string designates the default environment name that will be used ! 203: by XMenu to read the users ! 204: .I Xdefaults ! 205: variables. Typically the application name is used for this purpose (a good ! 206: software engineering practice is to use element zero of the applications ! 207: argument vector, argv[0], as the default environment since this is the ! 208: name by which the application was called from the shell). All ! 209: .I user ! 210: setable parameters are set via the ! 211: .I Xdefaults ! 212: mechanism. If any parameters do not have ! 213: .I Xdefaults ! 214: values then they default to preset ! 215: .I XMenu ! 216: internal values. The ! 217: .I Xdefaults ! 218: parameters are listed below along with their preset internal values. ! 219: If the create operation is successful ! 220: .I XMenuCreate ! 221: will return an ! 222: .I XMenu ! 223: object. If it fails NULL will be returned. ! 224: .PP ! 225: .TP 8 ! 226: .B XMenuAddPane ! 227: Once a menu has been created the application may then begin ! 228: adding panes and subsequently selections. Panes are added by calling ! 229: .I XMenuAddPane. ! 230: .I XMenuAddPane ! 231: adds additional panes to a menu in call order. That is, panes will appear ! 232: in the menu with the first pane added being at the front of the pane stack ! 233: and the last pane added being at the back of the pane stack. ! 234: .I XMenuAddPane ! 235: takes the following arguments: The menu to which the pane is being added; A ! 236: null-terminated string that will be the label for the new pane; and an flag ! 237: that designates whether or not the pane is to be considered active for ! 238: selection. It is sometimes useful to add inactive panes to indicate a ! 239: currently unavailable but planned set of selections. If the add operation is ! 240: successful the index number of the pane just added will be returned. If it ! 241: fails XM_FAILURE will be returned. Further panes may be added at a later time ! 242: but remember that when this routine is used to add panes they are always added ! 243: to the back of the pane stack! ! 244: .PP ! 245: .TP 8 ! 246: .B XMenuAddSelection ! 247: Once a pane has been added to a menu is it possible to begin adding selections ! 248: to that pane. Selections are added to panes in much the same way as panes are ! 249: added to menus. Selections are added by calling ! 250: .I XMenuAddSelection. ! 251: .I XMenuAddSelection ! 252: adds additional selections to a pane in call order. That is, selections will ! 253: appear in the pane with the first selection added being at the top of the pane ! 254: and the last selection added being at the bottom of the pane. ! 255: .I XMenuAddSelection ! 256: takes the following arguments: The menu containing the pane to which the ! 257: selection is being added; The index number of the pane to which the selection ! 258: is being added; A null-terminated string that will be the label for the new ! 259: selection; A (char *) data value that will be returned by ! 260: .I XMenuActivate ! 261: whenever the new selection is selected by the menu's user; and a flag that ! 262: designates whether or not the selection will be considered active. It is ! 263: sometimes useful to add inactive selections which may become active as the ! 264: application state changes. If the add operation is successful then the ! 265: index number of the selection just added will be returned. If it fails ! 266: XM_FAILURE will be returned. Further selections may be added at a later time ! 267: but remember when this routine is used to add selections they are always added ! 268: to the bottom of a pane! ! 269: .PP ! 270: .TP 8 ! 271: .B XMenuInsertPane ! 272: This routine allows the application to insert menu panes into a menu in ! 273: random order. If the index number of the pane being inserted matches the ! 274: index number of a pane that already exists, then the existing pane is displaced ! 275: backward (its index number and the index numbers of all following planes ! 276: increased by one) in the menu and the new pane inserted in its place. Panes ! 277: may be inserted into any menu provided that the index number of the pane being ! 278: inserted is no more than one greater than the index number of the last pane in ! 279: the menu. For example, if a menu contains 4 panes with index numbers 0 through ! 280: 3 then it is possible to insert a new pane with an index number from 0 through ! 281: 4 inclusive. It is possible to use ! 282: .I XMenuInsertPane ! 283: in place of ! 284: .I XMenuAddPane ! 285: but in situations where panes are simply being added to a menu one after ! 286: another then the use of the simpler and more efficient ! 287: .I XMenuAddPane ! 288: routine is encouraged. ! 289: .I XMenuInsertPane ! 290: takes the following arguments: The menu into which the pane is being inserted; ! 291: the index number of the new pane; a null-terminated string that will be the ! 292: label for the new pane; and an int that designates whether or not the pane ! 293: will to be considered active for selection. It is sometimes useful to add ! 294: inactive panes to indicate a currently unavailable but planned set of ! 295: selections. If the insert operation is successful the index number of the ! 296: pane just inserted will be returned. If it fails XM_FAILURE will be returned. ! 297: .PP ! 298: .TP 8 ! 299: .B XMenuInsertSelection ! 300: This routine allows the application to insert selections into a menu pane in ! 301: random order. If the index number of the selection being inserted matches the ! 302: index number of a selection that already exists in the specified pane, then the ! 303: existing selection is displaced downward (its index number and the index ! 304: numbers of all following selections increased by one) in the pane and the new ! 305: selection inserted in its place. Selections may be inserted into any pane ! 306: provided that the index number of the selection being inserted is no more than ! 307: one greater than the index number of the last selection in the pane. For ! 308: example, if a pane contains 4 selections numbered 0 through 3 then it is ! 309: possible to insert a new selection with an index number from 0 through 4 ! 310: inclusive. It is possible to use ! 311: .I XMenuInsertSelection ! 312: in place of ! 313: .I XMenuAddSelection ! 314: but in situations where selections are simply being added to a pane one after ! 315: another then the use of the simpler and more efficient ! 316: .I XMenuAddSelection ! 317: routine is encouraged. ! 318: .I XMenuInsertSelection ! 319: takes the following arguments: the menu containing the pane into which the ! 320: selection is being inserted; the index number of the pane to which the ! 321: selection is being inserted; the desired index number of the new selection; ! 322: a null-terminated string that will be the label for the new selection; A ! 323: (char *) data value that will be returned by ! 324: .I XMenuActivate ! 325: whenever the new selection is selected by a user; and an int that designates ! 326: whether or not the selection will be considered active for selection. It is ! 327: sometimes useful to insert inactive selections which may become active as the ! 328: application state changes. If the insert operation is successful the index ! 329: number of the selection just inserted will be returned. If it fails XM_FAILURE ! 330: will be returned. ! 331: .PP ! 332: .TP 8 ! 333: .B XMenuFindPane ! 334: This routine allows the application to find the index number of a pane whose ! 335: label matches a given NULL terminated string. ! 336: .I XMenuFindPane ! 337: takes the following arguments: the menu containing the pane whose index number ! 338: is being searched for; and a null terminated string to be searched for. ! 339: If the find operation is successful then the index number of the first pane ! 340: whose label matches the given string will be returned. If it fails XM_FAILURE ! 341: will be returned. ! 342: .PP ! 343: .TP 8 ! 344: .B XMenuFindSelection ! 345: This routine allows the application to find the index number of a selection ! 346: whose label matches a given NULL terminated string. ! 347: .I XMenuFindSelection ! 348: takes the following arguments: the menu containing the pane which contains ! 349: the selection being searched for; the index number of the pane which contains ! 350: the selection being searched for; and a null terminated string to be searched ! 351: for. ! 352: If the find operation is successful then the index number of the first ! 353: selection whose label matched the given string will be returned. If is fails ! 354: XM_FAILURE will be returned. ! 355: .PP ! 356: .TP 8 ! 357: .B XMenuChangePane ! 358: This routine allows the application to change a pane's label on the fly. This ! 359: is useful for situations where a state change in the application must be ! 360: reflected in the menu. ! 361: .I XMenuChangePane ! 362: takes the following arguments: the menu containing the pane whose label is ! 363: being changed; the index number of that pane in the specified menu; and a ! 364: null-terminated string that will be the used as the new pane label. If the ! 365: change operation is successful the index number of the pane just changed will ! 366: be returned. If it fails XM_FAILURE will be returned. ! 367: .I XMenuChangePane ! 368: may be called any time after the pane being changed has been added / inserted ! 369: into the specified menu. ! 370: .PP ! 371: .TP 8 ! 372: .B XMenuChangeSelection ! 373: This routine allows the application to change a selection's data and label on ! 374: the fly. This is useful for situations where a state change in the application ! 375: must be reflected in the menu. ! 376: .I XMenuChangeSelection ! 377: takes the following arguments: the menu containing the pane that contains the ! 378: selection to be changed; the index number of that pane in the menu; the index ! 379: number of the selection to be changed; a (char *) new data value for the ! 380: selection; an int that indicates whether or not to actually store the new ! 381: data value (in case only the label is being changed); Aanull-terminated string ! 382: that will be the used as the new selection label; and an int that indicates ! 383: whether or not to actually store the new label (incase only the data value ! 384: is being changed). If the change operation is successful the index number of ! 385: the selection just changed will be returned. If it fails XM_FAILURE will be ! 386: returned. ! 387: .I XMenuChangeSelection ! 388: may be called anytime after the pane selection being changed has been added to ! 389: the specified pane and menu. ! 390: .PP ! 391: .TP 8 ! 392: .B XMenuSetPane ! 393: .I XMenuSetPane ! 394: allows the application to make an active pane inactive or an inactive pane ! 395: active. This provides the application with the ability to restrict the usage ! 396: of certain panes to times when they may or may not have a valid purpose. In ! 397: addition this allows the application to activate and utilize dummy panes that ! 398: were added at menu creation time as place holders for future selections. ! 399: .I XMenuSetPane ! 400: takes the following arguments: the menu containing the pane to be activated or ! 401: deactivated; the index number of that pane in the specified menu; and an int ! 402: that designates whether or not the pane is to be considered active for ! 403: selection. If the set operation is successful the index number of the pane ! 404: just set will be returned. If it fails XM_FAILURE will be returned. ! 405: .I XMenuSetPane ! 406: may be called anytime after the pane being set has been added / inserted into ! 407: the specified menu. ! 408: .PP ! 409: .TP 8 ! 410: .B XMenuSetSelection ! 411: .I XMenuSetSelection ! 412: allows the application to make an active selection inactive or an inactive ! 413: selection active. This provides the application with the ability to restrict ! 414: the usage of certain selections to times when they may or may not have a valid ! 415: purpose. In addition this allows the application to activate and utilize ! 416: selections that were added at menu creation time with a future purpose in mind. ! 417: .I XMenuSetSelection ! 418: takes the following arguments: the menu containing the pane that contains the ! 419: selection to be activated or deactivated; the index number of that pane in the ! 420: menu; the index number of the selection to be activated / deactivated; and an ! 421: int that designates whether or not to make the specified selection active. If ! 422: the set operation is successful the index number of the selection just set will ! 423: be returned. If it fails XM_FAILURE will be returned. ! 424: .I XMenuSetSelection ! 425: may be called anytime after the pane selection being set has been added to the ! 426: specified pane and menu. ! 427: .PP ! 428: .TP 8 ! 429: .B XMenuDeletePane ! 430: This routine allows the application to delete panes when they will no longer ! 431: be needed. ! 432: .I XMenuDeletePane ! 433: takes the following arguments: the menu containing the pane to be deleted; ! 434: and the index number of that pane in the specified menu. ! 435: .PP ! 436: .TP 8 ! 437: .B XMenuDeleteSelection ! 438: This routine allows the application to delete selections when they will no ! 439: longer be needed. ! 440: .I XMenuDeleteSelection ! 441: takes the following arguments: the menu containing the pane which contains the ! 442: selection to be deleted; the index number of the pane containing the selection ! 443: to be deleted; and the index number of the selection to be deleted in that ! 444: pane. ! 445: .PP ! 446: .TP 8 ! 447: .B XMenuRecompute ! 448: After the initial menu configuration has been constructed (in fact, anytime ! 449: that the menu configuration, a pane label or selection label is altered), the ! 450: menu dependencies need to be recomputed. ! 451: .I XMenu ! 452: will do this automatically if needed when ! 453: .I XMenuLocate ! 454: or ! 455: .I XMenuActivate ! 456: is called. In the interest of efficiency it is suggested that the application ! 457: call ! 458: .I XMenuRecompute ! 459: prior to any calls to ! 460: .I XMenuLocate ! 461: or ! 462: .I XMenuActivate. ! 463: This need only be done if ! 464: .I XMenuAddPane, ! 465: .I XMenuAddSelection, ! 466: .I XMenuInsertPane, ! 467: .I XMenuInsertSelection, ! 468: .I XMenuChangePane, ! 469: .I XMenuChangeSelection, ! 470: .I XMenuDeletePane, ! 471: or ! 472: .I XMenuDeleteSelection ! 473: have been called since the last call to ! 474: .I XMenuRecompute ! 475: or ! 476: .I XMenuActivate. ! 477: If ! 478: .I XMenuRecompute ! 479: is called before the first pane has been added to the menu a error will result ! 480: indicating that the menu has not been initialized. The most efficient state ! 481: is achieved if a sequence of panes and selections are added or modified in ! 482: order and then a single call is immediately made to ! 483: .I XMenuRecompute. ! 484: In this way all operations will batched and all dependencies will be up to date ! 485: by the time the next ! 486: .I XMenuActivate ! 487: call occurs. If the recompute operation is successful XM_SUCCESS will be ! 488: be returned. If it fails XM_FAILURE will be returned. ! 489: .PP ! 490: .TP 8 ! 491: .B XMenuEventHandler ! 492: Since ! 493: .I XMenu ! 494: shares the ! 495: .I Xlib ! 496: event queue with the application, it is possible that ! 497: .I X ! 498: events selected by the application will arrive and be queued while a menu is ! 499: posted. Before a menu is posted, it is up to the application to decide what ! 500: will happen to events that do occur while the menu is posted. ! 501: .I XMenuEventHandler ! 502: allows the application to specify an asynchronous event handling routine. ! 503: .I XMenuEventHandler ! 504: takes only one argument which is a pointer to a routine which returns int. ! 505: This routine will be called by ! 506: .I XMenuActivate ! 507: if it encounters an event that it does not recognize. The format of the ! 508: handler should be as follows: ! 509: .br ! 510: .B int handler(event) ! 511: .br ! 512: .B XEvent *event; ! 513: .br ! 514: If no action is taken by the application (i.e., no event handler is specified) ! 515: .I XMenuActivate ! 516: will discard any events that they do not recognize. ! 517: .PP ! 518: .TP 8 ! 519: .B XMenuLocate ! 520: This routine provides an application will all the necessary data to properly ! 521: locate and position a menu with respect to the parent window. ! 522: .I XMenuLocate ! 523: takes the following arguments: the menu that is being located; the index number ! 524: of the desired current pane; the index number of the desired current ! 525: selection; the X and Y coordinates of where the application would like the ! 526: center of the current selection (in the current pane) to be; and four return ! 527: value pointers to int that will be filled in by the routine. The four return ! 528: value pointers are set to the following values (respectively): the upper ! 529: left X and Y coordinates of the entire menu (relative to the parent window); ! 530: and the overall width and height of the entire menu. If the specified ! 531: current selection is not a valid selection index within the specified ! 532: current pane (i.e., a negative value or a value greater than the index of ! 533: the last selection in that pane) the return values will be computed with the ! 534: specified X and Y location in the center of the flag of the specified current ! 535: pane. If the locate operation is successful XM_SUCCESS will be be returned. ! 536: If it fails XM_FAILURE will be returned. ! 537: .PP ! 538: .TP 8 ! 539: .B XMenuSetFreeze ! 540: This routine allows the application to forcibly override the ! 541: .I Xdefaults ! 542: setting of the `freeze' parameter. If freeze mode is turned on the ! 543: bits under where the menu will appear are saved by ! 544: .I XMenu ! 545: then the ! 546: .I X ! 547: server is frozen and remains frozed while the menu is activated. Immediately ! 548: after the menu is deactivated the bits under the menu are restored to their ! 549: original state and the server is unfrozen. This routine is necessary for ! 550: certain applications that must guarantee that the screen contents are not ! 551: damaged by ! 552: .I XMenu. XMenuSetFreeze ! 553: takes two arguments: The menu to be set and an int that indicates whether or ! 554: not to place the menu in freeze mode. ! 555: .PP ! 556: .TP 8 ! 557: .B XMenuActivate ! 558: .I XMenuActivate maps a given menu to the display and activates the menu for ! 559: user selection. Before ! 560: .I XMenuActivate ! 561: is called it is suggested that the application synchronize the X connection and ! 562: and process all events in the ! 563: .I Xlib ! 564: internal event queue. This guarantees that a minimum of asynchronous ! 565: call-backs to the applications event handler routine (or discards if no ! 566: application event handler is specified). ! 567: .I XMenuActivate ! 568: guarantees that no unprocessed events of its own will be left in the ! 569: .I Xlib ! 570: event queue upon its return. ! 571: .I XMenuActivate ! 572: takes the following arguments: the menu that is to be posted; the desired ! 573: current pane and selection; the X and Y menu position; the mouse button event ! 574: mask; and a pointer to a pointer to char (char **). The menu is positioned ! 575: within the menu's parent window such that the specified X and Y location ! 576: (relative to the parent window) is in the center of the specified current ! 577: selection in the current pane. If the specified current selection ! 578: is not a valid selection index within the specified current pane (i.e., a ! 579: negative value or a value greater than the index of the last selection in ! 580: that pane) the menu will be mapped with the specified X and Y location in ! 581: the center of the flag of the specified current pane. The mouse button ! 582: event mask provided by the application should be suitable for an ! 583: .I XGrabMouse ! 584: operation. It provides the application with a way to indicate which mouse ! 585: events will be used to identify a selection request. Every time ! 586: .I XMenuActivate ! 587: returns, the pane and selection indices are left at their last known values ! 588: (i.e., the last current pane and selection indices). The following are the ! 589: defined return states for this routine: ! 590: .LP ! 591: .nf ! 592: .ta 1i 1.5i ! 593: 1) If the selection that is current at the time a ! 594: selection request is made is active then the data ! 595: pointer will be set to the data associated with that ! 596: particular selection and XM_SUCCESS is returned. ! 597: 2) If the selection that is current at the time a ! 598: selection request is made is not active then the data ! 599: pointer will be left untouched and XM_IA_SELECT will ! 600: be returned. ! 601: 3) If there is no selection current at the time a ! 602: selection request is made then the data pointer will ! 603: be left untouched and XM_NO_SELECT will be returned. ! 604: 4) If at any time an error occurs the data pointer is ! 605: left untouched and XM_FAILURE is returned. ! 606: .fi ! 607: .PP ! 608: .TP 8 ! 609: .B XMenuDestroy ! 610: When the application is no longer intending to use a menu ! 611: .I XMenuDestroy ! 612: should be called. ! 613: .I XMenuDestroy ! 614: frees all resources (both ! 615: .I X ! 616: resources and system resources) that are being held by the menu. ! 617: .I XMenuDestroy ! 618: takes only one argument, the menu to be destroyed. WARNING! Using a menu after ! 619: it has been destroyed is to invite disaster! ! 620: .PP ! 621: .TP 8 ! 622: .B XMenuError ! 623: When called ! 624: .I XMenuError ! 625: will return a null-terminated string that describes the current error state of ! 626: the ! 627: .I XMenu ! 628: library. The string returned is static in the ! 629: .I XMenu ! 630: library and should not be modified or freed. The error state is set every time ! 631: an ! 632: .I XMenu ! 633: routine returns a status condition. ! 634: .I XMenuError ! 635: takes no arguments. ! 636: .SH X DEFAULTS ! 637: .PP ! 638: .TP 8 ! 639: .B MenuFreeze ! 640: Determines whether or not to grab the ! 641: .I X ! 642: server while a menu is posted. ! 643: One of: on, off. ! 644: The default value is off. ! 645: .PP ! 646: .TP 8 ! 647: .B MenuReverseVideo ! 648: Determines whether clock should be in normal mode (white on black) ! 649: or reverse video mode (black on white). ! 650: On color displays this value is ignored. ! 651: One of: on, off. ! 652: The default value is off. ! 653: .PP ! 654: .TP 8 ! 655: .B MenuStyle ! 656: Determines the menu display style. ! 657: One of: left_hand, right_hand, center. ! 658: The default value is right_hand. ! 659: .PP ! 660: .TP 8 ! 661: .B MenuMode ! 662: Determines the menu selection high light mode. ! 663: One of: box, invert. ! 664: If box mode is chosen then the SelectionBorderWidth and SelectionBorderColor ! 665: parameters effect the box line width and color respectively. ! 666: If invert mode is chose then the SelectionForeground and MenuBackground ! 667: colors are used for the inversion. ! 668: The default value is invert. ! 669: .PP ! 670: .TP 8 ! 671: .B MenuMouse ! 672: Determines the color of the mouse cursor while it is within ! 673: the menu. ! 674: On black and white displays this value is ignored. ! 675: Any valid ! 676: .I X ! 677: color may be used. ! 678: The default value is black. ! 679: .PP ! 680: .TP 8 ! 681: .B MenuBackground ! 682: Determines the menu background color. ! 683: On black and white displays this value is ignored. ! 684: Any valid ! 685: .I X ! 686: color may be used. ! 687: The default value is white. ! 688: .PP ! 689: .TP 8 ! 690: .B MenuInactivePattern ! 691: Determines which of the five possible bitmap patterns will be used to tile ! 692: inactive panes. ! 693: One of: dimple1, dimple3, gray1, gray3, cross_weave. ! 694: The default value is gray3. ! 695: .PP ! 696: .TP 8 ! 697: .B PaneStyle ! 698: Determines the display style of all menu panes. ! 699: One of: flush_left, flush_right, center. ! 700: The default value is center. ! 701: .PP ! 702: .TP 8 ! 703: .B PaneFont ! 704: Determines the font used for the label (heading text) of each pane. ! 705: Any valid ! 706: .I X ! 707: font may be used. ! 708: The default value is 8x13. ! 709: .PP ! 710: .TP 8 ! 711: .B PaneForeground ! 712: Determines the pane foreground color. ! 713: This is the color used for the label (heading text) in each pane. ! 714: On black and white displays this value is ignored. ! 715: Any valid ! 716: .I X ! 717: color may be used. ! 718: The default value is black. ! 719: .PP ! 720: .TP 8 ! 721: .B PaneBorder ! 722: Determines the color of all menu pane borders. ! 723: On black and white displays this value is ignored. ! 724: Any valid ! 725: .I X ! 726: color may be used. ! 727: The default value is black. ! 728: .PP ! 729: .TP 8 ! 730: .B PaneBorderWidth ! 731: Determines the width (in pixels) of all menu pane borders. ! 732: Any integer greater than or equal to 0 may be used. ! 733: The default value is 2. ! 734: .PP ! 735: .TP 8 ! 736: .B PaneSpread ! 737: Determines the horizontal spread of menu panes. ! 738: Any double greater than or equal to 0.0 may be used. ! 739: A value of 1.0 specifies a one to one ratio between horizontal spread and ! 740: vertical spread. ! 741: A value less than 1.0 will compress the menu panes inward and a value greater ! 742: than 1.0 will expand them outward. ! 743: The default value is 1.0. ! 744: .PP ! 745: .TP 8 ! 746: .B SelectionStyle ! 747: Determines the display style of all menu selections. ! 748: One of: flush_left, flush_right, center. ! 749: The default value is flush_left. ! 750: .PP ! 751: .TP 8 ! 752: .B SelectionFont ! 753: Determines the font used for the text in each selection. ! 754: Any valid X font may be used. ! 755: The default value is 6x10. ! 756: .PP ! 757: .TP 8 ! 758: .B SelectionForeground ! 759: Determines the selection foreground color. ! 760: This is the color used for the text in each selection. ! 761: On black and white displays this value is ignored. ! 762: Any valid ! 763: .I X ! 764: color may be used. ! 765: On black and white displays this value is ignored. ! 766: The default value is black. ! 767: .PP ! 768: .TP 8 ! 769: .B SelectionBorder ! 770: Determines the color of all menu selection borders. ! 771: On black and white displays this value is ignored. ! 772: Any valid ! 773: .I X ! 774: color ! 775: may be used. ! 776: The default value is black. ! 777: .PP ! 778: .TP 8 ! 779: .B SelectionBorderWidth ! 780: Determines the width (in pixels) of all menu selection borders. ! 781: Any integer greater than or equal to 0 may be used. ! 782: The default value is 1. ! 783: .PP ! 784: .TP 8 ! 785: .B SelectionSpread ! 786: Determines the inter-selection spread. ! 787: Any double greater than or equal to 0.0 may be used. ! 788: A value of 1.0 specifies that 1.0 times the height of the current selection ! 789: font will be used for padding ! 790: The default value is 0.25. ! 791: .SH DIAGNOSTICS ! 792: .PP ! 793: Since ! 794: .I XMenu ! 795: uses the ! 796: .I Xlib ! 797: library, the ! 798: .I XIOError ! 799: and ! 800: .I XError ! 801: .I Xlib ! 802: routines may be set by the application to change how asynchronous error ! 803: reporting occurs. ! 804: .PP ! 805: Synchronous error reporting is primarily accomplished by examining the return ! 806: values of routines and using the ! 807: .I XMenuError ! 808: routine. Although its use is discouraged, synchronous error reporting may also ! 809: be accomplished by having the application directly examine the value of the ! 810: .I _XMErrorCode ! 811: global variable. ! 812: .I _XMErrorCode ! 813: is set every time an ! 814: .I XMenu ! 815: routine returns a status condition. The following sequence of symbols is ! 816: provided in ! 817: .I XMenu.h ! 818: and may be used to index the null-terminated description strings in the global ! 819: error string array ! 820: .I _XMErrorList. ! 821: .LP ! 822: .nf ! 823: .ta \w'XME_CREATE_WINDOW 'u + .5i ! 824: XME_CODE_COUNT Total number of entries in \fI_XMErrorList\fP (17). ! 825: ! 826: XME_NO_ERROR -> ``No error'' ! 827: XME_NOT_INIT -> ``Menu not initialized'' ! 828: XME_ARG_BOUNDS -> ``Argument out of bounds'' ! 829: XME_P_NOT_FOUND -> ``Pane not found'' ! 830: XME_S_NOT_FOUND -> ``Selection not found'' ! 831: XME_STYLE_PARAM -> ``Invalid menu style parameter'' ! 832: XME_GRAB_MOUSE -> ``Unable to grab mouse'' ! 833: XME_INTERP_LOC -> ``Unable to interpret locator'' ! 834: XME_CALLOC -> ``Unable to calloc memory'' ! 835: XME_CREATE_ASSOC -> ``Unable to create XAssocTable'' ! 836: XME_STORE_BITMAP -> ``Unable to store bitmap'' ! 837: XME_MAKE_TILES -> ``Unable to make tile pixmaps'' ! 838: XME_MAKE_PIXMAP -> ``Unable to make pixmap'' ! 839: XME_CREATE_CURSOR -> ``Unable to create cursor'' ! 840: XME_OPEN_FONT -> ``Unable to open font'' ! 841: XME_CREATE_WINDOW -> ``Unable to create windows'' ! 842: XME_CREATE_TRANSP -> ``Unable to create transparencies'' ! 843: .fi ! 844: .SH FILES ! 845: .PP ! 846: /usr/include/X/XMenu.h, /usr/lib/libXMenu.a, /usr/include/X/Xlib.h, ! 847: /usr/lib/libX.a ! 848: .SH SEE ALSO ! 849: Xlib(3x), X(1), X(8c) ! 850: .SH AUTHOR ! 851: .PP ! 852: Copyright 1985, 1986, Massachusetts Institute of Technology. ! 853: .PP ! 854: See \fIX(1)\fP for a complete copyright notice. ! 855: .PP ! 856: Tony Della Fera (MIT Project Athena, DEC) ! 857: .SH BUGS ! 858: .PP ! 859: There is a problem that necessitates an additional round trip time ! 860: when panes are activated and deactivated. In order for this to be fixed ! 861: efficiently, a change needs to be made to the ! 862: .I X ! 863: protocol.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.