From c744867b5adc417748f6ed6fdb17cb6e4c6fc46b Mon Sep 17 00:00:00 2001 From: Gregor Kleen Date: Tue, 14 Jan 2025 15:05:32 +0100 Subject: ... --- accounts/gkleen@sif/niri/default.nix | 117 +++++++++++++++++++++++++++++++---- accounts/gkleen@sif/niri/waybar.nix | 16 ++--- 2 files changed, 111 insertions(+), 22 deletions(-) (limited to 'accounts/gkleen@sif/niri') diff --git a/accounts/gkleen@sif/niri/default.nix b/accounts/gkleen@sif/niri/default.nix index 6a8d10a0..b6165487 100644 --- a/accounts/gkleen@sif/niri/default.nix +++ b/accounts/gkleen@sif/niri/default.nix @@ -1,10 +1,35 @@ -{ config, pkgs, lib, ... }: +{ config, hostConfig, pkgs, lib, ... }: let niri = config.programs.niri.package; terminal = lib.getExe config.programs.kitty.package; lightctl = lib.getExe' config.services.avizo.package "lightctl"; volumectl = lib.getExe' config.services.avizo.package "volumectl"; dunstctl = lib.getExe' config.services.dunst.package "dunstctl"; + loginctl = lib.getExe' hostConfig.systemd.package "loginctl"; + systemctl = lib.getExe' hostConfig.systemd.package "systemctl"; + + focus-or-spawn = pkgs.writeShellApplication { + name = "focus-or-spawn"; + runtimeInputs = [ niri pkgs.gojq pkgs.gnugrep ]; + text = '' + app_id="$1" + shift + workspace_name="$1" + shift + + niri msg action move-workspace-to-monitor --output "$(niri msg -j workspaces | jq -r '.[] | select(.is_focused) | .output')" "$workspace_name" + + while IFS=$'\n' read -r window_json; do + if jq -r '.app_id' <<<"$window_json" | grep -q "$app_id"; then + niri msg action focus-window --id "$(jq -r '.id' <<<"$window_json")" + exit 0 + fi + done < <(niri msg -j windows | jq -c '.[]') + + exec "$@" + ''; + }; + focus-or-spawn-action = app_id: workspace_name: config.lib.niri.actions.spawn (lib.getExe focus-or-spawn) (lib.escapeShellArg app_id) (lib.escapeShellArg workspace_name); in { imports = [ ./waybar.nix @@ -21,7 +46,9 @@ in { Service = { Type = "notify"; NotifyAccess = "all"; - ExecStart = lib.getExe pkgs.xwayland-satellite-unstable; + Environment = [ "DISPLAY=:0" ]; + ExecStart = ''${lib.getExe pkgs.xwayland-satellite-unstable} ''${DISPLAY}''; + ExecStartPre = "${systemctl} --user import-environment DISPLAY"; StandardOutput = "journal"; }; Install = { @@ -29,16 +56,44 @@ in { }; }; + services.swayidle = { + events = [ + { event = "after-resume"; command = "${lib.getExe niri} msg action power-on-monitors"; } + ]; + timeouts = [ + { timeout = 300; + command = "${lib.getExe niri} msg action power-off-monitors"; + } + ]; + }; + programs.niri.settings = { prefer-no-csd = true; screenshot-path = "${config.home.homeDirectory}/screenshots"; + hotkey-overlay.skip-at-startup = true; + input = { keyboard.xkb = { - layout = "us,"; + layout = "us,us"; variant = "dvp,"; options = "compose:caps,grp:win_space_toggle"; }; + + workspace-auto-back-and-forth = true; + # focus-follows-mouse.enable = true; + warp-mouse-to-focus = true; + }; + + outputs = { + "Samsung Display Corp. 0x4141 Unknown" = { + scale = 1.5; + position = { x = 0; y = 0; }; + }; + "Ancor Communications Inc ASUS PB287Q 0x0000DD9B" = { + scale = 1.5; + position = { x = 2560; y = 0; }; + }; }; environment = { @@ -48,9 +103,40 @@ in { SDL_VIDEODRIVER = "wayland"; }; + layout = { + gaps = 8; + struts = { left = 8; right = 8; top = 0; bottom = 0; }; + focus-ring = { + width = 2; + }; + empty-workspace-above-first = true; + }; + cursor.hide-when-typing = true; + workspaces = { + "01".name = "pwctl"; + }; + + window-rules = [ + { + geometry-corner-radius = + let + allCorners = r: { bottom-left = r; bottom-right = r; top-left = r; top-right = r; }; + in allCorners 8.; + clip-to-geometry = true; + open-focused = false; + } + { + matches = [ { app-id = "^com\.saivert\.pwvucontrol$"; } ]; + open-on-workspace = "pwctl"; + open-focused = true; + } + ]; + binds = with config.lib.niri.actions; { + "Mod+Slash".action = show-hotkey-overlay; + "Mod+Return".action = spawn terminal; "Mod+Q".action = close-window; "Mod+D".action = spawn (lib.getExe config.programs.fuzzel.package); @@ -79,17 +165,20 @@ in { "Mod+G".action = focus-workspace-down; "Mod+C".action = focus-workspace-up; - "Mod+Control+G".action = move-column-to-workspace-down; - "Mod+Control+C".action = move-column-to-workspace-up; + "Mod+Shift+G".action = move-column-to-workspace-down; + "Mod+Shift+C".action = move-column-to-workspace-up; - "Mod+Shift+G".action = move-workspace-down; - "Mod+Shift+C".action = move-workspace-up; + "Mod+Shift+Control+G".action = move-workspace-down; + "Mod+Shift+Control+C".action = move-workspace-up; - "Mod+M".action = consume-window-into-column; - "Mod+W".action = expel-window-from-column; + "Mod+M".action = consume-or-expel-window-left; + "Mod+W".action = consume-or-expel-window-right; - "Mod+F".action = maximize-column; - "Mod+Shift+F".action = fullscreen-window; + "Mod+R".action = switch-preset-column-width; + "Mod+Shift+R".action = switch-preset-window-height; + "Mod+F".action = center-column; + "Mod+Shift+F".action = maximize-column; + "Mod+Shift+Ctrl+F".action = fullscreen-window; "Mod+Space".action = switch-focus-between-floating-and-tiling; "Mod+Shift+Space".action = toggle-window-floating; @@ -103,6 +192,10 @@ in { action = spawn (lib.getExe niri) "msg" "action" "power-off-monitors"; allow-when-locked = true; }; + "Mod+Shift+L" = { + action = spawn loginctl "lock-session"; + }; + "Mod+Shift+E".action = quit; "XF86MonBrightnessUp" = { action = spawn lightctl "-d" "-e4" "-n1" "up"; @@ -133,6 +226,8 @@ in { "Mod+Shift+Semicolon".action = spawn dunstctl "close-all"; "Mod+Period".action = spawn dunstctl "context"; "Mod+Comma".action = spawn dunstctl "history-pop"; + + "Mod+Alt+A".action = focus-or-spawn-action "^com\.saivert\.pwvucontrol$" "pwctl" "pwvucontrol"; }; }; }; diff --git a/accounts/gkleen@sif/niri/waybar.nix b/accounts/gkleen@sif/niri/waybar.nix index 1a25b581..2d00c6d8 100644 --- a/accounts/gkleen@sif/niri/waybar.nix +++ b/accounts/gkleen@sif/niri/waybar.nix @@ -80,9 +80,7 @@ exec = "${lib.getExe pkgs.worktime} today"; tooltip = false; }; - "niri/workspaces" = { - all-outputs = true; - }; + "niri/workspaces" = {}; "niri/window" = { separate-outputs = true; icon = true; @@ -166,9 +164,7 @@ modules-center = [ "niri/window" ]; modules-right = [ "clock" ]; - "niri/workspaces" = { - all-outputs = false; - }; + "niri/workspaces" = {}; "niri/window" = { separate-outputs = true; icon = true; @@ -215,13 +211,11 @@ } #workspaces button { - color: @grey; - } - #workspaces button.hosting-monitor { color: @white; + padding: 2px 5px; } - #workspaces button.visible { - color: @blue; + #workspaces button.empty { + color: @grey; } #workspaces button.active { color: @green; -- cgit v1.2.3