Compare commits

...

3 commits

10 changed files with 76 additions and 354 deletions

View file

@ -12,8 +12,8 @@
# TODO make configurable # TODO make configurable
settings = { settings = {
user = { user = {
email = "ringofstorms@gmail.com"; email = "abc@joshuabell.xyz";
name = "RingOfStorms (Joshua Bell)"; name = "Joshua Bell";
}; };
core.pager = "bat"; core.pager = "bat";
core.editor = "vi"; core.editor = "vi";

View file

@ -150,7 +150,7 @@ in
# kdePackages.plasma-workspace-wallpapers # kdePackages.plasma-workspace-wallpapers
# On-screen keyboard (Plasma Wayland) # On-screen keyboard (Plasma Wayland)
kdePackages.plasma-keyboard # kdePackages.plasma-keyboard
# Panel applets required for widgets # Panel applets required for widgets
kdePackages.plasma-nm # org.kde.plasma.networkmanagement kdePackages.plasma-nm # org.kde.plasma.networkmanagement

View file

@ -6,8 +6,6 @@
let let
cfg = osConfig.ringofstorms.dePlasma; cfg = osConfig.ringofstorms.dePlasma;
inherit (lib) mkIf optionalAttrs; inherit (lib) mkIf optionalAttrs;
# Get the first wallpaper from the list if available
wallpaper = if (builtins.length cfg.wallpapers) > 0 then builtins.head cfg.wallpapers else null;
in in
{ {
imports = [ imports = [
@ -296,8 +294,8 @@ in
lookAndFeel = "org.kde.breezedark.desktop"; lookAndFeel = "org.kde.breezedark.desktop";
theme = "breeze-dark"; theme = "breeze-dark";
cursor.theme = "breeze_cursors"; cursor.theme = "breeze_cursors";
} // optionalAttrs (wallpaper != null) { } // optionalAttrs ((builtins.length cfg.wallpapers) > 0) {
wallpaper = wallpaper; wallpaper = cfg.wallpapers;
}; };
configFile = { configFile = {

View file

@ -6,9 +6,9 @@ let
workspaceLetters = [ workspaceLetters = [
"n" "n"
"m" "m"
"Comma" ","
"Period" "."
"Slash" "/"
]; ];
kwinWorkspace = builtins.listToAttrs ( kwinWorkspace = builtins.listToAttrs (
map (i: { map (i: {
@ -85,6 +85,12 @@ in
"Lock Session" = "none"; "Lock Session" = "none";
}; };
# Disable Plasma emojier shortcuts which conflict with workspace switching
# (Meta+. is bound by default in org.kde.plasma.emojier.desktop)
"org.kde.plasma.emojier.desktop" = {
"_launch" = [ ];
};
# "KDE Keyboard Layout Switcher"."Switch to Next Keyboard Layout" = "Meta+K"; # "KDE Keyboard Layout Switcher"."Switch to Next Keyboard Layout" = "Meta+K";
}; };

84
hosts/lio/flake.lock generated
View file

@ -63,14 +63,20 @@
}, },
"common": { "common": {
"locked": { "locked": {
"path": "../../flakes/common", "dir": "flakes/common",
"type": "path" "lastModified": 1768586643,
"narHash": "sha256-FPRn8Ea7h+209KQvdy2FCAaMK7iMbxHvIEb/1Flt9wc=",
"ref": "refs/heads/master",
"rev": "28656f137da6f102749b39b4bcb03c04c7107d2d",
"revCount": 1145,
"type": "git",
"url": "https://git.joshuabell.xyz/ringofstorms/dotfiles"
}, },
"original": { "original": {
"path": "../../flakes/common", "dir": "flakes/common",
"type": "path" "type": "git",
}, "url": "https://git.joshuabell.xyz/ringofstorms/dotfiles"
"parent": [] }
}, },
"crane": { "crane": {
"locked": { "locked": {
@ -131,14 +137,20 @@
"plasma-manager": "plasma-manager" "plasma-manager": "plasma-manager"
}, },
"locked": { "locked": {
"path": "../../flakes/de_plasma", "dir": "flakes/de_plasma",
"type": "path" "lastModified": 1768586643,
"narHash": "sha256-FPRn8Ea7h+209KQvdy2FCAaMK7iMbxHvIEb/1Flt9wc=",
"ref": "refs/heads/master",
"rev": "28656f137da6f102749b39b4bcb03c04c7107d2d",
"revCount": 1145,
"type": "git",
"url": "https://git.joshuabell.xyz/ringofstorms/dotfiles"
}, },
"original": { "original": {
"path": "../../flakes/de_plasma", "dir": "flakes/de_plasma",
"type": "path" "type": "git",
}, "url": "https://git.joshuabell.xyz/ringofstorms/dotfiles"
"parent": [] }
}, },
"flake-utils": { "flake-utils": {
"inputs": { "inputs": {
@ -342,11 +354,11 @@
}, },
"nixpkgs_4": { "nixpkgs_4": {
"locked": { "locked": {
"lastModified": 1768302833, "lastModified": 1768456270,
"narHash": "sha256-h5bRFy9bco+8QcK7rGoOiqMxMbmn21moTACofNLRMP4=", "narHash": "sha256-NgaL2CCiUR6nsqUIY4yxkzz07iQUlUCany44CFv+OxY=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "61db79b0c6b838d9894923920b612048e1201926", "rev": "f4606b01b39e09065df37905a2133905246db9ed",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -1273,11 +1285,11 @@
"nixpkgs": "nixpkgs_4" "nixpkgs": "nixpkgs_4"
}, },
"locked": { "locked": {
"lastModified": 1768396176, "lastModified": 1768623515,
"narHash": "sha256-JqLZY6/s3O5IVNjZs4vi4BGQhA730aLLMA7DgENCTTU=", "narHash": "sha256-7rfFPs9rBXpNmnK77Lc8PBbdTQt6ITotwbJkL85qLIA=",
"owner": "anomalyco", "owner": "anomalyco",
"repo": "opencode", "repo": "opencode",
"rev": "ee6ca104e5eb1693b63901128ea315754f88f595", "rev": "85ab9798c65dfb36b0f47de3b1fd786e7751f761",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -1481,14 +1493,20 @@
}, },
"secrets-bao": { "secrets-bao": {
"locked": { "locked": {
"path": "../../flakes/secrets-bao", "dir": "flakes/secrets-bao",
"type": "path" "lastModified": 1768586643,
"narHash": "sha256-FPRn8Ea7h+209KQvdy2FCAaMK7iMbxHvIEb/1Flt9wc=",
"ref": "refs/heads/master",
"rev": "28656f137da6f102749b39b4bcb03c04c7107d2d",
"revCount": 1145,
"type": "git",
"url": "https://git.joshuabell.xyz/ringofstorms/dotfiles"
}, },
"original": { "original": {
"path": "../../flakes/secrets-bao", "dir": "flakes/secrets-bao",
"type": "path" "type": "git",
}, "url": "https://git.joshuabell.xyz/ringofstorms/dotfiles"
"parent": [] }
}, },
"stt_ime": { "stt_ime": {
"inputs": { "inputs": {
@ -1497,14 +1515,20 @@
"nixpkgs": "nixpkgs_7" "nixpkgs": "nixpkgs_7"
}, },
"locked": { "locked": {
"path": "../../flakes/stt_ime", "dir": "flakes/stt_ime",
"type": "path" "lastModified": 1768586643,
"narHash": "sha256-FPRn8Ea7h+209KQvdy2FCAaMK7iMbxHvIEb/1Flt9wc=",
"ref": "refs/heads/master",
"rev": "28656f137da6f102749b39b4bcb03c04c7107d2d",
"revCount": 1145,
"type": "git",
"url": "https://git.joshuabell.xyz/ringofstorms/dotfiles"
}, },
"original": { "original": {
"path": "../../flakes/stt_ime", "dir": "flakes/stt_ime",
"type": "path" "type": "git",
}, "url": "https://git.joshuabell.xyz/ringofstorms/dotfiles"
"parent": [] }
}, },
"systems": { "systems": {
"locked": { "locked": {

View file

@ -6,20 +6,20 @@
nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable"; nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable";
# Use relative to get current version for testing # Use relative to get current version for testing
common.url = "path:../../flakes/common"; # common.url = "path:../../flakes/common";
# common.url = "git+https://git.joshuabell.xyz/ringofstorms/dotfiles?dir=flakes/common"; common.url = "git+https://git.joshuabell.xyz/ringofstorms/dotfiles?dir=flakes/common";
# secrets.url = "path:../../flakes/secrets"; # secrets.url = "path:../../flakes/secrets";
secrets.url = "git+https://git.joshuabell.xyz/ringofstorms/dotfiles?dir=flakes/secrets"; secrets.url = "git+https://git.joshuabell.xyz/ringofstorms/dotfiles?dir=flakes/secrets";
secrets-bao.url = "path:../../flakes/secrets-bao"; # secrets-bao.url = "path:../../flakes/secrets-bao";
# secrets-bao.url = "git+https://git.joshuabell.xyz/ringofstorms/dotfiles?dir=flakes/secrets-bao"; secrets-bao.url = "git+https://git.joshuabell.xyz/ringofstorms/dotfiles?dir=flakes/secrets-bao";
# flatpaks.url = "path:../../flakes/flatpaks"; # flatpaks.url = "path:../../flakes/flatpaks";
flatpaks.url = "git+https://git.joshuabell.xyz/ringofstorms/dotfiles?dir=flakes/flatpaks"; flatpaks.url = "git+https://git.joshuabell.xyz/ringofstorms/dotfiles?dir=flakes/flatpaks";
# beszel.url = "path:../../flakes/beszel"; # beszel.url = "path:../../flakes/beszel";
beszel.url = "git+https://git.joshuabell.xyz/ringofstorms/dotfiles?dir=flakes/beszel"; beszel.url = "git+https://git.joshuabell.xyz/ringofstorms/dotfiles?dir=flakes/beszel";
de_plasma.url = "path:../../flakes/de_plasma"; # de_plasma.url = "path:../../flakes/de_plasma";
# de_plasma.url = "git+https://git.joshuabell.xyz/ringofstorms/dotfiles?dir=flakes/de_plasma"; de_plasma.url = "git+https://git.joshuabell.xyz/ringofstorms/dotfiles?dir=flakes/de_plasma";
stt_ime.url = "path:../../flakes/stt_ime"; # stt_ime.url = "path:../../flakes/stt_ime";
# stt_ime.url = "git+https://git.joshuabell.xyz/ringofstorms/dotfiles?dir=flakes/stt_ime"; stt_ime.url = "git+https://git.joshuabell.xyz/ringofstorms/dotfiles?dir=flakes/stt_ime";
opencode.url = "github:anomalyco/opencode"; opencode.url = "github:anomalyco/opencode";
ros_neovim.url = "git+https://git.joshuabell.xyz/ringofstorms/nvim"; ros_neovim.url = "git+https://git.joshuabell.xyz/ringofstorms/nvim";

View file

@ -1,10 +0,0 @@
{
config,
lib,
pkgs,
modulesPath,
...
}:
{
}

View file

@ -1,157 +0,0 @@
{ lib, pkgs, ... }:
let
# Exact descriptions as reported by: hyprctl -j monitors | jq '.[].description'
mainDesc = "ASUSTek COMPUTER INC ASUS PG43U 0x01010101";
secondaryDesc = "Samsung Electric Company C34J79x HTRM900776";
mainMonitor = "desc:${mainDesc}";
secondaryMonitor = "desc:${secondaryDesc}";
hyprlandExtraOptions = {
exec-once = [
# Wait a moment for monitors/workspaces to settle, then "prime" 6 and return to 1
"sh -lc 'sleep 0.2; hyprctl dispatch workspace 7; sleep 0.02; hyprctl dispatch workspace 1'"
];
monitor = [
"${mainMonitor},3840x2160@97.98,0x0,1,transform,0"
"${secondaryMonitor},3440x1440@99.98,-1440x-640,1,transform,1"
];
workspace =
let
inherit (builtins) map toString;
inherit (lib) range;
mkWs = monitor: i: "${toString i},monitor:${monitor},persistent:true";
in
(map (mkWs mainMonitor) (range 1 6)) ++ (map (mkWs secondaryMonitor) (range 7 10));
};
moveScript = pkgs.writeShellScriptBin "hyprland-move-workspaces" ''
#!/usr/bin/env bash
set -euo pipefail
HYPRCTL='${pkgs.hyprland}/bin/hyprctl'
JQ='${pkgs.jq}/bin/jq'
SOCAT='${pkgs.socat}/bin/socat'
MAIN_DESC='${mainDesc}'
SEC_DESC='${secondaryDesc}'
get_socket() {
# socket2 carries the event stream
echo "${"$"}{XDG_RUNTIME_DIR}/hypr/${"$"}{HYPRLAND_INSTANCE_SIGNATURE}/.socket2.sock"
}
wait_for_hypr() {
# Wait until hyprctl works (Hyprland is up)
until ''${HYPRCTL} -j monitors >/dev/null 2>&1; do
sleep 0.5
done
}
mon_name_by_desc() {
# Resolve Hyprland "name" (e.g., DP-2) from human-friendly description
local desc="${"$"}1"
''${HYPRCTL} -j monitors \
| ''${JQ} -r --arg d "${"$"}desc" '.[] | select(.description == $d) | .name' \
| head -n1
}
place_workspaces() {
local mainName secName
mainName="$(mon_name_by_desc "${"$"}MAIN_DESC")"
secName="$(mon_name_by_desc "${"$"}SEC_DESC" || true)"
# Always keep 16 on the main monitor
for ws in 1 2 3 4 5 6; do
''${HYPRCTL} dispatch moveworkspacetomonitor "${"$"}ws" "${"$"}mainName" || true
done
if [ -n "${"$"}{secName:-}" ]; then
# Secondary is present ➜ put 710 on secondary
for ws in 7 8 9 10; do
''${HYPRCTL} dispatch moveworkspacetomonitor "${"$"}ws" "${"$"}secName" || true
done
else
# No secondary ➜ keep 710 on main
for ws in 7 8 9 10; do
''${HYPRCTL} dispatch moveworkspacetomonitor "${"$"}ws" "${"$"}mainName" || true
done
fi
}
watch_events() {
local sock
sock="$(get_socket)"
# If socket2 is missing for some reason, fall back to polling
if [ ! -S "${"$"}sock" ]; then
while :; do
place_workspaces
sleep 5
done
return
fi
# Subscribe to Hyprland events and react to monitor changes
''${SOCAT} - "UNIX-CONNECT:${"$"}sock" | while IFS= read -r line; do
case "${"$"}line" in
monitoradded*|monitorremoved*|activemonitor*|layoutchange*|createworkspace*)
place_workspaces
;;
esac
done
}
if [ "${"$"}{1:-}" = "--oneshot" ]; then
wait_for_hypr
place_workspaces
else
wait_for_hypr
place_workspaces
watch_events
fi
'';
in
{
options = { };
config = {
environment.systemPackages = [ moveScript ];
ringofstorms_common.desktopEnvironment.hyprland.extraOptions = hyprlandExtraOptions;
ringofstorms_common.desktopEnvironment.hyprland.hyprpaperSettings = {
mode = "fill"; # Wallpaper display mode: fill, fit, stretch, center, tile
preload = [
"${../_shared_assets/wallpapers/pixel_neon.png}"
];
wallpaper = [
"${mainMonitor},${../_shared_assets/wallpapers/pixel_neon.png}"
"${secondaryMonitor},${../_shared_assets/wallpapers/pixel_neon_v.png}"
];
};
# User-level systemd service that follows your Hyprland session and watches for monitor changes
# systemd.user.services.hyprland-move-workspaces = {
# description = "Keep workspaces 16 on main and 710 on secondary; react to monitor changes";
#
# # Start/stop with Hyprland specifically
# wantedBy = [ "hyprland-session.target" ];
# after = [ "hyprland-session.target" ];
# partOf = [ "hyprland-session.target" ];
# bindsTo = [ "hyprland-session.target" ];
# # Only start once Hyprland's event socket exists
# unitConfig.ConditionPathExistsGlob = "%t/hypr/*/.socket2.sock";
#
# serviceConfig = {
# Type = "simple";
# ExecStart = "${moveScript}/bin/hyprland-move-workspaces";
# Restart = "always";
# RestartSec = "2s";
# };
# };
};
}

View file

@ -1,51 +0,0 @@
{ pkgs, ... }:
let
assignLines = ''
workspace 1 output DP-1
workspace 2 output DP-1
workspace 3 output DP-1
workspace 4 output DP-1
workspace 5 output DP-1
workspace 6 output DP-1
workspace 7 output DP-2
workspace 8 output DP-2
workspace 9 output DP-2
workspace 10 output DP-2
'';
bg1 = ../_shared_assets/wallpapers/pixel_neon.png;
bg2 = ../_shared_assets/wallpapers/pixel_neon_v.png;
# xrSetup = "xrandr --output DP-1 --mode 3840x2160 --rate 119.88 --pos 0x0 --primary; sleep 0.2; xrandr --output DP-2 --mode 3440x1440 --rate 99.98 --rotate left --left-of DP-1";
xrSetup = "xrandr --output DP-1 --mode 3840x2160 --rate 60 --pos 0x0 --primary; sleep 0.2; xrandr --output DP-2 --mode 3440x1440 --rate 99.98 --rotate left --left-of DP-1";
xwallpaperCmd = "xwallpaper --output DP-1 --zoom ${bg1} --output DP-2 --zoom ${bg2}";
startupCmd = "sh -c 'sleep 0.2; i3-msg workspace number 7; sleep 0.2; i3-msg workspace number 1'";
i3ExtraOptions = {
startup = [
{ command = "${xrSetup}"; }
{ command = "sh -c 'sleep 1; ${xwallpaperCmd}'"; }
{ command = "${startupCmd}"; }
];
};
in
{
options = { };
config = {
home-manager.sharedModules = [
(
{ lib, pkgs, ... }:
let
inherit (lib) mkAfter;
in
{
xsession.windowManager.i3.config.startup = mkAfter (i3ExtraOptions.startup ++ [
{ command = "nm-applet"; }
{ command = "blueman-applet"; }
{ command = "xfce4-power-manager"; }
{ command = "sh -c 'xset s off -dpms; xset s noblank'"; }
]);
xsession.windowManager.i3.extraConfig = mkAfter assignLines;
home.packages = [ pkgs.xwallpaper pkgs.xorg.xrandr pkgs.xorg.xset ];
}
)
];
};
}

View file

@ -1,88 +0,0 @@
{ ... }:
let
swayExtraOptions = {
startup = [
{
command = "exec sh -c 'sleep 0.01; swaymsg workspace number 7; sleep 0.02; swaymsg workspace number 1'";
}
];
# Example: map workspaces 16 to DP-1 and 710 to HDMI-A-1
workspaceOutputAssign = [
{
workspace = "1";
output = "DP-1";
}
{
workspace = "2";
output = "DP-1";
}
{
workspace = "3";
output = "DP-1";
}
{
workspace = "4";
output = "DP-1";
}
{
workspace = "5";
output = "DP-1";
}
{
workspace = "6";
output = "DP-1";
}
{
workspace = "7";
output = "DP-2";
}
{
workspace = "8";
output = "DP-2";
}
{
workspace = "9";
output = "DP-2";
}
{
workspace = "10";
output = "DP-2";
}
];
# Optional output settings
output = {
"DP-1" = {
scale = "1";
pos = "0 0";
mode = "3840x2160@97.983Hz";
bg = "${../_shared_assets/wallpapers/pixel_neon.png} fill";
};
"DP-2" = {
scale = "1";
transform = "270";
pos = "-1440 -640";
mode = "3440x1440@99.982Hz";
bg = "${../_shared_assets/wallpapers/pixel_neon_v.png} fill";
};
};
};
in
{
options = { };
config = {
# ringofstorms_common.desktopEnvironment.sway.extraOptions = swayExtraOptions;
home-manager.sharedModules = [
(
{ ... }:
{
wayland.windowManager.sway.config = swayExtraOptions;
}
)
];
};
}