|
|
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 current pane; the index number of the current selection; the X and Y ! 525: coordinates of where the application would like the center of the current ! 526: selection (in the current pane) to be; and four return value pointers to int ! 527: that will be filled in by the routine. The four return value pointers are set ! 528: to the following values (respectively): the upper left X and Y coordinates ! 529: of the entire menu (relative to the parent window); and the overall width and ! 530: height of the entire menu. If the locate operation is successful XM_SUCCESS ! 531: will be be returned. If it fails XM_FAILURE will be returned. ! 532: .PP ! 533: .TP 8 ! 534: .B XMenuSetFreeze ! 535: This routine allows the application to forcibly override the ! 536: .I Xdefaults ! 537: setting of the `freeze' parameter. If freeze mode is turned on the ! 538: bits under where the menu will appear are saved by ! 539: .I XMenu ! 540: then the ! 541: .I X ! 542: server is frozen and remains frozed while the menu is activated. Immediately ! 543: after the menu is deactivated the bits under the menu are restored to their ! 544: original state and the server is unfrozen. This routine is necessary for ! 545: certain applications that must guarantee that the screen contents are not ! 546: damaged by ! 547: .I XMenu. XMenuSetFreeze ! 548: takes two arguments: The menu to be set and an int that indicates whether or ! 549: not to place the menu in freeze mode. ! 550: .PP ! 551: .TP 8 ! 552: .B XMenuActivate ! 553: .I XMenuActivate maps a given menu to the display and activates the menu for ! 554: user selection. Before ! 555: .I XMenuActivate ! 556: is called it is suggested that the application synchronize the X connection and ! 557: and process all events in the ! 558: .I Xlib ! 559: internal event queue. This guarantees that a minimum of asynchronous ! 560: call-backs to the applications event handler routine (or discards if no ! 561: application event handler is specified). ! 562: .I XMenuActivate ! 563: guarantees that no unprocessed events of its own will be left in the ! 564: .I Xlib ! 565: event queue upon its return. ! 566: .I XMenuActivate ! 567: takes the following arguments: the menu that is to be posted; the desired ! 568: current pane and selection; the X and Y menu position; the mouse button event ! 569: mask; and a pointer to a pointer to char (char **). The menu is positioned ! 570: within the menu's parent window such that the specified X and Y location ! 571: (relative to the parent window) is in the center of the specified current ! 572: selection in the current pane. The mouse button event mask provided by the ! 573: application should be suitable for an ! 574: .I XGrabMouse ! 575: operation. It provides the application with a way to indicate which mouse ! 576: events will be used to identify a selection request. Every time ! 577: .I XMenuActivate ! 578: returns, the pane and selection indices are left at their last known values ! 579: (i.e., the last current pane and selection indices). The following are the ! 580: defined return states for this routine: ! 581: .LP ! 582: .nf ! 583: .ta 1i 1.5i ! 584: 1) If the selection that is current at the time a ! 585: selection request is made is active then the data ! 586: pointer will be set to the data associated with that ! 587: particular selection and XM_SUCCESS is returned. ! 588: 2) If the selection that is current at the time a ! 589: selection request is made is not active then the data ! 590: pointer will be left untouched and XM_IA_SELECT will ! 591: be returned. ! 592: 3) If there is no selection current at the time a ! 593: selection request is made then the data pointer will ! 594: be left untouched and XM_NO_SELECT will be returned. ! 595: 4) If at any time an error occurs the data pointer is ! 596: left untouched and XM_FAILURE is returned. ! 597: .fi ! 598: .PP ! 599: .TP 8 ! 600: .B XMenuDestroy ! 601: When the application is no longer intending to use a menu ! 602: .I XMenuDestroy ! 603: should be called. ! 604: .I XMenuDestroy ! 605: frees all resources (both ! 606: .I X ! 607: resources and system resources) that are being held by the menu. ! 608: .I XMenuDestroy ! 609: takes only one argument, the menu to be destroyed. WARNING! Using a menu after ! 610: it has been destroyed is to invite disaster! ! 611: .PP ! 612: .TP 8 ! 613: .B XMenuError ! 614: When called ! 615: .I XMenuError ! 616: will return a null-terminated string that describes the current error state of ! 617: the ! 618: .I XMenu ! 619: library. The string returned is static in the ! 620: .I XMenu ! 621: library and should not be modified or freed. The error state is set every time ! 622: an ! 623: .I XMenu ! 624: routine returns a status condition. ! 625: .I XMenuError ! 626: takes no arguments. ! 627: .SH X DEFAULTS ! 628: .PP ! 629: .TP 8 ! 630: .B MenuFreeze ! 631: Determines whether or not to grab the ! 632: .I X ! 633: server while a menu is posted. ! 634: One of: on, off. ! 635: The default value is off. ! 636: .PP ! 637: .TP 8 ! 638: .B MenuStyle ! 639: Determines the menu display style. ! 640: One of: left_hand, right_hand, center. ! 641: The default value is right_hand. ! 642: .PP ! 643: .TP 8 ! 644: .B MenuMode ! 645: Determines the menu selection high light mode. ! 646: One of: box, invert. ! 647: If box mode is chosen then the SelectionBorderWidth and SelectionBorderColor ! 648: parameters effect the box line width and color respectively. ! 649: If invert mode is chose then the SelectionForeground and MenuBackground ! 650: colors are used for the inversion. ! 651: The default value is invert. ! 652: .PP ! 653: .TP 8 ! 654: .B MenuMouse ! 655: Determines the color of the mouse cursor while it is within ! 656: the menu. ! 657: Any valid ! 658: .I X ! 659: color may be used. ! 660: The default value is black. ! 661: .PP ! 662: .TP 8 ! 663: .B MenuBackground ! 664: Determines the menu background color. ! 665: Any valid ! 666: .I X ! 667: color may be used. ! 668: The default value is white. ! 669: .PP ! 670: .TP 8 ! 671: .B MenuInactivePattern ! 672: Determines which of the five possible bitmap patterns will be used to tile ! 673: inactive panes. ! 674: One of: dimple1, dimple3, gray1, gray3, cross_weave. ! 675: The default value is gray3. ! 676: .PP ! 677: .TP 8 ! 678: .B PaneStyle ! 679: Determines the display style of all menu panes. ! 680: One of: flush_left, flush_right, center. ! 681: The default value is center. ! 682: .PP ! 683: .TP 8 ! 684: .B PaneFont ! 685: Determines the font used for the label (heading text) of each pane. ! 686: Any valid ! 687: .I X ! 688: font may be used. ! 689: The default value is 8x13. ! 690: .PP ! 691: .TP 8 ! 692: .B PaneForeground ! 693: Determines the pane foreground color. ! 694: This is the color used for the label (heading text) in each pane. ! 695: Any valid ! 696: .I X ! 697: color may be used. ! 698: The default value is black. ! 699: .PP ! 700: .TP 8 ! 701: .B PaneBorder ! 702: Determines the color of all menu pane borders. ! 703: Any valid ! 704: .I X ! 705: color may be used. ! 706: The default value is black. ! 707: .PP ! 708: .TP 8 ! 709: .B PaneBorderWidth ! 710: Determines the width (in pixels) of all menu pane borders. ! 711: Any integer greater than or equal to 0 may be used. ! 712: The default value is 2. ! 713: .PP ! 714: .TP 8 ! 715: .B PaneSpread ! 716: Determines the horizontal spread of menu panes. ! 717: Any double greater than or equal to 0.0 may be used. ! 718: A value of 1.0 specifies a one to one ratio between horizontal spread and ! 719: vertical spread. ! 720: A value less than 1.0 will compress the menu panes inward and a value greater ! 721: than 1.0 will expand them outward. ! 722: The default value is 1.0. ! 723: .PP ! 724: .TP 8 ! 725: .B SelectionStyle ! 726: Determines the display style of all menu selections. ! 727: One of: flush_left, flush_right, center. ! 728: The default value is flush_left. ! 729: .PP ! 730: .TP 8 ! 731: .B SelectionFont ! 732: Determines the font used for the text in each selection. ! 733: Any valid X font may be used. ! 734: The default value is 6x10. ! 735: .PP ! 736: .TP 8 ! 737: .B SelectionForeground ! 738: Determines the selection foreground color. ! 739: This is the color used for the text in each selection. ! 740: Any valid ! 741: .I X ! 742: color may be used. ! 743: The default value is black. ! 744: .PP ! 745: .TP 8 ! 746: .B SelectionBorder ! 747: Determines the color of all menu selection borders. ! 748: Any valid ! 749: .I X ! 750: color ! 751: may be used. ! 752: The default value is black. ! 753: .PP ! 754: .TP 8 ! 755: .B SelectionBorderWidth ! 756: Determines the width (in pixels) of all menu selection borders. ! 757: Any integer greater than or equal to 0 may be used. ! 758: The default value is 1. ! 759: .PP ! 760: .TP 8 ! 761: .B SelectionSpread ! 762: Determines the inter-selection spread. ! 763: Any double greater than or equal to 0.0 may be used. ! 764: A value of 1.0 specifies that 1.0 times the height of the current selection ! 765: font will be used for padding ! 766: The default value is 0.25. ! 767: .SH DIAGNOSTICS ! 768: .PP ! 769: Since ! 770: .I XMenu ! 771: uses the ! 772: .I Xlib ! 773: library, the ! 774: .I XIOError ! 775: and ! 776: .I XError ! 777: .I Xlib ! 778: routines may be set by the application to change how asynchronous error ! 779: reporting occurs. ! 780: .PP ! 781: Synchronous error reporting is primarily accomplished by examining the return ! 782: values of routines and using the ! 783: .I XMenuError ! 784: routine. Although its use is discouraged, synchronous error reporting may also ! 785: be accomplished by having the application directly examine the value of the ! 786: .I _XMErrorCode ! 787: global variable. ! 788: .I _XMErrorCode ! 789: is set every time an ! 790: .I XMenu ! 791: routine returns a status condition. The following sequence of symbols is ! 792: provided in ! 793: .I XMenu.h ! 794: and may be used to index the null-terminated description strings in the global ! 795: error string array ! 796: .I _XMErrorList. ! 797: .LP ! 798: .nf ! 799: .ta \w'XME_CREATE_WINDOW 'u + .5i ! 800: XME_CODE_COUNT Total number of entries in \fI_XMErrorList\fP (17). ! 801: ! 802: XME_NO_ERROR -> ``No error'' ! 803: XME_NOT_INIT -> ``Menu not initialized'' ! 804: XME_ARG_BOUNDS -> ``Argument out of bounds'' ! 805: XME_P_NOT_FOUND -> ``Pane not found'' ! 806: XME_S_NOT_FOUND -> ``Selection not found'' ! 807: XME_STYLE_PARAM -> ``Invalid menu style parameter'' ! 808: XME_GRAB_MOUSE -> ``Unable to grab mouse'' ! 809: XME_INTERP_LOC -> ``Unable to interpret locator'' ! 810: XME_CALLOC -> ``Unable to calloc memory'' ! 811: XME_CREATE_ASSOC -> ``Unable to create XAssocTable'' ! 812: XME_STORE_BITMAP -> ``Unable to store bitmap'' ! 813: XME_MAKE_TILES -> ``Unable to make tile pixmaps'' ! 814: XME_MAKE_PIXMAP -> ``Unable to make pixmap'' ! 815: XME_CREATE_CURSOR -> ``Unable to create cursor'' ! 816: XME_OPEN_FONT -> ``Unable to open font'' ! 817: XME_CREATE_WINDOW -> ``Unable to create windows'' ! 818: XME_CREATE_TRANSP -> ``Unable to create transparencies'' ! 819: .fi ! 820: .SH FILES ! 821: .PP ! 822: /usr/include/X/XMenu.h, /usr/lib/libXMenu.a, /usr/include/X/Xlib.h, ! 823: /usr/lib/libX.a ! 824: .SH SEE ALSO ! 825: Xlib(3x), X(1), X(8c) ! 826: .SH AUTHOR ! 827: .PP ! 828: Copyright 1985, 1986, Massachusetts Institute of Technology. ! 829: .PP ! 830: See \fIX(1)\fP for a complete copyright notice. ! 831: .PP ! 832: Tony Della Fera (MIT Project Athena, DEC) ! 833: .SH BUGS ! 834: .PP ! 835: There is a problem that necessitates an additional round trip time ! 836: when panes are activated and deactivated. In order for this to be fixed ! 837: efficiently, a change needs to be made to the ! 838: .I X ! 839: protocol.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.