XMSCROLLBAR(3)
π 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, theXmNtraversalOndefault isTrue. otherwise, the default isFalse. 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:CXmNdragCallbackβ Class:XmCCallback, Type:XtCallbackList, Default:NULL, Access:CXmNeditableβ Class:XmCEditable, Type:Boolean, Default:True, Access:CSGXmNincrementβ Class:XmCIncrement, Type:int, Default:1, Access:CSGXmNincrementCallbackβ Class:XmCCallback, Type:XtCallbackList, Default:NULL, Access:CXmNinitialDelayβ Class:XmCInitialDelay, Type:int, Default:250 ms, Access:CSGXmNmaximumβ Class:XmCMaximum, Type:int, Default:100, Access:CSGXmNminimumβ Class:XmCMinimum, Type:int, Default:0, Access:CSGXmNorientationβ Class:XmCOrientation, Type:unsigned char, Default:XmVERTICAL, Access:CSGXmNpageDecrementCallbackβ Class:XmCCallback, Type:XtCallbackList, Default:NULL, Access:CXmNpageIncrementβ Class:XmCPageIncrement, Type:int, Default:10, Access:CSGXmNpageIncrementCallbackβ Class:XmCCallback, Type:XtCallbackList, Default:NULL, Access:CXmNprocessingDirectionβ Class:XmCProcessingDirection, Type:unsigned char, Default:dynamic, Access:CSGXmNrepeatDelayβ Class:XmCRepeatDelay, Type:int, Default:50 ms, Access:CSGXmNshowArrowsβ Class:XmCShowArrows, Type:XtEnum, Default:XmEACH_SIDE, Access:CSGXmNsliderSizeβ Class:XmCSliderSize, Type:int, Default:dynamic, Access:CSGXmNsliderMarkβ Class:XmCSliderMark, Type:XtEnum, Default:dynamic, Access:CSGXmNsliderVisualβ Class:XmCSliderVisual, Type:XtEnum, Default:XmSHADOWED, Access:CSGXmNslidingModeβ Class:XmCSlidingMode, Type:XtEnum, Default:XmSLIDER, Access:CSGXmNsnapBackMultipleβ Class:XmCSnapBackMultiple, Type:unsigned short, Default:MaxValue, Access:CSGXmNtoBottomCallbackβ Class:XmCCallback, Type:XtCallbackList, Default:NULL, Access:CXmNtoTopCallbackβ Class:XmCCallback, Type:XtCallbackList, Default:NULL, Access:CXmNtroughColorβ Class:XmCTroughColor, Type:Pixel, Default:dynamic, Access:CSGXmNvalueβ Class:XmCValue, Type:int, Default:dynamic, Access:CSGXmNvalueChangedCallbackβ 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 isXmCR_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 isXmCR_DRAG.XmNeditableβ Specifies how ScrollBar will react to user input. This resource can beTrueorFalsevalues, 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 forXmTHERMOMETERmode.
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 ofXmNincrementand(previous XmNvalue - XmNminimum)when the slider moves to the end of the ScrollBar with the minimum value, and the lesser ofXmNincrementand(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 isXmCR_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.XmNmaximummust be greater thanXmNminimum. That's the law, no cap.XmNminimumβ the slider's minimum value. And yes,XmNmaximummust be greater thanXmNminimum. They're a package deal π.XmNorientationβ is the ScrollBar displayed vertically or horizontally? It can have values ofXmVERTICALandXmHORIZONTAL. 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 asXmNincrement, same math: the actual change in value is the lesser ofXmNpageIncrementand(previous XmNvalue - XmNminimum)when the slider moves to the end of the ScrollBar with the minimum value, and the lesser ofXmNpageIncrementand(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 theXmNmaximumvalue lives on the right or left ofXmNminimumfor horizontal ScrollBars, or above or belowXmNminimumfor vertical ScrollBars. Values it can take:XmMAX_ON_TOP,XmMAX_ON_BOTTOM,XmMAX_ON_LEFT, andXmMAX_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
XmNlayoutDirectionresource of the widget. Iykyk.
- If the ScrollBar is oriented vertically, the default is
XmNrepeatDelayβ the amount of time in milliseconds to wait between subsequent slider movements after theXmNinitialDelayhas 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 ofTruein previous releases. This is the default, btw. βXmMAX_SIDEβ both arrows are displayed on theXmNmaximumside of the ScrollBar slider.XmMIN_SIDEβ both arrows are displayed on theXmNminimumside of the ScrollBar slider.XmNONEβ no arrows are displayed at all. This corresponds to a value ofFalsein 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 of1and(XmNmaximum - XmNminimum). The value is constrained to be within these inclusive bounds. Default is(XmNmaximum - XmNminimum)divided by 10, with a minimum of1. 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
1causes the slider to snap back as soon as the pointer moves beyond 1 ScrollBar width of the ScrollBar edge
- a multiple of
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, betweenXmNminimumand(XmNmaximum - XmNsliderSize). The value is constrained to be within these inclusive bounds. The initial value of this resource is the larger of0(zero) andXmNminimum.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 ofXmNincrementCallback,XmNdecrementCallback,XmNpageIncrementCallback,XmNpageDecrementCallback,XmNtoTopCallback, orXmNtoBottomCallbackwhen one of these callback lists would normally be called but the value of the corresponding resource isNULL. Reason passed to the callback isXmCR_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β classXmCBottomShadowColor, typePixel, default dynamic, accessCSGXmNbottomShadowPixmapβ classXmCBottomShadowPixmap, typePixmap, defaultXmUNSPECIFIED_PIXMAP, accessCSGXmNconvertCallbackβ classXmCCallback, typeXtCallbackList, defaultNULL, accessCXmNforegroundβ classXmCForeground, typePixel, default dynamic, accessCSGXmNhelpCallbackβ classXmCCallback, typeXtCallbackList, defaultNULL, accessCXmNhighlightColorβ classXmCHighlightColor, typePixel, default dynamic, accessCSGXmNhighlightOnEnterβ classXmCHighlightOnEnter, typeBoolean, defaultFalse, accessCSGXmNhighlightPixmapβ classXmCHighlightPixmap, typePixmap, default dynamic, accessCSGXmNhighlightThicknessβ classXmCHighlightThickness, typeDimension, default dynamic, accessCSGXmNlayoutDirectionβ classXmCLayoutDirection, typeXmDirection, default dynamic, accessCGXmNnavigationTypeβ classXmCNavigationType, typeXmNavigationType, defaultXmSTICKY_TAB_GROUP, accessCSGXmNpopupHandlerCallbackβ classXmCCallback, typeXtCallbackList, defaultNULL, accessCXmNshadowThicknessβ classXmCShadowThickness, typeDimension, default2, accessCSGXmNtopShadowColorβ classXmCTopShadowColor, typePixel, default dynamic, accessCSGXmNtopShadowPixmapβ classXmCTopShadowPixmap, typePixmap, default dynamic, accessCSGXmNtraversalOnβ classXmCTraversalOn, typeBoolean, default dynamic, accessCSGXmNunitTypeβ classXmCUnitType, typeunsigned char, default dynamic, accessCSGXmNuserDataβ classXmCUserData, typeXtPointer, defaultNULL, accessCSG
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 thatCGonXmNlayoutDirectionis not a typo, she's just built different.CSGandCare 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β classXmCAccelerators, typeXtAccelerators, defaultdynamic, accessCSGβ¨XmNancestorSensitiveβ classXmCSensitive, typeBoolean, defaultdynamic, accessGXmNbackgroundβ classXmCBackground, typePixel, defaultdynamic, accessCSGXmNbackgroundPixmapβ classXmCPixmap, typePixmap, defaultXmUNSPECIFIED_PIXMAP, accessCSGXmNborderColorβ classXmCBorderColor, typePixel, defaultXtDefaultForeground, accessCSGXmNborderPixmapβ classXmCPixmap, typePixmap, defaultXmUNSPECIFIED_PIXMAP, accessCSGXmNborderWidthβ classXmCBorderWidth, typeDimension, default0, accessCSGXmNcolormapβ classXmCColormap, typeColormap, defaultdynamic, accessCGXmNdepthβ classXmCDepth, typeint, defaultdynamic, accessCGXmNdestroyCallbackβ classXmCCallback, typeXtCallbackList, defaultNULL, accessCXmNheightβ classXmCHeight, typeDimension, defaultdynamic, accessCSGXmNinitialResourcesPersistentβ classXmCInitialResourcesPersistent, typeBoolean, defaultTrue, accessCXmNmappedWhenManagedβ classXmCMappedWhenManaged, typeBoolean, defaultTrue, accessCSGXmNscreenβ classXmCScreen, typeScreen *, defaultdynamic, accessCGXmNsensitiveβ classXmCSensitive, typeBoolean, defaultTrue, accessCSGXmNtranslationsβ classXmCTranslations, typeXtTranslations, defaultdynamic, accessCSGXmNwidthβ classXmCWidth, typeDimension, defaultdynamic, accessCSGXmNxβ classXmCPosition, typePosition, default0, accessCSGXmNyβ classXmCPosition, typePosition, default0, accessCSG
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 theXEventthat 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 forXmNtoTopCallbackandXmNtoBottomCallback, 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 ofDown, or0(zero) for compatibility, it moves the slider down by one increment. With an argument ofRight, or1for compatibility, it moves the slider right by one increment. Now here's the plot twist: ifXmNprocessingDirectionisXmMAX_ON_RIGHTorXmMAX_ON_BOTTOM, then movement toward the right or bottom calls the callbacks forXmNincrementCallback. But ifXmNprocessingDirectionisXmMAX_ON_LEFTorXmMAX_ON_TOP, movement toward the right or bottom calls the callbacks forXmNdecrementCallbackinstead. And ifXmNincrementCallbackorXmNdecrementCallbackisNULL, theXmNvalueChangedCallbackgets called. slay β¨IncrementUpOrLeft(Up|Left)β with an argument ofUp, or0(zero) for compatibility, it moves the slider up by one increment. With an argument ofLeft, or1for compatibility, it moves the slider left by one increment. IfXmNprocessingDirectionisXmMAX_ON_RIGHTorXmMAX_ON_BOTTOM, movement to the left or top calls the callbacks forXmNdecrementCallback. IfXmNprocessingDirectionisXmMAX_ON_LEFTorXmMAX_ON_TOP, movement to the left or top calls the callbacks forXmNincrementCallback. And again, theXmNvalueChangedCallbacksteps in ifXmNincrementCallbackorXmNdecrementCallbackisNULL. π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 forXmNdragCallback. it's giving follow-the-leader πPageDownOrRight(Down|Right)β with an argument ofDown, or0(zero) for compatibility, it moves the slider down by one page increment. With an argument ofRight, or1for compatibility, it moves the slider right by one page increment. IfXmNprocessingDirectionisXmMAX_ON_RIGHTorXmMAX_ON_BOTTOM, movement toward the right or bottom calls the callbacks forXmNpageIncrementCallback. IfXmNprocessingDirectionisXmMAX_ON_LEFTorXmMAX_ON_TOP, movement toward the right or bottom calls theXmNpageDecrementCallbackcallbacks. And theXmNvalueChangedCallbackis called if theXmNpageIncrementCallbackorXmNpageDecrementCallbackisNULL. no cap π§PageUpOrLeft(Up|Left)β with an argument ofUp, or0(zero) for compatibility, it moves the slider up by one page increment. With an argument ofLeft, or1for compatibility, it moves the slider left by one page increment. IfXmNprocessingDirectionisXmMAX_ON_RIGHTorXmMAX_ON_BOTTOM, movement to the left or top calls the callbacks forXmNpageDecrementCallback. IfXmNprocessingDirectionisXmMAX_ON_LEFTorXmMAX_ON_TOP, movement to the left or top calls theXmNpageIncrementCallbackcallbacks. TheXmNvalueChangedCallbackis called if theXmNpageIncrementCallbackorXmNpageDecrementCallbackisNULL. periodt πΈPrimitiveHelp()β calls the callbacks forXmNhelpCallbackif 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 forXmNvalueChangedCallbackget 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
XmNprocessingDirectionisXmMAX_ON_RIGHTorXmMAX_ON_BOTTOM, movement toward the right or bottom calls the callbacks forXmNincrementCallback, and movement to the left or top calls the callbacks forXmNdecrementCallback. IfXmNprocessingDirectionisXmMAX_ON_LEFTorXmMAX_ON_TOP, movement toward the right or bottom calls the callbacks forXmNdecrementCallback, and movement to the left or top calls the callbacks forXmNincrementCallback. TheXmNvalueChangedCallbackis called if theXmNincrementCallbackorXmNdecrementCallbackisNULL. - In scroll region between an arrow and the slider: moves the slider by one page increment in the direction of the arrow. If
XmNprocessingDirectionisXmMAX_ON_RIGHTorXmMAX_ON_BOTTOM, movement toward the right or bottom calls the callbacks forXmNpageIncrementCallback, and movement to the left or top calls the callbacks forXmNpageDecrementCallback. IfXmNprocessingDirectionisXmMAX_ON_LEFTorXmMAX_ON_TOP, movement toward the right or bottom calls the callbacks forXmNpageDecrementCallback, and movement to the left or top calls the callbacks forXmNpageIncrementCallback. TheXmNvalueChangedCallbackis called if theXmNpageIncrementCallbackorXmNpageDecrementCallbackisNULL. - In slider: activates the interactive dragging of the slider. main character energy fr fr π¦
- In arrow: moves the slider by one increment in the direction of the arrow. If
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. IfXmNprocessingDirectionisXmMAX_ON_RIGHTorXmMAX_ON_BOTTOM, movement toward the right or bottom calls the callbacks forXmNtoBottomCallback, and movement to the left or top calls the callbacks forXmNtoTopCallback. IfXmNprocessingDirectionisXmMAX_ON_LEFTorXmMAX_ON_TOP, movement toward the right or bottom calls the callbacks forXmNtoTopCallback, and movement to the left or top calls the callbacks forXmNtoBottomCallback. TheXmNvalueChangedCallbackis called if theXmNtoTopCallbackorXmNtoBottomCallbackisNULL. And separately: pressing<Key><osfBeginLine>or<Key><osfBeginData>moves the slider to the minimum value and invokes theXmNtoTopCallback. Pressing<Key><osfEndLine>or<Key><osfEndData>moves the slider to the maximum value and invokes theXmNtoBottomCallback. 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 β¨
π RELATED π
your little reading list, bestie β go off:
Core(3)XmCreateScrollBar(3)XmPrimitive(3)XmScrollBarGetValues(3)XmScrollBarSetValues(3)XmVaCreateScrollBar(3)XmVaCreateManagedScrollBar(3)
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 π
πβ¨
π¦ 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