mirror of
https://github.com/labwc/labwc.git
synced 2026-06-13 14:33:18 -04:00
feat: implement Openbox-style bottom window handle and grips
Add full handle/grip assembly to the bottom of SSD window frames, following the Openbox themerc specification for geometry and theming. Theme parsing: - Parse window.handle.width (handle bar height, default 6) - Parse window.grip.width (corner grip width, default 20) - Parse window.[active|inactive].handle.bg with Solid/Gradient support - Parse window.[active|inactive].grip.bg (inherits from handle if unset) - Pre-render 1px-wide fill buffers and cairo patterns for handle/grip Scene graph (new ssd-handle.c): - Handle assembly replaces bottom border when active, with its own left/right/top borders and three-segment bottom border - Grips at left/right corners for diagonal resize (sw/se-resize) - Center handle for vertical resize (s-resize) - Vertical separator lines between grips and handle using border color - Per Openbox spec, handle_width is content-only height with borders drawn around it (total assembly height = 2*border_width + handle_width) Interactive visual states (grips only): - Hover: 20% black overlay on grip content area - Pressed: 40% black overlay with 1px inset shadow (dark top/left, light bottom/right) for a pushed-in 3D effect - Dragging: 20% overlay with inset shadow maintained - Global hover tracking (server.hovered_handle_ssd/element) ensures proper cleanup when cursor moves across views or to desktop Decoration toggle cycle (ToggleDecorations action): - New LAB_SSD_MODE_BORDER_HANDLE between BORDER and FULL - keepBorder=true: full -> border+handle -> border -> none -> full - keepBorder=false: full -> none -> full (unchanged) Node types and input: - New LAB_NODE_HANDLE, LAB_NODE_GRIP_LEFT, LAB_NODE_GRIP_RIGHT - Integrated into LAB_NODE_BORDER/BORDER_BOTTOM containment so existing Border context mousebinds (Resize) work automatically - Handle/grip descriptors resolved directly in get_cursor_context() bypassing ssd_get_resizing_type() for precise cursor shapes Visibility rules: - Hidden when maximized, shaded, or handle_width is 0 - Hidden in LAB_SSD_MODE_BORDER and LAB_SSD_MODE_NONE states - Bottom border in ssd-border.c disabled when handle is active Documentation: - labwc-theme.5.scd: document all handle/grip theme properties - labwc-actions.5.scd: update ToggleDecorations to 4-state cycle - docs/themerc: add handle/grip default values
This commit is contained in:
parent
4af693a7fd
commit
ba5a0b9829
19 changed files with 1132 additions and 17 deletions
|
|
@ -217,13 +217,14 @@ Actions are used in menus and keyboard/mouse bindings.
|
|||
*<action name="ToggleDecorations" />*
|
||||
Toggle decorations of focused window.
|
||||
|
||||
This is a 3-state action which can be executed multiple times:
|
||||
- Only the titlebar will be hidden, borders and resize area are kept
|
||||
This is a 4-state action which can be executed multiple times:
|
||||
- Titlebar is hidden; borders and handle/grip remain visible
|
||||
- Handle/grip is also hidden; only borders remain
|
||||
- Remaining decorations will be disabled
|
||||
- Decorations will be shown normally
|
||||
|
||||
By disabling the theme configuration 'keepBorder' the first step
|
||||
will be removed and the action only toggles between on and off.
|
||||
By disabling the theme configuration 'keepBorder' the cycle reduces
|
||||
to toggling between full decorations and no decorations.
|
||||
|
||||
*<action name="ToggleFullscreen" />*
|
||||
Toggle fullscreen state of focused window.
|
||||
|
|
@ -526,9 +527,10 @@ Actions that execute other actions. Used in keyboard/mouse bindings.
|
|||
Whether the client is tiled (snapped) to the indicated
|
||||
region. The indicated region may be a glob.
|
||||
|
||||
*decoration* [full|border|none]
|
||||
*decoration* [full|border-handle|border|none]
|
||||
Whether the client has full server-side decorations,
|
||||
borders only, or no server-side decorations.
|
||||
borders with handle/grip, borders only, or no
|
||||
server-side decorations.
|
||||
|
||||
*monitor* [current|left|right|<monitor_name>]
|
||||
Whether the client is on a monitor relative to the to
|
||||
|
|
|
|||
|
|
@ -113,6 +113,33 @@ window.*.title.bg.colorTo.splitTo: #557485
|
|||
Line width (integer) of border drawn around window frames.
|
||||
Default is 1.
|
||||
|
||||
*window.handle.width*
|
||||
Height (integer) of the bottom handle bar in pixels. Despite the name,
|
||||
this controls the vertical size of the handle (Openbox naming
|
||||
convention). When set to 0, the handle/grip assembly is disabled and
|
||||
the standard bottom border is used instead. Default is 6.
|
||||
|
||||
*window.grip.width*
|
||||
Width (integer) of each corner grip in the bottom handle bar, in
|
||||
pixels. Default is 20.
|
||||
|
||||
*window.active.handle.bg* / *window.inactive.handle.bg*
|
||||
Texture for the handle background. Supports Solid, Gradient Vertical,
|
||||
and Gradient SplitVertical. Default is *Solid* with color #a0a0a0
|
||||
(active) / #c0c0c0 (inactive).
|
||||
|
||||
*window.active.handle.bg.color* (and .colorTo, .color.splitTo, .colorTo.splitTo)
|
||||
Colors for the handle background gradient stops. See the texture
|
||||
documentation above for details.
|
||||
|
||||
*window.active.grip.bg* / *window.inactive.grip.bg*
|
||||
Texture for the left and right grip backgrounds. If not set, the grip
|
||||
inherits from the handle background.
|
||||
|
||||
*window.active.grip.bg.color* (and .colorTo, .color.splitTo, .colorTo.splitTo)
|
||||
Colors for the grip background gradient stops. If not set, the grip
|
||||
inherits from the handle background colors.
|
||||
|
||||
*window.titlebar.padding.width*
|
||||
Horizontal titlebar padding size, in pixels, between border and first
|
||||
button on the left/right.
|
||||
|
|
@ -561,7 +588,19 @@ following icons should be added:
|
|||
|
||||
# DEFINITIONS
|
||||
|
||||
The handle is the window edge decoration at the bottom of the window.
|
||||
The handle is the window edge decoration at the bottom of the window. It
|
||||
consists of a center handle bar (for vertical resizing) and two grips at the
|
||||
left and right corners (for diagonal resizing). The handle/grip assembly
|
||||
replaces the standard bottom border when enabled (window.handle.width > 0)
|
||||
and the current decoration state includes the handle. Vertical separator
|
||||
lines of border.width thickness are drawn between the grips and the center
|
||||
handle using the window border color.
|
||||
|
||||
When hovering over a grip element, it dims by 20%. When clicked (pressed
|
||||
but not yet moved), it dims by 40% with an inset shadow effect giving a
|
||||
"pushed in" appearance. During drag-resize, the dimming reduces to 20%
|
||||
while maintaining the inset shadow. The center handle does not receive
|
||||
these visual effects.
|
||||
|
||||
# SEE ALSO
|
||||
|
||||
|
|
|
|||
13
docs/themerc
13
docs/themerc
|
|
@ -58,6 +58,19 @@ window.inactive.shadow.size: 40
|
|||
window.active.shadow.color: #00000060
|
||||
window.inactive.shadow.color: #00000040
|
||||
|
||||
# window bottom handle and grips
|
||||
window.handle.width: 6
|
||||
window.grip.width: 20
|
||||
window.active.handle.bg: Solid
|
||||
window.active.handle.bg.color: #a0a0a0
|
||||
window.inactive.handle.bg: Solid
|
||||
window.inactive.handle.bg.color: #c0c0c0
|
||||
# Grips inherit from handle if not set explicitly
|
||||
# window.active.grip.bg: Solid
|
||||
# window.active.grip.bg.color: #a0a0a0
|
||||
# window.inactive.grip.bg: Solid
|
||||
# window.inactive.grip.bg.color: #c0c0c0
|
||||
|
||||
# Note that "menu", "iconify", "max", "close" buttons colors can be defined
|
||||
# individually by inserting the type after the button node, for example:
|
||||
#
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue