From f50a110e2120177d692b61493cb9c58f908cfff8 Mon Sep 17 00:00:00 2001 From: Gregor Kleen Date: Wed, 14 May 2025 13:19:38 +0200 Subject: ... --- accounts/gkleen@sif/niri/default.nix | 63 ++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) (limited to 'accounts/gkleen@sif/niri') diff --git a/accounts/gkleen@sif/niri/default.nix b/accounts/gkleen@sif/niri/default.nix index 803b3a0d..7254b7ed 100644 --- a/accounts/gkleen@sif/niri/default.nix +++ b/accounts/gkleen@sif/niri/default.nix @@ -330,6 +330,69 @@ in { ''; }; }; + systemd.user.services.niri-workspace-sort = { + Unit = { + BindsTo = [ "niri.service" ]; + After = [ "niri.service" ]; + }; + Install = { + WantedBy = [ "niri.service" ]; + }; + Service = { + Type = "simple"; + ExecStart = pkgs.writers.writePython3 "niri-workspace-sort" { flakeIgnore = ["E501"]; } '' + import os + import sys + import socket + import json + + outputs = None + only = {'HDMI-A-1': {'bmr'}, 'eDP-1': {'vid'}} + + with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as cmd_sock, socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as sock: + cmd_sock.connect(os.environ["NIRI_SOCKET"]) + with cmd_sock.makefile(mode='w', buffering=1, encoding='utf-8') as fh: + sock.connect(os.environ["NIRI_SOCKET"]) + sock.send(b"\"EventStream\"\n") + for line in sock.makefile(buffering=1, encoding='utf-8'): + workspaces = None + if line_json := json.loads(line): + if "WorkspacesChanged" in line_json: + workspaces = line_json["WorkspacesChanged"]["workspaces"] + + if workspaces is None: + continue + + old_outputs = outputs + outputs = {ws["output"] for ws in workspaces} + if old_outputs is None: + print("Initial outputs: {}".format(outputs), file=sys.stderr) + continue + + new_outputs = outputs - old_outputs + if not new_outputs: + continue + print("New outputs: {}".format(new_outputs), file=sys.stderr) + + relevant_workspaces = list(filter(lambda ws: (ws["name"] is not None) or (ws["active_window_id"] is not None), workspaces)) + target_output = next(iter(outputs - set(only.keys()))) + if not target_output: + continue + for ws in relevant_workspaces: + ws_ident = ws["name"] if ws["name"] is not None else (ws["output"], ws["idx"]) + if ws["output"] not in set(only.keys()): + continue + if ws_ident in only[ws["output"]]: + continue + + print("{} -> {}".format(ws_ident, target_output), file=sys.stderr) + cmd = json.dumps({"Action": {"MoveWorkspaceToMonitor": {"reference": {"Id": ws["id"]}, "output": target_output}}}, separators=(',', ':')) + print(cmd, flush=True, file=fh) + ''; + Restart = "on-failure"; + RestartSec = 10; + }; + }; programs.niri.scratchspaces = [ { name = "pwctl"; -- cgit v1.2.3