commit b89bc223dcab2aae602157d9c40e67d12c8edc5f Author: Brandon Kessler Date: Mon Sep 7 14:39:20 2026 -0600 initial commit diff --git a/.config/umbriel/config.toml b/.config/umbriel/config.toml new file mode 100644 index 0000000..edd590c --- /dev/null +++ b/.config/umbriel/config.toml @@ -0,0 +1,698 @@ +# Umbriel example configuration + +# Distribution packages normally install this file as +# /usr/share/umbriel/config.toml. Copy it to ~/.config/umbriel/config.toml +# before making personal changes. Creating the user file and saving later edits +# both apply live, so a logout is not needed. + +# Validate the standard config without starting or disturbing the compositor: +# umbriel validate +# Use `-c` for a custom config path: +# umbriel validate -c /path/to/config.toml + +# Complete documentation: https://docs.noctalia.dev/umbriel/ + +# ─────────────────────────────── Includes ─────────────────────────────────── +# Split large configurations into smaller files. Required files are applied in +# list order, followed by optional files, then values in this main file. +# Missing optional files are silently ignored and remain watched. Relative +# paths start from the directory containing this file. +# Documentation: https://docs.noctalia.dev/umbriel/configuration/#include +# ──────────────────────────────────────────────────────────────────────────── + +[include] +files = [] # Example: ["appearance.toml", "outputs.toml"] + +[include.optional] +files = [] # Example: ["~/.config/umbriel/noctalia.toml"] + +# ─────────────────────────────── General ──────────────────────────────────── +# Configure startup commands, session behavior, environment variables, and +# hardware events. +# Documentation: https://docs.noctalia.dev/umbriel/configuration/#general +# ──────────────────────────────────────────────────────────────────────────── + +[general] +autostart = ["noctalia"] # Commands run once when the session starts +# mod_key = "Super" # Force Super instead of nested-session Alt +xwayland = true # Requires xwayland-satellite; restart to change +show_cheatsheet = true # Show the keybind overlay on startup +focus_on_activate = false # Do not let unsolicited requests steal focus +honor_restored_maximize = false # Honor restored maximized state + +# Session environment +# Values apply only at session startup. Native sessions also publish them to +# newly started systemd user services. Add or uncomment values as needed. +# Documentation: https://docs.noctalia.dev/umbriel/configuration/#environment + +[environment] +GTK_THEME = "Adwaita:dark" +QT_QPA_PLATFORMTHEME = "qt6ct" + +# Hardware events +# These commands run when a laptop lid opens or closes. Uncomment either hook +# to enable it. +# Documentation: https://docs.noctalia.dev/umbriel/configuration/#events + +[events] +# lid_close = "notify-send 'The laptop lid is closed'" +# lid_open = "notify-send 'The laptop lid is open'" + +# ─────────────────────────────── Outputs ──────────────────────────────────── +# Configure monitor identity, mode, logical placement, scaling, HDR, VRR, and +# workspace inventory. Run `umbriel outputs` to list names and available modes. +# Documentation: https://docs.noctalia.dev/umbriel/outputs/ +# ──────────────────────────────────────────────────────────────────────────── + +# Output sections are machine-specific, so this example stays commented. +# Uncomment the complete block below and replace DP-1 with the correct name. +# Use a connector when the rule belongs to a port. To follow one physical +# display between machines or ports, replace the header with its quoted Config +# name, for example [output."Some Make Some Model ABC123"]. + +# [output.DP-1] +# enabled = true # False removes the output but preserves its state +# mode = "2560x1440@144" # WIDTHxHEIGHT or WIDTHxHEIGHT@HZ +# position = [0, 0] # Logical top-left; omit for automatic placement +# scale = 1.25 # Logical size is mode size divided by scale +# transform = "normal" # normal, 90, 180, 270, or a flipped variant +# vrr = "fullscreen" # disabled, always, or fullscreen +# tearing = true # Permit eligible fullscreen asynchronous flips +# direct_scanout = true # False forces composition on this output +# hdr = "auto" # off, on, auto, or fullscreen +# sdr_white = 203 # SDR reference white in cd/m2 during HDR +# workspaces = 5 # Omit for dynamic workspaces + +# Replace the count with ["WEB", "CHAT", "MEDIA"] for named static workspaces, +# or with "dynamic" to state the dynamic default explicitly. A dynamic output +# can keep a minimum number of workspaces instead, so a bar always shows them: +# [output.DP-1] +# min_workspaces = 3 # Dynamic floor; rejected with a static inventory + +# New scrolling columns on this output can use a different initial width. This +# affects new columns only; existing columns keep their current size. +# Documentation: https://docs.noctalia.dev/umbriel/outputs/#initial-scrolling-width +# [output.DP-1.layout.scrolling] +# default_width_fraction = 0.4 + +# ────────────────────────────── Workspaces ────────────────────────────────── +# Choose global workspace behavior. Each output uses dynamic workspaces unless +# its output section defines a static count or list of names. +# Documentation: https://docs.noctalia.dev/umbriel/workspaces/ +# ──────────────────────────────────────────────────────────────────────────── + +[workspaces] +# Each output supports at most 64 workspaces, including empty ones. +back_and_forth = false # Re-select active workspace to switch back +empty_above = false # Keep one empty workspace above active range + +# Workspace rules customize layout without creating workspaces. Select exactly +# one `index` or `name`; `output` is optional. This recipe works with dynamic +# inventories and static inventories that contain workspace 2. Uncomment the +# complete block. +# Documentation: https://docs.noctalia.dev/umbriel/workspaces/#workspace-rules + +# [[workspace]] +# index = 2 +# output = "DP-1" +# layout.mode = "dwindle" +# layout.gap = 4 +# layout.struts.top = 24 +# layout.scrolling.center_underfull_strip = false +# layout.dwindle.preserve_split = true + +# A name selector must exist in a static output inventory, for example +# `workspaces = ["WEB", "CHAT"]` in the matching output block. + +# [[workspace]] +# name = "CHAT" +# output = "DP-1" +# layout.mode = "master" + +# ─────────────────────────────── Colors ───────────────────────────────────── +# Configure every color Umbriel paints. Values stay commented so an included +# Noctalia-generated palette can supply them without this main file winning. +# Documentation: https://docs.noctalia.dev/umbriel/appearance/#colors +# ──────────────────────────────────────────────────────────────────────────── + +[colors] +# background = "#141419FF" # Internal panels and banners +# text_primary = "#E8E8EAFF" # Primary text +# text_muted = "#8A8A92FF" # Secondary help and status text +# accent_primary = "#7AA3FFFF" # Titles, key chords, and primary emphasis +# accent_secondary = "#F5C96BFF" # Group headings and secondary emphasis +# warning = "#F5C96BFF" # Warning text and warning-only diagnostics +# error = "#FF6B6BFF" # Error text, confirmations, and diagnostics +# insert_hint = "#7FC8FF80" # Drag-and-drop target preview +# backdrop = "#000000FF" # Fullscreen gaps and lock screen +# shadow = "#0000007F" # Window shadow + +[colors.border] +# focused = "#7AA3FFFF" # Focused window border +# unfocused = "#292933FF" # Unfocused window border +# scratchpad_focused = "#E5C07BFF" # Focused scratchpad border +# scratchpad_unfocused = "#5C4A2AFF" # Unfocused scratchpad border +# outer = "#1A1A1FFF" # Outer border ring + +[colors.overview] +# background_tint = "#10101430" # Tint over the desktop background +# workspace_background = "#00000044" # Background behind each workspace +# badge = "#7AA3FFFF" # Overview shortcut badge + +# ───────────────────────────── Appearance ─────────────────────────────────── +# Configure window decoration geometry, blur, shadows, and other visual +# effects. +# Documentation: https://docs.noctalia.dev/umbriel/appearance/#window-appearance +# ──────────────────────────────────────────────────────────────────────────── + +[appearance] +prefer_no_csd = true # Prefer Umbriel's border-only decoration +border_width = 2 # Inner border width, 0-100 logical pixels +outer_border_width = 0 # Optional outer ring, 0-100 logical pixels +corner_radius = 10 # Radius of the final decorated edge, 0-100 +drag_opacity = 0.75 # Window opacity during a tiled or floating drag + +[appearance.blur] +# This is the global blur engine. A matching window or layer rule must still +# opt a surface into blur. +enabled = true # Disable blur and release per-output effect buffers +optimized = true # Reuse one cached background blur per output +passes = 3 # Blur passes, 0-8 +radius = 3 # Blur radius, 0-100 +noise = 0.02 # Noise overlay, 0.0-1.0 +brightness = 0.9 # 0.0-2.0 +contrast = 0.9 # 0.0-2.0 +saturation = 1.1 # 0.0-2.0 + +[appearance.shadow] +# Custom window shaders automatically shape the shadow from their output alpha. +# Shadows stay beneath windows and follow closing snapshots as well. +enabled = true # Draw shadows behind non-fullscreen windows +softness = 10 # Gaussian softness, 0-200; 0 is a hard edge +offset_x = 2 # Horizontal offset, -200 to 200 +offset_y = 2 # Vertical offset, -200 to 200 + +# ──────────────────────────────── Input ───────────────────────────────────── +# Configure keyboards, pointers, tablets, cursor behavior, and focus policy. +# Documentation: https://docs.noctalia.dev/umbriel/input/ +# ──────────────────────────────────────────────────────────────────────────── + +[input] +middle_click_paste = true # Primary-selection paste; applies on reload +window_drag_toggle = "none" # Retarget a window drag: "none", "floating", or "pinned" + +[input.keyboard] +# Physical keyboard XKB settings. Virtual keyboards provide their own keymaps. +layout = "" # Example: "us,de"; empty uses the system default +variant = "" # Example: ",nodeadkeys" for two layouts +options = "" # Example: "grp:alt_shift_toggle" +repeat_rate = 25 # Key repeats per second, 0-1000 +repeat_delay = 600 # Delay before repeating, 0-10000 ms +numlock_toggle = true # Enable on connect; false preserves the current state +track_layout = "global" # global, or window for per-surface layout memory + +[input.touchpad] +tap = true # Tap-to-click +# natural_scroll = true # Omit to preserve the libinput default +# accel_profile = "adaptive" # flat, adaptive, or custom +# sensitivity = 0.5 # Pointer speed, -1.0 to 1.0 +# scroll_factor = 1.5 # Two-finger scroll multiplier, 0.1-10.0 +# disable_while_typing = true # Omit to preserve the libinput default +# disable_on_external_mouse = true # Native sessions only + +[input.mouse] +# natural_scroll = false # Omit to preserve the libinput default +# accel_profile = "flat" # Omit to preserve the libinput default +sensitivity = 0.0 # Pointer speed, -1.0 to 1.0 +scroll_wheel_step = 60 # Logical pixels per layout-scroll action, 1-1000 + +[input.tablet] +enabled = true # False disables tablet tools and pads +# map_to_output = "DP-1" # Connector or monitor Config name +# map_to_focused_output = false +# map_to_focused_window = false # Focused-window mapping has highest priority +# left_handed = false +# calibration_matrix = [1.0, 0.0, 0.0, 0.0, 1.0, 0.0] + +[input.cursor] +theme = "" # Empty uses environment or default Xcursor theme +size = 24 # Logical size, 1-512 +hardware_cursor = true # False forces cursor composition +follows_focus = false # Warp to windows selected by focus, output, move, or other activations +hide_when_typing = false # Keep visible while typing +hide_timeout_ms = 0 # Idle hide timeout, 0 disables; maximum is 3600000 + +[input.focus] +follows_mouse = false # Focus the pointer target after pointer motion +# Refuse hover focus when revealing a window would scroll farther than this +# many viewport widths. Omit the key for no limit. +# follows_mouse_max_scroll = 0.5 + +# Exact, case-sensitive per-device overrides inherit their device-kind table. +# Find names with `libinput list-devices`. Uncomment each complete block needed. +# Documentation: https://docs.noctalia.dev/umbriel/input/#per-device-overrides + +# [[input.device]] +# name = "Acme Split Keyboard" +# layout = "us" +# variant = "colemak_dh" +# repeat_rate = 40 +# repeat_delay = 250 + +# [[input.device]] +# name = "Acme Precision Touchpad" +# tap = true +# natural_scroll = false +# accel_profile = "flat" +# sensitivity = 0.0 +# disable_while_typing = false + +# [[input.device]] +# name = "Acme Gaming Mouse" +# accel_profile = "flat" +# sensitivity = 0.0 + +# ─────────────────────────────── Keybinds ─────────────────────────────────── +# Bind chords to compositor actions. Configured chords replace matching +# built-ins; built-in chords not mentioned here remain active. +# Syntax: https://docs.noctalia.dev/umbriel/keybinds/ +# Actions: https://docs.noctalia.dev/umbriel/actions/ +# ──────────────────────────────────────────────────────────────────────────── + +[keybinds] + +# Applications and session +"Mod+Return" = "spawn:alacritty" +"Mod" = "spawn:noctalia msg panel-toggle launcher" +"Mod+Q" = "window-close" + +# Focus navigation. In overview, Mod+Up/Down retain normal layout focus, so they +# traverse stacks in the default horizontal layout. Bare Up/Down move between +# workspace rows. +"Mod+Left" = "window-focus-left" +"Mod+Down" = "window-focus-down" +"Mod+Up" = "window-focus-up" +"Mod+Right" = "window-focus-right" + +# Window state and layout +"Mod+T" = "window-toggle-floating" +"Mod+Shift+T" = "window-focus-switch-floating" +"Mod+P" = "window-toggle-pinned" +"Mod+M" = "window-toggle-maximize-to-edges" + +# Overview +"Mod+O" = { action = "overview-toggle", repeat = false } + +# These useful bindings are built in already. They stay commented here so an +# included keybind file can override them without this main file winning again. +# Uncomment a chord only when this file should own that override. + +# "Mod+Escape" = "session-quit" +# "Mod+F1" = "window-focus-next" +# "Mod+H" = "window-focus-left" +# "Mod+J" = "window-focus-down" +# "Mod+K" = "window-focus-up" +# "Mod+L" = "window-focus-right" +# "Mod+Shift+Left" = "column-move-left" +# "Mod+Shift+Down" = "window-move-down" +# "Mod+Shift+Up" = "window-move-up" +# "Mod+Shift+Right" = "column-move-right" +# "Mod+F" = "window-toggle-fullscreen" +# "Mod+Ctrl+F" = "window-toggle-maximize" +# "Mod+R" = "window-cycle-width" +# "Mod+Shift+R" = "window-cycle-width-back" +# "Mod+Comma" = "window-consume-left" +# "Mod+Period" = "window-consume-right" +# "Mod+WheelUp" = "window-focus-left" +# "Mod+WheelDown" = "window-focus-right" +# Mod+1 through Mod+9 switch workspaces. Adding Shift moves the focused window; +# keypad digits provide the same built-in actions. + +# Scratchpads +# Each output owns a separate scratchpad. Bare actions target the output under +# the pointer; append `:DP-1` or a monitor Config name to target one explicitly. +# Documentation: https://docs.noctalia.dev/umbriel/scratchpads/ +"Mod+Shift+Space" = "window-move-to-scratchpad" +"Mod+Space" = "scratchpad-toggle" +"Mod+Ctrl+Space" = "window-restore-from-scratchpad" +"Mod+Tab" = "scratchpad-focus-next" + +# Optional navigation and sizing recipes. These chords do not replace active +# bindings above when uncommented. +# "Mod+Page_Up" = "workspace-previous" +# "Mod+Page_Down" = "workspace-next" +# "Mod+Shift+Page_Up" = "window-move-to-workspace-previous" +# "Mod+Shift+Page_Down" = "window-move-to-workspace-next" +# "Mod+Home" = "column-focus-first" +# "Mod+End" = "column-focus-last" +# "Mod+Shift+Home" = "column-move-to-first" +# "Mod+Shift+End" = "column-move-to-last" +# "Mod+Bracketright" = "window-focus-next" +# "Mod+Bracketleft" = "window-focus-previous" +# "Mod+Shift+Bracketright" = "window-swap-next" +# "Mod+Shift+Bracketleft" = "window-swap-previous" +# "Mod+Minus" = "window-modify-width:-0.1" +# "Mod+Equal" = "window-modify-width:0.1" +# "Mod+Alt+Minus" = "window-modify-height:-0.1" +# "Mod+Alt+Equal" = "window-modify-height:0.1" +# "Mod+Alt+R" = "window-cycle-height" +# "Mod+Alt+Shift+R" = "window-cycle-height-back" +# "Mod+Grave" = "window-focus-last" +# "Mod+BackSpace" = "window-consume-or-expel-left" +# "Mod+C" = "column-center" +# "Mod+Shift+C" = "window-center" +# "Mod+Ctrl+T" = "workspace-set-layout:toggle" +# "Mod+MouseMiddle" = "layout-scroll-drag" +# "Mod+Alt+K" = "keyboard-layout-next" +# "Mod+WheelUp" = { action = "workspace-previous", cooldown_ms = 150 } +# "Mod+WheelDown" = { action = "workspace-next", cooldown_ms = 150 } + +# Submaps temporarily replace the active keybind layer and can nest. Entry +# binds must not repeat. A table-form bind can run an action and then reset one +# level, while a global reset provides an emergency exit from any layer. +# Submaps: https://docs.noctalia.dev/umbriel/keybinds/#submaps +# "Mod+S" = { action = "submap:resize", repeat = false } +# "submap[resize],1" = { action = "window-set-width:0.5", submap = "reset" } +# "submap[resize],N" = { action = "submap:nudge", repeat = false } +# "submap[resize],Escape" = "submap:reset" +# "submap[nudge],Left" = "window-modify-width:-0.1" +# "submap[nudge],Right" = "window-modify-width:0.1" +# "submap[nudge],Escape" = "submap:reset" +# "Escape" = "submap:reset" + +# Media and brightness +# Documentation: https://docs.noctalia.dev/umbriel/keybinds/#example-media-and-brightness-keys +# "XF86AudioRaiseVolume" = "spawn:wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+" +# "XF86AudioLowerVolume" = "spawn:wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-" +# "XF86AudioMute" = "spawn:wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle" +# "XF86AudioPlay" = "spawn:playerctl play-pause" +# "XF86AudioNext" = "spawn:playerctl next" +# "XF86AudioPrev" = "spawn:playerctl previous" +# Binds intended to work while locked use the table form. +# "XF86MonBrightnessDown" = { action = "spawn:noctalia msg brightness-down 10", allow_when_locked = true } +# "XF86MonBrightnessUp" = { action = "spawn:noctalia msg brightness-up 10", allow_when_locked = true } + +# ─────────────────────────────── Layout ───────────────────────────────────── +# Configure the default tiling mode and shared sizing behavior. Workspace rules +# above can override these values for individual workspaces. +# Documentation: https://docs.noctalia.dev/umbriel/layout/ +# ──────────────────────────────────────────────────────────────────────────── + +[layout] +mode = "scrolling" # scrolling, dwindle, or master +gap = 8 # Logical pixels between tiles, 0-500 +width_presets = [0.333, 0.5, 0.667] # Width and height cycling fractions + +[layout.struts] +# Signed logical pixels reserved after panel exclusive zones. Negative values +# expand the tiled area beyond that edge. +left = 0 # -65535 to 65535 +right = 0 +top = 0 +bottom = 0 + +[layout.scrolling] +# direction = "horizontal" # horizontal or vertical strip axis +default_width_fraction = 0.5 # Initial width for new columns, 0.1-1.0 +center_underfull_strip = true # Center a strip narrower than the viewport +center_focused = false # Always center the focused column +expand_single_column = true # Let a lone column fill the viewport + +[layout.dwindle] +# preserve_split = false # Keep every split direction fixed after creation + +[layout.master] +position = "left" # left or right master area +default_width_fraction = 0.55 # Initial master area fraction, 0.1-0.9 +new_on_top = true # Put new windows at the top of the stack + +# ───────────────────────────── Window Rules ───────────────────────────────── +# Match windows by application ID, title, XDG tag, content type, or focus state. +# Opening settings apply once; effects and output policies update while mapped. +# Documentation: https://docs.noctalia.dev/umbriel/window-rules/ +# ──────────────────────────────────────────────────────────────────────────── + +# Blur every window. Keep this selectorless rule first so later matching rules +# can override individual blur settings. +[[window_rule]] +blur = true +blur_optimized = false + +# Noctalia settings +[[window_rule]] +match.app_id = "^dev.noctalia.Noctalia$" +default_floating = true +default_size = [1020, 900] + +# Noctalia share picker +[[window_rule]] +match.app_id = "^dev.noctalia.UmbrielSharePicker$" +default_floating = true +default_size = [800, 600] + +# Browsers expose no semantic PiP role or global position control. +[[window_rule]] +match.title = "^(Picture-in-Picture|Picture in picture)$" +default_floating = true +default_maximize = false +default_position = { x = 20, y = 20, anchor = "bottom_right" } + +# Keep Steam notification toasts in the bottom-right corner without stealing +# focus, and pin them so workspace switches do not hide them. +[[window_rule]] +match.title = "^notificationtoasts_.+_desktop" +default_position = { x = 0, y = 0, anchor = "bottom_right" } +default_focused = false +default_pinned = true + +# Optional placement recipe. Output names follow the same rules as [output.*]. + +# [[window_rule]] +# match.app_id = "^org[.]example[.]Chat$" +# default_output = "DP-1" +# default_workspace = 2 +# default_focused = false + +# Open an application maximized while keeping its parented dialogs natural-sized. + +# [[window_rule]] +# match.app_id = "^example-app$" +# default_maximize = true + +# Open an application maximized to usable-area edges, without gaps or borders. + +# [[window_rule]] +# match.app_id = "^discord$" +# default_maximize_to_edges = true + +# Match a standardized surface content hint. + +# [[window_rule]] +# match.content_type = "game" +# vrr = "always" + +# Match a client-defined XDG toplevel tag, such as Proton-EM's game tag. + +# [[window_rule]] +# match.xdg_tag = "^proton-game$" +# default_fullscreen = true + +# Seed a new horizontal scrolling column with a pixel width. The layout controls +# its tiled height, and existing named columns keep their established width. + +# [[window_rule]] +# match.app_id = "^org[.]example[.]Wide$" +# default_size = [1200, 600] + +# Size a floating window as fractions of the usable area. `default_size` wins +# on both axes if it is also present. + +# [[window_rule]] +# match.app_id = "^org[.]example[.]Utility$" +# default_floating = true +# default_width = 0.5 +# default_height = 0.6 + +# Dynamic effects and output policies can be combined in one matching rule. + +# [[window_rule]] +# match.app_id = "^firefox$" +# match.title = "^Library$" +# default_floating = true +# default_focused = false +# focus_on_activate = true +# opacity = 0.95 +# blur_popups = true +# blur_ignore_alpha = 0.1 +# vrr = "always" +# tearing = true +# hdr = "fullscreen" + +# Keep related tiled windows in one named scrolling column. Lower orders appear +# higher in horizontal scrolling and farther left in vertical scrolling. + +# [[window_rule]] +# match.app_id = "^firefox$" +# default_scrolling_column = "browsers" +# default_scrolling_column_order = 10 + +# Focus-aware rules update as focus changes. + +# [[window_rule]] +# match.is_focused = false +# opacity = 0.85 + +# [[window_rule]] +# match.is_focused = true +# opacity = 1.0 + +# ────────────────────────────── Layer Rules ───────────────────────────────── +# Match layer-shell surfaces such as panels, launchers, notifications, and +# desktop widgets by namespace. Run `umbriel layers` to inspect live names. +# Documentation: https://docs.noctalia.dev/umbriel/layer-rules/ +# ──────────────────────────────────────────────────────────────────────────── + +[[layer_rule]] +match.namespace = "^noctalia-(bar-[^\"]+|notification|dock|panel|attached-panel|osd|desktop-widget-[^\"]*)$" +blur = true +blur_ignore_alpha = 0.5 +blur_popups = true +blur_optimized = false + +# ────────────────────────────── Animation ─────────────────────────────────── +# Parent values provide defaults for every event table. Nested values override +# only that event. Disable one event to make just that transition instant. +# Documentation: https://docs.noctalia.dev/umbriel/animation/ +# Every event accepts shader = "path/to/effect.glsl". Inline GLSL is not supported. +# File paths are relative to this config, including configs loaded via include. +# Bundled reveal.glsl and squash.glsl can be referenced by their installed absolute paths. +# Copy examples/shaders beside your config only if you want editable local versions. +# ──────────────────────────────────────────────────────────────────────────── + +[animation] +enabled = true # Master animation switch +duration_ms = 250 # Shared duration, 1-10000 ms +curve = "easeout" # Built-in or registered bezier/spring curve name + +# Window opening +[animation.windows_in] +enabled = true +duration_ms = 150 +curve = "easeout" +style = "popin" # popin, zoom, slide, fade, or none +scale = 0.85 # Popin start scale, 0.1-1.0 +# shader = "shaders/reveal.glsl" # Replaces the built-in opening style + +# Window closing +[animation.windows_out] +enabled = true +duration_ms = 150 +curve = "easeout" +style = "fade" # fade or slide +# shader = "shaders/reveal.glsl" + +# Window movement, resizing, and floating maximize +[animation.windows_move] +enabled = true +duration_ms = 250 +curve = "snappy" +# shader = "shaders/squash.glsl" # Subtle compression and settle during move/resize + +# Workspace switching +[animation.workspaces] +enabled = true +duration_ms = 250 +curve = "easeout" + +# Overview opening, closing, and row settling +[animation.overview] +enabled = true +duration_ms = 250 +curve = "easeout" + +# Scratchpad show, hide, and backdrop +[animation.scratchpad] +enabled = false +duration_ms = 250 +curve = "easeout" +dim = 0.5 # Backdrop dim amount, 0.0-1.0 +blur = false # Requires appearance.blur.enabled +scale = 0.0 # 0 keeps geometry; 0.1-1.0 centers and scales +maximize = false # Maximize to usable-area edges while shown +fullscreen = false # Make the scratchpad window fullscreen while shown + +# Focus border color +[animation.border] +enabled = false +duration_ms = 250 +curve = "easeout" + +# Unfocused window opacity +[animation.dim_unfocused] +enabled = false +duration_ms = 250 +curve = "easeout" +dim = 0.0 # 0 disables dimming; maximum is 1.0 + +# Layer-shell surface mapping and unmapping +[animation.layers] +enabled = false +duration_ms = 250 +curve = "easeout" + +# Register reusable curves by adding or uncommenting entries below. +# Documentation: https://docs.noctalia.dev/umbriel/animation/#curves + +[animation.beziers] +# myBezier = [0.05, 0.9, 0.1, 1.0] + +[animation.springs] +# myBounce = { damping = 0.5, stiffness = 200 } + +# ─────────────────────── Overview and Hot Corners ─────────────────────────── +# Configure the all-workspaces overview and pointer-triggered corner actions. +# Overview: https://docs.noctalia.dev/umbriel/workspaces-overview/ +# Hot corners: https://docs.noctalia.dev/umbriel/keybinds/#hot-corners +# ──────────────────────────────────────────────────────────────────────────── + +[overview] +zoom = 0.5 # Workspace scale in overview, 0.1-0.75 +# Pinned windows stay hidden until overview closes; visible scratchpads are dismissed. +# background_blur = true # Blur the wallpaper behind overview rows +# workspace_wallpaper = true # Mirror wallpapers inside workspace previews +# shortcuts = true # Show keyboard shortcut badges on windows +# shortcut_keys = "1234567890" # Badge keys in preference order + +[hot_corners.top_left] +enabled = true # Open the overview after resting here +delay_ms = 500 # 0 activates immediately; maximum is 10000 +action = "overview-open" # Any normal Umbriel action is accepted + +[hot_corners.top_right] +enabled = false +delay_ms = 500 +action = "overview-close" + +[hot_corners.bottom_left] +enabled = false +delay_ms = 500 +action = "overview-toggle" + +[hot_corners.bottom_right] +enabled = false +delay_ms = 500 +action = "spawn:notify-send 'Bottom right'" + +# ─────────────────────── Security Context Rules ───────────────────────────── +# Sandboxed clients receive a restricted Wayland global set. Grant extra +# globals only to a narrowly matched application that genuinely needs them. +# Documentation: https://docs.noctalia.dev/umbriel/security/#per-application-grants +# ──────────────────────────────────────────────────────────────────────────── + +# Grant a sandboxed clipboard manager both data-control protocol variants. +# Uncomment the complete block and replace the example application ID. + +# [[security_context_rule]] +# match.sandbox_engine = 'org\.flatpak' +# match.app_id = 'org\.example\.ClipboardManager' +# allow_globals = ["ext_data_control_manager_v1", "zwlr_data_control_manager_v1"]