Files
feresaria/packaging/config.kdl
T
Samuel Onoja e22f0ebef9 Add panel-wide styles and the Morph hub (#26)
Panel appearance now applies to the whole panel, with seven styles: Floating, Capsules, Notch, Edge to edge, Fused islands, Adaptive and Morph.

- Share composition, geometry, and motion through the renderer-independent `ferese-panel` crate, including native materials, input regions, and Settings previews.
- Add the Morph hub with media, calendar, notifications, controls, workspace previews, hover feedback, and attached mode. Keep recording and low-battery status visible and respect window clearance.
- Cache workspace preview geometry, draw thumbnails directly, centralize Morph transitions, and keep rendering settings local to each shell instance.
- Put Record Screen in the Morph header and show the display control only when an external monitor is connected. Update panel documentation, the desktop screenshot, and native check style names.

Local validation included 660 compositor tests, 191 shell tests, isolated preview-cache checks, GPU Morph captures at 1×/1.25×/1.5×, formatting, and Clippy with warnings denied. The final header change passed all 23 Morph tests. Release workflow jobs are skipped for this PR.
2026-10-12 01:31:34 +01:00

238 lines
6.3 KiB
KDL

// Commands run directly, without a shell. Install optional apps before using them.
commands {
terminal "foot"
browser "firefox"
editor "zed"
lock "ferese-lock"
screenshot "ferese-screenshot"
screenshot-full "ferese-screenshot" "--full"
brightness-up "brightnessctl" "set" "2%+"
brightness-down "brightnessctl" "set" "2%-"
volume-up "wpctl" "set-volume" "-l" "1.0" "@DEFAULT_AUDIO_SINK@" "5%+"
volume-down "wpctl" "set-volume" "-l" "1.0" "@DEFAULT_AUDIO_SINK@" "5%-"
mute "wpctl" "set-mute" "@DEFAULT_AUDIO_SINK@" "toggle"
mic-mute "wpctl" "set-mute" "@DEFAULT_AUDIO_SOURCE@" "toggle"
}
xwayland {
enabled #true
startup on-demand
path "xwayland-satellite"
}
// These supplement the built-in shortcuts listed in docs/shortcuts.md.
binding "Super+B" "spawn" "browser"
binding "Super+Z" "spawn" "editor"
binding "Super+Alt+L" "spawn" "lock"
binding "XF86MonBrightnessUp" "spawn" "brightness-up"
binding "XF86MonBrightnessDown" "spawn" "brightness-down"
binding "XF86AudioRaiseVolume" "spawn" "volume-up"
binding "XF86AudioLowerVolume" "spawn" "volume-down"
binding "XF86AudioMute" "spawn" "mute"
binding "XF86AudioMicMute" "spawn" "mic-mute"
binding "Super+Left" "focus" "left"
binding "Super+Down" "focus" "down"
binding "Super+Up" "focus" "up"
binding "Super+Right" "focus" "right"
binding "Super+Ctrl+Left" "move" "left"
binding "Super+Ctrl+Down" "move" "down"
binding "Super+Ctrl+Up" "move" "up"
binding "Super+Ctrl+Right" "move" "right"
binding "Super+Alt+Left" "resize" "left"
binding "Super+Alt+Down" "resize" "down"
binding "Super+Alt+Up" "resize" "up"
binding "Super+Alt+Right" "resize" "right"
// Replace a swipe action with "toggle-overview", "move" "left", or another action.
binding "Swipe3Up" "workspace-next"
binding "Swipe3Down" "workspace-previous"
binding "Swipe3Left" "focus" "right"
binding "Swipe3Right" "focus" "left"
input {
xkb-layout "us"
xkb-variant ""
xkb-options
focus-follows-mouse #false
repeat-rate 25
repeat-delay-ms 600
touchpad {
tap #true
natural-scroll #true
disable-while-typing #true
swipe-threshold 80
}
}
layout {
mode "scrolling"
inner-gap 4
outer-gap 4
smart-gaps #false
}
workspaces {
// Press the current workspace's shortcut again to return to the previous one.
auto-back-and-forth #false
}
scrolling {
default-column-width 0.5
focus-strategy "paged"
width-presets 0.33333 0.5 0.66667 "full"
}
animations {
enabled #true
reduced-motion #false
speed 0.9
spring {
duration-ms 240.0
bounce 0.0
overshoot #false
}
viewport-spring {
duration-ms 350.0
bounce 0.0
overshoot #false
}
}
appearance {
focus-effect {
enabled #true
active-opacity 1.0
inactive-opacity 1.0
inactive-dim 0.0
duration-ms 150
}
}
theme {
mode "dark"
family "ferese-blue"
split #false
schedule { source "schedule"; timezone "system"; light-at "07:00"; dark-at "19:00"; }
accessibility { increase-contrast #false; reduce-transparency #false; }
background {
mode "fill"
// path "/absolute/path/to/wallpaper.png"
}
material {
style "translucent"
}
geometry {
window-radius 12
shell-radius 12
border-width 1
focus-ring-width 1
control-gap 12
}
shadow {
soft {
blur 10
offset-y 2
opacity 0.07
}
}
// typography { font-family "JetBrainsMono Nerd Font"; }
}
status {
keybinding-guide #true
low-battery-threshold 20
}
// Panel composition is explicit; visibility and item options belong to each item.
// Opacity follows the shell; corners follow the panel style unless overridden here.
panel "main" {
geometry {
height 30
side-margins 18
edge-margin 6
window-clearance 4
}
edge "top"
style "flat"
border #false
start {
spacing 3
group "overview" {
padding 0 0
item "overview" kind="overview" overflow="never" priority=100
}
group "workspaces" {
padding 2 3
item "workspaces" kind="workspaces" overflow="never" priority=100
}
}
center {
group "title" {
padding 0 0
item "focused-window" kind="focused-window" visible=#true overflow="never"
}
}
end {
spacing 8
group "status" {
padding 2 3
item "media" kind="media"
item "quick-settings" kind="quick-settings"
item "network" kind="network"
item "audio" kind="audio"
item "recording" kind="recording"
item "notifications" kind="notifications"
item "battery" kind="battery" percentage=#true
}
group "time" {
padding 2 3
item "clock" kind="clock"
}
group "display" {
padding 0 0
item "display-mode" kind="display-mode"
}
}
}
window-rule app-id="dev.ferese.Settings" floating=#true
window-rule app-id="dev.ferese.ScreenShare" floating=#true
window-rule app-id="dev.ferese.Authentication" floating=#true
window-rule app-id="org.gnome.Calculator" floating=#true
window-rule app-id="org.pulseaudio.pavucontrol" floating=#true
window-rule title="Picture-in-Picture" floating=#true
window-rule title="Choose a wallpaper" floating=#true
notifications {
show-popups #true
do-not-disturb #false
timeout-ms 6000
}
lock-screen {
clock-format "12h"
background-dim 0.26
background-blur 14
dim-after-seconds 30
sleep-after-seconds 120
}
// Install swayidle and test unlocking before enabling automatic locking.
// autostart "swayidle" "-w" "timeout" "300" "ferese-lock" "before-sleep" "ferese-lock" "lock" "ferese-lock"
// Fullscreen MPRIS playback keeps the session awake until paused or hidden.
// idle-inhibit { fullscreen-playback #false; }
// window-rule app-id="org.example.Presentation" idle-inhibit="visible"
// Find display names with feresectl outputs, then adjust and uncomment.
// output-profile "docked" {
// output "HDMI-A-1" scale=1.5 { position 0 0; }
// output "eDP-1" scale=1.5 { position 2560 0; }
// }
// output-profile "laptop" {
// output "eDP-1" scale=1.5
// }