XMSCROLLEDWINDOW(3)
π XmScrolledWindow β the ScrolledWindow widget class π
okay bestie, welcome to XmScrolledWindow(library call), the little manual page that's about to change your whole scroll game. this is a library call page, so grab a snack and let's get into it π«Ά
β¨ SYNOPSIS β¨
#include <Xm/ScrolledW.h>
πΈ DESCRIPTION πΈ
so basically, the ScrolledWindow widget is that girl who takes one or two ScrollBar widgets plus a viewing area and turns them into a visible window onto some other β usually way bigger β data display. you know how you can only see a lil slice of a huge thing at once? yeah. that. and the user can scroll through the bigger display using the ScrollBars. iconic behaviour, no notes π
to use ScrolledWindow, an app first creates a ScrolledWindow widget, any ScrollBar widgets it needs, and a widget that's capable of displaying whatever data it wants as the work area of ScrolledWindow. then ScrolledWindow positions that work area widget and shows the ScrollBars if you asked for them. when the user does some action on the ScrollBar, the app gets notified through the normal ScrollBar callback interface. periodt.
ScrolledWindow can be configured to go automatic, meaning it does all the scrolling and display actions itself with literally zero involvement from the application program. OR it can be configured to give you a minimal support framework, where the app is the one responsible for processing all user input and making all the visual changes to the displayed data in response. your call, bestie π
when ScrolledWindow is doing automatic scrolling, it creates a clipping window and automatically creates the scroll bars. conceptually, this window becomes the viewport through which the user examines the larger underlying data area. the app just creates the data it wants, then makes that data the work area of the ScrolledWindow. and when the user moves the slider to change the displayed data, the workspace gets moved under the viewing area so a new portion of the data becomes visible. it's giving magic, honestly β¨
sometimes though, it's just not practical for an app to create a huge data space and display it through a tiny clipping window. like, imagine a text editor β creating one single data area that consisted of a large file would involve an undesirable amount of overhead. π the app still needs a ScrolledWindow (a small viewport onto some larger data), but it also needs to be notified when the user scrolls the viewport so it can pull in more data from storage and update the display area. for these cases, ScrolledWindow can be configured to provide only visual layout support. no clipping window is created, and the application must maintain the data displayed in the work area, as well as respond to user input on the ScrollBars. so like, you're on your own but make it fashion π
the user can specify resources in a resource file for the automatically created widgets that contain the horizontal and vertical scrollbars and the clipping area of the ScrolledWindow widget. the names of these widgets are HorScrollBar, VertScrollBar, and ClipWindow respectively, and they stay consistent whether created by XmCreateScrolledList, XmCreateScrolledText or XmCreateScrolledWindow. consistency is the vibe check that matters π¦
ScrolledWindow uses the XmQTnavigator trait, and holds the XmQTscrollFrame trait.
π Descendants π
ScrolledWindow automatically creates the descendants below. an application can use XtNameToWidget to gain access to the named descendant. plus, a user or an application can use the named descendant when specifying resource values. so many doors open for you, bestie π
- Named Descendant:
VertScrollBarβ Class:XmScrollBarβ Identity: vertical scroll bar - Named Descendant:
HorScrollBarβ Class:XmScrollBarβ Identity: horizontal scroll bar - Named Descendant:
ClipWindowβ Class:XmClipWindowβ Identity: clip window
π Classes π
ScrolledWindow inherits behavior, resources, and traits from Core, Composite, Constraint, and XmManager. a whole family tree, fr fr π
- the class pointer is
xmScrolledWindowWidgetClass. - the class name is
XmScrolledWindow.
π New Resources π
the table below defines a set of widget resources the programmer uses 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 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)
heads up bestie, the actual resource table is coming in the next part, so don't go anywhere π
π The Resource Set (yes bestie, all of it) π
Okay so here's the full tea on every single resource. Five columns, no skips, no shortcuts: Name, Class, Type, Default, Access. Periodt. β¨
XmNautoDragModelβ ClassXmCAutoDragModel, typeXtEnum, defaultXmAUTO_DRAG_ENABLED, accessCSGXmNclipWindowβ ClassXmCClipWindow, typeWidget, default dynamic, accessGXmNhorizontalScrollBarβ ClassXmCHorizontalScrollBar, typeWidget, default dynamic, accessCSGXmNscrollBarDisplayPolicyβ ClassXmCScrollBarDisplayPolicy, typeunsigned char, default dynamic, accessCSGXmNscrollBarPlacementβ ClassXmCScrollBarPlacement, typeunsigned char, defaultXmBOTTOM_RIGHT, accessCSGXmNscrolledWindowMarginHeightβ ClassXmCScrolledWindowMarginHeight, typeDimension, default0, accessCSGXmNscrolledWindowMarginWidthβ ClassXmCScrolledWindowMarginWidth, typeDimension, default0, accessCSGXmNscrollingPolicyβ ClassXmCScrollingPolicy, typeunsigned char, defaultXmAPPLICATION_DEFINED, accessCGXmNspacingβ ClassXmCSpacing, typeDimension, default4, accessCSGXmNtraverseObscuredCallbackβ ClassXmCCallback, typeXtCallbackList, defaultNULL, accessCSGXmNverticalScrollBarβ ClassXmCVerticalScrollBar, typeWidget, default dynamic, accessCSGXmNvisualPolicyβ ClassXmCVisualPolicy, typeunsigned char, default dynamic, accessGXmNworkWindowβ ClassXmCWorkWindow, typeWidget, defaultNULL, accessCSG
π¦ Resource Descriptions π¦
Time to meet the whole cast, one resource at a time. Sit down, grab a snack, we're doing this properly. π
XmNautoDragModel
Tells you whether automatic drag is turned on β that's XmAUTO_DRAG_ENABLED β or off, which is XmAUTO_DRAG_DISABLED. And the default? Enabled. It's giving "yes, obviously". π
XmNclipWindow
This one's the widget ID of the clipping area. ScrolledWindow makes it for you automatically when XmNvisualPolicy is set to XmCONSTANT, and your app can only read it β no writing, bestie.
β οΈ Try to set this resource to a new value and the scrolled window prints a warning message at you. Like, it will call you out.
But if XmNvisualPolicy is set to XmVARIABLE? Then this resource gets set to NULL and no clipping window is created at all. Gone. Ghosted. π
XmNhorizontalScrollBar
The widget ID of the horizontal ScrollBar, no cap. ScrolledWindow creates it automatically when XmNscrollingPolicy is initialized to XmAUTOMATIC β otherwise the default is NULL. Simple as that. β¨
XmNscrollBarDisplayPolicy
This controls where the ScrollBars get automatically placed. Two moods:
- Set it to
XmAS_NEEDED, and ifXmNscrollingPolicyisXmAUTOMATIC, ScrollBars show up only when the workspace exceeds the clip area in one dimension or both. Very "only here when you need me". π«Ά - Set it to
XmSTATIC, and the ScrolledWindow displays the ScrollBars whenever they are managed β regardless of the relationship between the clip window and the work area. Always showing up, main character energy. π
π¨ Important: this resource must beXmSTATICwhenXmNscrollingPolicyisXmAPPLICATION_DEFINED. Not optional, not negotiable.
Default situation: XmAS_NEEDED when XmNscrollingPolicy is XmAUTOMATIC, and XmSTATIC in every other case.
XmNscrollBarPlacement
Where do the ScrollBars sit relative to the work window? Pick your vibe:
XmTOP_LEFTβ the horizontal ScrollBar goes above the work window, and the vertical ScrollBar goes to the left.XmBOTTOM_LEFTβ the horizontal ScrollBar goes below the work window, and the vertical ScrollBar goes to the left.XmTOP_RIGHTβ the horizontal ScrollBar goes above the work window, and the vertical ScrollBar goes to the right.XmBOTTOM_RIGHTβ the horizontal ScrollBar goes below the work window, and the vertical ScrollBar goes to the right.
The actual default depends on what XmNlayoutDirection is set to on the widget. iykyk. π
XmNscrolledWindowMarginHeight
The margin height on the top and bottom of the ScrolledWindow. Now here's the lore: to use the autoscroll drag feature of the Motif drag and drop facility, a user has to be able to hold a drag icon over the margin of a scrolled window.
π The thing is β drag and drop will work with the default margin size of zero, but the user may find it genuinely difficult to position the icon precisely enough to actually use the feature easily.
So if you want the autoscroll drag feature in your app, the application programmer should make sure the window margins are set to an adequate size. Do your friend a favor. π
XmNscrolledWindowMarginWidth
The margin width on the right and left sides of the ScrolledWindow. And please β go back and read the warning about the default margin size for XmNscrolledWindowMarginHeight above, because it applies here too. Same energy, different axis. β¨
XmNscrollingPolicy π
Okay so bestie, this resource is the one that decides who's driving. It performs automatic scrolling of the work area with no application interaction β literally zero effort from your app. π
If the value of this resource is XmAUTOMATIC, ScrolledWindow goes full main character and does all of this itself: creates the ScrollBars, attaches callbacks to the ScrollBars, sets the visual policy to XmCONSTANT, and automatically moves the work area through the clip window in response to any user interaction with the ScrollBars. And your application can still add its own callbacks to the ScrollBars on top of that β which means your app gets notified of a scroll event without having to perform any layout procedures. ate. π
NOTE: Since the ScrolledWindow adds callbacks to the ScrollBars, an application should not perform an XtRemoveAllCallbacks on any of the ScrollBar widgets. not the vibe, don't do it π
When XmNscrollingPolicy is set to XmAPPLICATION_DEFINED, the application is responsible for all aspects of scrolling. The ScrollBars must be created by the application, and it is responsible for performing any visual changes in the work area in response to user input. you wanted the aux cord, you got it π§
This resource must be set to the desired policy at the time the ScrolledWindow is created. It cannot be changed through SetValues. no take-backs, no edits, fr fr π
XmNspacing π
Specifies the distance that separates the ScrollBars from the work window. personal space matters. π«Ά
XmNtraverseObscuredCallback π
Specifies a list of callbacks that is called when traversing to a widget or gadget that is obscured due to its position in the work area relative to the location of the ScrolledWindow viewport. β¨
This resource is valid only when XmNscrollingPolicy is XmAUTOMATIC. If this resource is NULL, an obscured widget cannot be traversed to. The callback reason is XmCR_OBSCURED_TRAVERSAL.
XmNverticalScrollBar β¬οΈ
Specifies the widget ID of the vertical ScrollBar. This is automatically created by ScrolledWindow when the XmNscrollingPolicy is initialized to XmAUTOMATIC; otherwise, the default is NULL. she builds it for you or she doesn't π
XmNvisualPolicy π¦
Enlarges the ScrolledWindow to match the size of the work area. It can also be used as a static viewport onto a larger data space. πΈ
If the visual policy is XmVARIABLE, the ScrolledWindow forces the ScrollBar display policy to XmSTATIC and allows the work area to grow or shrink at any time and adjusts its layout to accommodate the new size. flexible queen. π
When the policy is XmCONSTANT, the work area grows or shrinks as requested, but a clipping window forces the size of the visible portion to remain constant. The only time the viewing area can grow is in response to a resize from the ScrolledWindow's parent.
The default is XmCONSTANT when XmNscrollingPolicy is XmAUTOMATIC, and XmVARIABLE otherwise.
NOTE: This resource must be set to the desired policy at the time the ScrolledWindow is created. It cannot be changed through SetValues. same rule as before, iykyk π
XmNworkWindow πͺ
Specifies the widget ID of the viewing area.
And then there's the constraint resource set for it, the XmScrolledWindow Constraint Resource Set, which goes a lil something like:
- Name β
XmNscrolledWindowChildType - Class β
XmCScrolledWindowChildType - Type β
unsigned char - Default β
RESOURCE_DEFAULT - Access β
CSG
XmNscrolledWindowChildType π
Specifies what the child is. ScrolledWindow supports a number of child types, and the possible values are giving:
XmWORK_AREAβ Indicates a work area child. This specifies that both ScrollBars are limited to moving the child inside the clipping window. If the scrolling policy isXmAUTOMATIC, the work area child can move in both directions. πXmHOR_SCROLLBARβ Indicates a horizontal child widget; the child must have theXmQTnavigatortrait installed. For example, theXmScrollBarwidget has theXmQTnavigatortrait installed. βXmVERT_SCROLLBARβ Indicates a vertical child widget; the child must have theXmQTnavigatortrait installed.XmSCROLL_HORβ Indicates that only the horizontal ScrollBar moves the child. This value is only meaningful if the scrolling policy isXmAUTOMATIC.XmSCROLL_VERTβ Indicates that only the vertical ScrollBar moves the child. This value is only meaningful if the scrolling policy isXmAUTOMATIC.XmNO_SCROLLβ Indicates that the child does not move with the ScrollBars. This value is only meaningful if the scrolling policy isXmAUTOMATIC. sit still bestie, we're not going anywhere π
π Inherited Resources π
ScrolledWindow 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 those too, they're part of the lore πβ¨
Ok bestie, now for the part everyone actually screenshots: the resource sets. This is the receipts section β every resource, its class, its type, its default, and who's allowed to touch it. π
β¨ XmManager Resource Set β¨
Every widget that inherits from XmManager gets all of these for free, no cap. One bullet per resource, so nothing slips through. π«Ά
XmNbottomShadowColorβ classXmCBottomShadowColor, typePixel, default is dynamic, accessCSG.XmNbottomShadowPixmapβ classXmCBottomShadowPixmap, typePixmap, defaultXmUNSPECIFIED_PIXMAP, accessCSG.XmNforegroundβ classXmCForeground, typePixel, default is dynamic, accessCSG.XmNhelpCallbackβ classXmCCallback, typeXtCallbackList, defaultNULL, accessC.XmNhighlightColorβ classXmCHighlightColor, typePixel, default is dynamic, accessCSG.XmNhighlightPixmapβ classXmCHighlightPixmap, typePixmap, default is dynamic, accessCSG.XmNinitialFocusβ classXmCInitialFocus, typeWidget, defaultNULL, accessCSG.XmNlayoutDirectionβ classXmCLayoutDirection, typeXmDirection, default is dynamic, accessCG.XmNnavigationTypeβ classXmCNavigationType, typeXmNavigationType, defaultXmTAB_GROUP, accessCSG.XmNpopupHandlerCallbackβ classXmCCallback, typeXtCallbackList, defaultNULL, accessC.XmNshadowThicknessβ classXmCShadowThickness, typeDimension, default is dynamic, accessCSG.XmNstringDirectionβ classXmCStringDirection, typeXmStringDirection, default is dynamic, accessCG.XmNtopShadowColorβ classXmCTopShadowColor, typePixel, default is dynamic, accessCSG.XmNtopShadowPixmapβ classXmCTopShadowPixmap, typePixmap, default is dynamic, accessCSG.XmNtraversalOnβ classXmCTraversalOn, typeBoolean, defaultTrue, accessCSG.XmNunitTypeβ classXmCUnitType, typeunsigned char, default is dynamic, accessCSG.XmNuserDataβ classXmCUserData, typeXtPointer, defaultNULL, accessCSG.
Notice how many of those say dynamic for the default, bestie β that's not me being vague, that's literally what the manpage says. The value gets worked out for you. Iconic behaviour honestly. β¨
β¨ Composite Resource Set β¨
And if your widget is a Composite on top of all that, you also inherit these three. Short list, big power. π
XmNchildrenβ classXmCReadOnly, typeWidgetList, defaultNULL, accessG.XmNinsertPositionβ classXmCInsertPosition, typeXtOrderProc, defaultNULL, accessCSG.XmNnumChildrenβ classXmCReadOnly, typeCardinal, default0, accessG.
XmNchildrenandXmNnumChildrenare read-only β accessGβ so don't even think about setting them yourself. They're the widget's little diary, you just read it. π
That's the whole inheritance stack for this one, babes β every single resource accounted for, zero skipped, zero invented. More coming, don't go anywhere. π¦
XmNacceleratorsβ classXmCAccelerators, typeXtAccelerators, defaultdynamic, accessCSGXmNancestorSensitiveβ 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
π Callback Information π
okay so listen up bestie β if you want to actually hear about user input, your app must use the ScrollBar callbacks. That's the whole vibe. No shortcuts. π
ScrolledWindow defines a callback structure for use with XmNtraverseObscuredCallback callbacks. The XmNtraverseObscuredCallback resource is basically the β¨glow-upβ¨ mechanism that lets traversal reach widgets (or gadgets) that got obscured because of where they're sitting in the work area of a ScrolledWindow. It's giving hidden behind the vibe. π«£
The XmNtraverseObscuredCallback routine has responsibility for adjusting the position of the work area such that the specified traversal destination widget is positioned within the viewport of the ScrolledWindow. Like, that's literally its job description, no cap. π
heads up queen: aNULLXmNtraverseObscuredCallbackresource causes obscured widgets within the ScrolledWindow to be nontraversable. So if you leave itNULL, those hidden babes are justβ¦ unreachable. π Not the main character energy you want.
So traversal to an obscured widget or gadget requires these conditions to be met, and bestie you need all three, not two out of three, this isn't a vibe check where partial credit exists:
- the widget or gadget can be obscured only due to its position in the work area of a ScrolledWindow relative to the viewport πΈ
- the viewport of the associated ScrolledWindow is fully visible, or can be made so by virtue of ancestral
XmNtraverseObscuredCallbackroutines β¨ - and the
XmNtraverseObscuredCallbackresource must be non-NULLπ₯
And when ScrolledWindow widgets are nested β you know, windows in windows in windows, very inception core π β the XmNtraverseObscuredCallback routine for each ScrolledWindow that obscures the traversal destination is called in ascending order within the given hierarchy. Order matters, iykyk. π
So like, a pointer to this structure gets passed to callbacks for XmNtraverseObscuredCallback. Here's the whole look:
typedef struct
{
int reason;
XEvent *event:
Widget traversal_destination;
XmTraversalDirection direction;
} XmTraverseObscuredCallbackStruct;
reasonβ tells you why the callback was invoked, bestie. It's the receipts. π§Ύeventβ points to theXEventthat triggered the callback. That's the moment that started it all. β¨traversal_destinationβ the widget or gadget you're traversing to. It's gonna be a descendant of the work window. Family tree vibes. π³directionβ the direction of traversal. For the valid values, go read the description of thedirectionparameter in theXmProcessTraversalreference page. It's all there, iykyk. π
Translations π«
XmScrolledWindow includes the translations from XmManager. So it's literally borrowing the whole translation vibe. Periodt. π
Additional Behavior π
This widget has the following additional behavior:
<Key><osfPageUp>β ifXmNscrollingPolicyisXmAUTOMATIC, it scrolls the window up the height of the viewport. The distance scrolled may be reduced to provide some overlap. The actual distance scrolled depends on theXmNpageIncrementresource of the verticalScrollBar. Up up and away! π<Key><osfPageDown>β ifXmNscrollingPolicyisXmAUTOMATIC, it scrolls the window down the height of the viewport. The distance scrolled may be reduced to provide some overlap. The actual distance scrolled depends on theXmNpageIncrementresource of the verticalScrollBar. Going down? Groundbreaking. π<Key><osfPageLeft>β ifXmNscrollingPolicyisXmAUTOMATIC, it scrolls the window left the width of the viewport. The distance scrolled may be reduced to provide some overlap. The actual distance scrolled depends on theXmNpageIncrementresource of the horizontalScrollBar. Left, bestie! β¬ οΈ<Key><osfPageRight>β ifXmNscrollingPolicyisXmAUTOMATIC, it scrolls the window right the width of the viewport. The distance scrolled may be reduced to provide some overlap. The actual distance scrolled depends on theXmNpageIncrementresource of the horizontalScrollBar. Right? Right. β‘οΈ<Key><osfBeginLine>β ifXmNscrollingPolicyisXmAUTOMATIC, it scrolls the window horizontally to the edge corresponding to the horizontalScrollBar's minimum value. Start of the line energy. β¨<Key><osfEndLine>β ifXmNscrollingPolicyisXmAUTOMATIC, it scrolls the window horizontally to the edge corresponding to the horizontalScrollBar's maximum value. End of the line, no cap. π<Key><osfBeginData>β ifXmNscrollingPolicyisXmAUTOMATIC, it scrolls the window vertically to the edge corresponding to the verticalScrollBar's minimum value. Top of the data, let's go. π<Key><osfEndData>β ifXmNscrollingPolicyisXmAUTOMATIC, it scrolls the window vertically to the edge corresponding to the verticalScrollBar's maximum value. Bottom of the data, we made it. π
Some apps are gonna want to swap these page bindings out for ones that match whatever's inside the scrolled area. And honestly? Valid. Do you. π
Virtual Bindings π§
Virtual key bindings are vendor specific, so it's giving "everyone's different." Wanna know about virtual buttons and keys? Check VirtualBindings(3). It's the plug. π
RELATED π
You might also vibe with these:
Composite(3)Constraint(3)Core(3)XmCreateScrolledWindow(3)XmManager(3)XmProcessTraversal(3)XmScrollBar(3)XmScrollVisible(3)XmScrolledWindowSetAreas(3)XmVaCreateScrolledWindow(3)XmVaCreateManagedScrolledWindow(3)
And that's a wrap on the XmScrolledWindow(library call) page, bestie! Source/version is exactly that, and there's no date on this one, but it's still iconic. Catch you in the next man page. Bye! π
β¨
π¦ 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