labwc/docs/themerc
stormshadow ba5a0b9829 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
2026-05-16 21:00:50 +05:30

153 lines
5.2 KiB
Text

# This file contains all themerc options with default values
#
# System-wide and local themes can be overridden by creating a copy of this
# file and renaming it to $HOME/.config/labwc/themerc-override. Be careful
# though - if you only want to override a small number of specific options,
# make sure all other lines are commented out or deleted.
# general
border.width: 1
#
# The global padding.{width,height} of openbox are not supported because
# the default labwc button geometry deviates from that of openbox
#
window.titlebar.padding.width: 0
window.titlebar.padding.height: 0
# window border
window.active.border.color: #aaaaaa
window.inactive.border.color: #aaaaaa
# ToggleKeybinds status indicator
window.active.indicator.toggled-keybind.color: #ff0000
# window titlebar background
window.active.title.bg.color: #e1dedb
window.inactive.title.bg.color: #f6f5f4
window.*.title.bg: Solid
# Vertical and SplitVertical gradients are supported for window.*.title.bg
# with the following additional color fields. See labwc-theme(5) for examples.
#
# window.*.title.bg.colorTo:
# window.*.title.bg.color.splitTo:
# window.*.title.bg.colorTo.splitTo:
# window titlebar text
window.active.label.text.color: #000000
window.inactive.label.text.color: #000000
window.label.text.justify: center
# window button width and spacing
window.button.width: 26
window.button.height: 26
window.button.spacing: 0
# window button hover overlay
window.button.hover.bg.color: #80808020
window.button.hover.bg.corner-radius: 0
# window buttons
window.active.button.unpressed.image.color: #000000
window.inactive.button.unpressed.image.color: #000000
# window drop-shadows
window.active.shadow.size: 60
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:
#
# window.active.button.iconify.unpressed.image.color: #333333
# menu
menu.overlap.x: 0
menu.overlap.y: 0
menu.width.min: 20
menu.width.max: 200
menu.border.width: 1
menu.border.color: #aaaaaa
menu.items.bg.color: #fcfbfa
menu.items.text.color: #000000
menu.items.active.bg.color: #e1dedb
menu.items.active.text.color: #000000
menu.items.padding.x: 7
menu.items.padding.y: 4
menu.separator.width: 1
menu.separator.padding.width: 6
menu.separator.padding.height: 3
menu.separator.color: #888888
menu.title.bg.color: #589bda
menu.title.text.color: #ffffff
menu.title.text.justify: Center
# on screen display (window-cycle dialog)
osd.bg.color: #e1dedb
osd.border.color: #000000
osd.border.width: 1
osd.label.text.color: #000000
# width can be set as percent (of screen width)
# example 50% or 75% instead of 600, max 100%
osd.window-switcher.style-classic.width: 600
osd.window-switcher.style-classic.padding: 4
osd.window-switcher.style-classic.item.padding.x: 10
osd.window-switcher.style-classic.item.padding.y: 1
osd.window-switcher.style-classic.item.active.border.width: 2
osd.window-switcher.style-classic.item.active.border.color: #706f6d
osd.window-switcher.style-classic.item.active.bg.color: #bfbcba
# The icon size the same as the font size by default
# osd.window-switcher.style-classic.item.icon.size: 50
osd.window-switcher.style-thumbnail.width.max: 80%
osd.window-switcher.style-thumbnail.padding: 4
osd.window-switcher.style-thumbnail.item.width: 300
osd.window-switcher.style-thumbnail.item.height: 250
osd.window-switcher.style-thumbnail.item.padding: 10
osd.window-switcher.style-thumbnail.item.active.border.width: 2
osd.window-switcher.style-thumbnail.item.active.border.color: #706f6d
osd.window-switcher.style-thumbnail.item.active.bg.color: #bfbcba
osd.window-switcher.style-thumbnail.item.icon.size: 60
osd.window-switcher.preview.border.width: 1
osd.window-switcher.preview.border.color: #dddda6,#000000,#dddda6
osd.workspace-switcher.boxes.width: 20
osd.workspace-switcher.boxes.height: 20
osd.workspace-switcher.boxes.border.width: 2
# Default values for following options change depending on the rendering
# backend. For software-based renderers, *.bg.enabled is "no" and
# *.border.enabled is "yes" if not set. For hardware-based renderers,
# *.bg.enabled is "yes" and *.border.enabled is "no" if not set.
# Setting *.bg.enabled to "yes" for software-based renderer with translucent
# background color may severely impact performance.
#
# snapping.overlay.region.bg.enabled:
# snapping.overlay.edge.bg.enabled:
# snapping.overlay.region.border.enabled:
# snapping.overlay.edge.border.enabled:
snapping.overlay.region.bg.color: #8080b380
snapping.overlay.edge.bg.color: #8080b380
snapping.overlay.region.border.width: 1
snapping.overlay.edge.border.width: 1
snapping.overlay.region.border.color: #dddda6,#000000,#dddda6
snapping.overlay.edge.border.color: #dddda6,#000000,#dddda6