XMSCROLLBAR(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

πŸ’– XmScrollBar β€” the ScrollBar widget class πŸ’–

okay bestie, welcome to the library call page for XmScrollBar, aka the little widget that lets you peek at data that's wayyy too big to fit on screen. it's giving main character energy in every ScrolledWindow, fr fr. πŸ¦‹


✨ NAME ✨

XmScrollBar β€” The ScrollBar widget class 🌸


✨ SYNOPSIS ✨

#include <Xm/ScrollBar.h>

✨ DESCRIPTION ✨

so the ScrollBar widget is literally here so your user can look at data that's too large to be displayed all at once. no cap. ScrollBars usually live inside a ScrolledWindow, right next to the widget that actually holds the data you wanna see. when the user messes with the ScrollBar, the data inside that other widget scrolls. that's the whole vibe. ✨

a ScrollBar is made of two arrows sitting at each end of a rectangle. that rectangle? it's called the scroll region. and inside the scroll region there's a smaller rectangle called the slider. πŸŽ€

how do you scroll? three ways, bestie:

  • clicking either arrow
  • selecting on the scroll region
  • dragging the slider

when an arrow gets selected, the slider inside the scroll region moves in the direction of that arrow, by an amount that the application supplies. and if you just hold the mouse button down, the slider keeps moving at a constant rate. iconic behavior honestly. πŸ’…

now here's the cute part. the ratio of the slider size to the scroll region size typically corresponds to the relationship between the size of the visible data and the total size of the data. so like β€” if 10 percent of the data is visible, the slider typically occupies 10 percent of the scroll region. it's a lil visual clue for the user about how much invisible data is lurking. 🫢

lowkey important: if the ScrollBar parent is an automatic ScrolledWindow, the XmNtraversalOn default is True. otherwise, the default is False. don't forget that one bestie, it's a whole thing. 😭

ScrollBar holds the XmQTnavigator traits. periodt. πŸ‘‘


🌈 Classes 🌈

ScrollBar inherits behavior, resources, and traits from the Core and XmPrimitive classes. it's a whole family tree situation.

  • the class pointer is xmScrollBarWidgetClass
  • the class name is XmScrollBar

🌈 New Resources 🌈

the following table defines a set of widget resources that us programmers use to specify data. you 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 β€” either lowercase or uppercase, your choice, but include any underscores between words. don't skip the underscores bestie, they matter. πŸŽ€

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)
  • or is not applicable (N/A)

and that's where we're at β€” more coming, don't go anywhere πŸ’–

XmScrollBar Resource Set ✨

okay bestie, here's the whole resource set for XmScrollBar. Each one has a Name, Class, Type, Default, and Access code. Let's get into it πŸ’…

  • XmNdecrementCallback β€” Class: XmCCallback, Type: XtCallbackList, Default: NULL, Access: C
  • XmNdragCallback β€” Class: XmCCallback, Type: XtCallbackList, Default: NULL, Access: C
  • XmNeditable β€” Class: XmCEditable, Type: Boolean, Default: True, Access: CSG
  • XmNincrement β€” Class: XmCIncrement, Type: int, Default: 1, Access: CSG
  • XmNincrementCallback β€” Class: XmCCallback, Type: XtCallbackList, Default: NULL, Access: C
  • XmNinitialDelay β€” Class: XmCInitialDelay, Type: int, Default: 250 ms, Access: CSG
  • XmNmaximum β€” Class: XmCMaximum, Type: int, Default: 100, Access: CSG
  • XmNminimum β€” Class: XmCMinimum, Type: int, Default: 0, Access: CSG
  • XmNorientation β€” Class: XmCOrientation, Type: unsigned char, Default: XmVERTICAL, Access: CSG
  • XmNpageDecrementCallback β€” Class: XmCCallback, Type: XtCallbackList, Default: NULL, Access: C
  • XmNpageIncrement β€” Class: XmCPageIncrement, Type: int, Default: 10, Access: CSG
  • XmNpageIncrementCallback β€” Class: XmCCallback, Type: XtCallbackList, Default: NULL, Access: C
  • XmNprocessingDirection β€” Class: XmCProcessingDirection, Type: unsigned char, Default: dynamic, Access: CSG
  • XmNrepeatDelay β€” Class: XmCRepeatDelay, Type: int, Default: 50 ms, Access: CSG
  • XmNshowArrows β€” Class: XmCShowArrows, Type: XtEnum, Default: XmEACH_SIDE, Access: CSG
  • XmNsliderSize β€” Class: XmCSliderSize, Type: int, Default: dynamic, Access: CSG
  • XmNsliderMark β€” Class: XmCSliderMark, Type: XtEnum, Default: dynamic, Access: CSG
  • XmNsliderVisual β€” Class: XmCSliderVisual, Type: XtEnum, Default: XmSHADOWED, Access: CSG
  • XmNslidingMode β€” Class: XmCSlidingMode, Type: XtEnum, Default: XmSLIDER, Access: CSG
  • XmNsnapBackMultiple β€” Class: XmCSnapBackMultiple, Type: unsigned short, Default: MaxValue, Access: CSG
  • XmNtoBottomCallback β€” Class: XmCCallback, Type: XtCallbackList, Default: NULL, Access: C
  • XmNtoTopCallback β€” Class: XmCCallback, Type: XtCallbackList, Default: NULL, Access: C
  • XmNtroughColor β€” Class: XmCTroughColor, Type: Pixel, Default: dynamic, Access: CSG
  • XmNvalue β€” Class: XmCValue, Type: int, Default: dynamic, Access: CSG
  • XmNvalueChangedCallback β€” Class: XmCCallback, Type: XtCallbackList, Default: NULL, Access: C

Now for the deets on each one πŸ’–

  • XmNdecrementCallback β€” Specifies the list of callbacks that is called when the user takes an action that moves the ScrollBar by one increment and the value decreases. The reason passed to the callback is XmCR_DECREMENT.
  • XmNdragCallback β€” Specifies the list of callbacks that is called on each incremental change of position when the slider is being dragged. The reason sent by the callback is XmCR_DRAG.
  • XmNeditable β€” Specifies how ScrollBar will react to user input. This resource can be True or False values, as follows:
    • True β€” Allows the scrollbar to be sensitive to user input. This is the default value.
  • False β€” makes the Scale scrollbar not listen to user input at all. Lowkey important: the visual does not grey out, so it just sits there looking normal while ignoring you (the audacity πŸ’€). This value is mostly for XmTHERMOMETER mode.

When XmNeditable is used on a widget it sets the dropsite to XmDROP_SITE_ACTIVE.

  • XmNincrement β€” how much the value goes up or down when the user does a thing that moves the slider by one increment. Bestie, the actual change is not just the raw number, here's the tea: the real change in value is the lesser of XmNincrement and (previous XmNvalue - XmNminimum) when the slider moves to the end of the ScrollBar with the minimum value, and the lesser of XmNincrement and (XmNmaximum - XmNsliderSize - previous XmNvalue) when the slider moves to the end of the ScrollBar with the maximum value. Also it has to be greater than 0 (zero). No zero, no negatives, periodt.
  • XmNincrementCallback β€” the callback list that fires when the user takes an action that moves the ScrollBar by one increment and the value increases. The reason passed to the callback is XmCR_INCREMENT. ✨
  • XmNinitialDelay β€” the amount of time in milliseconds to wait before starting continuous slider movement while a button is held down in an arrow or the scroll region. Must be greater than 0 (zero). This is the "okay hold up, let me think" pause 🫢.
  • XmNmaximum β€” the slider's maximum value. XmNmaximum must be greater than XmNminimum. That's the law, no cap.
  • XmNminimum β€” the slider's minimum value. And yes, XmNmaximum must be greater than XmNminimum. They're a package deal πŸ’œ.
  • XmNorientation β€” is the ScrollBar displayed vertically or horizontally? It can have values of XmVERTICAL and XmHORIZONTAL. Pick your lane.
  • XmNpageDecrementCallback β€” the callback list that fires when the user takes an action that moves the ScrollBar by one page increment and the value decreases. Reason passed: XmCR_PAGE_DECREMENT.
  • XmNpageIncrement β€” how much the value goes up or down when the user moves the slider by one page increment. Same situation as XmNincrement, same math: the actual change in value is the lesser of XmNpageIncrement and (previous XmNvalue - XmNminimum) when the slider moves to the end of the ScrollBar with the minimum value, and the lesser of XmNpageIncrement and (XmNmaximum - XmNsliderSize - previous XmNvalue) when the slider moves to the end of the ScrollBar with the maximum value. And it must be greater than 0 (zero). πŸ’…
  • XmNpageIncrementCallback β€” the callback list that fires when the user takes an action that moves the ScrollBar by one page increment and the value increases. Reason passed: XmCR_PAGE_INCREMENT.
  • XmNprocessingDirection β€” decides whether the XmNmaximum value lives on the right or left of XmNminimum for horizontal ScrollBars, or above or below XmNminimum for vertical ScrollBars. Values it can take: XmMAX_ON_TOP, XmMAX_ON_BOTTOM, XmMAX_ON_LEFT, and XmMAX_ON_RIGHT. The defaults:
    • If the ScrollBar is oriented vertically, the default is XmMAX_ON_BOTTOM.
    • If the ScrollBar is oriented horizontally, the default depends on the XmNlayoutDirection resource of the widget. Iykyk.
  • XmNrepeatDelay β€” the amount of time in milliseconds to wait between subsequent slider movements after the XmNinitialDelay has been processed. Must be greater than 0 (zero). It's giving "keep scrolling, keep scrolling, keep scrolling" πŸ”₯.
  • XmNshowArrows β€” whether the arrows show up and how they show up. Can take these values:
    • XmEACH_SIDE β€” one arrow is displayed on each end of the ScrollBar slider. This corresponds to a value of True in previous releases. This is the default, btw. ⭐
    • XmMAX_SIDE β€” both arrows are displayed on the XmNmaximum side of the ScrollBar slider.
    • XmMIN_SIDE β€” both arrows are displayed on the XmNminimum side of the ScrollBar slider.
    • XmNONE β€” no arrows are displayed at all. This corresponds to a value of False in previous releases. Bye arrows πŸ‘‹
  • XmNsliderMark β€” the shape the slider gets displayed in. Values:
    • XmETCHED_LINE β€” the slider is an etched line.
    • XmNONE β€” the slider is a foregrounded rectangle. This is the default for a regular slider.
    • XmROUND_MARK β€” the slider is a shadowed circle. This is the default when the slider is a thermometer. 🌸
    • XmTHUMB_MARK β€” the slider is a series of three etched lines centered in the middle of the slider.
  • XmNslidingMode β€” the mode the slider works in. Two possible modes, bestie:
    • XmSLIDER β€” lets the slider move freely between the minimum and maximum ends of the scale. This is the default value.
    • XmTHERMOMETER β€” forces the slider to be anchored to one side of the trough area.
  • XmNsliderSize β€” the length of the slider, between the values of 1 and (XmNmaximum - XmNminimum). The value is constrained to be within these inclusive bounds. Default is (XmNmaximum - XmNminimum) divided by 10, with a minimum of 1. Math girlies rise 🧚
  • XmNsliderVisual β€” the color of the slider visual. Values:
    • XmBACKGROUND_COLOR β€” the slider visual is in the background color.
    • XmFOREGROUND_COLOR β€” the slider visual is in the foreground color.
    • XmSHADOWED_BACKGROUND β€” the slider visual is in the background color, with a shadow. This is the default for a regular slider.
    • XmTROUGH_COLOR β€” the slider visual is in the trough color. This is the default when the slider is a thermometer.
  • XmNsnapBackMultiple β€” the distance over which the scrollbar slider snaps back to its original position when the user drags the mouse outside the ScrollBar edge. This distance is defined in terms of multiples of the width of the slider. For example:
    • a multiple of 0 (zero) causes the slider to snap back as soon as the pointer moves out of the ScrollBar frame
    • a multiple of 1 causes the slider to snap back as soon as the pointer moves beyond 1 ScrollBar width of the ScrollBar edge

Whenever the slider snaps back, the ScrollBar dragCallback is called if there is one.

The default value is large enough to prevent unwanted snapBack activity if the mouse is moved within the boundaries of any reasonable screen. To reset the default, set this resource to a large value, such as 10000.
  • XmNtoBottomCallback β€” the callback list that fires when the user takes an action that moves the slider to the end of the ScrollBar with the maximum value. Reason passed: XmCR_TO_BOTTOM.
  • XmNtoTopCallback β€” the callback list that fires when the user takes an action that moves the slider to the end of the ScrollBar with the minimum value. Reason passed: XmCR_TO_TOP.
  • XmNtroughColor β€” the color of the slider trough. Defaults to the color used for selections. Aesthetic choices πŸ’–
  • XmNvalue β€” the slider's position, between XmNminimum and (XmNmaximum - XmNsliderSize). The value is constrained to be within these inclusive bounds. The initial value of this resource is the larger of 0 (zero) and XmNminimum.
  • XmNvalueChangedCallback β€” the callback list that fires when the slider is released after being dragged. And here's the plot twist: these callbacks are also called in place of XmNincrementCallback, XmNdecrementCallback, XmNpageIncrementCallback, XmNpageDecrementCallback, XmNtoTopCallback, or XmNtoBottomCallback when one of these callback lists would normally be called but the value of the corresponding resource is NULL. Reason passed to the callback is XmCR_VALUE_CHANGED. It's the backup bestie fr fr. 🫢

🌈 Inherited Resources 🌈

ScrollBar 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.

✨ XmPrimitive Resource Set ✨

okay bestie, this is the ✨*heritage*✨ section β€” everything below is what XmPrimitive brings to the party, and our girl XmScrollBar inherits every single one of them. Four columns, no skips: Name, Class, Type, Default, and Access. Read it like a receipt πŸ’…

  • 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 dynamic, access CSG
  • XmNlayoutDirection β€” class XmCLayoutDirection, type XmDirection, default dynamic, access CG
  • XmNnavigationType β€” class XmCNavigationType, type XmNavigationType, default XmSTICKY_TAB_GROUP, 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 dynamic, access CSG
  • XmNunitType β€” class XmCUnitType, type unsigned char, default dynamic, access CSG
  • XmNuserData β€” class XmCUserData, type XtPointer, default NULL, access CSG
bestie heads up 🫢 β€” some of these say dynamic for the default, which is the manual's way of saying "it gets figured out at runtime, don't come for me." And that CG on XmNlayoutDirection is not a typo, she's just built different. CSG and C are their own whole thing. Respect the column, okay? πŸŽ€

that's the whole XmPrimitive set, no crumbs left. and there's still more coming πŸ‘‘

πŸ¦‹ Core Resource Set πŸ¦‹

okay bestie, here's the full core resource lineup for the ScrollBar. all of them. no skipping, no "you get the gist" energy, we're listing every single one πŸ’…

  • 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

that's nineteen. count 'em. I did. πŸ’–


πŸ’Œ Callback Information πŸ’Œ

so when a callback fires, you don't just get vibes β€” you get a pointer to this struct. like, every callback gets handed one of these:

typedef struct
{
        int reason;
        XEvent * event;
        int value;
        int pixel;
} XmScrollBarCallbackStruct;

and here's what's inside, bestie, field by field 🫢

  • reason β€” tells you why the callback got invoked. the whole plot, basically.
  • event β€” points at the XEvent that triggered the callback. the receipts. 😭
  • value β€” holds the new slider location value. where the slider ended up, iconic.
  • pixel β€” okay so this one is only used for XmNtoTopCallback and XmNtoBottomCallback, iykyk. for horizontal ScrollBars it holds the x coordinate of where the mouse button selection happened. for vertical ScrollBars it holds the y coordinate. that's it, that's the whole job.

🌈 Translations 🌈

XmScrollBar pulls in translations from Primitive. the XmScrollBar translations are listed below, and yes we're listing them properly, don't worry πŸ‘‘

the key names here are written in the X standard key event translation table syntax. that's the format Motif itself uses to say which widget actions go with which key. there's a little overview of the format over in VirtualBindings(3), and if you want the complete rundown, go read the X Toolkit Intrinsics Documentation. no cap, that's where the full spec lives πŸ“š

∼s ∼c ∼m ∼a <Btn1Down>:
          Select()
∼s ∼c ∼m ∼a <Btn1Up>:
          Release()

so like β€” no shift, no ctrl, no meta, no alt, button one goes down: Select() happens. button one comes up: Release() happens. clean. simple. slay. ✨

∼s ∼c ∼m ∼a Button1<PtrMoved>:
          Moved()

∼s ∼c ∼m ∼a <Btn2Down>:
          Select()

∼s ∼c ∼m ∼a <Btn2Up>:
          Release()

∼s ∼c ∼m ∼a Button2<PtrMoved>:
          Moved()

∼s c ∼m ∼a <Btn1Down>:
          TopOrBottom()

∼s c ∼m ∼a <Btn1Up>:
          Release()

:<Key><osfActivate>:
          PrimitiveParentActivate()

:<Key><osfCancel>:
          CancelDrag()

:<Key><osfBeginLine>:
          TopOrBottom()

:<Key><osfEndLine>:
          TopOrBottom()

:<Key><osfPageLeft>:
          PageUpOrLeft(Left)

:c <Key><osfPageUp>:
          PageUpOrLeft(Left)

:<Key><osfPageUp>:
          PageUpOrLeft(Up)

:<Key><osfPageRight>:
          PageDownOrRight(Right)

:c <Key><osfPageDown>:
          PageDownOrRight(Right)

:<Key><osfPageDown>:
          PageDownOrRight(Down)

:<Key><osfHelp>:
          PrimitiveHelp()

:c <Key><osfUp>:
          PageUpOrLeft(Up)

:<Key><osfUp>:
          IncrementUpOrLeft(Up)

:c <Key><osfDown>:
          PageDownOrRight(Down)

:<Key><osfDown>:
          IncrementDownOrRight(Down)

:c <Key><osfLeft>:
          PageUpOrLeft(Left)

:<Key><osfLeft>:
          IncrementUpOrLeft(Left)

:c <Key><osfRight>:
          PageDownOrRight(Right)

:<Key><osfRight>:
          IncrementDownOrRight(Right)

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

s ∼m ∼a <Key>Tab:
          PrimitivePrevTabGroup()

∼m ∼a <Key>Tab:
          PrimitiveNextTabGroup()

✨ Action Routines ✨

okay bestie, here's the tea on what each of these actions actually does when it fires. The ScrollBar action routines are:

  • CancelDrag() β€” if the key press happens while you're scrolling, it cancels the whole scroll and yeets the slider right back to its previous location in the scrollbar. Otherwise β€” and only if the parent is a manager β€” it just passes the event up to the parent. 🫢
  • IncrementDownOrRight(Down|Right) β€” with an argument of Down, or 0 (zero) for compatibility, it moves the slider down by one increment. With an argument of Right, or 1 for compatibility, it moves the slider right by one increment. Now here's the plot twist: if XmNprocessingDirection is XmMAX_ON_RIGHT or XmMAX_ON_BOTTOM, then movement toward the right or bottom calls the callbacks for XmNincrementCallback. But if XmNprocessingDirection is XmMAX_ON_LEFT or XmMAX_ON_TOP, movement toward the right or bottom calls the callbacks for XmNdecrementCallback instead. And if XmNincrementCallback or XmNdecrementCallback is NULL, the XmNvalueChangedCallback gets called. slay ✨
  • IncrementUpOrLeft(Up|Left) β€” with an argument of Up, or 0 (zero) for compatibility, it moves the slider up by one increment. With an argument of Left, or 1 for compatibility, it moves the slider left by one increment. If XmNprocessingDirection is XmMAX_ON_RIGHT or XmMAX_ON_BOTTOM, movement to the left or top calls the callbacks for XmNdecrementCallback. If XmNprocessingDirection is XmMAX_ON_LEFT or XmMAX_ON_TOP, movement to the left or top calls the callbacks for XmNincrementCallback. And again, the XmNvalueChangedCallback steps in if XmNincrementCallback or XmNdecrementCallback is NULL. πŸ’–
  • Moved() β€” if the button press lands inside the slider, then all the motion events that follow drag the slider to wherever the pointer is, and call the callbacks for XmNdragCallback. it's giving follow-the-leader πŸ’…
  • PageDownOrRight(Down|Right) β€” with an argument of Down, or 0 (zero) for compatibility, it moves the slider down by one page increment. With an argument of Right, or 1 for compatibility, it moves the slider right by one page increment. If XmNprocessingDirection is XmMAX_ON_RIGHT or XmMAX_ON_BOTTOM, movement toward the right or bottom calls the callbacks for XmNpageIncrementCallback. If XmNprocessingDirection is XmMAX_ON_LEFT or XmMAX_ON_TOP, movement toward the right or bottom calls the XmNpageDecrementCallback callbacks. And the XmNvalueChangedCallback is called if the XmNpageIncrementCallback or XmNpageDecrementCallback is NULL. no cap 🧚
  • PageUpOrLeft(Up|Left) β€” with an argument of Up, or 0 (zero) for compatibility, it moves the slider up by one page increment. With an argument of Left, or 1 for compatibility, it moves the slider left by one page increment. If XmNprocessingDirection is XmMAX_ON_RIGHT or XmMAX_ON_BOTTOM, movement to the left or top calls the callbacks for XmNpageDecrementCallback. If XmNprocessingDirection is XmMAX_ON_LEFT or XmMAX_ON_TOP, movement to the left or top calls the XmNpageIncrementCallback callbacks. The XmNvalueChangedCallback is called if the XmNpageIncrementCallback or XmNpageDecrementCallback is NULL. periodt 🌸
  • PrimitiveHelp() β€” calls the callbacks for XmNhelpCallback if any of them exist. And if this widget has no help callbacks at all? It walks up the family tree and calls the help callbacks of the nearest ancestor that actually has them. iconic ancestor-support behavior 😭
  • PrimitiveNextTabGroup() β€” traverses to the first item in the next tab group. And if the current tab group is literally the last entry in the tab group list, it wraps alllll the way back to the beginning. loop queen πŸ‘‘
  • PrimitiveParentActivate() β€” if the parent is a manager, it passes the event to the parent. that's it, that's the whole job πŸŽ€
  • PrimitivePrevTabGroup() β€” traverses to the first item in the previous tab group. If you hit the beginning of the tab group list, it wraps around to the end of the tab group list. backwards but make it fashion πŸ’œ
  • Release() β€” if the button press happened within the slider and the slider position actually changed, then the callbacks for XmNvalueChangedCallback get called. πŸ’–
  • Select() β€” okay this one has three whole moods, buckle up:
    • In arrow: moves the slider by one increment in the direction of the arrow. If XmNprocessingDirection is XmMAX_ON_RIGHT or XmMAX_ON_BOTTOM, movement toward the right or bottom calls the callbacks for XmNincrementCallback, and movement to the left or top calls the callbacks for XmNdecrementCallback. If XmNprocessingDirection is XmMAX_ON_LEFT or XmMAX_ON_TOP, movement toward the right or bottom calls the callbacks for XmNdecrementCallback, and movement to the left or top calls the callbacks for XmNincrementCallback. The XmNvalueChangedCallback is called if the XmNincrementCallback or XmNdecrementCallback is NULL.
    • In scroll region between an arrow and the slider: moves the slider by one page increment in the direction of the arrow. If XmNprocessingDirection is XmMAX_ON_RIGHT or XmMAX_ON_BOTTOM, movement toward the right or bottom calls the callbacks for XmNpageIncrementCallback, and movement to the left or top calls the callbacks for XmNpageDecrementCallback. If XmNprocessingDirection is XmMAX_ON_LEFT or XmMAX_ON_TOP, movement toward the right or bottom calls the callbacks for XmNpageDecrementCallback, and movement to the left or top calls the callbacks for XmNpageIncrementCallback. The XmNvalueChangedCallback is called if the XmNpageIncrementCallback or XmNpageDecrementCallback is NULL.
    • In slider: activates the interactive dragging of the slider. main character energy fr fr πŸ¦‹

And one more thing bestie β€” if the button is held down in either the arrows or the scroll region longer than the XmNinitialDelay resource, the slider is moved again by the same increment and the same callbacks are called. After that initial delay has been used up, the time delay switches over to whatever the resource XmNrepeatDelay says. hold-to-repeat pipeline πŸ”₯

  • TopOrBottom() β€” <Ctrl><Btn1Down> in an arrow, or in the scroll region between an arrow and the slider, moves the slider as far as it possibly can in the direction of the arrow. If XmNprocessingDirection is XmMAX_ON_RIGHT or XmMAX_ON_BOTTOM, movement toward the right or bottom calls the callbacks for XmNtoBottomCallback, and movement to the left or top calls the callbacks for XmNtoTopCallback. If XmNprocessingDirection is XmMAX_ON_LEFT or XmMAX_ON_TOP, movement toward the right or bottom calls the callbacks for XmNtoTopCallback, and movement to the left or top calls the callbacks for XmNtoBottomCallback. The XmNvalueChangedCallback is called if the XmNtoTopCallback or XmNtoBottomCallback is NULL. And separately: pressing <Key><osfBeginLine> or <Key><osfBeginData> moves the slider to the minimum value and invokes the XmNtoTopCallback. Pressing <Key><osfEndLine> or <Key><osfEndData> moves the slider to the maximum value and invokes the XmNtoBottomCallback. go big or go home, literally πŸš€

🌈 Virtual Bindings 🌈

ngl, the bindings for virtual keys are vendor specific. Like, every vendor does their own thing. So if you need the details on bindings for virtual buttons and keys, go check out VirtualBindings(3). iykyk ✨


your little reading list, bestie β€” go off:


and that's a wrap on the whole thing, bestie!! πŸŽ€ the footer at the bottom of this page says it's the XmScrollBar(library call) β€” that's your source/version tag and the date stamp rolled into one, sitting right there under the text like a little signature. you made it to the end of a six-parter, which is genuinely iconic of you. go forth and scroll πŸ’…πŸ’–βœ¨