diff --git a/configs/omarchy.nix b/configs/omarchy.nix new file mode 100644 index 0000000..44451c9 --- /dev/null +++ b/configs/omarchy.nix @@ -0,0 +1,344 @@ +# Omarchy-style Hyprland desktop (classic dotfiles Omarchy, ported to a +# no-home-manager NixOS system module). Imported ONLY by hw/straylight, so +# the other desktop hosts (imladris, ono-sendai) keep i3. +# +# Layout mirrors Omarchy v3: +# ~/.config/{hypr,waybar,rofi,wlogout,swayosd,alacritty} -> read-only store links +# ~/.local/share/omarchy -> store payload (themes/, bin/) +# ~/.config/omarchy/current/ -> mutable state +# (theme + background) +# +# Theme colours are generated at build time from each theme's palette +# (Omarchy themes//colors.toml) into themes//{hyprland.conf, +# hyprlock.conf,waybar.css,rofi.rasi,swayosd.css,wlogout.css,alacritty.toml, +# mako.ini}. Wallpapers are fetched from the Omarchy v3.8.4 tag. + +{ config, lib, pkgs, ... }: +let + inherit (lib) mkForce mapAttrsToList concatMapStrings; + + user = "kyle"; + home = "/home/${user}"; + omarchyPath = "${home}/.local/share/omarchy"; + current = "${home}/.config/omarchy/current"; + defaultTheme = "tokyo-night"; + + # ---- Omarchy themes/*/colors.toml ---- + themes = { + tokyo-night = { + accent = "#7aa2f7"; cursor = "#c0caf5"; foreground = "#a9b1d6"; background = "#1a1b26"; + selection_foreground = "#c0caf5"; selection_background = "#7aa2f7"; + color0 = "#32344a"; color1 = "#f7768e"; color2 = "#9ece6a"; color3 = "#e0af68"; + color4 = "#7aa2f7"; color5 = "#ad8ee6"; color6 = "#449dab"; color7 = "#787c99"; + color8 = "#444b6a"; color9 = "#ff7a93"; color10 = "#b9f27c"; color11 = "#ff9e64"; + color12 = "#7da6ff"; color13 = "#bb9af7"; color14 = "#0db9d7"; color15 = "#acb0d0"; + }; + catppuccin = { + accent = "#89b4fa"; cursor = "#f5e0dc"; foreground = "#cdd6f4"; background = "#1e1e2e"; + selection_foreground = "#1e1e2e"; selection_background = "#f5e0dc"; + color0 = "#45475a"; color1 = "#f38ba8"; color2 = "#a6e3a1"; color3 = "#f9e2af"; + color4 = "#89b4fa"; color5 = "#f5c2e7"; color6 = "#94e2d5"; color7 = "#bac2de"; + color8 = "#585b70"; color9 = "#f38ba8"; color10 = "#a6e3a1"; color11 = "#f9e2af"; + color12 = "#89b4fa"; color13 = "#f5c2e7"; color14 = "#94e2d5"; color15 = "#a6adc8"; + }; + gruvbox = { + accent = "#7daea3"; cursor = "#bdae93"; foreground = "#d4be98"; background = "#282828"; + selection_foreground = "#ebdbb2"; selection_background = "#d65d0e"; + color0 = "#3c3836"; color1 = "#ea6962"; color2 = "#a9b665"; color3 = "#d8a657"; + color4 = "#7daea3"; color5 = "#d3869b"; color6 = "#89b482"; color7 = "#d4be98"; + color8 = "#3c3836"; color9 = "#ea6962"; color10 = "#a9b665"; color11 = "#d8a657"; + color12 = "#7daea3"; color13 = "#d3869b"; color14 = "#89b482"; color15 = "#d4be98"; + }; + kanagawa = { + accent = "#7e9cd8"; cursor = "#c8c093"; foreground = "#dcd7ba"; background = "#1f1f28"; + selection_foreground = "#c8c093"; selection_background = "#2d4f67"; + color0 = "#090618"; color1 = "#c34043"; color2 = "#76946a"; color3 = "#c0a36e"; + color4 = "#7e9cd8"; color5 = "#957fb8"; color6 = "#6a9589"; color7 = "#c8c093"; + color8 = "#727169"; color9 = "#e82424"; color10 = "#98bb6c"; color11 = "#e6c384"; + color12 = "#7fb4ca"; color13 = "#938aa9"; color14 = "#7aa89f"; color15 = "#dcd7ba"; + }; + everforest = { + accent = "#7fbbb3"; cursor = "#d3c6aa"; foreground = "#d3c6aa"; background = "#2d353b"; + selection_foreground = "#2d353b"; selection_background = "#d3c6aa"; + color0 = "#475258"; color1 = "#e67e80"; color2 = "#a7c080"; color3 = "#dbbc7f"; + color4 = "#7fbbb3"; color5 = "#d699b6"; color6 = "#83c092"; color7 = "#d3c6aa"; + color8 = "#475258"; color9 = "#e67e80"; color10 = "#a7c080"; color11 = "#dbbc7f"; + color12 = "#7fbbb3"; color13 = "#d699b6"; color14 = "#83c092"; color15 = "#d3c6aa"; + }; + nord = { + accent = "#81a1c1"; cursor = "#d8dee9"; foreground = "#d8dee9"; background = "#2e3440"; + selection_foreground = "#d8dee9"; selection_background = "#4c566a"; + color0 = "#3b4252"; color1 = "#bf616a"; color2 = "#a3be8c"; color3 = "#ebcb8b"; + color4 = "#81a1c1"; color5 = "#b48ead"; color6 = "#88c0d0"; color7 = "#e5e9f0"; + color8 = "#4c566a"; color9 = "#bf616a"; color10 = "#a3be8c"; color11 = "#ebcb8b"; + color12 = "#81a1c1"; color13 = "#b48ead"; color14 = "#8fbcbb"; color15 = "#eceff4"; + }; + rose-pine = { + accent = "#56949f"; cursor = "#cecacd"; foreground = "#575279"; background = "#faf4ed"; + selection_foreground = "#575279"; selection_background = "#dfdad9"; + color0 = "#f2e9e1"; color1 = "#b4637a"; color2 = "#286983"; color3 = "#ea9d34"; + color4 = "#56949f"; color5 = "#907aa9"; color6 = "#d7827e"; color7 = "#575279"; + color8 = "#9893a5"; color9 = "#b4637a"; color10 = "#286983"; color11 = "#ea9d34"; + color12 = "#56949f"; color13 = "#907aa9"; color14 = "#d7827e"; color15 = "#575279"; + }; + hackerman = { + accent = "#82FB9C"; cursor = "#ddf7ff"; foreground = "#ddf7ff"; background = "#0B0C16"; + selection_foreground = "#0B0C16"; selection_background = "#ddf7ff"; + color0 = "#3E4058"; color1 = "#50f872"; color2 = "#4fe88f"; color3 = "#50f7d4"; + color4 = "#829dd4"; color5 = "#86a7df"; color6 = "#7cf8f7"; color7 = "#85E1FB"; + color8 = "#6a6e95"; color9 = "#85ff9d"; color10 = "#9cf7c2"; color11 = "#a4ffec"; + color12 = "#c4d2ed"; color13 = "#cddbf4"; color14 = "#d1fffe"; color15 = "#ddf7ff"; + }; + }; + + # ---- Omarchy themes//backgrounds/ (v3.8.4) ---- + wallpapers = { + tokyo-night = [ + { file = "1-sunset-lake.png"; hash = "sha256-Bt+5/OAp7DWttA6jk5KWd3wrFA0SMrWhaXsVBS1XU2I="; } + { file = "2-pawel-czerwinski.jpg"; hash = "sha256-acxN1KQHwH9VRgD549BP7AKTuMiF3dhR/lg+/C6ty1I="; } + { file = "4-oma-cityscape.jpg"; hash = "sha256-IuHWOXIrM/pvDTrCczRQtLrpYbSB9WZcsWOXvF9xTlw="; } + ]; + catppuccin = [ + { file = "1-totoro.png"; hash = "sha256-O8+rFOjnsEEwfLd9cAxpWRYP5/bV3mMbFb0C3gz42f8="; } + { file = "2-waves.png"; hash = "sha256-VjGQ35WJvrLVEX1A2wLGSSMqtrw8Py622Xqfs1haDP0="; } + ]; + gruvbox = [ + { file = "1-the-backwater.jpg"; hash = "sha256-E8/GrjcK+YTAioIP+BtWoP67D7/pcSptsSi5TRTsqsY="; } + { file = "4-idyllic-procession.jpg"; hash = "sha256-vgrnMmOl62lBb7E1R4JqYIBoWaoxuwMQU6/HPeYKVcU="; } + { file = "5-leaves.jpg"; hash = "sha256-zb0817NKLI5+dIGK9RAahTF4aHiwo6/Lj2mFsnOU9m0="; } + ]; + kanagawa = [ + { file = "1-kanagawa.jpg"; hash = "sha256-m4F9cXaIU58NuHYDtmGZKDnDy7XUkYoCpO/AXJ+Isn0="; } + ]; + everforest = [ + { file = "1-tree-tops.jpg"; hash = "sha256-DwCl4tD3jV51x6L0gQH23uaRecbZTp9OvG+3wPOUYr8="; } + ]; + nord = [ + { file = "1-city-view.png"; hash = "sha256-sRhvp+5OnZAIe4aTTE3jGoZ9qkojxAGIUYGwe6Ev/3U="; } + { file = "2-night-hawks.png"; hash = "sha256-YaS8ScE3ERId6H9ffyQH/4I1BRzRf5ze1+IOFbGdVpI="; } + ]; + rose-pine = [ + { file = "1-funky-shapes.jpg"; hash = "sha256-b1qeo9wiP76RBGfMc5Z7pt2ffoCn2Aa8FemFVj0V/gM="; } + ]; + hackerman = [ + { file = "1-synth-scape.jpg"; hash = "sha256-x9JZSTXyBODfG0Pf56EjieocHT/Y5XqSqfCEl/J6N34="; } + ]; + }; + + # ---- helpers ---- + hexDigits = { + "0" = 0; "1" = 1; "2" = 2; "3" = 3; "4" = 4; "5" = 5; "6" = 6; "7" = 7; + "8" = 8; "9" = 9; "a" = 10; "b" = 11; "c" = 12; "d" = 13; "e" = 14; "f" = 15; + }; + hexToRgb = hex: + let + s = lib.toLower (lib.removePrefix "#" hex); + dig = i: hexDigits.${builtins.substring i 1 s}; + byte = i: (dig (i * 2)) * 16 + (dig (i * 2 + 1)); + in "${toString (byte 0)},${toString (byte 1)},${toString (byte 2)}"; + strip = hex: lib.removePrefix "#" hex; + mkFile = name: text: pkgs.writeText name text; + + themeDir = name: t: + let + bgs = wallpapers.${name} or [ ]; + hyprlandConf = mkFile "hyprland.conf" '' + $activeBorderColor = rgb(${strip t.accent}) + + general { + col.active_border = $activeBorderColor + } + + group { + col.border_active = $activeBorderColor + } + ''; + hyprlockConf = mkFile "hyprlock.conf" '' + $color = rgba(${hexToRgb t.background}, 1.0) + $inner_color = rgba(${hexToRgb t.background}, 0.8) + $outer_color = rgba(${hexToRgb t.foreground}, 1.0) + $font_color = rgba(${hexToRgb t.foreground}, 1.0) + $check_color = rgba(${hexToRgb t.accent}, 1.0) + ''; + waybarCss = mkFile "waybar.css" '' + @define-color foreground ${t.foreground}; + @define-color background ${t.background}; + ''; + swayosdCss = mkFile "swayosd.css" '' + @define-color background ${t.background}; + @define-color border-color ${t.foreground}; + @define-color label ${t.foreground}; + @define-color image ${t.foreground}; + @define-color progress ${t.accent}; + ''; + wlogoutCss = mkFile "wlogout.css" '' + @define-color background ${t.background}; + @define-color foreground ${t.foreground}; + @define-color accent ${t.accent}; + ''; + rofiRasi = mkFile "rofi.rasi" '' + * { + bg: ${t.background}; + fg: ${t.foreground}; + accent: ${t.accent}; + + background-color: @bg; + text-color: @fg; + border: 2px; + border-color: @accent; + border-radius: 0; + padding: 8px; + spacing: 6px; + font: "JetBrainsMono Nerd Font 12"; + } + + window { width: 40%; background-color: @bg; border: 2px; border-color: @accent; } + inputbar { background-color: @bg; text-color: @fg; } + listview { lines: 10; background-color: @bg; } + element { padding: 4px; } + element selected { background-color: @accent; text-color: @bg; } + ''; + alacrittyToml = mkFile "alacritty.toml" '' + [colors.primary] + background = "${t.background}" + foreground = "${t.foreground}" + + [colors.cursor] + text = "${t.background}" + cursor = "${t.cursor}" + + [colors.vi_mode_cursor] + text = "${t.background}" + cursor = "${t.cursor}" + + [colors.selection] + text = "${t.selection_foreground}" + background = "${t.selection_background}" + + [colors.normal] + black = "${t.color0}" + red = "${t.color1}" + green = "${t.color2}" + yellow = "${t.color3}" + blue = "${t.color4}" + magenta = "${t.color5}" + cyan = "${t.color6}" + white = "${t.color7}" + + [colors.bright] + black = "${t.color8}" + red = "${t.color9}" + green = "${t.color10}" + yellow = "${t.color11}" + blue = "${t.color12}" + magenta = "${t.color13}" + cyan = "${t.color14}" + white = "${t.color15}" + ''; + makoIni = mkFile "mako.ini" '' + text-color=${t.foreground} + border-color=${t.accent} + background-color=${t.background} + width=420 + height=110 + padding=10 + margin=10 + border-size=2 + border-radius=0 + anchor=top-right + layer=overlay + default-timeout=5000 + max-visible=5 + font=JetBrainsMono Nerd Font 10 + ''; + in + pkgs.runCommand "omarchy-theme-${name}" { } '' + mkdir -p $out/backgrounds + cp ${hyprlandConf} $out/hyprland.conf + cp ${hyprlockConf} $out/hyprlock.conf + cp ${waybarCss} $out/waybar.css + cp ${swayosdCss} $out/swayosd.css + cp ${wlogoutCss} $out/wlogout.css + cp ${rofiRasi} $out/rofi.rasi + cp ${alacrittyToml} $out/alacritty.toml + cp ${makoIni} $out/mako.ini + ${concatMapStrings (b: '' + cp ${pkgs.fetchurl { + url = "https://raw.githubusercontent.com/omacom/omarchy/v3.8.4/themes/${name}/backgrounds/${b.file}"; + hash = b.hash; + }} $out/backgrounds/${b.file} + '') bgs} + ''; + + themesTree = pkgs.linkFarm "omarchy-themes" + (mapAttrsToList (n: t: { name = n; path = themeDir n t; }) themes); + + omarchyDots = pkgs.runCommand "omarchy-dots" { } '' + mkdir -p $out + cp -r ${./omarchy/hypr} $out/hypr + cp -r ${./omarchy/waybar} $out/waybar + cp -r ${./omarchy/rofi} $out/rofi + cp -r ${./omarchy/wlogout} $out/wlogout + cp -r ${./omarchy/swayosd} $out/swayosd + cp -r ${./omarchy/alacritty} $out/alacritty + cp -r ${themesTree} $out/themes + ''; + + omarchyBin = pkgs.runCommand "omarchy-bin" { } '' + mkdir -p $out/bin + cp ${./omarchy/bin}/* $out/bin/ + chmod +x $out/bin/* + ''; + + polkitAgent = pkgs.writeShellScriptBin "omarchy-polkit-agent" '' + exec ${pkgs.polkit_gnome}/libexec/polkit-gnome-authentication-agent-1 + ''; +in +{ + programs.hyprland = { + enable = true; + systemd.setPath.enable = true; + }; + + # Hyprland is the default login session. i3 stays enabled (configs/desktop-light.nix) + # and remains selectable in lightdm as a fallback. + services.displayManager.defaultSession = "hyprland"; + + # Hyprland's own portal should be the default (desktop-light.nix sets gtk). + xdg.portal = { + config.common.default = mkForce "hyprland"; + extraPortals = [ pkgs.xdg-desktop-portal-hyprland ]; + }; + + environment.systemPackages = with pkgs; [ + omarchyBin + polkitAgent + waybar rofi wlogout hyprlock hypridle swayosd mako clipse + wl-clipboard wl-clip-persist grim slurp hyprpicker + brightnessctl pamixer playerctl alacritty swaybg jq + gnome-calculator pavucontrol nautilus + nerd-fonts.jetbrains-mono + ]; + + # Link the read-only config into ~/.config, seed the mutable theme state, and + # resolve the active theme/background symlinks. Runs on every switch/boot. + system.activationScripts.omarchy-dots = { + deps = [ "users" ]; + text = '' + set -eu + export PATH=${lib.makeBinPath [ pkgs.coreutils pkgs.findutils pkgs.bash ]}:$PATH + install -d -m0755 -o ${user} -g users ${home}/.config ${home}/.local/share ${current} + ln -sfnT ${omarchyDots}/hypr ${home}/.config/hypr + ln -sfnT ${omarchyDots}/waybar ${home}/.config/waybar + ln -sfnT ${omarchyDots}/rofi ${home}/.config/rofi + ln -sfnT ${omarchyDots}/wlogout ${home}/.config/wlogout + ln -sfnT ${omarchyDots}/swayosd ${home}/.config/swayosd + ln -sfnT ${omarchyDots}/alacritty ${home}/.config/alacritty + ln -sfnT ${omarchyDots} ${omarchyPath} + [ -f ${current}/theme.name ] || printf '%s\n' ${defaultTheme} > ${current}/theme.name + chown -R ${user}:users ${home}/.config/omarchy + HOME=${home} OMARCHY_PATH=${omarchyPath} ${omarchyBin}/bin/omarchy-theme-apply + chown -h ${user}:users ${current}/theme ${current}/background 2>/dev/null || true + ''; + }; +} diff --git a/configs/omarchy/alacritty/alacritty.toml b/configs/omarchy/alacritty/alacritty.toml new file mode 100644 index 0000000..f855e6f --- /dev/null +++ b/configs/omarchy/alacritty/alacritty.toml @@ -0,0 +1,17 @@ +# Alacritty — imports the active Omarchy theme palette. +[general] +import = ["~/.config/omarchy/current/theme/alacritty.toml"] +live_config_reload = true + +[font] +size = 12 + +[font.normal] +family = "JetBrainsMono Nerd Font" +style = "Regular" + +[window] +padding = { x = 8, y = 8 } + +[env] +TERM = "xterm-256color" diff --git a/configs/omarchy/bin/omarchy-capture-screenshot b/configs/omarchy/bin/omarchy-capture-screenshot new file mode 100644 index 0000000..ddceeac --- /dev/null +++ b/configs/omarchy/bin/omarchy-capture-screenshot @@ -0,0 +1,31 @@ +#!/usr/bin/env bash +# Screenshot helper: region | window | output. Saves under ~/Pictures/Screenshots +# and copies to the clipboard. +set -euo pipefail + +mode="${1:-region}" +dir="$HOME/Pictures/Screenshots" +mkdir -p "$dir" +file="$dir/$(date +%Y-%m-%d_%H-%M-%S).png" + +case "$mode" in + region) + geom="$(slurp)" || exit 0 + grim -g "$geom" "$file" + ;; + window) + geom="$(hyprctl activewindow -j | jq -r '"\(.at[0]),\(.at[1]) \(.size[0])x\(.size[1])"')" + grim -g "$geom" "$file" + ;; + output) + grim "$file" + ;; + *) + echo "Usage: omarchy-capture-screenshot [region|window|output]" >&2 + exit 1 + ;; +esac + +wl-copy <"$file" 2>/dev/null || true +command -v notify-send >/dev/null && notify-send -u low "Screenshot saved" "$file" || true +exit 0 diff --git a/configs/omarchy/bin/omarchy-menu b/configs/omarchy/bin/omarchy-menu new file mode 100644 index 0000000..253a00d --- /dev/null +++ b/configs/omarchy/bin/omarchy-menu @@ -0,0 +1,62 @@ +#!/usr/bin/env bash +# rofi-based Omarchy menu. Replaces Omarchy v3's walker-driven omarchy-menu. +# Usage: omarchy-menu [system|theme|background|capture|keybindings] +set -euo pipefail + +OMARCHY_PATH="${OMARCHY_PATH:-$HOME/.local/share/omarchy}" +CURRENT="$HOME/.config/omarchy/current" +PICK=(rofi -dmenu -i -p "" -theme-str 'window { width: 22%; } listview { lines: 8; }') + +menu_main() { + local choice + choice="$(printf '%s\n' Apps Themes Backgrounds Capture System Keybindings | "${PICK[@]}")" || exit 0 + case "$choice" in + Apps) rofi -show drun -show-icons ;; + Themes) menu_theme ;; + Backgrounds) omarchy-theme-bg-next ;; + Capture) menu_capture ;; + System) menu_system ;; + Keybindings) menu_keybindings ;; + esac +} + +menu_system() { + local choice + choice="$(printf '%s\n' Lock Logout Suspend Reboot Shutdown | "${PICK[@]}")" || exit 0 + case "$choice" in + Lock) omarchy-system-lock ;; + Logout) hyprctl dispatch exit ;; + Suspend) systemctl suspend ;; + Reboot) systemctl reboot ;; + Shutdown) systemctl poweroff ;; + esac +} + +menu_theme() { + local choice + choice="$(find "$OMARCHY_PATH/themes" -maxdepth 1 -mindepth 1 -type d -printf '%f\n' | sort | "${PICK[@]}")" || exit 0 + [ -n "$choice" ] && omarchy-theme-set "$choice" +} + +menu_capture() { + local choice + choice="$(printf '%s\n' Region Window Output | "${PICK[@]}")" || exit 0 + case "$choice" in + Region) omarchy-capture-screenshot region ;; + Window) omarchy-capture-screenshot window ;; + Output) omarchy-capture-screenshot output ;; + esac +} + +menu_keybindings() { + alacritty -e less ~/.config/hypr/bindings.conf +} + +case "${1:-}" in + system) menu_system ;; + theme) menu_theme ;; + background) omarchy-theme-bg-next ;; + capture) menu_capture ;; + keybindings) menu_keybindings ;; + "" | *) menu_main ;; +esac diff --git a/configs/omarchy/bin/omarchy-restart-waybar b/configs/omarchy/bin/omarchy-restart-waybar new file mode 100644 index 0000000..622e42c --- /dev/null +++ b/configs/omarchy/bin/omarchy-restart-waybar @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +# Reload waybar (re-reads config + style). +pkill -SIGUSR2 waybar 2>/dev/null || true +exit 0 diff --git a/configs/omarchy/bin/omarchy-system-lock b/configs/omarchy/bin/omarchy-system-lock new file mode 100644 index 0000000..dab8507 --- /dev/null +++ b/configs/omarchy/bin/omarchy-system-lock @@ -0,0 +1,13 @@ +#!/usr/bin/env bash +# Lock the session with hyprlock, then blank the display. +set -euo pipefail +if ! pidof hyprlock >/dev/null; then + ( hyprlock; hyprctl dispatch dpms on ) & +fi +hyprctl switchxkblayout all 0 >/dev/null 2>&1 || true +( + sleep 3 + pidof hyprlock >/dev/null || exit 0 + hyprctl dispatch dpms off >/dev/null 2>&1 || true +) & +exit 0 diff --git a/configs/omarchy/bin/omarchy-theme-apply b/configs/omarchy/bin/omarchy-theme-apply new file mode 100644 index 0000000..7d899ff --- /dev/null +++ b/configs/omarchy/bin/omarchy-theme-apply @@ -0,0 +1,33 @@ +#!/usr/bin/env bash +# Resolve ~/.config/omarchy/current/{theme,background} symlinks from the +# persisted theme.name / background.name state files. Only manages symlinks; +# restarting clients (swaybg/waybar/hyprland) is the caller's job. +# +# Safe to run as root (system activation) or as the user: honour $HOME. +set -euo pipefail + +OMARCHY_PATH="${OMARCHY_PATH:-$HOME/.local/share/omarchy}" +CURRENT="$HOME/.config/omarchy/current" +THEMES="$OMARCHY_PATH/themes" + +mkdir -p "$CURRENT" + +# --- theme --- +name="$(cat "$CURRENT/theme.name" 2>/dev/null || true)" +if [ -z "$name" ] || [ ! -d "$THEMES/$name" ]; then + name="$(find "$THEMES" -maxdepth 1 -mindepth 1 -type d -printf '%f\n' | sort | head -n1)" + printf '%s\n' "$name" >"$CURRENT/theme.name" +fi +ln -sfn "$THEMES/$name" "$CURRENT/theme" + +# --- background --- +bg="$(cat "$CURRENT/background.name" 2>/dev/null || true)" +if [ -z "$bg" ] || [ ! -e "$THEMES/$name/backgrounds/$bg" ]; then + bg="$(find "$THEMES/$name/backgrounds" -maxdepth 1 -type f -printf '%f\n' 2>/dev/null | sort | head -n1)" + printf '%s\n' "$bg" >"$CURRENT/background.name" +fi +if [ -n "$bg" ]; then + ln -sfn "$THEMES/$name/backgrounds/$bg" "$CURRENT/background" +fi + +exit 0 diff --git a/configs/omarchy/bin/omarchy-theme-bg-next b/configs/omarchy/bin/omarchy-theme-bg-next new file mode 100644 index 0000000..3d833c7 --- /dev/null +++ b/configs/omarchy/bin/omarchy-theme-bg-next @@ -0,0 +1,29 @@ +#!/usr/bin/env bash +# Cycle to the next background for the current theme. +set -euo pipefail + +OMARCHY_PATH="${OMARCHY_PATH:-$HOME/.local/share/omarchy}" +CURRENT="$HOME/.config/omarchy/current" + +name="$(cat "$CURRENT/theme.name" 2>/dev/null || true)" +theme="$OMARCHY_PATH/themes/$name" +[ -d "$theme/backgrounds" ] || { echo "No backgrounds for theme '$name'" >&2; exit 1; } + +mapfile -t backgrounds < <(find "$theme/backgrounds" -maxdepth 1 -type f -printf '%f\n' | sort) +total=${#backgrounds[@]} +[ "$total" -gt 0 ] || { echo "No backgrounds found" >&2; exit 1; } + +cur="$(cat "$CURRENT/background.name" 2>/dev/null || true)" +idx=-1 +for i in "${!backgrounds[@]}"; do + [ "${backgrounds[$i]}" = "$cur" ] && { idx=$i; break; } +done +next=$(( (idx + 1) % total )) +printf '%s\n' "${backgrounds[$next]}" >"$CURRENT/background.name" + +omarchy-theme-apply + +pkill -x swaybg 2>/dev/null || true +sleep 0.1 +setsid swaybg -i "$CURRENT/background" -m fill >/dev/null 2>&1 & +exit 0 diff --git a/configs/omarchy/bin/omarchy-theme-bg-set b/configs/omarchy/bin/omarchy-theme-bg-set new file mode 100644 index 0000000..016816c --- /dev/null +++ b/configs/omarchy/bin/omarchy-theme-bg-set @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +# Set the background for the current theme to a given image path. +set -euo pipefail + +OMARCHY_PATH="${OMARCHY_PATH:-$HOME/.local/share/omarchy}" +CURRENT="$HOME/.config/omarchy/current" + +[ -n "${1:-}" ] && [ -f "$1" ] || { echo "Usage: omarchy-theme-bg-set " >&2; exit 1; } +bg="$(realpath "$1")" +name="$(cat "$CURRENT/theme.name" 2>/dev/null || true)" + +if [ -n "$name" ] && [ "$(dirname "$bg")" = "$OMARCHY_PATH/themes/$name/backgrounds" ]; then + basename "$bg" >"$CURRENT/background.name" + ln -sfn "$bg" "$CURRENT/background" +else + rm -f "$CURRENT/background.name" + ln -sfn "$bg" "$CURRENT/background" +fi + +pkill -x swaybg 2>/dev/null || true +sleep 0.1 +setsid swaybg -i "$CURRENT/background" -m fill >/dev/null 2>&1 & +exit 0 diff --git a/configs/omarchy/bin/omarchy-theme-current b/configs/omarchy/bin/omarchy-theme-current new file mode 100644 index 0000000..d0460de --- /dev/null +++ b/configs/omarchy/bin/omarchy-theme-current @@ -0,0 +1,9 @@ +#!/usr/bin/env bash +# Print the current theme name (pretty). +set -euo pipefail +CURRENT="$HOME/.config/omarchy/current" +if [ -f "$CURRENT/theme.name" ]; then + sed -E 's/(^|-)([a-z])/\1\u\2/g; s/-/ /g' "$CURRENT/theme.name" +else + echo "Unknown" +fi diff --git a/configs/omarchy/bin/omarchy-theme-set b/configs/omarchy/bin/omarchy-theme-set new file mode 100644 index 0000000..ae0bb6e --- /dev/null +++ b/configs/omarchy/bin/omarchy-theme-set @@ -0,0 +1,36 @@ +#!/usr/bin/env bash +# Set the active Omarchy theme (name or "" from the menu). +set -euo pipefail + +OMARCHY_PATH="${OMARCHY_PATH:-$HOME/.local/share/omarchy}" +CURRENT="$HOME/.config/omarchy/current" + +if [ -z "${1:-}" ]; then + echo "Usage: omarchy-theme-set " >&2 + exit 1 +fi + +# Normalise: strip markup, lowercase, spaces -> dashes +name="$(printf '%s' "$1" | sed -E 's/<[^>]+>//g' | tr '[:upper:]' '[:lower:]' | tr ' ' '-')" + +if [ ! -d "$OMARCHY_PATH/themes/$name" ]; then + echo "Theme '$name' does not exist" >&2 + exit 1 +fi + +printf '%s\n' "$name" >"$CURRENT/theme.name" +# Start each theme on its first background +find "$OMARCHY_PATH/themes/$name/backgrounds" -maxdepth 1 -type f -printf '%f\n' | sort | head -n1 \ + >"$CURRENT/background.name" + +omarchy-theme-apply + +# Restart clients so the new colours/wallpaper take effect +pkill -x swaybg 2>/dev/null || true +sleep 0.1 +setsid swaybg -i "$CURRENT/background" -m fill >/dev/null 2>&1 & +pkill -SIGUSR2 waybar 2>/dev/null || true +hyprctl reload >/dev/null 2>&1 || true + +command -v notify-send >/dev/null && notify-send -u low "Theme: $name" || true +exit 0 diff --git a/configs/omarchy/bin/omarchy-toggle-waybar b/configs/omarchy/bin/omarchy-toggle-waybar new file mode 100644 index 0000000..190b67f --- /dev/null +++ b/configs/omarchy/bin/omarchy-toggle-waybar @@ -0,0 +1,13 @@ +#!/usr/bin/env bash +# Toggle the waybar on/off (marker file read by the session autostart). +set -euo pipefail +CURRENT="$HOME/.config/omarchy/current" +mkdir -p "$CURRENT" +if [ -e "$CURRENT/waybar-off" ]; then + rm -f "$CURRENT/waybar-off" + setsid waybar >/dev/null 2>&1 & +else + touch "$CURRENT/waybar-off" + pkill -x waybar 2>/dev/null || true +fi +exit 0 diff --git a/configs/omarchy/bin/omarchy-waybar-enabled b/configs/omarchy/bin/omarchy-waybar-enabled new file mode 100644 index 0000000..1adb246 --- /dev/null +++ b/configs/omarchy/bin/omarchy-waybar-enabled @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +# Exit 0 if waybar should be running (used by the Hyprland exec-once line). +[ ! -e "$HOME/.config/omarchy/current/waybar-off" ] diff --git a/configs/omarchy/hypr/autostart.conf b/configs/omarchy/hypr/autostart.conf new file mode 100644 index 0000000..7c3d698 --- /dev/null +++ b/configs/omarchy/hypr/autostart.conf @@ -0,0 +1,14 @@ +# Autostart for the Hyprland session (Omarchy v3 autostart, adapted: +# no uwsm, no omarchy-* first-run/hook machinery). + +exec-once = hypridle +exec-once = mako +exec-once = swayosd-server +exec-once = clipse -listen +exec-once = swaybg -i ~/.config/omarchy/current/background -m fill + +# Waybar honours `omarchy-toggle-waybar` (toggles hyprland layer autostart off) +exec-once = sh -c 'omarchy-waybar-enabled && waybar' + +# Slow app launch fix -- set systemd vars +exec-once = dbus-update-activation-environment --systemd --all diff --git a/configs/omarchy/hypr/bindings.conf b/configs/omarchy/hypr/bindings.conf new file mode 100644 index 0000000..43843fe --- /dev/null +++ b/configs/omarchy/hypr/bindings.conf @@ -0,0 +1,116 @@ +# Keybindings — ported from Omarchy v3 (bindings/tiling-v2, utilities and +# application bindings), with omarchy-* helpers replaced by the small set of +# scripts shipped in ~/.local/share/omarchy/bin. Launcher is rofi (Omarchy +# v3 shipped walker; rofi-wayland is used here per request). + +# ---- Applications ---- +bindd = SUPER, RETURN, Terminal, exec, alacritty +bindd = SUPER ALT, RETURN, Tmux, exec, alacritty -e tmux new -A -s Work +bindd = SUPER SHIFT, RETURN, Browser, exec, ungoogled-chromium +bindd = SUPER SHIFT, F, File manager, exec, nautilus --new-window +bindd = SUPER, SPACE, Launch apps, exec, rofi -show drun -show-icons +bindd = SUPER CTRL, E, Emoji picker, exec, rofi -show emoji +bindd = SUPER CTRL, C, Capture menu, exec, omarchy-menu capture +bindd = SUPER ALT, SPACE, Omarchy menu, exec, omarchy-menu +bindd = SUPER, K, Show key bindings, exec, omarchy-menu keybindings +bindd = , XF86Calculator, Calculator, exec, gnome-calculator + +# ---- Close / control windows ---- +bindd = SUPER, W, Close window, killactive, +bindd = SUPER, BACKSPACE, Close window, killactive, +bindd = SUPER, J, Toggle window split, layoutmsg, togglesplit +bindd = SUPER, P, Pseudo window, pseudo, +bindd = SUPER, T, Toggle floating/tiling, togglefloating, +bindd = SUPER, F, Full screen, fullscreen, 0 +bindd = SUPER ALT, F, Full width, fullscreen, 1 +bindd = SUPER, Q, Toggle window transparency, exec, hyprctl setprop active opaque toggle + +# ---- Focus ---- +bindd = SUPER, LEFT, Focus left, movefocus, l +bindd = SUPER, RIGHT, Focus right, movefocus, r +bindd = SUPER, UP, Focus up, movefocus, u +bindd = SUPER, DOWN, Focus down, movefocus, d +bindd = ALT, TAB, Focus next window, cyclenext +bindd = ALT SHIFT, TAB, Focus previous window, cyclenext, prev + +# ---- Swap / move windows ---- +bindd = SUPER SHIFT, LEFT, Swap window left, swapwindow, l +bindd = SUPER SHIFT, RIGHT, Swap window right, swapwindow, r +bindd = SUPER SHIFT, UP, Swap window up, swapwindow, u +bindd = SUPER SHIFT, DOWN, Swap window down, swapwindow, d + +# ---- Workspaces ---- +bindd = SUPER, code:10, Workspace 1, workspace, 1 +bindd = SUPER, code:11, Workspace 2, workspace, 2 +bindd = SUPER, code:12, Workspace 3, workspace, 3 +bindd = SUPER, code:13, Workspace 4, workspace, 4 +bindd = SUPER, code:14, Workspace 5, workspace, 5 +bindd = SUPER, code:15, Workspace 6, workspace, 6 +bindd = SUPER, code:16, Workspace 7, workspace, 7 +bindd = SUPER, code:17, Workspace 8, workspace, 8 +bindd = SUPER, code:18, Workspace 9, workspace, 9 +bindd = SUPER, code:19, Workspace 10, workspace, 10 + +bindd = SUPER SHIFT, code:10, Move window to workspace 1, movetoworkspace, 1 +bindd = SUPER SHIFT, code:11, Move window to workspace 2, movetoworkspace, 2 +bindd = SUPER SHIFT, code:12, Move window to workspace 3, movetoworkspace, 3 +bindd = SUPER SHIFT, code:13, Move window to workspace 4, movetoworkspace, 4 +bindd = SUPER SHIFT, code:14, Move window to workspace 5, movetoworkspace, 5 +bindd = SUPER SHIFT, code:15, Move window to workspace 6, movetoworkspace, 6 +bindd = SUPER SHIFT, code:16, Move window to workspace 7, movetoworkspace, 7 +bindd = SUPER SHIFT, code:17, Move window to workspace 8, movetoworkspace, 8 +bindd = SUPER SHIFT, code:18, Move window to workspace 9, movetoworkspace, 9 +bindd = SUPER SHIFT, code:19, Move window to workspace 10, movetoworkspace, 10 + +bindd = SUPER, TAB, Next workspace, workspace, e+1 +bindd = SUPER SHIFT, TAB, Previous workspace, workspace, e-1 +bindd = SUPER CTRL, TAB, Former workspace, workspace, previous +bindd = SUPER, mouse_down, Next workspace, workspace, e+1 +bindd = SUPER, mouse_up, Previous workspace, workspace, e-1 + +# ---- Scratchpad ---- +bindd = SUPER, S, Toggle scratchpad, togglespecialworkspace, scratchpad +bindd = SUPER ALT, S, Move window to scratchpad, movetoworkspacesilent, special:scratchpad + +# ---- Resize ---- +bindd = SUPER, code:20, Shrink window width, resizeactive, -100 0 +bindd = SUPER, code:21, Expand window width, resizeactive, 100 0 +bindd = SUPER SHIFT, code:20, Shrink window height, resizeactive, 0 -100 +bindd = SUPER SHIFT, code:21, Expand window height, resizeactive, 0 100 + +bindmd = SUPER, mouse:272, Move window, movewindow +bindmd = SUPER, mouse:273, Resize window, resizewindow + +# ---- Aesthetics ---- +bindd = SUPER SHIFT, SPACE, Toggle top bar, exec, omarchy-toggle-waybar +bindd = SUPER CTRL, SPACE, Next background, exec, omarchy-theme-bg-next +bindd = SUPER SHIFT CTRL, SPACE, Theme menu, exec, omarchy-menu theme + +# ---- Screenshots / capture ---- +bindd = , PRINT, Screenshot region, exec, omarchy-capture-screenshot region +bindd = SHIFT, PRINT, Screenshot window, exec, omarchy-capture-screenshot window +bindd = CTRL, PRINT, Screenshot output, exec, omarchy-capture-screenshot output +bindd = SUPER, PRINT, Color picker, exec, pkill hyprpicker || hyprpicker -a + +# ---- Clipboard ---- +bindd = SUPER CTRL, V, Clipboard history, exec, clipse + +# ---- Multimedia / brightness ---- +bindl = , XF86AudioRaiseVolume, exec, wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+ +bindl = , XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- +bindl = , XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle +bindl = , XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle +bindl = , XF86MonBrightnessUp, exec, brightnessctl -e4 -n2 set 5%+ +bindl = , XF86MonBrightnessDown, exec, brightnessctl -e4 -n2 set 5%- +bindl = , XF86AudioNext, exec, playerctl next +bindl = , XF86AudioPrev, exec, playerctl previous +bindl = , XF86AudioPlay, exec, playerctl play-pause +bindl = , XF86AudioPause, exec, playerctl play-pause + +# ---- Session / power ---- +bindd = SUPER CTRL, L, Lock system, exec, omarchy-system-lock +bindd = SUPER, ESCAPE, Power menu, exec, omarchy-menu system +bindld = , XF86PowerOff, Power menu, exec, omarchy-menu system +bindd = SUPER SHIFT, ESCAPE, Log out, exit, +bindd = SUPER CTRL, ESCAPE, Reboot, exec, systemctl reboot +bindd = SUPER SHIFT CTRL, ESCAPE, Shut down, exec, systemctl poweroff diff --git a/configs/omarchy/hypr/envs.conf b/configs/omarchy/hypr/envs.conf new file mode 100644 index 0000000..763cc2f --- /dev/null +++ b/configs/omarchy/hypr/envs.conf @@ -0,0 +1,27 @@ +# Environment for Hyprland sessions (Omarchy v3 default/hypr/envs.conf). +# GUM env source dropped (not installed); XCOMPOSEFILE dropped (no ~/.XCompose). + +# Cursor size +env = XCURSOR_SIZE,24 +env = HYPRCURSOR_SIZE,24 + +# Force all apps to use Wayland +env = GDK_BACKEND,wayland,x11,* +env = QT_QPA_PLATFORM,wayland;xcb +env = MOZ_ENABLE_WAYLAND,1 +env = ELECTRON_OZONE_PLATFORM_HINT,wayland +env = OZONE_PLATFORM,wayland +env = XDG_SESSION_TYPE,wayland + +# Allow better support for screen sharing (Google Meet, Discord, etc) +env = XDG_CURRENT_DESKTOP,Hyprland +env = XDG_SESSION_DESKTOP,Hyprland + +xwayland { + force_zero_scaling = true +} + +# Don't show update on first launch +ecosystem { + no_update_news = true +} diff --git a/configs/omarchy/hypr/hypridle.conf b/configs/omarchy/hypr/hypridle.conf new file mode 100644 index 0000000..eb53ac7 --- /dev/null +++ b/configs/omarchy/hypr/hypridle.conf @@ -0,0 +1,18 @@ +# hypridle — adapted from Omarchy v3. Locks at 5 min, screen off at ~5.5 min. +general { + lock_cmd = hyprlock + before_sleep_cmd = loginctl lock-session + after_sleep_cmd = sleep 1 && hyprctl dispatch dpms on + inhibit_sleep = 3 +} + +listener { + timeout = 300 + on-timeout = loginctl lock-session +} + +listener { + timeout = 330 + on-timeout = hyprctl dispatch dpms off + on-resume = hyprctl dispatch dpms on && brightnessctl -r +} diff --git a/configs/omarchy/hypr/hyprland.conf b/configs/omarchy/hypr/hyprland.conf new file mode 100644 index 0000000..b467a49 --- /dev/null +++ b/configs/omarchy/hypr/hyprland.conf @@ -0,0 +1,15 @@ +# Omarchy-style Hyprland configuration (ported to NixOS for straylight). +# Mirrors Omarchy v3 ~/.config/hypr/hyprland.conf: a set of sourced +# fragments plus the active theme's colour overrides. + +source = ~/.config/hypr/envs.conf +source = ~/.config/hypr/looknfeel.conf +source = ~/.config/hypr/input.conf +source = ~/.config/hypr/windows.conf +source = ~/.config/hypr/autostart.conf +source = ~/.config/hypr/monitors.conf +source = ~/.config/hypr/bindings.conf + +# Active Omarchy theme. Sourced last so its border colours win over the +# defaults in looknfeel.conf. Managed by omarchy-theme-set. +source = ~/.config/omarchy/current/theme/hyprland.conf diff --git a/configs/omarchy/hypr/hyprlock.conf b/configs/omarchy/hypr/hyprlock.conf new file mode 100644 index 0000000..ba31962 --- /dev/null +++ b/configs/omarchy/hypr/hyprlock.conf @@ -0,0 +1,44 @@ +# hyprlock — Omarchy v3 config/hypr/hyprlock.conf. +source = ~/.config/omarchy/current/theme/hyprlock.conf + +general { + ignore_empty_input = true +} + +background { + monitor = + color = $color + path = ~/.config/omarchy/current/background + blur_passes = 3 +} + +animations { + enabled = false +} + +input-field { + monitor = + size = 650, 100 + position = 0, 0 + halign = center + valign = center + + inner_color = $inner_color + outer_color = $outer_color + outline_thickness = 4 + + font_family = JetBrainsMono Nerd Font + font_color = $font_color + + placeholder_text = Enter Password + check_color = $check_color + fail_text = $FAIL ($ATTEMPTS) + + rounding = 0 + shadow_passes = 0 + fade_on_empty = false +} + +auth { + fingerprint:enabled = false +} diff --git a/configs/omarchy/hypr/input.conf b/configs/omarchy/hypr/input.conf new file mode 100644 index 0000000..5b4da3b --- /dev/null +++ b/configs/omarchy/hypr/input.conf @@ -0,0 +1,28 @@ +# Input devices. kb_options matches Kyle's existing i3 xkb settings +# (ctrl:swapcaps + right-alt compose) so muscle memory carries over. + +input { + kb_layout = us + kb_options = ctrl:swapcaps,compose:ralt + + repeat_rate = 40 + repeat_delay = 250 + + numlock_by_default = true + + follow_mouse = 1 + sensitivity = 0 + + touchpad { + clickfinger_behavior = true + scroll_factor = 0.4 + natural_scroll = false + } +} + +# Scroll nicely in the terminal +windowrule = match:class (Alacritty|kitty|foot|com.mitchellh.ghostty), scroll_touchpad 1.5 + +gestures { + workspace_swipe = false +} diff --git a/configs/omarchy/hypr/looknfeel.conf b/configs/omarchy/hypr/looknfeel.conf new file mode 100644 index 0000000..019f628 --- /dev/null +++ b/configs/omarchy/hypr/looknfeel.conf @@ -0,0 +1,131 @@ +# Omarchy v3 default/hypr/looknfeel.conf. +# Default border colours here are overridden by the active theme's +# hyprland.conf (sourced last from hyprland.conf). + +# Variables +$activeBorderColor = rgba(33ccffee) rgba(00ff99ee) 45deg +$inactiveBorderColor = rgba(595959aa) + +general { + gaps_in = 5 + gaps_out = 10 + + border_size = 2 + + col.active_border = $activeBorderColor + col.inactive_border = $inactiveBorderColor + + # Set to true enable resizing windows by clicking and dragging on borders and gaps + resize_on_border = false + + # Please see https://wiki.hypr.land/Configuring/Advanced-and-Cool/Tearing/ before you turn this on + allow_tearing = false + + layout = dwindle +} + +decoration { + rounding = 0 + + shadow { + enabled = true + range = 2 + render_power = 3 + color = rgba(1a1a1aee) + } + + blur { + enabled = true + size = 2 + passes = 2 + special = true + brightness = 0.60 + contrast = 0.75 + } +} + +group { + col.border_active = $activeBorderColor + col.border_inactive = $inactiveBorderColor + col.border_locked_active = $activeBorderColor + col.border_locked_inactive = $inactiveBorderColor + + groupbar { + font_size = 12 + font_family = monospace + font_weight_active = ultraheavy + font_weight_inactive = normal + + indicator_height = 0 + indicator_gap = 5 + height = 22 + gaps_in = 5 + gaps_out = 0 + + text_color = rgb(ffffff) + text_color_inactive = rgba(ffffff90) + col.active = rgba(00000040) + col.inactive = rgba(00000020) + + gradients = true + gradient_rounding = 0 + gradient_round_only_edges = false + } +} + +animations { + enabled = yes, please :) + + bezier = easeOutQuint,0.23,1,0.32,1 + bezier = easeInOutCubic,0.65,0.05,0.36,1 + bezier = linear,0,0,1,1 + bezier = almostLinear,0.5,0.5,0.75,1.0 + bezier = quick,0.15,0,0.1,1 + + animation = global, 1, 10, default + animation = border, 1, 5.39, easeOutQuint + animation = windows, 1, 3.79, easeOutQuint + animation = windowsIn, 1, 4.1, easeOutQuint, popin 87% + animation = windowsOut, 1, 1.49, linear, popin 87% + animation = fadeIn, 1, 1.73, almostLinear + animation = fadeOut, 1, 1.46, almostLinear + animation = fade, 1, 3.03, quick + animation = layers, 1, 3.81, easeOutQuint + animation = layersIn, 1, 4, easeOutQuint, fade + animation = layersOut, 1, 1.5, linear, fade + animation = fadeLayersIn, 1, 1.79, almostLinear + animation = fadeLayersOut, 1, 1.39, almostLinear + animation = workspaces, 0, 0, ease + animation = specialWorkspace, 1, 3, easeOutQuint, slidevert +} + +dwindle { + preserve_split = true + force_split = 2 +} + +scrolling { + column_width = 0.49 +} + +master { + new_status = master +} + +misc { + disable_hyprland_logo = true + disable_splash_rendering = true + disable_scale_notification = true + focus_on_activate = true + anr_missed_pings = 3 + on_focus_under_fullscreen = 1 +} + +cursor { + hide_on_key_press = true + warp_on_change_workspace = 1 +} + +binds { + hide_special_on_workspace_change = true +} diff --git a/configs/omarchy/hypr/monitors.conf b/configs/omarchy/hypr/monitors.conf new file mode 100644 index 0000000..f29c55d --- /dev/null +++ b/configs/omarchy/hypr/monitors.conf @@ -0,0 +1,10 @@ +# Monitors. Edit with `hyprctl monitors` for current names/resolutions. +# Format: monitor = [port], resolution, position, scale + +# Safe default: preferred resolution, auto position, no forced scale. +monitor = , preferred, auto, auto + +# Examples (uncomment / adjust as needed): +# monitor = DP-1, 3840x2160@60, auto, 1.5 +# monitor = eDP-1, preferred, auto, 1, transform, 1 +# monitor = HDMI-A-1, disable diff --git a/configs/omarchy/hypr/windows.conf b/configs/omarchy/hypr/windows.conf new file mode 100644 index 0000000..e4b0d9d --- /dev/null +++ b/configs/omarchy/hypr/windows.conf @@ -0,0 +1,26 @@ +# Window / layer rules. Omarchy v3 default/hypr/windows.conf with the +# app-specific apps.conf inlined (no separate apps.conf here). + +windowrule = suppress_event maximize, match:class .* + +# Tag all windows for default opacity (apps can override by clearing the tag) +windowrule = tag +default-opacity, match:class .* + +# Float common utility windows +windowrule = float, match:class ^(org.pulseaudio.pavucontrol|blueberry.py|nm-connection-editor|blueman-manager)$ +windowrule = float, match:class ^(org.gnome.Calculator|gnome-calculator)$ + +# Fix some dragging issues with XWayland +windowrule = no_focus on, match:class ^$, match:title ^$, match:xwayland 1, match:float 1, match:fullscreen 0, match:pin 0 + +# clipse clipboard manager floats in the middle +windowrule = float, match:class (clipse) +windowrule = size 622 652, match:class (clipse) +windowrule = stay_focused, match:class (clipse) + +# Apply default opacity after apps have had a chance to opt out +windowrule = opacity 0.97 0.9, match:tag default-opacity + +# Proper background blur for rofi + waybar +layerrule = blur, rofi +layerrule = blur, waybar diff --git a/configs/omarchy/rofi/config.rasi b/configs/omarchy/rofi/config.rasi new file mode 100644 index 0000000..c75960a --- /dev/null +++ b/configs/omarchy/rofi/config.rasi @@ -0,0 +1,12 @@ +configuration { + modi: "drun,run,window"; + show-icons: true; + icon-theme: "Papirus"; + drun-display-format: "{name}"; + display-drun: " Apps"; + display-run: " Run"; + display-window: " Windows"; + font: "JetBrainsMono Nerd Font 12"; +} + +@theme "~/.config/omarchy/current/theme/rofi.rasi" diff --git a/configs/omarchy/swayosd/config.toml b/configs/omarchy/swayosd/config.toml new file mode 100644 index 0000000..9a3072f --- /dev/null +++ b/configs/omarchy/swayosd/config.toml @@ -0,0 +1,3 @@ +[server] +max_volume = 100 +show_percentage = true diff --git a/configs/omarchy/swayosd/style.css b/configs/omarchy/swayosd/style.css new file mode 100644 index 0000000..d66070e --- /dev/null +++ b/configs/omarchy/swayosd/style.css @@ -0,0 +1,15 @@ +@import "../omarchy/current/theme/swayosd.css"; + +* { + font-family: 'JetBrainsMono Nerd Font'; + border-radius: 0; +} + +window { + background-color: @background; + border: 2px solid @border-color; +} + +label { + color: @label; +} diff --git a/configs/omarchy/waybar/config.jsonc b/configs/omarchy/waybar/config.jsonc new file mode 100644 index 0000000..a5eadd5 --- /dev/null +++ b/configs/omarchy/waybar/config.jsonc @@ -0,0 +1,117 @@ +{ + "reload_style_on_change": true, + "layer": "top", + "position": "top", + "spacing": 0, + "height": 26, + "modules-left": ["custom/omarchy", "hyprland/workspaces"], + "modules-center": ["clock"], + "modules-right": ["tray", "bluetooth", "network", "pulseaudio", "cpu", "battery"], + + "custom/omarchy": { + "format": "\uf0c9", + "on-click": "omarchy-menu", + "on-click-right": "alacritty", + "tooltip-format": "Omarchy Menu\n\nSuper + Alt + Space" + }, + + "hyprland/workspaces": { + "on-click": "activate", + "format": "{icon}", + "format-icons": { + "default": "", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9", + "10": "0", + "active": "󱓻" + }, + "persistent-workspaces": { + "1": [], + "2": [], + "3": [], + "4": [], + "5": [] + } + }, + + "clock": { + "format": "{:%A %H:%M}", + "format-alt": "{:%d %B W%V %Y}", + "tooltip": false + }, + + "cpu": { + "interval": 5, + "format": "󰍛", + "on-click": "alacritty -e btop" + }, + + "network": { + "format-icons": ["󰤯", "󰤟", "󰤢", "󰤥", "󰤨"], + "format": "{icon}", + "format-wifi": "{icon}", + "format-ethernet": "󰀂", + "format-disconnected": "󰤮", + "tooltip-format-wifi": "{essid} ({frequency} GHz)", + "tooltip-format-ethernet": "Connected", + "tooltip-format-disconnected": "Disconnected", + "interval": 3, + "spacing": 1, + "on-click": "nm-connection-editor" + }, + + "battery": { + "interval": 5, + "format": "{capacity}% {icon}", + "format-discharging": "{icon}", + "format-charging": "{icon}", + "format-plugged": "󰂅", + "format-icons": { + "charging": ["󰢜", "󰂆", "󰂇", "󰂈", "󰢝", "󰂉", "󰢞", "󰂊", "󰂋", "󰂅"], + "default": ["󰁺", "󰁻", "󰁼", "󰁽", "󰁾", "󰁿", "󰂀", "󰂁", "󰂂", "󰁹"] + }, + "format-full": "󰂅", + "tooltip-format-discharging": "{power:>1.0f}W↓ {capacity}%", + "tooltip-format-charging": "{power:>1.0f}W↑ {capacity}%", + "states": { + "warning": 20, + "critical": 10 + }, + "on-click": "omarchy-menu system" + }, + + "bluetooth": { + "format": "󰂯", + "format-off": "󰂲", + "format-disabled": "󰂲", + "format-connected": "󰂱", + "tooltip-format": "Devices connected: {num_connections}", + "on-click": "blueman-manager" + }, + + "pulseaudio": { + "format": "{icon}", + "on-click": "pavucontrol", + "on-click-right": "pamixer -t", + "tooltip-format": "Playing at {volume}%", + "scroll-step": 5, + "format-muted": "󰝟", + "format-icons": { + "headphone": "󰋋", + "headset": "󰋎", + "default": ["󰕿", "󰖀", "󰕾"] + } + }, + + "tray": { + "icon-size": 12, + "spacing": 17 + } +} diff --git a/configs/omarchy/waybar/style.css b/configs/omarchy/waybar/style.css new file mode 100644 index 0000000..543c1e9 --- /dev/null +++ b/configs/omarchy/waybar/style.css @@ -0,0 +1,63 @@ +@import "../omarchy/current/theme/waybar.css"; + +* { + background-color: @background; + color: @foreground; + + border: none; + border-radius: 0; + min-height: 0; + font-family: 'JetBrainsMono Nerd Font'; + font-size: 12px; +} + +.modules-left { + margin-left: 8px; +} + +.modules-right { + margin-right: 8px; +} + +#workspaces button { + all: initial; + padding: 0 6px; + margin: 0 1.5px; + min-width: 9px; +} + +#workspaces button.empty { + opacity: 0.5; +} + +#cpu, +#battery, +#pulseaudio, +#custom-omarchy { + min-width: 12px; + margin: 0 7.5px; +} + +#tray { + margin-right: 16px; +} + +#bluetooth { + margin-right: 17px; +} + +#network { + margin-right: 13px; +} + +tooltip { + padding: 2px; +} + +#clock { + margin-left: 8.75px; +} + +.hidden { + opacity: 0; +} diff --git a/configs/omarchy/wlogout/layout b/configs/omarchy/wlogout/layout new file mode 100644 index 0000000..4c3d8fa --- /dev/null +++ b/configs/omarchy/wlogout/layout @@ -0,0 +1,32 @@ +[ + { + "label": "lock", + "action": "hyprlock", + "text": "Lock", + "keybind": "l" + }, + { + "label": "logout", + "action": "hyprctl dispatch exit", + "text": "Logout", + "keybind": "e" + }, + { + "label": "suspend", + "action": "systemctl suspend", + "text": "Suspend", + "keybind": "s" + }, + { + "label": "reboot", + "action": "systemctl reboot", + "text": "Reboot", + "keybind": "r" + }, + { + "label": "shutdown", + "action": "systemctl poweroff", + "text": "Shutdown", + "keybind": "p" + } +] diff --git a/configs/omarchy/wlogout/style.css b/configs/omarchy/wlogout/style.css new file mode 100644 index 0000000..e750fc6 --- /dev/null +++ b/configs/omarchy/wlogout/style.css @@ -0,0 +1,27 @@ +@import "../omarchy/current/theme/wlogout.css"; + +* { + background-image: none; + font-family: 'JetBrainsMono Nerd Font'; + font-size: 20px; +} + +window { + background-color: @background; +} + +button { + color: @foreground; + background-color: @background; + border: 2px solid @foreground; + border-radius: 0; + margin: 8px; + padding: 24px; +} + +button:focus, +button:active, +button:hover { + background-color: @accent; + color: @background; +} diff --git a/hw/straylight/default.nix b/hw/straylight/default.nix index 4edbf96..6633793 100644 --- a/hw/straylight/default.nix +++ b/hw/straylight/default.nix @@ -235,6 +235,7 @@ in imports = [ ./hardware-configuration.nix ../../configs/desktop.nix + ../../configs/omarchy.nix ../../configs/qemu.nix ../../configs/metrics/straylight.nix ];