XMPUSHBUTTON(3)

πŸ“¦
version 2.5.2 Β· 2 versions
, in alpine 3.24, arch rolling, centos-stream 9, epel 10, fedora 43, fedora 44, nixos 26.05, nixpkgs unstable, opensuse-leap 16.0

okay bestie, welcome to XmPushButton(library call) πŸ’– this is the manual page for the PushButton widget class, and we're about to make it make sense.


🌸 NAME 🌸

XmPushButton β€” The PushButton widget class πŸ‘‘


πŸŽ€ SYNOPSIS πŸŽ€

#include <Xm/PushB.h>

✨ DESCRIPTION ✨

okay so PushButton is literally the widget that issues commands within an application. It's giving a text label or pixmap surrounded by a border shadow. When a PushButton is selected, the shadow changes to give the appearance that it has been pressed in. When a PushButton is unselected, the shadow changes to give the appearance that it is out. πŸ’…

The default behavior associated with a PushButton in a menu depends on the type of menu system in which it resides. By default, <Btn1> controls the behavior of the PushButton. In addition, <Btn3> controls the behavior of the PushButton if it resides in a PopupMenu system. The actual mouse button used is determined by its RowColumn parent.

Thickness for a second shadow, used when the PushButton is the default button, may be specified with the XmNshowAsDefault resource. If it has a nonzero value, the Label's resources XmNmarginLeft, XmNmarginRight, XmNmarginTop, and XmNmarginBottom may be modified to accommodate the second shadow.

If an initial value is specified for XmNarmPixmap but not for XmNlabelPixmap, the XmNarmPixmap value is used for XmNlabelPixmap.

PushButton uses the XmQTmenuSystem and XmQTspecifyRenderTable traits, and holds the XmQactivatable, XmQTmenuSavvy, and XmQTtakesDefault traits.

πŸ¦‹ Classes πŸ¦‹

PushButton inherits behavior, resources, and traits from Core, XmPrimitive, and XmLabel.

The class pointer is xmPushButtonWidgetClass.

The class name is XmPushButton.

🌈 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. 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 indicate if the given resource can be set at creation time (C), set by using XtSetValues (S), retrieved by using XtGetValues (G), or is not applicable (N/A).

πŸ’Ž XmPushButton Resource Set πŸ’Ž

  • XmNactivateCallback β€” Class: XmCCallback; Type: XtCallbackList; Default: NULL; Access: C
  • XmNarmCallback β€” Class: XmCCallback; Type: XtCallbackList; Default: NULL; Access: C
  • XmNarmColor β€” Class: XmCArmColor; Type: Pixel; Default: dynamic; Access: CSG
  • XmNarmPixmap β€” Class: XmCArmPixmap; Type: Pixmap; Default: XmUNSPECIFIED_PIXMAP; Access: CSG
  • XmNdefaultButtonShadowThickness β€” Class: XmCDefaultButtonShadowThickness; Type: Dimension; Default: dynamic; Access: CSG
  • XmNdisarmCallback β€” Class: XmCCallback; Type: XtCallbackList; Default: NULL; Access: C
  • XmNfillOnArm β€” Class: XmCFillOnArm; Type: Boolean; Default: True; Access: CSG
  • XmNmultiClick β€” Class: XmCMultiClick; Type: unsigned char; Default: dynamic; Access: CSG
  • XmNshowAsDefault β€” Class: XmCShowAsDefault; Type: Dimension; Default: 0; Access: CSG

🫢 Resource Descriptions 🫢

  • XmNactivateCallback β€” Specifies the list of callbacks that is called when PushButton is activated. PushButton is activated when the user presses and releases the active mouse button while the pointer is inside that widget. Activating the PushButton also disarms it. For this callback, the reason is XmCR_ACTIVATE. This callback uses the XmQTactivatable trait.
  • XmNarmCallback β€” Specifies the list of callbacks that is called when PushButton is armed. PushButton is armed when the user presses the active mouse button while the pointer is inside that widget. For this callback, the reason is XmCR_ARM.
  • XmNarmColor β€” Specifies the color with which to fill the armed button. XmNfillOnArm must be set to True for this resource to have an effect. The default for a color display is a color between the background and the bottom shadow color. For a monochrome display, the default is set to the foreground color, and any text in the label appears in the background color when the button is armed.

This resource is also used when the button is armed in a menu and the XmNenableEtchedInMenu resource is True.

  • XmNarmPixmap β€” Specifies the pixmap to be used as the button face if XmNlabelType is XmPIXMAP or XmPIXMAP_AND_STRING and PushButton is armed. This resource is disabled when the PushButton is in a menu.
  • XmNdefaultButtonShadowThickness β€” This resource specifies the width of the default button indicator shadow. If this resource is 0 (zero), the width of the shadow comes from the value of the XmNshowAsDefault resource. If this resource is greater than 0, the XmNshowAsDefault resource is only used to specify whether this button is the default. The default value is the initial value of XmNshowAsDefault.
  • XmNdisarmCallback β€” Specifies the list of callbacks that is called when PushButton is disarmed. PushButton is disarmed when the user presses and releases the active mouse button while the pointer is inside that widget. For this callback, the reason is XmCR_DISARM.
  • XmNfillOnArm β€” Forces the PushButton to fill the background of the button with the color specified by XmNarmColor when the button is armed and when this resource is set to True. If False, only the top and bottom shadow colors are switched. When the PushButton is in a menu, this resource is ignored and assumed to be False.
  • XmNmultiClick β€” okay so here's the vibe 🫢: you click the button, and then you click it again super fast, all within the time span the display calls its multiclick time. That second click is a whole situation, and this resource decides what happens to it.

If this resource is set to XmMULTICLICK_DISCARD, that second click does not get processed β€” nope, not today, it's giving ignored. πŸ™ˆ If it's set to XmMULTICLICK_KEEP, the event is processed and click_count in the callback structure gets incremented. πŸ’…

Now the defaults, because they're lowkey different depending on where your button lives: when the button is inside a menu, the default is XmMULTICLICK_DISCARD. Otherwise β€” for a button not in a menu β€” XmMULTICLICK_KEEP is the default value. periodt.

  • XmNshowAsDefault β€” this one is about making your button the main character default button. πŸ‘‘

If XmNdefaultButtonShadowThickness is greater than 0 (zero), then a value greater than 0 in this resource specifies to mark this button as the default button.

If XmNdefaultButtonShadowThickness is 0, then a value greater than 0 in this resource specifies to mark this button as the default button with the shadow thickness specified by this resource.

Here's the emphasis tea β˜•: when the Display resource XmNdefaultButtonEmphasis has a value of XmEXTERNAL_HIGHLIGHT (which is the default), PushButton draws the location cursor outside of the outer shadow. When this resource has a value of XmINTERNAL_HIGHLIGHT, the highlight gets drawn between the inner and outer shadows. The space between the shadow and the default shadow is equal to the sum of both shadows. ✨

The default value is 0.

When this value is not 0, the Label resources XmNmarginLeft, XmNmarginRight, XmNmarginTop, and XmNmarginBottom may be modified to accommodate that second shadow. No cap.

Heads up bestie 🚨: this resource is disabled when the PushButton is in a menu.

🌸 Inherited Resources 🌸

PushButton 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. πŸ“š

πŸ’– XmLabel Resource Set πŸ’–

okay so real talk, this is the XmLabel resource set and she is long, but every single row is laid out the same way: Name, Class, Type, Default, Access. That's it. Five little columns of truth 🫢. And the access on literally every one of them? CSG. All of them. Every last one. periodt πŸ’…

  • XmNaccelerator β€” class XmCAccelerator, type String, default NULL, access CSG.
  • XmNacceleratorText β€” class XmCAcceleratorText, type XmString, default NULL, access CSG.
  • XmNalignment β€” class XmCAlignment, type unsigned char, default dynamic, access CSG.
  • XmNfontList β€” class XmCFontList, type XmFontList, default dynamic, access CSG.
  • XmNlabelInsensitivePixmap β€” class XmCLabelInsensitivePixmap, type Pixmap, default XmUNSPECIFIED_PIXMAP, access CSG.
  • XmNlabelPixmap β€” class XmCLabelPixmap, type Pixmap, default dynamic, access CSG.
  • XmNlabelString β€” class XmCXmString, type XmString, default dynamic, access CSG.
  • XmNlabelType β€” class XmCLabelType, type unsigned char, default XmSTRING, access CSG.
  • XmNmarginBottom β€” class XmCMarginBottom, type Dimension, default dynamic, access CSG.
  • XmNmarginHeight β€” class XmCMarginHeight, type Dimension, default 2, access CSG.
  • XmNmarginLeft β€” class XmCMarginLeft, type Dimension, default dynamic, access CSG.
  • XmNmarginRight β€” class XmCMarginRight, type Dimension, default dynamic, access CSG.
  • XmNmarginTop β€” class XmCMarginTop, type Dimension, default dynamic, access CSG.
  • XmNmarginWidth β€” class XmCMarginWidth, type Dimension, default 2, access CSG.
  • XmNmnemonic β€” class XmCMnemonic, type KeySym, default NULL, access CSG.
  • XmNmnemonicCharSet β€” class XmCMnemonicCharSet, type String, default XmFONTLIST_DEFAULT_TAG, access CSG.
  • XmNpixmapPlacement β€” class XmCPixmapPlacement, type unsigned int, default XmPIXMAP_LEFT, access CSG.
  • XmNpixmapTextPadding β€” class XmCSpace, type Dimension, default 2, access CSG. (yes the class is XmCSpace, not a matching name β€” she's quirky like that, no notes πŸ¦‹)
  • XmNrecomputeSize β€” class XmCRecomputeSize, type Boolean, default True, access CSG.
  • XmNrenderTable β€” class XmCRenderTable, type XmRenderTable, default dynamic, access CSG.
  • XmNstringDirection β€” class XmCStringDirection, type XmStringDirection, default dynamic, access CSG.

and that's the whole resource set bestie, all 21 of them, not a single row skipped πŸ’œ notice how a bunch of these defaults are just dynamic β€” which is giving "we'll sort it out later" energy and honestly? relatable ✨ keep scrolling, there's more 🌸

Okay bestie, this is the part where XmPushButton shows you everything it inherited from its parent, XmPrimitive 😌 β€” like when you find out your fave got their whole lewk from their mom. Every single one of these resources is available on your push button, so you can tweak them to your heart's content. Here's the full roster, no skips, no cuts πŸ’–

✨ Inherited Resources from XmPrimitive ✨

Each one shows up as: resource name, its resource class, its type, its default, and who's allowed to touch it (the access column). Slay responsibly 🫢

  • XmNbottomShadowColor β€” class XmCBottomShadowColor, type Pixel, default dynamic, access CSG 🌈
  • XmNbottomShadowPixmap β€” class XmCBottomShadowPixmap, type Pixmap, default XmUNSPECIFIED_PIXMAP, access CSG πŸŽ€
  • XmNconvertCallback β€” class XmCCallback, type XtCallbackList, default NULL, access C πŸ’Œ
  • XmNforeground β€” class XmCForeground, type Pixel, default dynamic, access CSG πŸ’…
  • XmNhelpCallback β€” class XmCCallback, type XtCallbackList, default NULL, access C πŸ†˜
  • XmNhighlightColor β€” class XmCHighlightColor, type Pixel, default dynamic, access CSG ✨
  • XmNhighlightOnEnter β€” class XmCHighlightOnEnter, type Boolean, default False, access CSG πŸ‘€
  • XmNhighlightPixmap β€” class XmCHighlightPixmap, type Pixmap, default dynamic, access CSG 🌸
  • XmNhighlightThickness β€” class XmCHighlightThickness, type Dimension, default 2, access CSG πŸ“
  • XmNlayoutDirection β€” class XmCLayoutDirection, type XmDirection, default dynamic, access CG 🧭
  • XmNnavigationType β€” class XmCNavigationType, type XmNavigationType, default XmNONE, access CSG πŸšΆβ€β™€οΈ
  • XmNpopupHandlerCallback β€” class XmCCallback, type XtCallbackList, default NULL, access C πŸͺŸ
  • XmNshadowThickness β€” class XmCShadowThickness, type Dimension, default 2, access CSG πŸŒ‘
  • XmNtopShadowColor β€” class XmCTopShadowColor, type Pixel, default dynamic, access CSG 🌞
  • XmNtopShadowPixmap β€” class XmCTopShadowPixmap, type Pixmap, default dynamic, access CSG πŸ¦‹
  • XmNtraversalOn β€” class XmCTraversalOn, type Boolean, default True, access CSG πŸ”₯
  • XmNunitType β€” class XmCUnitType, type unsigned char, default dynamic, access CSG πŸ“
  • XmNuserData β€” class XmCUserData, type XtPointer, default NULL, access CSG πŸ—‚οΈ
Heads up bestie: those access codes aren't decoration β€” C, S, and G tell you when you're allowed to read or write each one, so don't just go assigning whatever whenever. The original lays out the rules, and they're real πŸ’€

  • XmNaccelerators β€” class XmCAccelerators, type XtAccelerators, default dynamic, access CSG
  • XmNancestorSensitive β€” class XmCSensitive, type Boolean, default dynamic, access G
  • XmNbackground β€” class XmCBackground, type Pixel, default dynamic, access CSG
  • XmNbackgroundPixmap β€” class XmCPixmap, type Pixmap, default XmUNSPECIFIED_PIXMAP, access CSG
  • XmNborderColor β€” class XmCBorderColor, type Pixel, default XtDefaultForeground, access CSG
  • XmNborderPixmap β€” class XmCPixmap, type Pixmap, default XmUNSPECIFIED_PIXMAP, access CSG
  • XmNborderWidth β€” class XmCBorderWidth, type Dimension, default 0, access CSG
  • XmNcolormap β€” class XmCColormap, type Colormap, default dynamic, access CG
  • XmNdepth β€” class XmCDepth, type int, default dynamic, access CG
  • XmNdestroyCallback β€” class XmCCallback, type XtCallbackList, default NULL, access C
  • XmNheight β€” class XmCHeight, type Dimension, default dynamic, access CSG
  • XmNinitialResourcesPersistent β€” class XmCInitialResourcesPersistent, type Boolean, default True, access C
  • XmNmappedWhenManaged β€” class XmCMappedWhenManaged, type Boolean, default True, access CSG
  • XmNscreen β€” class XmCScreen, type Screen *, default dynamic, access CG
  • XmNsensitive β€” class XmCSensitive, type Boolean, default True, access CSG
  • XmNtranslations β€” class XmCTranslations, type XtTranslations, default dynamic, access CSG
  • XmNwidth β€” class XmCWidth, type Dimension, default dynamic, access CSG
  • XmNx β€” class XmCPosition, type Position, default 0, access CSG
  • XmNy β€” class XmCPosition, type Position, default 0, access CSG

πŸŽ€ Callback Information πŸŽ€

ok so every callback you register gets handed a pointer to this little guy right here β€” it's giving "here's your tea, bestie, drink up":

typedef struct
{
        int reason;
        XEvent * event;
        int click_count;
} XmPushButtonCallbackStruct;
  • reason β€” tells you why the callback got invoked in the first place. the whole receipts, basically.
  • event β€” points at the XEvent that triggered the callback. like, the actual moment it happened.
  • click_count β€” ✨ read this one carefully ✨ this value is only valid when reason is XmCR_ACTIVATE. it holds the number of clicks in the last multiclick sequence if the XmNmultiClick resource is set to XmMULTICLICK_KEEP β€” otherwise it just contains 1. and lowkey important: when XmNmultiClick is XmMULTICLICK_KEEP, the activate callback gets invoked for each click. so yeah. every. single. one.

🌈 Translations 🌈

XmPushButton includes translations from Primitive.

heads up bestie: altering translations in #override or #augment mode is undefined. no cap, just don't. it's giving undefined behaviour energy and we are NOT about that πŸ’€

Additional XmPushButton translations for XmPushButtons that are not in a menu system are described in the following list.

The following key names are listed in the X standard key event translation table syntax. this format? yeah, it's literally the exact one Motif uses to specify which widget actions line up with a given key. there's a lil brief overview of the format over in VirtualBindings(3) if you want the vibe check πŸ¦‹ β€” and for the full, complete, no-details-skipped description of the format, please refer to the X Toolkit Instrinsics Documentation.

c<Btn1Down>:
          ButtonTakeFocus()

∼c<Btn1Down>:
          Arm()

∼c<Btn1Down>,∼c<Btn1Up>:
          Activate() Disarm()

∼c<Btn1Down>(2+):
          MultiArm()

∼c<Btn1Up>(2+):
          MultiActivate()

∼c<Btn1Up>:
          Activate() Disarm()

∼c<Btn2Down>:
          ProcessDrag()

:<Key><osfActivate>:
          PrimitiveParentActivate()

:<Key><osfCancel>:
          PrimitiveParentCancel()

:<Key><osfSelect>:
          ArmAndActivate()

:<Key><osfHelp>:
          Help()

∼s ∼m ∼a <Key>Return:
          PrimitiveParentActivate()

∼s ∼m ∼a <Key>space:
          ArmAndActivate()

okay so XmPushButton inherits its menu traversal translations from XmLabel, bestie πŸ’–. And there's a whole extra little translation buffet for PushButtons that live inside a menu system, listed right below. Important vibe check: in a Popup menu system, <Btn3> also does all the <Btn1> things. noted! πŸ“

The key names down here are written in the X standard key event translation table syntax β€” that's the exact format Motif uses to say "this widget action happens when you press this key." There's a lil overview of the format over in VirtualBindings(3), and if you want the whole enchilada, go read the X Toolkit Intrinsics Documentation. πŸ“šβœ¨

<Btn2Down>:
          ProcessDrag()

c<Btn1Down>:
          MenuButtonTakeFocus()

c<Btn1Up>:
          MenuButtonTakeFocusUp()

∼c<BtnDown>:
          BtnDown()

∼c<BtnUp>:
          BtnUp()

:<Key><osfSelect>:
          ArmAndActivate()

:<Key><osfActivate>:
          ArmAndActivate()

:<Key><osfCancel>:
          MenuEscape()

:<Key><osfHelp>:
          Help()

∼s ∼m ∼a <Key>Return:
          ArmAndActivate()

∼s ∼m ∼a <Key>space:
          ArmAndActivate()

✨ Action Routines ✨

the moment you've all been waiting for β€” the XmPushButton action routines, bestie πŸ’…

Activate()

Draws the shadow in the unarmed state. If the button is not in a menu, and if XmNfillOnArm is set to True, the background color reverts to the unarmed color. If XmNlabelType is XmPIXMAP or XmPIXMAP_AND_STRING, XmNlabelPixmap is used for the button face. And if the pointer is still within the button, this action calls the callbacks for XmNactivateCallback. 🫢

Arm()

Arms the PushButton, periodt. Draws the shadow in the armed state. If the button isn't in a menu and XmNfillOnArm is True, it fills the button with the color specified by XmNarmColor. If XmNlabelType is XmPIXMAP or XmPIXMAP_AND_STRING, XmNarmPixmap is used for the button face. It calls the XmNarmCallback callbacks. πŸ”₯

ArmAndActivate()

two moods, depending on where you at:

  • In a menu: unposts all menus in the menu hierarchy and, unless the button is already armed, calls the XmNarmCallback callbacks. This action calls the XmNactivateCallback and XmNdisarmCallback callbacks.
  • Outside a menu: draws the shadow in the armed state and, if XmNfillOnArm is set to True, fills the button with the color specified by XmNarmColor. If XmNlabelType is XmPIXMAP or XmPIXMAP_AND_STRING, XmNarmPixmap is used for the button face. This action calls the XmNarmCallback callbacks.

Outside a menu, this action also arranges for the following to happen, either immediately or at a later time: the shadow is drawn in the unarmed state and, if XmNfillOnArm is set to True, the background color reverts to the unarmed color. If XmNlabelType is XmPIXMAP or XmPIXMAP_AND_STRING, XmNlabelPixmap is used for the button face. The XmNactivateCallback and XmNdisarmCallback callbacks are called. πŸ’«

BtnDown()

This action unposts any menus posted by the PushButton's parent menu, disables keyboard traversal for the menu, and enables mouse traversal for the menu. It draws the shadow in the armed state and, unless the button is already armed, calls the XmNarmCallback callbacks. πŸ–±οΈ

BtnUp()

Unposts all menus in the menu hierarchy and activates the PushButton. It calls the XmNactivateCallback callbacks and then the XmNdisarmCallback callbacks. πŸŽ€

ButtonTakeFocus()

Causes the PushButton to take keyboard focus when Ctrl<Btn1Down> is pressed, without activating the widget. no accidental chaos, we love to see it πŸ’…

Disarm()

Calls the callbacks for XmNdisarmCallback. short. sweet. iconic. ✨

Help()

In a Pulldown or Popup MenuPane, unposts all menus in the menu hierarchy and, when the shell's keyboard focus policy is XmEXPLICIT, restores keyboard focus to the widget that had the focus before the menu system was entered. This action calls the callbacks for XmNhelpCallback if any exist. If there are no help callbacks for this widget, this action calls the help callbacks for the nearest ancestor that has them. πŸ†˜πŸ’œ

  • In a top-level Pulldown MenuPane from a MenuBar, unposts the menu, disarms the MenuBar CascadeButton and the MenuBar; and, when the shell's keyboard focus policy is XmEXPLICIT, restores keyboard focus to the widget that had the focus before the MenuBar was entered. In other Pulldown MenuPanes, it unposts the menu.
  • In a Popup MenuPane, this action unposts the menu and restores keyboard focus to the widget from which the menu was posted.

everybody gets put back exactly where they belong, we stan a considerate king πŸ‘‘

MultiActivate()

  • If XmNmultiClick is XmMULTICLICK_DISCARD, this action does nothing. πŸ™ˆ
  • If XmNmultiClick is XmMULTICLICK_KEEP, this action increments click_count in the callback structure and draws the shadow in the unarmed state. If the button is not in a menu and if XmNfillOnArm is set to True, the background color reverts to the unarmed color. If XmNlabelType is XmPIXMAP, the XmNlabelPixmap is used for the button face. If the pointer is within the PushButton, calls the callbacks for XmNactivateCallback and XmNdisarmCallback.

MultiArm()

  • If XmNmultiClick is XmMULTICLICK_DISCARD, this action does nothing. πŸ™ˆ
  • If XmNmultiClick is XmMULTICLICK_KEEP, this action draws the shadow in the armed state. If the button is not in a menu and if XmNfillOnArm is set to True, this action fills the button with the color specified by XmNarmColor. If XmNlabelType is XmPIXMAP, the XmNarmPixmap is used for the button face. This action calls the XmNarmCallback callbacks.

ProcessDrag()

Drags the contents of a PushButton label, identified when BTransfer is pressed. This action sets the XmNconvertProc of the DragContext to a function that calls the XmNconvertCallback procedures, possibly multiple times, for the _MOTIF_DROP selection.

⚠️ This action is undefined for PushButtons used in a menu system. like, undefined-undefined. do not. πŸ™…β€β™€οΈ

πŸ’– Additional Behavior πŸ’–

this widget has some extra little behaviors, bestie, and they're giving main character energy:

<EnterWindow>

In a menu, if keyboard traversal is enabled, this action does nothing. Otherwise, it draws the shadow in the armed state and calls the XmNarmCallback callbacks.

If the PushButton is not in a menu and the cursor leaves and then reenters the PushButton's window while the button is pressed, this action draws the shadow in the armed state. If XmNfillOnArm is set to True, it also fills the button with the color specified by XmNarmColor. If XmNlabelType is XmPIXMAP or XmPIXMAP_AND_STRING, XmNarmPixmap is used for the button face. πŸ¦‹

<LeaveWindow>

In a menu, if keyboard traversal is enabled, this action does nothing. Otherwise, it draws the shadow in the unarmed state and calls the XmNdisarmCallback callbacks.

If the PushButton is not in a menu and the cursor leaves the PushButton's window while the button is pressed, this action draws the shadow in the unarmed state. If XmNfillOnArm is set to True, the background color reverts to the unarmed color. If XmNlabelType is XmPIXMAP or XmPIXMAP_AND_STRING, the XmNlabelPixmap is used for the button face. πŸ“


🌈 Virtual Bindings 🌈

The bindings for virtual keys are vendor specific β€” iykyk, it depends on who made your setup. For info about bindings for virtual buttons and keys, go peek at VirtualBindings(3). ✨


your lil study group, fr fr β€” go read these next:


and that's a wrap on the XmPushButton library call page, bestie πŸŽ€πŸ’– you just read the whole thing, no cap. that footer down there is the XmPushButton library call</> tag β€” go forth and push some buttons, you absolute icon πŸ‘‘βœ¨