XMLABELGADGET(3)
π XmLabelGadget β The LabelGadget widget class π
okay bestie so this one is straight out of the library call manual section, and it's a whole moment. grab a snack. π
πΈ NAME πΈ
XmLabelGadget β the LabelGadget widget class β¨
π SYNOPSIS π
#include <Xm/LabelG.h>
π DESCRIPTION π
so LabelGadget is an instantiable widget, meaning you can literally just... make one. but it's also the superclass for other button gadgets β like PushButtonGadget and ToggleButtonGadget. it's giving proud parent energy. π
LabelGadget can hold either text or a pixmap. its text is a compound string, and if you want the whole lore on compound strings, go read the Motif Programmer's Guide. the text can be multilingual, multiline, and/or multifont β no limits, we love a versatile icon. π¦
and when a LabelGadget is insensitive? its text gets stippled, OR the user-supplied insensitive pixmap gets displayed. either way, she's still showing up, just muted. π
LabelGadget supports both accelerators and mnemonics, mostly so that LabelGadget subclass widgets hanging out inside menus can do their thing. here's the tea:
- Mnemonics are available in a menu system when the button is visible.
- Accelerators in a menu system are accessible even when the button is not visible. main character behavior, honestly.
the LabelGadget shows the mnemonic by underlining the first matching character in the text string. the accelerator gets displayed as a text string sitting right next to the label text or pixmap β which side depends on the layout direction.
now, LabelGadget is basically made of a bunch of margin fields surrounding the text or pixmap. these margin fields are resources the user can set, BUT LabelGadget subclasses and Manager parents also mess with some of them. they tend to touch:
XmNmarginLeftXmNmarginRightXmNmarginTopXmNmarginBottom
...and they leave XmNmarginWidth and XmNmarginHeight exactly as the application set them. boundaries, respected. π«Ά
LabelGadget also takes XmNshadowThickness into account when it's figuring out its layout β but it does not draw the shadow. so if XmNshadowThickness is greater than 0 (zero), LabelGadget leaves space for the shadow, but the shadow does not appear. it's reserving the seat but not showing up to the party. π
inside Popup menu panes, Pulldown menu panes, and OptionMenus, LabelGadget forces XmNtraversalOn and XmNhighlightOnEnter to False. otherwise, these resources just default to False anyway.
LabelGadget uses the XmQTmenuSystem and XmQTspecifyRenderTable traits, and holds the XmQTaccessTextual, XmQTcareParentVisual, XmQTmenuSavvy, and XmQTtransfer traits. collecting traits like PokΓ©mon cards fr fr. β
π¦ Data Transfer Behavior π¦
LabelGadget and its subclasses β except when used in a menu system β support dragging the label contents off of the LabelGadget. BUT (and this is the catch) the label contents are only draggable if the XmNenableUnselectableDrag resource of XmDisplay is set to True. so set it. π
as a source of data, LabelGadget and its subclasses support the following targets, plus the associated conversions of data into those targets:
localeβ if the locale target matches the widget's locale, the widget transfersXmNlabelStringin the encoding of the locale. this target is only supported whenXmNlabelTypeisXmSTRINGorXmPIXMAP_AND_STRING.COMPOUND_TEXTβ the widget transfersXmNlabelStringas typeCOMPOUND_TEXT. only supported whenXmNlabelTypeisXmSTRINGorXmPIXMAP_AND_STRING.UTF8_STRINGβ the widget transfersXmNlabelStringas typeUTF8_STRING. only supported whenXmNlabelTypeisXmSTRINGorXmPIXMAP_AND_STRING.PIXMAPβ the widget transfersXmNlabelPixmapas typeDRAWABLE. supported whenXmNlabelTypeisXmPIXMAPorXmPIXMAP_AND_STRING.STRINGβ the widget transfersXmNlabelStringas typeSTRING. supported whenXmNlabelTypeisXmSTRINGorXmPIXMAP_AND_STRING.TEXTβ ifXmNlabelStringis fully convertible to the encoding of the locale, the widget transfersXmNlabelStringin the encoding of the locale. otherwise, the widget transfersXmNlabelStringas typeCOMPOUND_TEXT. supported whenXmNlabelTypeisXmSTRINGorXmPIXMAP_AND_STRING._MOTIF_CLIPBOARD_TARGETSβ the widget transfers, as typeATOM, a list of the targets it supports for theCLIPBOARDselection. whenXmNlabelTypeisXmSTRINGorXmPIXMAP_AND_STRING, these include the following targets:_MOTIF_COMPOUND_STRINGCOMPOUND_TEXTUTF8_STRING- the encoding of the locale, if
XmNlabelStringis fully convertible to the encoding of the locale STRING, ifXmNlabelStringis fully convertible toSTRING
when XmNlabelType is XmPIXMAP or XmPIXMAP_AND_STRING, the targets include PIXMAP.
_MOTIF_COMPOUND_STRINGβ the widget transfersXmNlabelStringas a compound string in Byte Stream format. supported whenXmNlabelTypeisXmSTRINGorXmPIXMAP_AND_STRING._MOTIF_EXPORT_TARGETSβ the widget transfers, as typeATOM, a list of the targets to be used as the value of the DragContext'sXmNexportTargetsin a drag-and-drop transfer. whenXmNlabelTypeisXmSTRINGorXmPIXMAP_AND_STRING, these include_MOTIF_COMPOUND_STRING,COMPOUND_TEXT,UTF8_STRING, the encoding of the locale,STRING,TEXT,BACKGROUND, andFOREGROUND. whenXmNlabelTypeisXmPIXMAPorXmPIXMAP_AND_STRING, these includePIXMAP,BACKGROUND, andFOREGROUND.
as a source of data, LabelGadget also supports the following standard Motif targets:
BACKGROUNDβ the widget transfers the parent'sXmNbackgroundas typePIXEL.CLASSβ the widget finds the first shell in the widget hierarchy that has aWM_CLASSproperty and transfers the contents as text in the current locale.CLIENT_WINDOWβ the widget finds the first shell in the widget hierarchy and transfers its window as typeWINDOW.COLORMAPβ the widget transfers the parent'sXmNcolormapas typeCOLORMAP.FOREGROUNDβ the widget transfers the parent'sXmNforegroundas typePIXEL.NAMEβ the widget finds the first shell in the widget hierarchy that has aWM_NAMEproperty and transfers the contents as text in the current locale.TARGETSβ the widget transfers, as typeATOM, a list of the targets it supports. these include the standard targets in this list. whenXmNlabelTypeisXmSTRINGorXmPIXMAP_AND_STRING, these also include_MOTIF_COMPOUND_STRING,COMPOUND_TEXT,UTF8_STRING, the encoding of the locale,STRING, andTEXT. whenXmNlabelTypeisXmPIXMAPorXmPIXMAP_AND_STRING, these also includePIXMAP.TIMESTAMPβ the widget transfers the timestamp used to acquire the selection as typeINTEGER._MOTIF_RENDER_TABLEβ the widget transfersXmNrenderTableif it exists, or else the default text render table, as typeSTRING._MOTIF_ENCODING_REGISTRYβ the widget transfers its encoding registry as typeSTRING. the value is a list ofNULLseparated items in the form of tag encoding pairs. this target symbolizes the transfer target for the Motif Segment Encoding Registry. widgets and applications can use this Registry to register text encoding formats for specified render table tags. applications access this Registry by callingXmRegisterSegmentEncodingandXmMapSegmentEncoding.
π Classes π
LabelGadget inherits behavior, resources, and traits from Object, RectObj, and XmGadget. the family tree is real. π
- the class pointer is
xmLabelGadgetClass. - the class name is
XmLabelGadget.
β¨ New Resources β¨
the following table defines a set of widget resources used by the programmer to specify data. the programmer can also set the resource values for the inherited classes to set attributes for this widget.
so, to reference a resource by name or by class in a .Xdefaults file: remove the XmN or XmC prefix and use the remaining letters. π
to specify one of the defined values for a resource in a .Xdefaults file: remove the Xm prefix and use the remaining letters β in either lowercase or uppercase, but include any underscores between words.
the codes in the access column tell you if the given resource can be:
- set at creation time β
C - set by using
XtSetValuesβS - retrieved by using
XtGetValuesβG - not applicable β
N/A
and that's where we're pausing, bestie β more coming right up. π«Ά
β¨ XmLabelGadget Resource Set β¨
okay bestie, here's the whole menu of things you can set on a LabelGadget π each one comes in a little squad of four: its Class, its Type, its Default, and its Access. no skipping, we're doing all of them π
XmNacceleratorβ classXmCAccelerator, typeString, defaultNULL, accessCSGXmNacceleratorTextβ classXmCAcceleratorText, typeXmString, defaultNULL, accessCSGXmNalignmentβ classXmCAlignment, typeunsigned char, defaultdynamic, accessCSGXmNfontListβ classXmCFontList, typeXmFontList, defaultdynamic, accessCSGXmNlabelInsensitivePixmapβ classXmCLabelInsensitivePixmap, typePixmap, defaultXmUNSPECIFIED_PIXMAP, accessCSGXmNlabelPixmapβ classXmCLabelPixmap, typePixmap, defaultXmUNSPECIFIED_PIXMAP, accessCSGXmNlabelStringβ classXmCXmString, typeXmString, defaultdynamic, accessCSGXmNlabelTypeβ classXmCLabelType, typeunsigned char, defaultXmSTRING, accessCSGXmNmarginBottomβ classXmCMarginBottom, typeDimension, default0, accessCSGXmNmarginHeightβ classXmCMarginHeight, typeDimension, default2, accessCSGXmNmarginLeftβ classXmCMarginLeft, typeDimension, default0, accessCSGXmNmarginRightβ classXmCMarginRight, typeDimension, default0, accessCSGXmNmarginTopβ classXmCMarginTop, typeDimension, default0, accessCSGXmNmarginWidthβ classXmCMarginWidth, typeDimension, default2, accessCSGXmNmnemonicβ classXmCMnemonic, typeKeySym, defaultNULL, accessCSGXmNmnemonicCharSetβ classXmCMnemonicCharSet, typeString, defaultdynamic, accessCSGXmNpixmapPlacementβ classXmCPixmapPlacement, typeunsigned int, defaultXmPIXMAP_LEFT, accessCSGXmNpixmapTextPaddingβ classXmCSpace, typeDimension, default2, accessCSGXmNrecomputeSizeβ classXmCRecomputeSize, typeBoolean, defaultTrue, accessCSGXmNrenderTableβ classXmCRenderTable, typeXmRenderTable, defaultdynamic, accessCSGXmNstringDirectionβ classXmCStringDirection, typeXmStringDirection, defaultdynamic, accessCSG
π
XmNaccelerator
okay so picture this: you got a button widget chillin' inside a menu, right? XmNaccelerator is the resource that gives that button a keyboard shortcut, so it can activate a button that's visible or invisible, but managed β from the keyboard, no mouse required, iconic behavior fr fr β¨οΈβ¨
It's a String, and that string is basically a lil recipe describing a set of modifiers plus the key that you'd use to select the button. π
The format of this string is identical to the format the translations manager uses β same vibe, same syntax, no cap β with two exceptions though, and you NEED to know them:
- only a single event may be specified π
- only KeyPress events are allowed π
π«Ά real talk bestie: accelerators for buttons are supported only forPushButtonGadgetsandToggleButtonGadgetsinsidePulldownandPopupmenus. that's the whole guest list, no plus-ones πΈ
XmNacceleratorTextβ the literal text that shows up for the accelerator, bestie π«. It gets displayed right next to the label string or pixmap, and which way it lays out depends on the widget'sXmNlayoutDirectionresource. Also, plot twist: accelerator text on buttons only shows up forPushButtonGadgetsandToggleButtonGadgetsinside Pulldown and Popup Menus. That's it, that's the rule.XmNalignmentβ where the label (text or pixmap) sits. It's giving alignment era β¨XmALIGNMENT_BEGINNING(left alignment) β lines of text get their left sides vertically aligned with the left edge of the gadget. For a pixmap, its left side is vertically aligned with the left edge of the gadget.XmALIGNMENT_CENTER(center alignment) β centers of the lines of text get vertically aligned in the center of the gadget. For a pixmap, its center is vertically aligned with the center of the gadget.XmALIGNMENT_END(right alignment) β right sides of the lines of text get vertically aligned with the right edge of the gadget. For a pixmap, its right side is vertically aligned with the right edge of the gadget.
Okay so those text descriptions above? They're only correct when XmNlayoutDirection is XmLEFT_TO_RIGHT. When that resource is XmRIGHT_TO_LEFT, the descriptions for XmALIGNMENT_BEGINNING and XmALIGNMENT_END get swapped. Yes really, they trade places, no cap π«
And if the parent is a RowColumn whose XmNisAligned resource is True, then XmNalignment gets forced to the same value as the RowColumn's XmNentryAlignment β but only if the RowColumn's XmNrowColumnType is XmWORK_AREA, or if the gadget is a subclass of XmLabelGadget. Otherwise? The default is XmALIGNMENT_CENTER.
XmNfontListβ the font for the text in the gadget. > Heads up bestie:XmNfontListis obsolete π it only hangs around for compatibility with previous releases. You should be usingXmNrenderTableinstead ofXmNfontListnow. If you specify both, the render table takes precedence, periodt. IfXmNfontListis NULL at initialization, the widget's parent hierarchy gets searched for an ancestor that's a subclass of theXmBulletinBoard,VendorShell, orXmMenuShellwidget class. Find one? Then the font list is initialized to theXmNbuttonFontList(for button gadget subclasses) orXmNlabelFontListof that ancestor widget. Don't find one? The default is implementation dependent, rip π Refer toXmFontList(3)for more info on creating and structuring a font list.XmNlabelInsensitivePixmapβ the pixmap used as the button face whenXmNlabelTypeisXmPIXMAPorXmPIXMAP_AND_STRINGand the button is insensitive. Default value isXmUNSPECIFIED_PIXMAP, which just shows an empty label. Empty. Void. Nothing π³οΈXmNlabelPixmapβ the pixmap whenXmNlabelTypeisXmPIXMAPorXmPIXMAP_AND_STRING. Default value isXmUNSPECIFIED_PIXMAP, which again = empty label πXmNlabelStringβ the compound string whenXmNlabelTypeisXmSTRINGorXmPIXMAP_AND_STRING. If the value of this resource is NULL, it gets initialized to the name of the gadget converted to a compound string. Refer toXmString(3)for more info on the creation and structure of compound strings πXmNlabelTypeβ what kind of label we're doing today, bestie:XmSTRINGβ text displaysXmNlabelStringXmPIXMAPβ icon data in pixmap displaysXmNlabelPixmaporXmNlabelInsensitivePixmapXmPIXMAP_AND_STRINGβ icon data in pixmap displaysXmNlabelPixmaporXmNlabelInsensitivePixmapand text displaysXmNlabelString
XmNmarginBottomβ how much spacing sits between the bottom of the label text and the top of the bottom margin specified byXmNmarginHeight. This can get modified by LabelGadget's subclasses β for example,CascadeButtonGadgetmay increase this field to make room for the cascade pixmap π¦XmNmarginHeightβ an equal amount of spacing above the margin defined byXmNmarginTopand below the margin defined byXmNmarginBottom. So:XmNmarginHeightspecifies the spacing between the top edge of the margin set byXmNmarginTopand the bottom edge of the top shadow, and the spacing between the bottom edge of the margin specified byXmNmarginBottomand the top edge of the bottom shadow. Symmetry, we love to see it πXmNmarginLeftβ spacing between the left edge of the label text and the right side of the left margin (specified byXmNmarginWidth). This can get modified by LabelGadget's subclasses β for example,ToggleButtonGadgetmay increase this field to make room for the toggle indicator and for spacing between the indicator and the label. Whether this actually applies to the left or right side of the label depends on the value ofXmNlayoutDirectionπXmNmarginRightβ spacing between the right edge of the label text and the left side of the right margin (specified byXmNmarginWidth). This can get modified by LabelGadget's subclasses β for example,CascadeButtonGadgetmay increase this field to make room for the cascade pixmap. Whether this actually applies to the left or right side of the label depends on the value ofXmNlayoutDirectionπXmNmarginTopβ spacing between the top of the label text and the bottom of the top margin specified byXmNmarginHeight. This can get modified by LabelGadget's subclasses β for example,CascadeButtonGadgetmay increase this field to make room for the cascade pixmap πΈXmNmarginWidthβ an equal amount of spacing to the left of the margin defined byXmNmarginLeftand to the right of the margin defined byXmNmarginRight. So:XmNmarginWidthspecifies the spacing between the left edge of the margin set byXmNmarginLeftand the right edge of the left shadow, and the spacing between the right edge of the margin specified byXmNmarginRightand the left edge of the right shadow. Balance β¨XmNmnemonicβ gives the user an alternate way to activate a button, iykyk. A button in a MenuBar, a Popup menu pane, or a Pulldown menu pane can have a mnemonic.
This resource holds a keysym as listed in the X11 keysym table. The first character in the label string that exactly matches the mnemonic in the character set specified in XmNmnemonicCharSet gets underlined when the button is displayed. Underline reveal, iconic βοΈ
Once a mnemonic is specified, the user activates the button by pressing the mnemonic key while the button is visible. If the button is a CascadeButtonGadget in a MenuBar and the MenuBar doesn't have the focus, the user has to use the MAlt modifier while pressing the mnemonic. And good news: the user can activate the button by pressing either the shifted or the unshifted mnemonic key π«Ά
XmNmnemonicCharSetβ the character set of the mnemonic for the label. Default isXmFONTLIST_DEFAULT_TAG.XmNpixmapPlacementβ where the pixmap lives relative to the text label. Can take one of these values:XmPIXMAP_TOP,XmPIXMAP_BOTTOM,XmPIXMAP_LEFT, andXmPIXMAP_RIGHT. A type converter has been registered that converts these strings:"top","bottom","left", and"right"πXmNpixmapTextPaddingβ how much space gets left between the pixmap and the label string. Personal space matters πXmNrecomputeSizeβ a Boolean that says whether the gadget shrinks or expands to fit its contents (label string or pixmap) as a result of anXtSetValuesresource value that would change the gadget's size. If True, the gadget shrinks or expands to exactly fit the label string or pixmap. If False, the gadget never attempts to change size on its own. Independent queen, she stays her size πXmNrenderTableβ the render table associated with thelabelString. If this value is NULL at initialization, Label searches its parent hierarchy for an ancestor that holds theXmQTspecifyRenderTabletrait. Find one? Then Label initializesXmNrenderTableto theXmLABEL_RENDER_TABLEvalue of the ancestor widget. Similarly, button subclasses of Label initializeXmNrenderTableto theXmBUTTON_RENDER_TABLEvalue of the ancestor widget. (And note: all current subclasses of Label are button subclasses, so yeah, that's all of them π) If no such ancestor is found, the default is implementation dependent. If a font list and a render table are both specified, the render table takes precedence. Refer toXmRenderTable(3)for more info on creating and structuring a render table.XmNstringDirectionβ a synthetic resource for settingXmNlayoutDirection. Its values areXmSTRING_DIRECTION_L_TO_RandXmSTRING_DIRECTION_R_TO_L. Refer to theXmNlayoutDirectionresource description. > Lowkey important:XmNstringDirectionis obsoleted byXmNlayoutDirection, but it's kept here for backward compatibility π
𧬠Inherited Resources π§¬
LabelGadget inherits behavior and resources from the superclasses described in the following tables. For a complete description of each resource, refer to the reference page for that superclass. Go read the source, bestie, it's all there π
XmGadget Resource Set π
okay bestie, here's the whole glow-up kit every XmGadget comes pre-loaded with β¨ β name, class, type, default, and how you're allowed to touch it (that last column is the access vibe: CSG, C, CG, etc.). Every single one, no skipping, we don't do that here π
XmNbackgroundβ classXmCBackground, typePixel, default is dynamic, accessCSGXmNbackgroundPixmapβ classXmCPixmap, typePixmap, default isXmUNSPECIFIED_PIXMAP, accessCSGXmNbottomShadowColorβ classXmCBottomShadowColor, typePixel, default is dynamic, accessCSGXmNbottomShadowPixmapβ classXmCBottomShadowPixmap, typePixmap, default is dynamic, accessCSGXmNhelpCallbackβ classXmCCallback, typeXtCallbackList, default isNULL, accessCXmNforegroundβ classXmCForeground, typePixel, default is dynamic, accessCSGXmNhighlightColorβ classXmCHighlightColor, typePixel, default is dynamic, accessCSGXmNhighlightOnEnterβ classXmCHighlightOnEnter, typeBoolean, default isFalse, accessCSGXmNhighlightPixmapβ classXmCHighlightPixmap, typePixmap, default is dynamic, accessCSGXmNhighlightThicknessβ classXmCHighlightThickness, typeDimension, default is0, accessCSGXmNlayoutDirectionβ classXmNCLayoutDirection, typeXmDirection, default is dynamic, accessCGXmNnavigationTypeβ classXmCNavigationType, typeXmNavigationType, default isXmNONE, accessCSGXmNshadowThicknessβ classXmCShadowThickness, typeDimension, default is0, accessCSGXmNtopShadowColorβ classXmCTopShadowColor, typePixel, default is dynamic, accessCSGXmNtopShadowPixmapβ classXmCTopShadowPixmap, typePixmap, default is dynamic, accessCSGXmNtraversalOnβ classXmCTraversalOn, typeBoolean, default isFalse, accessCSGXmNunitTypeβ classXmCUnitType, typeunsigned char, default is dynamic, accessCSGXmNuserDataβ classXmCUserData, typeXtPointer, default isNULL, accessCSG
RectObj Resource Set π¦
and because every gadget is also secretly a RectObj underneath (main character energy fr), it inherits this whole second set too π«Ά
XmNancestorSensitiveβ classXmCSensitive, typeBoolean, default is dynamic, accessGXmNborderWidthβ classXmCBorderWidth, typeDimension, default is0, accessN/AXmNheightβ classXmCHeight, typeDimension, default is dynamic, accessCSGXmNsensitiveβ classXmCSensitive, typeBoolean, default isTrue, accessCSGXmNwidthβ classXmCWidth, typeDimension, default is dynamic, accessCSGXmNxβ classXmCPosition, typePosition, default is0, accessCSGXmNyβ classXmCPosition, typePosition, default is0, accessCSG
ngl bestie, thatN/AonXmNborderWidthis not a typo β it literally means you can't set it through the access modes listed here, so don't come for me when it doesn't budge π
Last row of the table, and then we're out of resources, bestie β one single entry, but she's important:
XmNdestroyCallbackβ ClassXmCCallback, TypeXtCallbackList, DefaultNULL, AccessC
π Behavior π
XmLabelGadget straight up inherits behavior from XmGadget β that's the base, the blueprint, the foundation. Everything extra that XmLabelGadget brings to the group chat is in this list right here:
<Btn2Down>β drags the contents of a LabelGadget, the one it identified whenBTransfergot pressed. π«³
Not me warning you: this action is undefined for LabelGadgets used in a menu system. Undefined. Don't do it. π
<Key><osfHelp>β in a Popup or PulldownMenuPane, this unposts all menus in the menu hierarchy and, when the shell's keyboard focus policy isXmEXPLICIT, it restores keyboard focus to the widget that had the focus before the menu system was entered. It calls the callbacks forXmNhelpCallbackif any exist. And if this widget has no help callbacks at all? Then this action calls the help callbacks for the nearest ancestor that has them. Found family energy, fr fr. π<key><osfCancel>β depends on where you're standing, so pay attention:- In a
MenuBar: disarms the CascadeButton and the menu and, when the shell's keyboard focus policy isXmEXPLICIT, restores keyboard focus to the widget that had the focus before the menu was entered. - In a toplevel Pulldown
MenuPanefrom aMenuBar: unposts the menu, disarms theMenuBarCascadeButton and theMenuBar, and, when the shell's keyboard focus policy isXmEXPLICIT, restores keyboard focus to the widget that had the focus before theMenuBarwas entered. In other Pulldown MenuPanes, it unposts the menu. - In a Popup
MenuPane: unposts the menu and, when the shell's keyboard focus policy isXmEXPLICIT, restores keyboard focus to the widget from which the menu was posted. π«Ά
- In a
<Key><osfDown>β- If the current menu item has a submenu and is in a
MenuBar, then this action posts the submenu, disarms the current menu item, and arms the submenu's first traversable menu item. - If the current menu item is in a
MenuPane, then this action disarms the current menu item and arms the item below it. This action wraps within theMenuPane. The direction of the wrapping depends on theXmNlayoutDirectionresource. π
- If the current menu item has a submenu and is in a
<Key><osfLeft>β okay this one is a whole saga, so buckle up:- When the horizontal direction of
XmNlayoutDirectionisXmLEFT_TO_RIGHT, everything below applies:- When the current menu item is in a
MenuBar, then this action disarms the current item and arms theMenuBaritem to the left. This action wraps within theMenuBar. - In MenuPanes, if the current menu item is not at the left edge of a
MenuPane, this action disarms the current item and arms the item to its left. If the current menu item is at the left edge of a submenu attached to aMenuBaritem, then this action unposts the submenu and traverses to theMenuBaritem to the left, wrapping if necessary. If thatMenuBaritem has a submenu, it posts the submenu and arms the first traversable item in the submenu. If the current menu item is at the left edge of a submenu not directly attached to aMenuBaritem, then this action unposts the current submenu only. - In Popup or Torn-off MenuPanes, when the current menu item is at the left edge, this action wraps within the
MenuPane. If the current menu item is at the left edge of theMenuPaneand not in the top row, this action wraps to the rightmost menu item in the row above. If the current menu item is in the upper, leftmost corner, this action wraps to the tear-off control, if present, or else it wraps to the bottom, rightmost menu item in theMenuPane.
- When the current menu item is in a
- When the horizontal direction of
XmNlayoutDirectionisXmRIGHT_TO_LEFT, then this instead:- If the current menu item is in a
MenuBar, then this action disarms the current item and arms theMenuBaritem to the left. This action wraps within theMenuBar. - In MenuPanes, if the current menu item is a CascadeButton, then this action posts its associated submenu. If the current menu item is not a CascadeButton and is not at the left edge of a
MenuPane, this action disarms the current item and arms the item to its left, wrapping if necessary. If the current menu item is not a CascadeButton and is at the left edge of a submenu that is a descendent of aMenuBar, then this action unposts all submenus and traverses to theMenuBaritem to the left. If thatMenuBaritem has a submenu, it posts the submenu and arms the submenu's first traversable item. - In Popup or Torn-off menus, if the current menu item is not a CascadeButton and is at the left edge of a row (except the bottom row), this action wraps to the rightmost menu item in the row below. If the current menu item is not a CascadeButton and is in the bottom, leftmost corner of a Popup or Pulldown
MenuPane, this action wraps to the tear-off control, if present, or else it wraps to the top, rightmost menu item of theMenuPane.
- If the current menu item is in a
- When the horizontal direction of
<Key><osfRight>β the mirror twin, and yes she's also a saga:- When the horizontal direction of
XmNlayoutDirectionisXmLEFT_TO_RIGHT, this is the tea:- If the current menu item is in a
MenuBar, then this action disarms the current item and arms theMenuBaritem to the right. This action wraps within theMenuBar. - In MenuPanes, if the current menu item is a CascadeButton, then this action posts its associated submenu. If the current menu item is not a CascadeButton and is not at the right edge of a
MenuPane, this action disarms the current item and arms the item to its right, wrapping if necessary. If the current menu item is not a CascadeButton and is at the right edge of a submenu that is a descendent of aMenuBar, then this action unposts all submenus and traverses to theMenuBaritem to the right. If thatMenuBaritem has a submenu, it posts the submenu and arms the submenu's first traversable item. - In Popup or Torn-off menus, if the current menu item is not a CascadeButton and is at the right edge of a row (except the bottom row), this action wraps to the leftmost menu item in the row below. If the current menu item is not a CascadeButton and is in the bottom, rightmost corner of a Popup or Pulldown
MenuPane, this action wraps to the tear-off control, if present, or else it wraps to the top, leftmost menu item of theMenuPane.
- If the current menu item is in a
- When the horizontal direction of
XmNlayoutDirectionisXmRIGHT_TO_LEFT, then the following applies:- When the current menu item is in a
MenuBar, then this action disarms the current item and arms theMenuBaritem to the right. This action wraps within theMenuBar. - In MenuPanes, if the current menu item is not at the right edge of a
MenuPane, this action disarms the current item and arms the item to its right. If the current menu item is at the right edge of a submenu attached to aMenuBaritem, then this action unposts the submenu and traverses to theMenuBaritem to the right, wrapping if necessary. If thatMenuBaritem has a submenu, it posts the submenu and arms the first traversable item in the submenu. If the current menu item is at the right edge of a submenu not directly attached to aMenuBaritem, then this action unposts the current submenu only. - In Popup or Torn-off MenuPanes, when the current menu item is at the right edge, this action wraps within the
MenuPane. If the current menu item is at the right edge of theMenuPaneand not in the top row, this action wraps to the leftmost menu item in the row above. If the current menu item is in the upper, rightmost corner, this action wraps to the tear-off control, if present, or else it wraps to the bottom, leftmost menu item in theMenuPane.
- When the current menu item is in a
- When the horizontal direction of
<Key><osfUp>β when the current menu item is in aMenuPane, then this action disarms the current menu item and arms the item above it. This action wraps within theMenuPane. The direction of the wrapping depends on theXmNlayoutDirectionresource. β¨
π Virtual Bindings π
The bindings for virtual keys are vendor specific β like, your vendor decides, it's their house their rules, iykyk. For the actual info about bindings for virtual buttons and keys, go read VirtualBindings(3). Go on, she's right there. π
π RELATED π
The whole friend group, and every one of them is iconic in her own right:
Object(3)RectObj(3)XmCreateLabelGadget(3)XmVaCreateLabelGadget(3)XmVaCreateManagedLabelGadget(3)XmFontListCreate(3)XmStringCreate(3)XmStringCreateLtoR(3)XmGadget(3)
And that's a wrap on the whole page, bestie!! πβ¨ The footer stamps the whole thing as XmLabelGadget(library call) β that's the source and the version tag, filed under the library call corner of the manual β and you made it all the way to the end, which is main character energy honestly. Go forth and label your gadgets. ππ
π¦ where this page comes from
- alpine 3.24: motif-doc 2.5.2-r0 Β· LGPL-2.1-or-later
- arch rolling: openmotif 2.3.8-4 Β· LGPL-2.1-or-later
- centos-stream 9: motif-devel 2.3.4-32.el9 Β· LGPLv2+
- centos-stream 9: motif-devel 2.3.4-32.el9 Β· LGPLv2+
- epel 10: motif-devel 2.3.8-2.el10_2 Β· LicenseRef-Callaway-LGPLv2+
- fedora 43: motif-devel 2.3.8-1.fc43 Β· LicenseRef-Callaway-LGPLv2+
- fedora 43: motif-devel 2.3.8-1.fc43 Β· LicenseRef-Callaway-LGPLv2+
- fedora 43: motif-devel 2.3.8-2.fc43 Β· LicenseRef-Callaway-LGPLv2+
- fedora 43: motif-devel 2.3.8-2.fc43 Β· LicenseRef-Callaway-LGPLv2+
- fedora 44: motif-devel 2.3.8-3.fc44 Β· LicenseRef-Callaway-LGPLv2+
- fedora 44: motif-devel 2.3.8-3.fc44 Β· LicenseRef-Callaway-LGPLv2+
- nixos 26.05: motif 2.3.8
- nixpkgs unstable: motif 2.3.8
- opensuse-leap 16.0: motif-devel 2.3.8-bp160.1.1 Β· LGPL-2.1-or-later
- opensuse-leap 16.0: motif-devel 2.3.8-bp160.1.1 Β· LGPL-2.1-or-later
- opensuse-leap 16.0: motif-devel 2.3.8-bp160.1.1 Β· LGPL-2.1-or-later
- opensuse-leap 16.0: motif-devel 2.3.8-bp160.1.1 Β· LGPL-2.1-or-later
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms