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.
238 lines
6.3 KiB
KDL
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
|
|
// }
|