diff options
137 files changed, 13499 insertions, 196 deletions
| @@ -3,6 +3,7 @@ keys: | |||
| 3 | - &machine_surtr age19a7j77w267z04zls7m28a8hj4a0g5af6ltye2d5wypg33c3l89csd4r9zq | 3 | - &machine_surtr age19a7j77w267z04zls7m28a8hj4a0g5af6ltye2d5wypg33c3l89csd4r9zq |
| 4 | - &machine_vidhar age1qffdqvy9arld9zd5a5cylt0n98xhcns5shxhrhwjq5g4qa844ejselaa4l | 4 | - &machine_vidhar age1qffdqvy9arld9zd5a5cylt0n98xhcns5shxhrhwjq5g4qa844ejselaa4l |
| 5 | - &machine_sif age1fj65apkhfkrwyv5tx6zcs9nkjg8267fy733qph30sc7zfn7vapjqkd5kne | 5 | - &machine_sif age1fj65apkhfkrwyv5tx6zcs9nkjg8267fy733qph30sc7zfn7vapjqkd5kne |
| 6 | - &machine_skadhi age1u6xegt79rarmyz8qy4pl7jh9lh90vx8fg0frmh4u2mzam7zydq4s4agz4e | ||
| 6 | 7 | ||
| 7 | creation_rules: | 8 | creation_rules: |
| 8 | - path_regex: ^hosts/surtr/email/ca | 9 | - path_regex: ^hosts/surtr/email/ca |
| @@ -34,4 +35,10 @@ creation_rules: | |||
| 34 | - age: [ *admin_gkleen, *machine_sif ] | 35 | - age: [ *admin_gkleen, *machine_sif ] |
| 35 | - path_regex: ^modules/nix-access-tokens/ | 36 | - path_regex: ^modules/nix-access-tokens/ |
| 36 | key_groups: | 37 | key_groups: |
| 37 | - age: [ *admin_gkleen, *machine_sif, *machine_surtr, *machine_vidhar ] | 38 | - age: [ *admin_gkleen, *machine_sif, *machine_skadhi, *machine_surtr, *machine_vidhar ] |
| 39 | - path_regex: ^hosts/skadhi/ | ||
| 40 | key_groups: | ||
| 41 | - age: [ *admin_gkleen, *machine_skadhi ] | ||
| 42 | - path_regex: skadhi(\/.*)?$ | ||
| 43 | key_groups: | ||
| 44 | - age: [ *admin_gkleen, *machine_skadhi ] | ||
diff --git a/_sources/generated.json b/_sources/generated.json index 55f10ad2..2fbb50c5 100644 --- a/_sources/generated.json +++ b/_sources/generated.json | |||
| @@ -111,11 +111,11 @@ | |||
| 111 | "passthru": null, | 111 | "passthru": null, |
| 112 | "pinned": false, | 112 | "pinned": false, |
| 113 | "src": { | 113 | "src": { |
| 114 | "sha256": "sha256-BgCeg0j0QTDma0refhQxwjv0olLauE4FoXyUyOUpIW4=", | 114 | "sha256": "sha256-LYDoTs7mZOHI85B7k59YZYGM30o9RSiNnQudF33zJ7c=", |
| 115 | "type": "tarball", | 115 | "type": "tarball", |
| 116 | "url": "https://github.com/wofr06/lesspipe/archive/refs/tags/v2.27.tar.gz" | 116 | "url": "https://github.com/wofr06/lesspipe/archive/refs/tags/v2.28.tar.gz" |
| 117 | }, | 117 | }, |
| 118 | "version": "2.27" | 118 | "version": "2.28" |
| 119 | }, | 119 | }, |
| 120 | "mpv-autosave": { | 120 | "mpv-autosave": { |
| 121 | "cargoLock": null, | 121 | "cargoLock": null, |
| @@ -193,12 +193,12 @@ | |||
| 193 | "name": null, | 193 | "name": null, |
| 194 | "owner": "hoyon", | 194 | "owner": "hoyon", |
| 195 | "repo": "mpv-mpris", | 195 | "repo": "mpv-mpris", |
| 196 | "rev": "1.2", | 196 | "rev": "1.3", |
| 197 | "sha256": "sha256-Q2kNaXZtI6U+x2f00x5CiHZq4o64xFTNC/3W4IiP0+4=", | 197 | "sha256": "sha256-jPncHlY2fIUzURhQ35ude1D8WkKQurAOdPedz1/osBU=", |
| 198 | "sparseCheckout": [], | 198 | "sparseCheckout": [], |
| 199 | "type": "github" | 199 | "type": "github" |
| 200 | }, | 200 | }, |
| 201 | "version": "1.2" | 201 | "version": "1.3" |
| 202 | }, | 202 | }, |
| 203 | "mpv-reload": { | 203 | "mpv-reload": { |
| 204 | "cargoLock": null, | 204 | "cargoLock": null, |
| @@ -270,11 +270,11 @@ | |||
| 270 | "pinned": false, | 270 | "pinned": false, |
| 271 | "src": { | 271 | "src": { |
| 272 | "name": null, | 272 | "name": null, |
| 273 | "sha256": "sha256-4PbBxZPh2grQg/nXoOOjWAhR9gJqNgR53oriAUrv0i8=", | 273 | "sha256": "sha256-Vrsh6fbXnq25R+cDGgiMmvzEiqHrmbJQLRYfCxxYaoI=", |
| 274 | "type": "url", | 274 | "type": "url", |
| 275 | "url": "https://github.com/netbootxyz/netboot.xyz/releases/download/3.0.2/netboot.xyz.efi" | 275 | "url": "https://github.com/netbootxyz/netboot.xyz/releases/download/3.0.3/netboot.xyz.efi" |
| 276 | }, | 276 | }, |
| 277 | "version": "3.0.2" | 277 | "version": "3.0.3" |
| 278 | }, | 278 | }, |
| 279 | "netbootxyz-lkrn": { | 279 | "netbootxyz-lkrn": { |
| 280 | "cargoLock": null, | 280 | "cargoLock": null, |
| @@ -285,11 +285,11 @@ | |||
| 285 | "pinned": false, | 285 | "pinned": false, |
| 286 | "src": { | 286 | "src": { |
| 287 | "name": null, | 287 | "name": null, |
| 288 | "sha256": "sha256-XuynuqxT/TVo+1FmhGmzPcQF8mF2TN+wxwxlp6HCSOE=", | 288 | "sha256": "sha256-uJNMT0plGVmRUSPt/ldDb695oKLzjIjDvDjtaTCxZdk=", |
| 289 | "type": "url", | 289 | "type": "url", |
| 290 | "url": "https://github.com/netbootxyz/netboot.xyz/releases/download/3.0.2/netboot.xyz.lkrn" | 290 | "url": "https://github.com/netbootxyz/netboot.xyz/releases/download/3.0.3/netboot.xyz.lkrn" |
| 291 | }, | 291 | }, |
| 292 | "version": "3.0.2" | 292 | "version": "3.0.3" |
| 293 | }, | 293 | }, |
| 294 | "postfix-mta-sts-resolver": { | 294 | "postfix-mta-sts-resolver": { |
| 295 | "cargoLock": null, | 295 | "cargoLock": null, |
| @@ -355,7 +355,7 @@ | |||
| 355 | }, | 355 | }, |
| 356 | "quickshell": { | 356 | "quickshell": { |
| 357 | "cargoLock": null, | 357 | "cargoLock": null, |
| 358 | "date": "2026-08-20", | 358 | "date": "2026-09-20", |
| 359 | "extract": null, | 359 | "extract": null, |
| 360 | "name": "quickshell", | 360 | "name": "quickshell", |
| 361 | "passthru": null, | 361 | "passthru": null, |
| @@ -365,13 +365,13 @@ | |||
| 365 | "fetchSubmodules": false, | 365 | "fetchSubmodules": false, |
| 366 | "leaveDotGit": false, | 366 | "leaveDotGit": false, |
| 367 | "name": null, | 367 | "name": null, |
| 368 | "rev": "9f807554e106f6b0670e60ead82b63f3c0c2ac26", | 368 | "rev": "fae96f1a5b7f53de9b7e40e5b53c0b7a2e97b1d7", |
| 369 | "sha256": "sha256-stV8Dxkrry6AbK8unyEjLNeDZcQtNE1TCgmjc8hdcxw=", | 369 | "sha256": "sha256-872tMDDYdjR983q7v2yDlnKOEBSPp5FXDdWF2q87gik=", |
| 370 | "sparseCheckout": [], | 370 | "sparseCheckout": [], |
| 371 | "type": "git", | 371 | "type": "git", |
| 372 | "url": "https://git.outfoxxed.me/quickshell/quickshell.git" | 372 | "url": "https://git.outfoxxed.me/quickshell/quickshell.git" |
| 373 | }, | 373 | }, |
| 374 | "version": "9f807554e106f6b0670e60ead82b63f3c0c2ac26" | 374 | "version": "fae96f1a5b7f53de9b7e40e5b53c0b7a2e97b1d7" |
| 375 | }, | 375 | }, |
| 376 | "scutiger": { | 376 | "scutiger": { |
| 377 | "cargoLock": null, | 377 | "cargoLock": null, |
diff --git a/_sources/generated.nix b/_sources/generated.nix index deada91d..00f69bfd 100644 --- a/_sources/generated.nix +++ b/_sources/generated.nix | |||
| @@ -72,10 +72,10 @@ | |||
| 72 | }; | 72 | }; |
| 73 | lesspipe = { | 73 | lesspipe = { |
| 74 | pname = "lesspipe"; | 74 | pname = "lesspipe"; |
| 75 | version = "2.27"; | 75 | version = "2.28"; |
| 76 | src = fetchTarball { | 76 | src = fetchTarball { |
| 77 | url = "https://github.com/wofr06/lesspipe/archive/refs/tags/v2.27.tar.gz"; | 77 | url = "https://github.com/wofr06/lesspipe/archive/refs/tags/v2.28.tar.gz"; |
| 78 | sha256 = "sha256-BgCeg0j0QTDma0refhQxwjv0olLauE4FoXyUyOUpIW4="; | 78 | sha256 = "sha256-LYDoTs7mZOHI85B7k59YZYGM30o9RSiNnQudF33zJ7c="; |
| 79 | }; | 79 | }; |
| 80 | }; | 80 | }; |
| 81 | mpv-autosave = { | 81 | mpv-autosave = { |
| @@ -118,13 +118,13 @@ | |||
| 118 | }; | 118 | }; |
| 119 | mpv-mpris = { | 119 | mpv-mpris = { |
| 120 | pname = "mpv-mpris"; | 120 | pname = "mpv-mpris"; |
| 121 | version = "1.2"; | 121 | version = "1.3"; |
| 122 | src = fetchFromGitHub { | 122 | src = fetchFromGitHub { |
| 123 | owner = "hoyon"; | 123 | owner = "hoyon"; |
| 124 | repo = "mpv-mpris"; | 124 | repo = "mpv-mpris"; |
| 125 | rev = "1.2"; | 125 | rev = "1.3"; |
| 126 | fetchSubmodules = false; | 126 | fetchSubmodules = false; |
| 127 | sha256 = "sha256-Q2kNaXZtI6U+x2f00x5CiHZq4o64xFTNC/3W4IiP0+4="; | 127 | sha256 = "sha256-jPncHlY2fIUzURhQ35ude1D8WkKQurAOdPedz1/osBU="; |
| 128 | }; | 128 | }; |
| 129 | }; | 129 | }; |
| 130 | mpv-reload = { | 130 | mpv-reload = { |
| @@ -169,18 +169,18 @@ | |||
| 169 | }; | 169 | }; |
| 170 | netbootxyz-efi = { | 170 | netbootxyz-efi = { |
| 171 | pname = "netbootxyz-efi"; | 171 | pname = "netbootxyz-efi"; |
| 172 | version = "3.0.2"; | 172 | version = "3.0.3"; |
| 173 | src = fetchurl { | 173 | src = fetchurl { |
| 174 | url = "https://github.com/netbootxyz/netboot.xyz/releases/download/3.0.2/netboot.xyz.efi"; | 174 | url = "https://github.com/netbootxyz/netboot.xyz/releases/download/3.0.3/netboot.xyz.efi"; |
| 175 | sha256 = "sha256-4PbBxZPh2grQg/nXoOOjWAhR9gJqNgR53oriAUrv0i8="; | 175 | sha256 = "sha256-Vrsh6fbXnq25R+cDGgiMmvzEiqHrmbJQLRYfCxxYaoI="; |
| 176 | }; | 176 | }; |
| 177 | }; | 177 | }; |
| 178 | netbootxyz-lkrn = { | 178 | netbootxyz-lkrn = { |
| 179 | pname = "netbootxyz-lkrn"; | 179 | pname = "netbootxyz-lkrn"; |
| 180 | version = "3.0.2"; | 180 | version = "3.0.3"; |
| 181 | src = fetchurl { | 181 | src = fetchurl { |
| 182 | url = "https://github.com/netbootxyz/netboot.xyz/releases/download/3.0.2/netboot.xyz.lkrn"; | 182 | url = "https://github.com/netbootxyz/netboot.xyz/releases/download/3.0.3/netboot.xyz.lkrn"; |
| 183 | sha256 = "sha256-XuynuqxT/TVo+1FmhGmzPcQF8mF2TN+wxwxlp6HCSOE="; | 183 | sha256 = "sha256-uJNMT0plGVmRUSPt/ldDb695oKLzjIjDvDjtaTCxZdk="; |
| 184 | }; | 184 | }; |
| 185 | }; | 185 | }; |
| 186 | postfix-mta-sts-resolver = { | 186 | postfix-mta-sts-resolver = { |
| @@ -223,17 +223,17 @@ | |||
| 223 | }; | 223 | }; |
| 224 | quickshell = { | 224 | quickshell = { |
| 225 | pname = "quickshell"; | 225 | pname = "quickshell"; |
| 226 | version = "9f807554e106f6b0670e60ead82b63f3c0c2ac26"; | 226 | version = "fae96f1a5b7f53de9b7e40e5b53c0b7a2e97b1d7"; |
| 227 | src = fetchgit { | 227 | src = fetchgit { |
| 228 | url = "https://git.outfoxxed.me/quickshell/quickshell.git"; | 228 | url = "https://git.outfoxxed.me/quickshell/quickshell.git"; |
| 229 | rev = "9f807554e106f6b0670e60ead82b63f3c0c2ac26"; | 229 | rev = "fae96f1a5b7f53de9b7e40e5b53c0b7a2e97b1d7"; |
| 230 | fetchSubmodules = false; | 230 | fetchSubmodules = false; |
| 231 | deepClone = false; | 231 | deepClone = false; |
| 232 | leaveDotGit = false; | 232 | leaveDotGit = false; |
| 233 | sparseCheckout = [ ]; | 233 | sparseCheckout = [ ]; |
| 234 | sha256 = "sha256-stV8Dxkrry6AbK8unyEjLNeDZcQtNE1TCgmjc8hdcxw="; | 234 | sha256 = "sha256-872tMDDYdjR983q7v2yDlnKOEBSPp5FXDdWF2q87gik="; |
| 235 | }; | 235 | }; |
| 236 | date = "2026-08-20"; | 236 | date = "2026-09-20"; |
| 237 | }; | 237 | }; |
| 238 | scutiger = { | 238 | scutiger = { |
| 239 | pname = "scutiger"; | 239 | pname = "scutiger"; |
diff --git a/accounts/gkleen@skadhi/default.nix b/accounts/gkleen@skadhi/default.nix new file mode 100644 index 00000000..5bb41677 --- /dev/null +++ b/accounts/gkleen@skadhi/default.nix | |||
| @@ -0,0 +1,322 @@ | |||
| 1 | { flake, flakeInputs, userName, config, pkgs, lib, customUtils, sources, ... }: | ||
| 2 | let | ||
| 3 | user = config.users.users.${userName}; | ||
| 4 | in { | ||
| 5 | imports = [ | ||
| 6 | ./greetd.nix ./rzm ./email ./keepassxc.nix | ||
| 7 | ] ++ (with flake.nixosModules.userProfiles.${userName}; [ | ||
| 8 | zsh mpv yt-dlp | ||
| 9 | ]) ++ (with flake.nixosModules.systemProfiles; [ | ||
| 10 | niri-unstable | ||
| 11 | flakeInputs.nixVirt.nixosModules.default | ||
| 12 | ]); | ||
| 13 | |||
| 14 | config = { | ||
| 15 | users.users.gkleen.group = "gkleen"; | ||
| 16 | users.groups.gkleen = {}; | ||
| 17 | systemd.tmpfiles.settings.home-directories."/persistent/${user.home}" = lib.mkForce { | ||
| 18 | v = { | ||
| 19 | mode = user.homeMode; | ||
| 20 | user = user.name; | ||
| 21 | inherit (user) group; | ||
| 22 | }; | ||
| 23 | }; | ||
| 24 | |||
| 25 | programs = { | ||
| 26 | dconf.enable = true; | ||
| 27 | niri.enable = true; | ||
| 28 | }; | ||
| 29 | environment.sessionVariables."GTK_USE_PORTAL" = "1"; | ||
| 30 | services.niri-autoselect-portal.enable = true; | ||
| 31 | xdg.portal = { | ||
| 32 | enable = true; | ||
| 33 | extraPortals = with pkgs; [ xdg-desktop-portal-gtk ]; | ||
| 34 | config.niri = { | ||
| 35 | default = lib.mkForce ["gnome" "gtk"]; | ||
| 36 | "org.freedesktop.impl.portal.FileChooser" = ["gtk"]; | ||
| 37 | "org.freedesktop.impl.portal.OpenFile" = ["gtk"]; | ||
| 38 | "org.freedesktop.impl.portal.Access" = ["gtk"]; | ||
| 39 | "org.freedesktop.impl.portal.Notification" = ["gtk"]; | ||
| 40 | "org.freedesktop.impl.portal.Secret" = ["none"]; | ||
| 41 | "org.freedesktop.impl.portal.Inhibit" = ["none"]; | ||
| 42 | }; | ||
| 43 | }; | ||
| 44 | |||
| 45 | security.pam.services.quickshell = {}; | ||
| 46 | |||
| 47 | services.upower.enable = true; | ||
| 48 | environment.persistence."/persistent".directories = [ | ||
| 49 | "/var/lib/upower" | ||
| 50 | ]; | ||
| 51 | |||
| 52 | services.dbus.packages = with pkgs; | ||
| 53 | [ dbus dconf | ||
| 54 | xdg-desktop-portal-gtk | ||
| 55 | gcr_4 | ||
| 56 | ]; | ||
| 57 | |||
| 58 | nixpkgs.externalConfig.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [ | ||
| 59 | "zoom" | ||
| 60 | ]; | ||
| 61 | |||
| 62 | home-manager.users.${userName} = { sysConfig, config, ... }: { | ||
| 63 | imports = [ | ||
| 64 | flakeInputs.nix-index-database.homeModules.nix-index | ||
| 65 | ./niri.nix ./shell ./emacs ./zsh ./ssh ./firefox | ||
| 66 | ]; | ||
| 67 | |||
| 68 | home.stateVersion = "26.05"; | ||
| 69 | |||
| 70 | home.persistence."/persistent" = { | ||
| 71 | directories = [ | ||
| 72 | "Downloads" "documents" "screenshots" "media" "projects" | ||
| 73 | ".local/share/direnv" ".local/share/nix" | ||
| 74 | ".config/Element" ".thunderbird" | ||
| 75 | ".config/chromium" | ||
| 76 | ".config/sops" | ||
| 77 | ".local/share/etesync-dav" | ||
| 78 | (lib.removePrefix (config.home.homeDirectory + "/") config.services.unison.pairs."documents".stateDirectory) | ||
| 79 | ".aqbanking" | ||
| 80 | ]; | ||
| 81 | }; | ||
| 82 | |||
| 83 | programs.nix-index.enable = true; | ||
| 84 | |||
| 85 | programs.alacritty = { | ||
| 86 | enable = true; | ||
| 87 | theme = "kitty"; | ||
| 88 | settings = { | ||
| 89 | font = { | ||
| 90 | normal = { | ||
| 91 | family = "Fira Mono"; | ||
| 92 | style = "Medium"; | ||
| 93 | }; | ||
| 94 | size = 10; | ||
| 95 | }; | ||
| 96 | hints = { | ||
| 97 | alphabet = "aoeuhtns"; | ||
| 98 | enabled = [ | ||
| 99 | { | ||
| 100 | command = lib.getExe' pkgs.xdg-utils "xdg-open"; | ||
| 101 | hyperlinks = true; | ||
| 102 | post_processing = true; | ||
| 103 | persist = false; | ||
| 104 | mouse.enabled = true; | ||
| 105 | binding = { key = "O"; mods = "Control|Shift"; }; | ||
| 106 | regex = "(ipfs:|ipns:|magnet:|mailto:|gemini://|gopher://|https://|http://|news:|file:|git://|ssh:|ftp://)[^\\u0000-\\u001F\\u007F-\\u009F<>\"\\\\s{-}\\\\^⟨⟩`\\\\\\\\]+"; | ||
| 107 | } | ||
| 108 | { | ||
| 109 | command = lib.getExe' pkgs.wl-clipboard-rs "wl-copy"; | ||
| 110 | hyperlinks = true; | ||
| 111 | post_processing = true; | ||
| 112 | persist = false; | ||
| 113 | mouse.enabled = true; | ||
| 114 | binding = { key = "Y"; mods = "Control|Shift"; }; | ||
| 115 | regex = "(ipfs:|ipns:|magnet:|mailto:|gemini://|gopher://|https://|http://|news:|file:|git://|ssh:|ftp://)[^\\u0000-\\u001F\\u007F-\\u009F<>\"\\\\s{-}\\\\^⟨⟩`\\\\\\\\]+"; | ||
| 116 | } | ||
| 117 | ]; | ||
| 118 | }; | ||
| 119 | terminal.shell.program = lib.getExe config.programs.zsh.package; | ||
| 120 | }; | ||
| 121 | }; | ||
| 122 | systemd.user.services.alacritty = { | ||
| 123 | Unit = { | ||
| 124 | Requisite = ["graphical-session.target"]; | ||
| 125 | After = [ "graphical-session.target" ]; | ||
| 126 | }; | ||
| 127 | Service = { | ||
| 128 | ExecStart = "${lib.getExe pkgs.alacritty} --daemon --socket %t/alacritty-activated.sock"; | ||
| 129 | }; | ||
| 130 | }; | ||
| 131 | systemd.user.services.alacritty-proxy = { | ||
| 132 | Unit = { | ||
| 133 | Requires = ["alacritty.service" "alacritty-proxy.socket"]; | ||
| 134 | After = ["alacritty.service" "alacritty-proxy.socket"]; | ||
| 135 | }; | ||
| 136 | Service = { | ||
| 137 | Type = "notify"; | ||
| 138 | ExecStart = "${sysConfig.systemd.package}/lib/systemd/systemd-socket-proxyd %t/alacritty-activated.sock"; | ||
| 139 | }; | ||
| 140 | }; | ||
| 141 | systemd.user.sockets."alacritty-proxy" = { | ||
| 142 | Socket = { | ||
| 143 | SocketMode = "0600"; | ||
| 144 | ListenStream = "%t/alacritty.sock"; | ||
| 145 | }; | ||
| 146 | Install = { | ||
| 147 | WantedBy = ["sockets.target"]; | ||
| 148 | }; | ||
| 149 | }; | ||
| 150 | programs.fuzzel = { | ||
| 151 | enable = true; | ||
| 152 | settings = { | ||
| 153 | main = { | ||
| 154 | terminal = "${lib.getExe config.programs.alacritty.package} msg --socket /run/user/1000/alacritty.sock create-window --command ${lib.getExe' sysConfig.systemd.package "systemd-run"} --user --pty --same-dir --wait --collect --quiet --service-type=exec --expand-environment=no {cmd}"; | ||
| 155 | layer = "overlay"; | ||
| 156 | icon-theme = "Paper"; | ||
| 157 | font = "Fira Sans"; | ||
| 158 | }; | ||
| 159 | colors = { | ||
| 160 | background = "000000cc"; | ||
| 161 | text = "cdd6f4ff"; | ||
| 162 | match = "94e2d5ff"; | ||
| 163 | selection = "585b70ff"; | ||
| 164 | selection-match = "94e2d5ff"; | ||
| 165 | selection-text = "cdd6f4ff"; | ||
| 166 | border = "b4befeff"; | ||
| 167 | }; | ||
| 168 | dmenu = { | ||
| 169 | exit-immediately-if-empty = true; | ||
| 170 | }; | ||
| 171 | }; | ||
| 172 | }; | ||
| 173 | |||
| 174 | services.xembed-sni-proxy = { | ||
| 175 | enable = true; | ||
| 176 | package = pkgs.kdePackages.plasma-workspace; | ||
| 177 | }; | ||
| 178 | services.network-manager-applet.enable = true; | ||
| 179 | services.blueman-applet.enable = true; | ||
| 180 | |||
| 181 | home.pointerCursor = { | ||
| 182 | enable = true; | ||
| 183 | package = pkgs.vanilla-dmz; | ||
| 184 | name = "Vanilla-DMZ-AA"; | ||
| 185 | size = 16; | ||
| 186 | |||
| 187 | x11 = { | ||
| 188 | enable = true; | ||
| 189 | defaultCursor = "left_ptr"; | ||
| 190 | }; | ||
| 191 | gtk.enable = true; | ||
| 192 | }; | ||
| 193 | |||
| 194 | gtk = { | ||
| 195 | enable = true; | ||
| 196 | font = { | ||
| 197 | package = pkgs.fira; | ||
| 198 | name = "Fira Sans"; | ||
| 199 | size = 10; | ||
| 200 | }; | ||
| 201 | theme = { | ||
| 202 | package = pkgs.kdePackages.breeze-gtk; | ||
| 203 | name = "Breeze-Dark"; | ||
| 204 | }; | ||
| 205 | iconTheme = { | ||
| 206 | package = pkgs.adwaita-icon-theme; | ||
| 207 | name = "Adwaita"; | ||
| 208 | }; | ||
| 209 | }; | ||
| 210 | qt.enable = true; | ||
| 211 | qt.platformTheme.name = "gtk3"; | ||
| 212 | |||
| 213 | qt.kde.settings.kwalletrc = { | ||
| 214 | KSecretD.Enabled = false; | ||
| 215 | Wallet."Default Wallet" = "store"; | ||
| 216 | }; | ||
| 217 | |||
| 218 | home.sessionVariables = { | ||
| 219 | QT_QPA_PLATFORMTHEME = lib.mkForce "gtk3"; | ||
| 220 | SYSTEMD_ADJUST_TERMINAL_TITLE = "false"; | ||
| 221 | SYSTEMD_TINT_BACKGROUND = "false"; | ||
| 222 | }; | ||
| 223 | home.extraProfileCommands = '' | ||
| 224 | export XDG_DATA_DIRS="${pkgs.gsettings-desktop-schemas}/share/gsettings-schemas/${pkgs.gsettings-desktop-schemas.name}:${pkgs.gtk3}/share/gsettings-schemas/${pkgs.gtk3.name}''${XDG_DATA_DIRS:+:''${XDG_DATA_DIRS}}" | ||
| 225 | ''; | ||
| 226 | |||
| 227 | xdg.configFile."systemd/user/home-manager.service.d/before-graphical-session.conf".text = '' | ||
| 228 | [Unit] | ||
| 229 | Before=graphical-session-pre.target | ||
| 230 | ''; | ||
| 231 | |||
| 232 | fonts = { | ||
| 233 | fontconfig.enable = true; | ||
| 234 | }; | ||
| 235 | |||
| 236 | i18n.inputMethod = { | ||
| 237 | enable = true; | ||
| 238 | type = "fcitx5"; | ||
| 239 | fcitx5 = { | ||
| 240 | waylandFrontend = true; | ||
| 241 | settings = { | ||
| 242 | globalOptions."Behavior/DisabledAddons" = { | ||
| 243 | "0" = "clipboard"; | ||
| 244 | }; | ||
| 245 | inputMethod = { | ||
| 246 | "Groups/0" = { | ||
| 247 | Name = "Default"; | ||
| 248 | "Default Layout" = "us"; | ||
| 249 | DefaultIM = "keyboard-us"; | ||
| 250 | }; | ||
| 251 | "Groups/0/Items/0" = { | ||
| 252 | Name = "keyboard-us"; | ||
| 253 | Layout = ""; | ||
| 254 | }; | ||
| 255 | "GroupOrder"."0" = "Default"; | ||
| 256 | }; | ||
| 257 | addons = { | ||
| 258 | classicui.globalSection = { | ||
| 259 | "Vertical Candidate List" = "True"; | ||
| 260 | Font = "Fira Sans 10"; | ||
| 261 | MenuFont = "Fira Sans 10"; | ||
| 262 | TrayFont = "Fira Sans Demi-Bold 10"; | ||
| 263 | UseDarkTheme = "True"; | ||
| 264 | }; | ||
| 265 | quickphrase = { | ||
| 266 | globalSection = { | ||
| 267 | "Choose Modifier" = "None"; | ||
| 268 | Spell = "True"; | ||
| 269 | FallbackSpellLanguage = "en"; | ||
| 270 | }; | ||
| 271 | sections.TriggerKey."0" = "Super+E"; | ||
| 272 | }; | ||
| 273 | }; | ||
| 274 | }; | ||
| 275 | }; | ||
| 276 | }; | ||
| 277 | |||
| 278 | home.packages = with pkgs; [ | ||
| 279 | pwvucontrol wl-clipboard-rs element-desktop thunderbird | ||
| 280 | papers zoom-us wireshark virt-manager rclone worktime | ||
| 281 | libreoffice sieve-connect gimp3 inkscape glab remmina openscad | ||
| 282 | spice-record libation gnucash | ||
| 283 | ] ++ lib.mapAttrsToList (_name: pkg: pkgs.callPackage pkg { inherit sources flake flakeInputs; }) (customUtils.nixImport { dir = ./utils; }); | ||
| 284 | |||
| 285 | dconf.settings = { | ||
| 286 | "org/gnome/desktop/interface".color-scheme = "prefer-dark"; | ||
| 287 | }; | ||
| 288 | |||
| 289 | services.etesync-dav = { | ||
| 290 | enable = true; | ||
| 291 | serverUrl = "https://etesync.yggdrasil.li"; | ||
| 292 | }; | ||
| 293 | |||
| 294 | programs.chromium.enable = true; | ||
| 295 | |||
| 296 | services.unison = { | ||
| 297 | enable = true; | ||
| 298 | pairs = { | ||
| 299 | documents = { | ||
| 300 | roots = ["${config.home.homeDirectory}/documents" "ssh://vidhar/documents"]; | ||
| 301 | stateDirectory = "${config.xdg.stateHome}/documents.unison"; | ||
| 302 | commandOptions = { | ||
| 303 | auto = "true"; | ||
| 304 | batch = "true"; | ||
| 305 | log = "false"; | ||
| 306 | repeat = "watch"; | ||
| 307 | sshcmd = toString (pkgs.runCommand "ssh-wrapped" { | ||
| 308 | buildInputs = [ pkgs.makeWrapper ]; | ||
| 309 | } '' | ||
| 310 | makeWrapper ${lib.getExe' pkgs.openssh "ssh"} $out \ | ||
| 311 | --add-flags ${lib.escapeShellArg "-o ControlMaster=no -o BatchMode=yes"} | ||
| 312 | ''); | ||
| 313 | ui = "text"; | ||
| 314 | }; | ||
| 315 | }; | ||
| 316 | }; | ||
| 317 | }; | ||
| 318 | |||
| 319 | programs.libreoffice.enable = true; | ||
| 320 | }; | ||
| 321 | }; | ||
| 322 | } | ||
diff --git a/accounts/gkleen@skadhi/emacs/default.nix b/accounts/gkleen@skadhi/emacs/default.nix new file mode 100644 index 00000000..70fd5c85 --- /dev/null +++ b/accounts/gkleen@skadhi/emacs/default.nix | |||
| @@ -0,0 +1,71 @@ | |||
| 1 | { pkgs, lib, config, sources, ... }: | ||
| 2 | let | ||
| 3 | editor = pkgs.symlinkJoin { | ||
| 4 | name = "${config.services.emacs.package.name}-editor"; | ||
| 5 | buildInputs = with pkgs; [ makeWrapper ]; | ||
| 6 | paths = [ config.services.emacs.package ]; | ||
| 7 | postBuild = '' | ||
| 8 | wrapProgram $out/bin/emacsclient \ | ||
| 9 | --inherit-argv0 \ | ||
| 10 | --add-flags ${lib.escapeShellArg (lib.escapeShellArgs config.services.emacs.client.arguments)} | ||
| 11 | ''; | ||
| 12 | }; | ||
| 13 | in { | ||
| 14 | config = { | ||
| 15 | home.persistence."/persistent".directories = [ | ||
| 16 | ".local/state/emacs/saves" ".local/state/emacs/undo" | ||
| 17 | ]; | ||
| 18 | |||
| 19 | programs.emacs = { | ||
| 20 | enable = true; | ||
| 21 | package = pkgs.emacs-pgtk; | ||
| 22 | extraPackages = epkgs: with epkgs; [ | ||
| 23 | evil evil-dvorak undo-tree magit haskell-tng-mode nix-mode | ||
| 24 | yaml-mode json-mode shakespeare-mode smart-mode-line | ||
| 25 | highlight-parentheses highlight-symbol ag sass-mode | ||
| 26 | lua-mode fira-code-mode use-package wanderlust # notmuch | ||
| 27 | git-gutter scratch edit-server mediawiki editorconfig | ||
| 28 | typescript-mode markdown-mode nftables-mode rustic | ||
| 29 | lsp-mode lsp-ui direnv company projectile | ||
| 30 | tomorrow-night-paradise-theme | ||
| 31 | treesit-grammars.with-all-grammars magit-delta scad-mode | ||
| 32 | typst-ts-mode | ||
| 33 | ]; | ||
| 34 | overrides = self: super: { | ||
| 35 | tomorrow-night-paradise-theme = super.trivialBuild { | ||
| 36 | inherit (sources.tomorrow-night-paradise-theme) pname version src; | ||
| 37 | }; | ||
| 38 | scratch = pkgs.stdenv.mkDerivation { | ||
| 39 | inherit (sources.emacs-scratch_el) pname version src; | ||
| 40 | |||
| 41 | phases = [ "unpackPhase" "installPhase" ]; | ||
| 42 | |||
| 43 | installPhase = '' | ||
| 44 | install -Dt $out/share/emacs/site-lisp scratch.el | ||
| 45 | ''; | ||
| 46 | }; | ||
| 47 | }; | ||
| 48 | }; | ||
| 49 | xdg.configFile."emacs/init.el".source = pkgs.substitute { | ||
| 50 | src = ./emacs.el; | ||
| 51 | substitutions = [ | ||
| 52 | "--subst-var-by" "ksshaskpass" (lib.getExe pkgs.kdePackages.ksshaskpass) | ||
| 53 | ]; | ||
| 54 | }; | ||
| 55 | |||
| 56 | home.sessionVariables.EDITOR = lib.getExe' editor "emacsclient"; | ||
| 57 | |||
| 58 | services.emacs = { | ||
| 59 | enable = true; | ||
| 60 | socketActivation.enable = true; | ||
| 61 | client = { | ||
| 62 | enable = true; | ||
| 63 | arguments = lib.mkForce ["--create-frame" "--alternate-editor" (lib.getExe config.services.emacs.package)]; | ||
| 64 | }; | ||
| 65 | }; | ||
| 66 | |||
| 67 | home.packages = with pkgs; [ | ||
| 68 | fira fira-code fira-code-symbols nerd-fonts.fira-mono nerd-fonts.symbols-only nerd-fonts.fira-code powerline-fonts | ||
| 69 | ]; | ||
| 70 | }; | ||
| 71 | } | ||
diff --git a/accounts/gkleen@skadhi/emacs/emacs.el b/accounts/gkleen@skadhi/emacs/emacs.el new file mode 100644 index 00000000..42d8b625 --- /dev/null +++ b/accounts/gkleen@skadhi/emacs/emacs.el | |||
| @@ -0,0 +1,259 @@ | |||
| 1 | (menu-bar-mode -1) | ||
| 2 | (scroll-bar-mode -1) | ||
| 3 | (tool-bar-mode -1) | ||
| 4 | |||
| 5 | (setq inhibit-startup-message t) | ||
| 6 | (defalias 'yes-or-no-p 'y-or-n-p) | ||
| 7 | |||
| 8 | ;; (set-face-attribute 'default nil :font "Fira Code" :height 49) | ||
| 9 | (set-frame-font "Fira Code 8" nil nil) | ||
| 10 | (load-theme 'modus-vivendi t) | ||
| 11 | ;; (add-to-list 'default-frame-alist '(alpha-background . 90)) | ||
| 12 | |||
| 13 | (require 'package) | ||
| 14 | (setq package-archives nil) | ||
| 15 | (package-initialize) | ||
| 16 | (require 'use-package) | ||
| 17 | ;; (use-package use-package-ensure-system-package :ensure t) | ||
| 18 | |||
| 19 | (require 'evil) | ||
| 20 | (evil-mode 1) | ||
| 21 | |||
| 22 | (editorconfig-mode 1) | ||
| 23 | |||
| 24 | (require 'edit-server) | ||
| 25 | (edit-server-start) | ||
| 26 | |||
| 27 | (require 'mediawiki) | ||
| 28 | (setq mediawiki-mode-hook | ||
| 29 | (lambda () | ||
| 30 | (define-key mediawiki-mode-map (kbd "<C-left>") nil) | ||
| 31 | (define-key mediawiki-mode-map (kbd "<C-right>") nil))) | ||
| 32 | |||
| 33 | (require 'typescript-mode) | ||
| 34 | |||
| 35 | (global-subword-mode) | ||
| 36 | (global-undo-tree-mode) | ||
| 37 | (global-fira-code-mode) | ||
| 38 | |||
| 39 | (evil-set-undo-system 'undo-tree) | ||
| 40 | |||
| 41 | (add-hook 'magit-mode-hook (lambda () (magit-delta-mode +1))) | ||
| 42 | |||
| 43 | (global-set-key (kbd "RET") 'newline-and-indent) | ||
| 44 | (global-set-key (kbd "M-g") 'magit-status) | ||
| 45 | (global-set-key (kbd "M-?") 'vc-git-grep) | ||
| 46 | |||
| 47 | (require 'git-gutter) | ||
| 48 | (global-git-gutter-mode t) | ||
| 49 | (custom-set-variables '(git-gutter:update-interval 2)) | ||
| 50 | (custom-set-variables '(git-gutter:hide-gutter t)) | ||
| 51 | |||
| 52 | (require 'scratch) | ||
| 53 | ;; (global-set-key (kbd "C-x b") 'scratch-switch-to-buffer) | ||
| 54 | (global-set-key (kbd "C-x B") 'scratch-create) | ||
| 55 | ;; (setq initial-major-mode 'scratch-mode) | ||
| 56 | (setq initial-scratch-message "") | ||
| 57 | |||
| 58 | (global-set-key (kbd "C-x K") 'kill-current-buffer) | ||
| 59 | |||
| 60 | (setq backup-directory-alist `(("." . "~/.local/state/emacs/saves"))) | ||
| 61 | (setq undo-tree-history-directory-alist `(("." . "~/.local/state/emacs/undo"))) | ||
| 62 | (setq delete-old-versions t | ||
| 63 | kept-new-versions 6 | ||
| 64 | kept-old-versions 2 | ||
| 65 | version-control t) | ||
| 66 | |||
| 67 | (setq undo-tree-visualizer-timestamps t | ||
| 68 | undo-tree-visualizer-diff t | ||
| 69 | ;; 10X bump of the undo limits to avoid issues with premature | ||
| 70 | ;; Emacs GC which truncages the undo history very aggresively | ||
| 71 | undo-limit 800000 | ||
| 72 | undo-strong-limit 12000000 | ||
| 73 | undo-outer-limit 120000000) | ||
| 74 | |||
| 75 | (add-hook 'haskell-mode-hook 'haskell-indentation-mode) | ||
| 76 | (add-hook 'haskell-mode-hook 'subword-mode) | ||
| 77 | (add-hook 'haskell-mode-hook 'highlight-symbol-mode) | ||
| 78 | (add-hook 'haskell-mode-hook 'highlight-paretheses-mode) | ||
| 79 | |||
| 80 | (add-hook 'js-mode-hook 'highlight-symbol-mode) | ||
| 81 | (add-hook 'js-mode-hook 'highlight-parentheses-mode) | ||
| 82 | (defun my-js-mode-hook () | ||
| 83 | "Custom `js-mode' behaviours." | ||
| 84 | (setq js-indent-level 2) | ||
| 85 | ) | ||
| 86 | (add-hook 'js-mode-hook 'my-js-mode-hook) | ||
| 87 | |||
| 88 | (define-derived-mode anansi-mode | ||
| 89 | markdown-mode "Anansi" | ||
| 90 | "Major mode for anansi" | ||
| 91 | (lambda () (setq indent-tabs-mode nil))) | ||
| 92 | (add-to-list 'auto-mode-alist '("\\.anansi\\'" . anansi-mode)) | ||
| 93 | |||
| 94 | (projectile-mode +1) | ||
| 95 | (define-key projectile-mode-map (kbd "s-p") 'projectile-command-map) | ||
| 96 | |||
| 97 | (add-hook 'rustic-mode-hook (lambda () (setq indent-tabs-mode nil))) | ||
| 98 | (add-hook 'rustic-mode-hook #'lsp-deferred) | ||
| 99 | (add-hook 'rustic-mode-hook (lambda () (setq lsp-ui-sideline-enable nil))) | ||
| 100 | (setq lsp-auto-guess-root t) | ||
| 101 | (setq lsp-inlay-hint-enable t) | ||
| 102 | ;; (add-hook 'rust-mode-hook 'lsp-inlay-hints-mode) | ||
| 103 | (setq lsp-rust-analyzer-server-display-inlay-hints t) | ||
| 104 | (setq lsp-rust-analyzer-inlay-hints-mode t) | ||
| 105 | (setq lsp-rust-analyzer-display-parameter-hints t) | ||
| 106 | (setq lsp-rust-analyzer-display-chaining-hints t) | ||
| 107 | (setq lsp-rust-analyzer-hide-named-constructor nil) | ||
| 108 | |||
| 109 | (setq undo-tree-auto-save-history t) | ||
| 110 | |||
| 111 | (defvar expand-file-name-custom-tilde-alist '(("u2w-srv01" . "/ssh:srv01.uniworx.de:/home/gkleen/projects/uni2work") ("fra-srv01" . "/ssh:srv01.uniworx.de:/home/gkleen/projects/fradrive"))) | ||
| 112 | (defun my/add-to-tilde-alist (hash) | ||
| 113 | (let* ((tilde:dir (split-string hash "=")) | ||
| 114 | (tilde (car tilde:dir)) | ||
| 115 | (dir (cadr tilde:dir))) | ||
| 116 | (push (cons tilde dir) expand-file-name-custom-tilde-alist))) | ||
| 117 | (mapc #'my/add-to-tilde-alist | ||
| 118 | (split-string (let ((process-environment (cl-copy-list process-environment))) (setenv "TERM" nil) (with-output-to-string (call-process "script" nil standard-output nil "-qec" "zsh -ic \"hash -d\"" "/dev/null"))) | ||
| 119 | "\r\n" t)) | ||
| 120 | |||
| 121 | (defadvice expand-file-name (before expand-file-name-custom-tilde | ||
| 122 | (name &optional default-directory) | ||
| 123 | activate compile) | ||
| 124 | "User-defined expansions for ~NAME in file names." | ||
| 125 | (save-match-data | ||
| 126 | (when (string-match "\\`\\(\\(.*/\\)?~\\([^:/]+\\)\\)/" name) | ||
| 127 | (let ((replacement (assoc (match-string 3 name) expand-file-name-custom-tilde-alist))) | ||
| 128 | (when replacement | ||
| 129 | (setq name (replace-match (cdr replacement) t t name 1))))))) | ||
| 130 | |||
| 131 | (setq edit-server-new-frame nil) | ||
| 132 | (setq edit-server-url-major-mode-alist '(("rzint\\.mathinst\\.loc" . mediawiki-mode))) | ||
| 133 | |||
| 134 | ;; (setq notmuch-address-internal-completion '(received nil)) | ||
| 135 | ;; (setq notmuch-always-prompt-for-sender t) | ||
| 136 | ;; (setq notmuch-command "notmuch-ssh") | ||
| 137 | ;; (setq notmuch-crypto-process-mime t) | ||
| 138 | ;; (setq notmuch-draft-tags '("+draft" "-inbox")) | ||
| 139 | ;; (setq notmuch-fcc-dirs nil) | ||
| 140 | ;; (setq notmuch-hello-sections '(notmuch-hello-insert-header notmuch-hello-insert-saved-searches)) | ||
| 141 | ;; (setq notmuch-hello-thousands-separator " ") | ||
| 142 | ;; (setq notmuch-identities '("gkleen@yggdrasil.li" "g@141.li" "kleen@cip.ifi.lmu.de" "Gregor.Kleen@stud.ifi.lmu.de" "G.Kleen@campus.lmu.de" "G.Kleen@lmu.de" "gregor.kleen@ifi.lmu.de" "uni2work@ifi.lmu.de" "gregor@kleen.li")) | ||
| 143 | ;; (setq notmuch-message-headers '("Subject" "To" "Cc" "Date")) | ||
| 144 | ;; (setq notmuch-message-replied-tags '("+replied" "-unread" "-inbox")) | ||
| 145 | ;; (setq notmuch-saved-searches | ||
| 146 | ;; (quote | ||
| 147 | ;; ((:name "inbox" :query "tag:inbox" :key "i") | ||
| 148 | ;; (:name "unread" :query "tag:unread AND tag:inbox" :key "u") | ||
| 149 | ;; (:name "drafts" :query "tag:draft" :key "d") | ||
| 150 | ;; (:name "all mail" :query "date:month.." :key "a" :count-query "*") | ||
| 151 | ;; (:name "sent" :query "is:sent" :key "s" :count-query "is:sent") | ||
| 152 | ;; ))) | ||
| 153 | ;; (setq notmuch-search-oldest-first nil) | ||
| 154 | ;; (setq notmuch-show-all-tags-list t) | ||
| 155 | ;; (setq notmuch-show-logo nil) | ||
| 156 | |||
| 157 | (setq send-mail-function 'sendmail-send-it) | ||
| 158 | (setq mail-envelope-from 'header) | ||
| 159 | (setq mail-specify-envelope-from 't) | ||
| 160 | (setq mail-default-headers nil) | ||
| 161 | (setq message-default-headers "") | ||
| 162 | (setq message-default-mail-headers "") | ||
| 163 | (setq message-sendmail-envelope-from 'header) | ||
| 164 | |||
| 165 | (setq highlight-symbol-idle-delay 0) | ||
| 166 | |||
| 167 | (setq indent-tabs-mode nil) | ||
| 168 | |||
| 169 | (setq ido-enable-flex-matching t) | ||
| 170 | (setq ido-everywhere t) | ||
| 171 | (ido-mode 1) | ||
| 172 | |||
| 173 | (setq tramp-default-method "ssh") | ||
| 174 | (customize-set-variable 'tramp-use-ssh-controlmaster-options nil) | ||
| 175 | (setq tramp-allow-unsafe-temporary-files t) | ||
| 176 | |||
| 177 | (direnv-mode) | ||
| 178 | (setq direnv-enabled-hosts '("uni2work-dev1")) | ||
| 179 | |||
| 180 | (setq auth-sources '()) | ||
| 181 | |||
| 182 | (setq ring-bell-function 'ignore) | ||
| 183 | |||
| 184 | (setq enable-remote-dir-locals 't) | ||
| 185 | |||
| 186 | (setq-default indicate-empty-lines t) | ||
| 187 | (setq-default show-trailing-whitespace t) | ||
| 188 | |||
| 189 | (defun tramp-sh-handle-start-file-process@my-direnv (args) | ||
| 190 | "Enable Direnv for hosts in `direnv-enabled-hosts'." | ||
| 191 | (with-parsed-tramp-file-name (expand-file-name default-directory) nil | ||
| 192 | (if (member host direnv-enabled-hosts) | ||
| 193 | (pcase-let ((`(,name ,buffer ,program . ,args) args)) | ||
| 194 | `(,name | ||
| 195 | ,buffer | ||
| 196 | "direnv" | ||
| 197 | "exec" | ||
| 198 | ,localname | ||
| 199 | ,program | ||
| 200 | ,@args)) | ||
| 201 | args))) | ||
| 202 | |||
| 203 | (with-eval-after-load "tramp-sh" | ||
| 204 | (advice-add 'tramp-sh-handle-start-file-process | ||
| 205 | :filter-args #'tramp-sh-handle-start-file-process@my-direnv)) | ||
| 206 | |||
| 207 | (setq mail-host-address "sif.midgard.yggdrasil") | ||
| 208 | (setq user-full-name "Gregor Kleen") | ||
| 209 | |||
| 210 | (defun tell-emacsclients-for-buffer-to-die () | ||
| 211 | "Sends error exit command to every client for the current buffer." | ||
| 212 | (interactive) | ||
| 213 | (dolist (proc server-buffer-clients) | ||
| 214 | (server-send-string proc "-error die"))) | ||
| 215 | |||
| 216 | (defun kill-buffer-with-special-emacsclient-handling () | ||
| 217 | "Wrapper around kill-buffer that ensures tell-emacsclients-for-buffer-to-die is on the hooks" | ||
| 218 | (interactive) | ||
| 219 | (add-hook 'kill-buffer-hook 'tell-emacsclients-for-buffer-to-die nil t) | ||
| 220 | (kill-buffer)) | ||
| 221 | |||
| 222 | ;; (global-set-key (kbd "C-x k") 'kill-buffer) | ||
| 223 | |||
| 224 | (defun install-emacsclient-wrapped-kill-buffer () | ||
| 225 | "Installs wrapped kill-buffer with special emacsclient handling. | ||
| 226 | Best not to install it unconditionally because the server is not | ||
| 227 | necessarily running." | ||
| 228 | (interactive) | ||
| 229 | (global-set-key (kbd "C-x k") 'kill-buffer-with-special-emacsclient-handling)) | ||
| 230 | |||
| 231 | (add-hook 'server-switch-hook 'install-emacsclient-wrapped-kill-buffer) | ||
| 232 | (add-hook 'server-switch-hook #'raise-frame) | ||
| 233 | |||
| 234 | (defun move-file (new-location) | ||
| 235 | "Write this file to NEW-LOCATION, and delete the old one." | ||
| 236 | (interactive (list (expand-file-name | ||
| 237 | (if buffer-file-name | ||
| 238 | (read-file-name "Move file to: ") | ||
| 239 | (read-file-name "Move file to: " | ||
| 240 | default-directory | ||
| 241 | (expand-file-name (file-name-nondirectory (buffer-name)) | ||
| 242 | default-directory)))))) | ||
| 243 | (when (file-exists-p new-location) | ||
| 244 | (delete-file new-location)) | ||
| 245 | (let ((old-location (expand-file-name (buffer-file-name)))) | ||
| 246 | (message "old file is %s and new file is %s" | ||
| 247 | old-location | ||
| 248 | new-location) | ||
| 249 | (write-file new-location t) | ||
| 250 | (when (and old-location | ||
| 251 | (file-exists-p new-location) | ||
| 252 | (not (string-equal old-location new-location))) | ||
| 253 | (delete-file old-location)))) | ||
| 254 | |||
| 255 | (bind-key "C-x C-m" #'move-file) | ||
| 256 | |||
| 257 | (let ((ssh_auth_sock (string-chop-newline (shell-command-to-string "gpgconf --list-dirs agent-ssh-socket")))) (setenv "SSH_AUTH_SOCK" ssh_auth_sock)) | ||
| 258 | (setenv "SSH_ASKPASS_REQUIRE" "prefer") | ||
| 259 | (setenv "SSH_ASKPASS" "@ksshaskpass@") | ||
diff --git a/accounts/gkleen@skadhi/email/default.nix b/accounts/gkleen@skadhi/email/default.nix new file mode 100644 index 00000000..aaf15901 --- /dev/null +++ b/accounts/gkleen@skadhi/email/default.nix | |||
| @@ -0,0 +1,111 @@ | |||
| 1 | { config, lib, pkgs, ... }: | ||
| 2 | { | ||
| 3 | services.postfix = { | ||
| 4 | enable = true; | ||
| 5 | enableSmtp = false; | ||
| 6 | enableSubmission = false; | ||
| 7 | setSendmail = true; | ||
| 8 | # networksStyle = "host"; | ||
| 9 | settings.main = { | ||
| 10 | recpipient_delimiter = "+"; | ||
| 11 | mydestination = []; | ||
| 12 | myhostname = "skadhi.midgard.yggdrasil"; | ||
| 13 | |||
| 14 | mydomain = "yggdrasil.li"; | ||
| 15 | |||
| 16 | local_transport = "error:5.1.1 No local delivery"; | ||
| 17 | alias_database = []; | ||
| 18 | alias_maps = []; | ||
| 19 | local_recipient_maps = []; | ||
| 20 | |||
| 21 | inet_interfaces = "loopback-only"; | ||
| 22 | |||
| 23 | message_size_limit = 0; | ||
| 24 | |||
| 25 | authorized_submit_users = "inline:{ gkleen= }"; | ||
| 26 | authorized_flush_users = "inline:{ gkleen= }"; | ||
| 27 | authorized_mailq_users = "inline:{ gkleen= }"; | ||
| 28 | |||
| 29 | smtp_generic_maps = "inline:{ root=root+skadhi }"; | ||
| 30 | |||
| 31 | mynetworks = ["127.0.0.0/8" "[::1]/128"]; | ||
| 32 | smtpd_client_restrictions = ["permit_mynetworks" "reject"]; | ||
| 33 | smtpd_relay_restrictions = ["permit_mynetworks" "reject"]; | ||
| 34 | |||
| 35 | sender_dependent_default_transport_maps = ''regexp:${pkgs.writeText "sender_relay" '' | ||
| 36 | /@(cip|stud)\.ifi\.(lmu|uni-muenchen)\.de$/ smtp:smtp.ifi.lmu.de | ||
| 37 | /@ifi\.(lmu|uni-muenchen)\.de$/ smtp:smtpin1.ifi.lmu.de:587 | ||
| 38 | /@math(ematik)?\.(lmu|uni-muenchen)\.de$/ smtps:smtp.math.lmu.de:465 | ||
| 39 | /@(campus\.)?lmu\.de$/ smtp:postout.lrz.de | ||
| 40 | ''}''; | ||
| 41 | sender_bcc_maps = ''regexp:${pkgs.writeText "sender_bcc" '' | ||
| 42 | /^uni2work(-[^@]*)?@ifi\.lmu\.de$/ uni2work@ifi.lmu.de | ||
| 43 | /@ifi\.lmu\.de$/ gregor.kleen@ifi.lmu.de | ||
| 44 | ''}''; | ||
| 45 | relayhost = ["[surtr.yggdrasil.li]:465"]; | ||
| 46 | default_transport = "relay"; | ||
| 47 | |||
| 48 | smtp_sasl_auth_enable = true; | ||
| 49 | smtp_sender_dependent_authentication = true; | ||
| 50 | smtp_sasl_tls_security_options = "noanonymous"; | ||
| 51 | smtp_sasl_mechanism_filter = ["plain"]; | ||
| 52 | smtp_sasl_password_maps = "regexp:/run/credentials/postfix.service/sasl_passwd"; | ||
| 53 | smtp_cname_overrides_servername = false; | ||
| 54 | smtp_always_send_ehlo = true; | ||
| 55 | smtp_tls_security_level = "dane"; | ||
| 56 | |||
| 57 | smtp_tls_loglevel = "1"; | ||
| 58 | smtp_dns_support_level = "dnssec"; | ||
| 59 | }; | ||
| 60 | settings.master = { | ||
| 61 | submission = { | ||
| 62 | type = "inet"; | ||
| 63 | private = false; | ||
| 64 | command = "smtpd"; | ||
| 65 | args = [ | ||
| 66 | "-o" "syslog_name=postfix/$service_name" | ||
| 67 | ]; | ||
| 68 | }; | ||
| 69 | smtp = { }; | ||
| 70 | smtps = { | ||
| 71 | type = "unix"; | ||
| 72 | private = true; | ||
| 73 | privileged = true; | ||
| 74 | chroot = false; | ||
| 75 | command = "smtp"; | ||
| 76 | args = [ | ||
| 77 | "-o" "smtp_tls_wrappermode=yes" | ||
| 78 | "-o" "smtp_tls_security_level=encrypt" | ||
| 79 | ]; | ||
| 80 | }; | ||
| 81 | relay = { | ||
| 82 | command = "smtp"; | ||
| 83 | args = [ | ||
| 84 | "-o" "smtp_fallback_relay=" | ||
| 85 | "-o" "smtp_tls_security_level=verify" | ||
| 86 | "-o" "smtp_tls_wrappermode=yes" | ||
| 87 | "-o" "smtp_tls_cert_file=${./relay.crt}" | ||
| 88 | "-o" "smtp_tls_key_file=/run/credentials/postfix.service/relay.key" | ||
| 89 | ]; | ||
| 90 | }; | ||
| 91 | }; | ||
| 92 | }; | ||
| 93 | |||
| 94 | systemd.services.postfix = { | ||
| 95 | serviceConfig.LoadCredential = [ | ||
| 96 | "sasl_passwd:${config.sops.secrets."postfix-sasl-passwd".path}" | ||
| 97 | "relay.key:${config.sops.secrets."relay-key".path}" | ||
| 98 | ]; | ||
| 99 | }; | ||
| 100 | |||
| 101 | sops.secrets = { | ||
| 102 | postfix-sasl-passwd = { | ||
| 103 | key = "sasl-passwd"; | ||
| 104 | sopsFile = ./secrets.yaml; | ||
| 105 | }; | ||
| 106 | relay-key = { | ||
| 107 | format = "binary"; | ||
| 108 | sopsFile = ./relay.key; | ||
| 109 | }; | ||
| 110 | }; | ||
| 111 | } | ||
diff --git a/accounts/gkleen@skadhi/email/relay.crt b/accounts/gkleen@skadhi/email/relay.crt new file mode 100644 index 00000000..ac13e7cb --- /dev/null +++ b/accounts/gkleen@skadhi/email/relay.crt | |||
| @@ -0,0 +1,11 @@ | |||
| 1 | -----BEGIN CERTIFICATE----- | ||
| 2 | MIIBjDCCAQygAwIBAgIPQAAAAGgLfNoL/PSMAsutMAUGAytlcTAXMRUwEwYDVQQD | ||
| 3 | DAx5Z2dkcmFzaWwubGkwHhcNMjUwNDI1MTIwOTQ1WhcNMzUwNDI2MTIxNDQ1WjAR | ||
| 4 | MQ8wDQYDVQQDDAZna2xlZW4wKjAFBgMrZXADIQB3outi3/3F4YO7Q97WAAaMHW0a | ||
| 5 | m+Blldrgee+EZnWnD6N1MHMwHwYDVR0jBBgwFoAUTtn+VjMw6Ge1f68KD8dT1CWn | ||
| 6 | l3YwHQYDVR0OBBYEFFOa4rYZYMbXUVdKv98NB504GUhjMA4GA1UdDwEB/wQEAwID | ||
| 7 | 6DAMBgNVHRMBAf8EAjAAMBMGA1UdJQQMMAoGCCsGAQUFBwMCMAUGAytlcQNzABC0 | ||
| 8 | 0UgIt7gLZrU1TmzGoqPBris8R1DbKOJacicF5CU0MIIjHcX7mPFW8KtB4qm6KcPq | ||
| 9 | kF6IaEPmgKpX3Nubk8HJik9vhIy9ysfINcVTvzXx8pO1bxbvREJRyA/apj10nzav | ||
| 10 | yauId0cXHvN6g5RLAMsMAA== | ||
| 11 | -----END CERTIFICATE----- | ||
diff --git a/accounts/gkleen@skadhi/email/relay.key b/accounts/gkleen@skadhi/email/relay.key new file mode 100644 index 00000000..109241d9 --- /dev/null +++ b/accounts/gkleen@skadhi/email/relay.key | |||
| @@ -0,0 +1,19 @@ | |||
| 1 | { | ||
| 2 | "data": "ENC[AES256_GCM,data:lBlTuzOS75pvRmcTKT4KhHMH44RlE2SvCFAUP+GfsXws1Uai7DZ1MmbhvxxCa+pcLW19+sQYxrXLRNZWby1yOeKBJ2UQeYV5LOk9LSL/WIE3FZkCo5Dv0O0gSFKjjb61WN22a4JnHbLWADf/mLT3GZv91XfvFDo=,iv:ho8wQH3UNzX9JPW5gVcUGtxZzdVwsMFus0Z4KYe5t48=,tag:dAgZyHOva2xVVhE1nTl+lg==,type:str]", | ||
| 3 | "sops": { | ||
| 4 | "age": [ | ||
| 5 | { | ||
| 6 | "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBzZ2gxbU5YYVkvdkF0eTB2\nU25RL254NHp1UFlwTWtPSEpnSmp0cng1dkVjCnZuSU96V2R5OVMxcU9XSDhmT3Az\nWExhelo4Wi9nU2ZycCtyM2F0VWpVVjQKLS0tIFpHZmRNSU9aSk0yeUFkSytVaC9B\nTHBpU2RudDFHY2czYjdMZ2p5T0VPUWcKQzVYd29LnP7v5+tOatkjugEP8LGLr8Dj\nTNC8ZxVRqQwyiTM29elmzJMD1xY1unZi/jLGiDrZi7Arsc10npt2Sw==\n-----END AGE ENCRYPTED FILE-----\n", | ||
| 7 | "recipient": "age1rmmhetcmllq0ahl5qznlr0eya2zdxwl9h6y5wnl97d2wtyx5t99sm2u866" | ||
| 8 | }, | ||
| 9 | { | ||
| 10 | "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBpVkltdnVzWUhDYjFPVm1w\nTmlDMGdHTlZkUVpuNEM0OGtHTkZ1ZE1jclJvCjZBUHo0NjF3S3UyWFRpV0lCREJO\nYlJpVXJ4TTMwMjBKVVF6a3RwSnZ5VWMKLS0tIGx6WkZZY0N1cGFwb0hsR3ZzOFdC\nRWxqcW5MR0JHVlBwcm43bFJKTTdaZWcKFETZni5oEHnj197CiHk56EtJO3labtFo\npe8jvh81iZIiLdZxhazhh25d3+GGT1NXtQwKcRIsGPBG5PJdul8aNg==\n-----END AGE ENCRYPTED FILE-----\n", | ||
| 11 | "recipient": "age1u6xegt79rarmyz8qy4pl7jh9lh90vx8fg0frmh4u2mzam7zydq4s4agz4e" | ||
| 12 | } | ||
| 13 | ], | ||
| 14 | "lastmodified": "2025-04-25T12:14:44Z", | ||
| 15 | "mac": "ENC[AES256_GCM,data:pObl2bJA93az9E3Ya+hA3ekI8TKKZ9NNTi0KzmWZBOiQwi9FuQYtpnmmT80L1KXWyOKJV6wGdAri3mNe/ue2S0TziSbQ/4+Dj4ubFKgkH7thb5q2dFyxw5FzhYzRQiXFqD/pxcNN9uL0lQI2Al0Eci0zX8Kcd1rAQ6RzLEoSmco=,iv:zo/3QFKTUEDxLy1k5yyU7Z1JMZ7cKdYUc6GHjaTTZKQ=,tag:f63Eja3lBfwJCYAOyEt56g==,type:str]", | ||
| 16 | "unencrypted_suffix": "_unencrypted", | ||
| 17 | "version": "3.10.2" | ||
| 18 | } | ||
| 19 | } | ||
diff --git a/accounts/gkleen@skadhi/email/secrets.yaml b/accounts/gkleen@skadhi/email/secrets.yaml new file mode 100644 index 00000000..fa634212 --- /dev/null +++ b/accounts/gkleen@skadhi/email/secrets.yaml | |||
| @@ -0,0 +1,25 @@ | |||
| 1 | sasl-passwd: ENC[AES256_GCM,data:L5QOQTEOplm9rQ+PuyDUl492ZTgIgZdRXNCNRaPQ4FLU+ha0GO7rjYWAOtvW7/oVdALrkQveSpBolnLG0nayvkjLpPuA6o9brR6bky52QmhOd8cYN9LMOhJcLJTwpUuvDesXkJD1mWA+ifuPnK6elVEfPuOndzMyw8MEvbPl53yCKQ7HOJc2nGvneD5QFkiHB9W9MmrR1gjGqaCSjZ0ahCnxe/Z2SwqccmBR9l60vt683RXMYbKNLDuSgE7HcXbzF9NstfnoSq7b332y/NgYsXvY0w+f6yPhsDuPhUXU+7gIcPb4+1TFOtdZP8uIPm1aLqG2nNKNhMGt23X8dD5Myy0FF6XmbTj43mDzKJahNel7pT91d+Vac5s08UeyUpQSjtrVMYneVTYbHEwiFPAD7S57LF0kZuE1aXIRF35g6XV3GB4rQDsrBsrZzn9vsGS12L2pdtYFVCvt/dLFlmd/GjPpm4JWyNSg,iv:fUEBrr1iby7+hK8ZesW+77HLMW93c6LpCcoJy8pgXUE=,tag:cW8vKVAebnJqo1gNNwDohQ==,type:str] | ||
| 2 | sops: | ||
| 3 | age: | ||
| 4 | - enc: | | ||
| 5 | -----BEGIN AGE ENCRYPTED FILE----- | ||
| 6 | YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBpQVM4V3RZNTUyZzN4bERP | ||
| 7 | SnRhM2hOK2FzNDRzRTR0bG4yYk1YS0tMclZrCkIrQWdBcnBkeU1wbWVZOEN4T0lY | ||
| 8 | c0lnaWtidTJLQjV0c3Rzd3o3alNIekkKLS0tIG5lZjQ5MWZoVGNIaTROOXJpdDhC | ||
| 9 | R3hyNlcxN2RQRS9aOGI4RzVPbUtBY3MKBKWGmZjjqZ7CBwVniEF9VjhyWH0kZv56 | ||
| 10 | 7eWx3lOhb849izKM8EEjr50t1DqrvBLL4KStLq8fbNV5uPotGuKOwA== | ||
| 11 | -----END AGE ENCRYPTED FILE----- | ||
| 12 | recipient: age1rmmhetcmllq0ahl5qznlr0eya2zdxwl9h6y5wnl97d2wtyx5t99sm2u866 | ||
| 13 | - enc: | | ||
| 14 | -----BEGIN AGE ENCRYPTED FILE----- | ||
| 15 | YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBDbStwZ0w5STFxcHNKNDhO | ||
| 16 | SnhZVHprVUlkUStvVXNpTW5RZ0dTSVpLWEZjCjdDa1ZtOU5KUjJxSHRlNy9WamJq | ||
| 17 | a0VEdUtiODdCL3RTeDlTc2NqY0Q1dDgKLS0tIGcwNkQxemVuSGw4V2RQNWp1cjhM | ||
| 18 | cHQ4WXBPNGJGRXZTL1kxSDhRb1c0ZVUKIhyhHihWR79vQBBNuaVLzIAFggmfdkM8 | ||
| 19 | 40/m+3OllYsTCvm55LdNVNjxQC8QnfsalgtIh+ZzUzhrjCksumqypw== | ||
| 20 | -----END AGE ENCRYPTED FILE----- | ||
| 21 | recipient: age1u6xegt79rarmyz8qy4pl7jh9lh90vx8fg0frmh4u2mzam7zydq4s4agz4e | ||
| 22 | lastmodified: "2022-02-02T14:45:23Z" | ||
| 23 | mac: ENC[AES256_GCM,data:UdM/VmdfqhYm1aFCHaO0mbJA/oyV/J2oKVVmGDa0Co3MWq9aWMqP726O+rLk36W0HOG4fmue//R1Q524au2hMW9bZUFzrubfQt2V78tZRZeHCJSRmOmi1D1EDdfPz9J3oWDvIEgIIsAk5H5EuuH0j6FILye6tzcomNGDAKZbwuc=,iv:a7dJAqkcroLp01gkGKV5gm6gTIIMa/9P8qJn44ISrw0=,tag:R9/6X6mgfVSLK7bmoWRnfQ==,type:str] | ||
| 24 | unencrypted_suffix: _unencrypted | ||
| 25 | version: 3.7.1 | ||
diff --git a/accounts/gkleen@skadhi/firefox/default.nix b/accounts/gkleen@skadhi/firefox/default.nix new file mode 100644 index 00000000..9b3be324 --- /dev/null +++ b/accounts/gkleen@skadhi/firefox/default.nix | |||
| @@ -0,0 +1,24 @@ | |||
| 1 | { ... }: | ||
| 2 | { | ||
| 3 | config = { | ||
| 4 | programs.firefox = { | ||
| 5 | enable = true; | ||
| 6 | profiles.default = { | ||
| 7 | settings = { | ||
| 8 | "browser.tabs.drawInTitlebar" = false; | ||
| 9 | "toolkit.legacyUserProfileCustomizations.stylesheets" = true; | ||
| 10 | "dom.security.https_only_mode" = true; | ||
| 11 | }; | ||
| 12 | }; | ||
| 13 | }; | ||
| 14 | |||
| 15 | home.persistence."/persistent".directories = [ | ||
| 16 | ".mozilla/firefox" | ||
| 17 | ]; | ||
| 18 | |||
| 19 | home.file = { | ||
| 20 | ".mozilla/firefox/default/chrome/userChrome.css".source = ./userChrome.css; | ||
| 21 | ".mozilla/firefox/default/chrome/userContent.css".source = ./userContent.css; | ||
| 22 | }; | ||
| 23 | }; | ||
| 24 | } | ||
diff --git a/accounts/gkleen@skadhi/firefox/userChrome.css b/accounts/gkleen@skadhi/firefox/userChrome.css new file mode 100644 index 00000000..726f1e4b --- /dev/null +++ b/accounts/gkleen@skadhi/firefox/userChrome.css | |||
| @@ -0,0 +1,54 @@ | |||
| 1 | @namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"); | ||
| 2 | |||
| 3 | * { | ||
| 4 | font-size:12px; | ||
| 5 | } | ||
| 6 | |||
| 7 | #sidebar-main:has([expanded]) { | ||
| 8 | min-width:20em !important; | ||
| 9 | max-width:20em !important; | ||
| 10 | } | ||
| 11 | |||
| 12 | #sidebar, #sidebar-box { | ||
| 13 | min-width:35em !important; | ||
| 14 | max-width:35em !important; | ||
| 15 | } | ||
| 16 | |||
| 17 | #sidebar-box { | ||
| 18 | margin-right: var(--space-small); | ||
| 19 | } | ||
| 20 | |||
| 21 | /* | ||
| 22 | #sidebar { | ||
| 23 | min-width:20em !important; | ||
| 24 | max-width:20em !important; | ||
| 25 | border-right:1px solid rgba(30,30,30) !important; | ||
| 26 | } | ||
| 27 | |||
| 28 | #sidebar-header:nth-last-child(2) > *:last-child { | ||
| 29 | visibility: collapse; | ||
| 30 | } | ||
| 31 | |||
| 32 | #sidebar-splitter { | ||
| 33 | visibility: collapse; | ||
| 34 | } | ||
| 35 | |||
| 36 | #toolbar-menubar[inactive="true"] + #TabsToolbar { | ||
| 37 | visibility: collapse !important; | ||
| 38 | } | ||
| 39 | |||
| 40 | #sidebar-box[sidebarcommand="tabcenter-reborn_ariasuni-sidebar-action"] #sidebar-header { visibility: collapse !important; } | ||
| 41 | #sidebar-box[sidebarcommand="_3c078156-979c-498b-8990-85f7987dd929_-sidebar-action"] #sidebar-header { visibility: collapse !important; } | ||
| 42 | */ | ||
| 43 | |||
| 44 | .titlebar-buttonbox-container{ display: none; } | ||
| 45 | #vertical-spacer { display: none; } | ||
| 46 | #tabbrowser-tabs[orient="vertical"] .tab-background { | ||
| 47 | border-radius: var(--border-radius-small) !important; | ||
| 48 | } | ||
| 49 | hbox:has(> #tabs-newtab-button) { | ||
| 50 | display: none; | ||
| 51 | } | ||
| 52 | #sidebar-main .tools-and-extensions { | ||
| 53 | justify-content: space-around !important; | ||
| 54 | } | ||
diff --git a/accounts/gkleen@skadhi/firefox/userContent.css b/accounts/gkleen@skadhi/firefox/userContent.css new file mode 100644 index 00000000..3ac53a9d --- /dev/null +++ b/accounts/gkleen@skadhi/firefox/userContent.css | |||
| @@ -0,0 +1,12 @@ | |||
| 1 | @-moz-document url("about:blank") { | ||
| 2 | html { | ||
| 3 | background-color: rgb(40,40,40); | ||
| 4 | } | ||
| 5 | } | ||
| 6 | |||
| 7 | @-moz-document url(about:newtab) { | ||
| 8 | body, #newtab-customize-overlay { | ||
| 9 | background-color: rgb(40,40,40) !important; | ||
| 10 | color: rgb(166,166,166) !important; | ||
| 11 | } | ||
| 12 | } | ||
diff --git a/accounts/gkleen@skadhi/greetd.nix b/accounts/gkleen@skadhi/greetd.nix new file mode 100644 index 00000000..1972404c --- /dev/null +++ b/accounts/gkleen@skadhi/greetd.nix | |||
| @@ -0,0 +1,92 @@ | |||
| 1 | { config, pkgs, lib, flakeInputs, ... }: | ||
| 2 | |||
| 3 | let | ||
| 4 | gkleenConfig = config.home-manager.users."gkleen"; | ||
| 5 | toIni = lib.generators.toINI { | ||
| 6 | mkKeyValue = | ||
| 7 | key: value: | ||
| 8 | let | ||
| 9 | value' = if lib.isBool value then lib.boolToString value else toString value; | ||
| 10 | in | ||
| 11 | "${lib.escape [ "=" ] key}=${value'}"; | ||
| 12 | }; | ||
| 13 | toDconfIni = let | ||
| 14 | gvariant = import (flakeInputs.home-manager + "/modules/lib/gvariant.nix") { inherit lib; }; | ||
| 15 | mkIniKeyValue = key: value: "${key}=${toString (gvariant.mkValue value)}"; | ||
| 16 | in lib.generators.toINI { mkKeyValue = mkIniKeyValue; }; | ||
| 17 | in { | ||
| 18 | config = { | ||
| 19 | services.greetd = { | ||
| 20 | enable = true; | ||
| 21 | settings.default_session.command = lib.getExe (pkgs.writeShellApplication { | ||
| 22 | name = "sway"; | ||
| 23 | runtimeInputs = [ pkgs.sway pkgs.fontconfig ]; | ||
| 24 | runtimeEnv = { | ||
| 25 | XDG_DATA_DIRS = lib.makeSearchPath "share" [ | ||
| 26 | pkgs.kdePackages.breeze-gtk pkgs.adwaita-icon-theme pkgs.fira | ||
| 27 | ]; | ||
| 28 | QT_PLUGIN_PATH = lib.makeSearchPath (pkgs.qt6.qtbase.qtPluginPrefix) [ | ||
| 29 | pkgs.qt6Packages.qtbase | ||
| 30 | ]; | ||
| 31 | QML2_IMPORT_PATH = lib.makeSearchPath (pkgs.qt6.qtbase.qtQmlPrefix) [ | ||
| 32 | pkgs.qt6Packages.qtbase | ||
| 33 | ]; | ||
| 34 | QT_QPA_PLATFORMTHEME = "gtk3"; | ||
| 35 | XDG_CONFIG_DIR = pkgs.symlinkJoin { | ||
| 36 | name = "config"; | ||
| 37 | paths = [ | ||
| 38 | (pkgs.writeTextDir "gtk-3.0/settings.ini" (toIni { | ||
| 39 | Settings = { | ||
| 40 | gtk-font-name = "Fira Sans 10"; | ||
| 41 | gtk-theme-name = "Breeze-Dark"; | ||
| 42 | gtk-icon-theme-name = "Adwaita"; | ||
| 43 | }; | ||
| 44 | })) | ||
| 45 | ]; | ||
| 46 | }; | ||
| 47 | # XDG_CACHE_HOME = "/var/cache/greetd/greeter"; | ||
| 48 | # XDG_CONFIG_HOME = "/var/cache/greetd/greeter/config"; | ||
| 49 | }; | ||
| 50 | text = '' | ||
| 51 | exec &>/tmp/sway-$$.log | ||
| 52 | |||
| 53 | unset MANAGERPID SYSTEMD_EXEC_PID | ||
| 54 | |||
| 55 | # ${lib.getExe' pkgs.coreutils "mkdir"} -p ''${XDG_CONFIG_HOME}/dconf | ||
| 56 | ${lib.getExe pkgs.dconf} load / < ${pkgs.writeText "dconf.ini" (toDconfIni { | ||
| 57 | "org/gnome/desktop/interface" = { | ||
| 58 | "color-scheme" = "prefer-dark"; | ||
| 59 | "font-name" = "Fira Sans 10"; | ||
| 60 | "gtk-theme" = "Breeze-Dark"; | ||
| 61 | "icon-theme" = "Adwaita"; | ||
| 62 | }; | ||
| 63 | })} | ||
| 64 | |||
| 65 | exec sway --unsupported-gpu --config ${pkgs.writeText "sway-config" '' | ||
| 66 | exec "${lib.getExe' config.systemd.package "systemctl"} --user import-environment {,WAYLAND_}DISPLAY SWAYSOCK; ${lib.getExe gkleenConfig.programs.quickshell.package} --path ${gkleenConfig.xdg.configFile."quickshell".source}/displaymanager.qml; swaymsg exit" | ||
| 67 | |||
| 68 | input type:keyboard { | ||
| 69 | xkb_layout "us,us" | ||
| 70 | xkb_variant "dvp," | ||
| 71 | xkb_options "compose:caps,grp:win_space_toggle" | ||
| 72 | } | ||
| 73 | |||
| 74 | output eDP-1 scale 1.5 | ||
| 75 | ''} | ||
| 76 | ''; | ||
| 77 | }); | ||
| 78 | }; | ||
| 79 | |||
| 80 | # security.pam.services.greetd.fprintAuth = false; | ||
| 81 | |||
| 82 | systemd.services.greetd.serviceConfig = { | ||
| 83 | ExecStartPre = ''${lib.getExe' pkgs.coreutils "install"} -d -o greeter -g greeter -m 0700 ''${CACHE_DIRECTORY}/greeter''; | ||
| 84 | # CacheDirectory = "greetd"; | ||
| 85 | }; | ||
| 86 | |||
| 87 | users.users.greeter = { | ||
| 88 | home = "/var/lib/greeter"; | ||
| 89 | createHome = true; | ||
| 90 | }; | ||
| 91 | }; | ||
| 92 | } | ||
diff --git a/accounts/gkleen@skadhi/keepassxc.nix b/accounts/gkleen@skadhi/keepassxc.nix new file mode 100644 index 00000000..8cb781b8 --- /dev/null +++ b/accounts/gkleen@skadhi/keepassxc.nix | |||
| @@ -0,0 +1,50 @@ | |||
| 1 | { pkgs, lib, ... }: | ||
| 2 | { | ||
| 3 | config = { | ||
| 4 | environment.systemPackages = [ pkgs.keepassxc ]; | ||
| 5 | |||
| 6 | home-manager.users.gkleen = { ... }: { | ||
| 7 | xdg.dataFile = { | ||
| 8 | "dbus-1/services/org.keepassxc.KeePassXC.MainWindow.service".text = '' | ||
| 9 | [D-BUS Service] | ||
| 10 | Name=org.keepassxc.KeePassXC.MainWindow | ||
| 11 | Exec=${lib.getExe' pkgs.coreutils "false"} | ||
| 12 | SystemdService=keepassxc.service | ||
| 13 | ''; | ||
| 14 | "dbus-1/services/org.freedesktop.secrets.service".text = '' | ||
| 15 | [D-BUS Service] | ||
| 16 | Name=org.freedesktop.secrets | ||
| 17 | Exec=${lib.getExe' pkgs.coreutils "false"} | ||
| 18 | SystemdService=keepassxc.service | ||
| 19 | ''; | ||
| 20 | "dbus-1/services/org.kde.kwalletd6.service".source = "${pkgs.kdePackages.kwallet}/share/dbus-1/services/org.kde.kwalletd6.service"; | ||
| 21 | "dbus-1/services/org.kde.kwalletd5.service".source = "${pkgs.kdePackages.kwallet}/share/dbus-1/services/org.kde.kwalletd5.service"; | ||
| 22 | }; | ||
| 23 | |||
| 24 | home.persistence."/persistent" = { | ||
| 25 | directories = [ | ||
| 26 | ".config/keepassxc" ".local/state/keepassxc" | ||
| 27 | ]; | ||
| 28 | files = [ | ||
| 29 | "store.kdbx" | ||
| 30 | ]; | ||
| 31 | }; | ||
| 32 | |||
| 33 | services.gnome-keyring.enable = lib.mkForce false; | ||
| 34 | |||
| 35 | systemd.user.services.keepassxc = { | ||
| 36 | Service = { | ||
| 37 | Type = "dbus"; | ||
| 38 | BusName = "org.keepassxc.KeePassXC.MainWindow"; | ||
| 39 | WorkingDirectory = "~"; | ||
| 40 | ExecStart = lib.getExe pkgs.keepassxc; | ||
| 41 | Environment = [ "QT_QPA_PLATFORM=wayland" ]; | ||
| 42 | }; | ||
| 43 | Unit = { | ||
| 44 | After = [ "graphical-session.target" ]; | ||
| 45 | BindsTo = [ "graphical-session.target" ]; | ||
| 46 | }; | ||
| 47 | }; | ||
| 48 | }; | ||
| 49 | }; | ||
| 50 | } | ||
diff --git a/accounts/gkleen@skadhi/niri.nix b/accounts/gkleen@skadhi/niri.nix new file mode 100644 index 00000000..beb3ef4e --- /dev/null +++ b/accounts/gkleen@skadhi/niri.nix | |||
| @@ -0,0 +1,1002 @@ | |||
| 1 | { config, hostConfig, pkgs, lib, utils, flakeInputs, ... }: | ||
| 2 | let | ||
| 3 | cfg = config.programs.niri; | ||
| 4 | |||
| 5 | kdl = flakeInputs.niri-flake.lib.kdl; | ||
| 6 | sleaf = name: arg: kdl.node name [arg] []; | ||
| 7 | |||
| 8 | niri = cfg.package; | ||
| 9 | spawnTerminal = { command ? lib.getExe config.programs.zsh.package, extraArgs ? [] }: | ||
| 10 | [(lib.getExe config.programs.alacritty.package) "msg" "--socket" "/run/user/1000/alacritty.sock" "create-window"] ++ lib.toList extraArgs ++ ["--command" (lib.getExe' hostConfig.systemd.package "systemd-run") "--user" "--pty" "--same-dir" "--wait" "--collect" "--quiet" "--service-type=exec" "--expand-environment=no"] ++ lib.mapAttrsToList (k: v: "--property=Environment=${utils.escapeSystemdExecArg "${k}=${if v == null then "" else v}"}") execEnvironment ++ lib.toList command; | ||
| 11 | |||
| 12 | execEnvironment = { | ||
| 13 | NIXOS_OZONE_WL = "1"; | ||
| 14 | QT_QPA_PLATFORM = "wayland"; | ||
| 15 | QT_WAYLAND_DISABLE_WINDOWDECORATION = "1"; | ||
| 16 | GDK_BACKEND = "wayland"; | ||
| 17 | SDL_VIDEODRIVER = "wayland"; | ||
| 18 | DISPLAY = ":0"; | ||
| 19 | ELECTRON_OZONE_PLATFORM_HINT = "auto"; | ||
| 20 | SSH_ASKPASS_REQUIRE = "prefer"; | ||
| 21 | SSH_ASKPASS = lib.getExe pkgs.kdePackages.ksshaskpass; | ||
| 22 | SUDO_ASKPASS = lib.getExe pkgs.kdePackages.ksshaskpass; | ||
| 23 | GTK_IM_MODULE = null; | ||
| 24 | QT_IM_MODULE = null; | ||
| 25 | QT_IM_MODULES = null; | ||
| 26 | }; | ||
| 27 | |||
| 28 | focus_or_spawn = pkgs.writeShellApplication { | ||
| 29 | name = "focus-or-spawn"; | ||
| 30 | runtimeInputs = [ niri pkgs.gojq pkgs.gnugrep pkgs.socat ]; | ||
| 31 | text = '' | ||
| 32 | window_select="$1" | ||
| 33 | shift | ||
| 34 | workspace_name="$1" | ||
| 35 | shift | ||
| 36 | |||
| 37 | workspaces_json="$(niri msg -j workspaces)" | ||
| 38 | workspace_output="$(jq -r --arg workspace_name "$workspace_name" '.[] | select(.name == $workspace_name) | .output' <<<"$workspaces_json")" | ||
| 39 | # active_workspace="$(jq -r --arg workspace_output "$workspace_output" '.[] | select(.output == $workspace_output and .is_active) | .id' <<<"$workspaces_json")" | ||
| 40 | active_output="$(jq -r '.[] | select(.is_focused) | .output' <<<"$workspaces_json")" | ||
| 41 | if [[ $workspace_output != "$active_output" ]]; then | ||
| 42 | niri msg action move-workspace-to-monitor --reference "$workspace_name" "$active_output" | ||
| 43 | # socat STDIO "$NIRI_SOCKET" <<<'{"Action":{"FocusWorkspace":{"reference":{"Id":'"''${active_workspace}"'}}}}' | ||
| 44 | # niri msg action move-workspace-to-index --reference "$workspace_name" 1 | ||
| 45 | fi | ||
| 46 | |||
| 47 | while IFS=$'\n' read -r window_json; do | ||
| 48 | if [[ -n $(jq -c "$window_select" <<<"$window_json") ]]; then | ||
| 49 | if jq -e '.is_focused' <<<"$window_json" >/dev/null; then | ||
| 50 | niri msg action focus-workspace-previous | ||
| 51 | else | ||
| 52 | if [[ $(jq -r --arg workspace_name "$workspace_name" 'map(select(.name == $workspace_name)) | .[0].is_focused' <<<"$workspaces_json") != "true" ]] && [[ $(jq -r --arg workspace_name "$workspace_name" 'map(select(.name == $workspace_name)) | .[0].id' <<<"$workspaces_json") = $(jq -r '.workspace_id' <<<"$window_json") ]]; then | ||
| 53 | niri msg action focus-workspace "$workspace_name" | ||
| 54 | else | ||
| 55 | niri msg action focus-window --id "$(jq -r '.id' <<<"$window_json")" | ||
| 56 | fi | ||
| 57 | fi | ||
| 58 | exit 0 | ||
| 59 | fi | ||
| 60 | done < <(niri msg -j windows | jq -c '.[]') | ||
| 61 | |||
| 62 | exec "$@" | ||
| 63 | ''; | ||
| 64 | }; | ||
| 65 | focus-or-spawn-action = config.lib.niri.actions.spawn (lib.getExe focus_or_spawn); | ||
| 66 | |||
| 67 | with_adjacent_workspace = pkgs.writeShellApplication { | ||
| 68 | name = "with-adjacent-workspace"; | ||
| 69 | runtimeInputs = [ niri pkgs.gojq pkgs.socat ]; | ||
| 70 | text = '' | ||
| 71 | blacklist="$1" | ||
| 72 | shift | ||
| 73 | direction="$1" | ||
| 74 | shift | ||
| 75 | action="$1" | ||
| 76 | shift | ||
| 77 | |||
| 78 | workspaces_json="$(niri msg -j workspaces)" | ||
| 79 | active_workspace="$(jq -r '.[] | select(.is_focused) | .id' <<<"$workspaces_json")" | ||
| 80 | workspace_output="$(jq -r --arg active_workspace "$active_workspace" '.[] | select(.id == ($active_workspace | tonumber)) | .output' <<<"$workspaces_json")" | ||
| 81 | workspace_idx="$(jq -r '.[] | select(.is_focused) | .idx' <<<"$workspaces_json")" | ||
| 82 | |||
| 83 | jq_script='map(select(' | ||
| 84 | case "$direction" in | ||
| 85 | down) | ||
| 86 | # shellcheck disable=SC2016 | ||
| 87 | jq_script=''${jq_script}'.idx > ($workspace_idx | tonumber)';; | ||
| 88 | up) | ||
| 89 | # shellcheck disable=SC2016 | ||
| 90 | jq_script=''${jq_script}'.idx < ($workspace_idx | tonumber)';; | ||
| 91 | esac | ||
| 92 | # shellcheck disable=SC2016 | ||
| 93 | jq_script=''${jq_script}' and .output == $workspace_output and ((.name == null) or (.name | test($blacklist) | not)))) | sort_by(.idx)' | ||
| 94 | [[ $direction == "up" ]] && jq_script=''${jq_script}' | reverse' | ||
| 95 | jq_script=''${jq_script}' | .[0]' | ||
| 96 | |||
| 97 | workspace_json=$(jq -c --arg blacklist "$blacklist" --arg workspace_output "$workspace_output" --arg workspace_idx "$workspace_idx" "$jq_script" <<<"$workspaces_json") | ||
| 98 | [[ -n $workspace_json && $workspace_json != null ]] || exit 0 | ||
| 99 | jq --arg active_workspace "$active_workspace" -c "$action" <<<"$workspace_json" | tee /dev/stderr | socat STDIO "$NIRI_SOCKET" | ||
| 100 | ''; | ||
| 101 | }; | ||
| 102 | with-adjacent-workspace-action = config.lib.niri.actions.spawn (lib.getExe with_adjacent_workspace) "^${lib.concatMapStringsSep "|" ({ name, ...}: name) cfg.scratchspaces}$"; | ||
| 103 | focus-adjacent-workspace = direction: with-adjacent-workspace-action direction ''{"Action":{"FocusWorkspace":{"reference":{"Id": .id}}}}''; | ||
| 104 | move-column-to-adjacent-workspace = direction: with-adjacent-workspace-action direction ''{"Action":{"MoveColumnToWorkspace":{"reference":{"Id": .id}, "focus": true}}}''; | ||
| 105 | |||
| 106 | with_unnamed_workspace = pkgs.writeShellApplication { | ||
| 107 | name = "with-unnamed-workspace"; | ||
| 108 | runtimeInputs = [ niri pkgs.gojq pkgs.socat ]; | ||
| 109 | text = '' | ||
| 110 | action="$1" | ||
| 111 | shift | ||
| 112 | |||
| 113 | workspaces_json="$(niri msg -j workspaces)" | ||
| 114 | active_output="$(jq -r '.[] | select(.is_focused) | .output' <<<"$workspaces_json")" | ||
| 115 | active_workspace="$(jq -r '.[] | select(.is_focused) | .id' <<<"$workspaces_json")" | ||
| 116 | |||
| 117 | history_json="$(socat STDIO UNIX-CONNECT:"$XDG_RUNTIME_DIR"/niri-workspace-history.sock)" | ||
| 118 | workspace_json="$(jq -c --arg active_output "$active_output" --argjson history "$history_json" 'map(select(.output == $active_output and .name == null)) | map({"value": ., "history_idx": ((. as $workspace | ($history[$active_output] | index($workspace | .id))) as $active_idx | if $active_idx then $active_idx else ($history[$active_output] | length) + 1 end)}) | sort_by(.history_idx, .value.idx) | map(.value) | .[0]' <<<"$workspaces_json")" | ||
| 119 | [[ -n $workspace_json && $workspace_json != null ]] || exit 0 | ||
| 120 | jq --arg active_workspace "$active_workspace" -c "$action" <<<"$workspace_json" | tee /dev/stderr | socat STDIO "$NIRI_SOCKET" | ||
| 121 | ''; | ||
| 122 | }; | ||
| 123 | with-unnamed-workspace-action = config.lib.niri.actions.spawn (lib.getExe with_unnamed_workspace); | ||
| 124 | |||
| 125 | with_empty_unnamed_workspace = pkgs.writeShellApplication { | ||
| 126 | name = "with-empty-unnamed-workspace"; | ||
| 127 | runtimeInputs = [ niri pkgs.gojq pkgs.socat ]; | ||
| 128 | text = '' | ||
| 129 | action="$1" | ||
| 130 | shift | ||
| 131 | |||
| 132 | workspaces_json="$(niri msg -j workspaces)" | ||
| 133 | active_output="$(jq '.[] | select(.is_focused) | .output' <<<"$workspaces_json")" | ||
| 134 | target_workspace_id="$(jq --argjson active_output "$active_output" 'map(select(.active_window_id == null and .name == null and .output == $active_output)) | sort_by(.idx) | .[0].id' <<<"$workspaces_json")" | ||
| 135 | jq --argjson workspace_id "$target_workspace_id" -nc "$action" | tee /dev/stderr | socat STDIO "$NIRI_SOCKET" | ||
| 136 | ''; | ||
| 137 | }; | ||
| 138 | with-empty-unnamed-workspace-action = config.lib.niri.actions.spawn (lib.getExe with_empty_unnamed_workspace); | ||
| 139 | |||
| 140 | with_select_window = pkgs.writeShellApplication { | ||
| 141 | name = "with-select-window"; | ||
| 142 | runtimeInputs = [ niri pkgs.gojq pkgs.socat config.programs.fuzzel.package pkgs.gawk ]; | ||
| 143 | text = '' | ||
| 144 | window_select="$1" | ||
| 145 | shift | ||
| 146 | action="$1" | ||
| 147 | shift | ||
| 148 | |||
| 149 | windows_json="$(niri msg -j windows)" | ||
| 150 | active_workspace="$(jq -r '.[] | select(.is_focused) | .workspace_id' <<<"$windows_json")" | ||
| 151 | window_ix="$(gojq -r --arg active_workspace "$active_workspace" '.[] | select('"$window_select"') | "\(.title)\u0000icon\u001f\(.app_id)"' <<<"$windows_json" | fuzzel --width=60 --log-level=warning --dmenu --index)" | ||
| 152 | # shellcheck disable=SC2016 | ||
| 153 | window_json="$(gojq -rc --arg active_workspace "$active_workspace" --arg window_ix "$window_ix" 'map(select('"$window_select"')) | .[($window_ix | tonumber)]' <<<"$windows_json")" | ||
| 154 | |||
| 155 | [[ -z "$window_json" ]] && exit 1 | ||
| 156 | |||
| 157 | jq -c "$action" <<<"$window_json" | socat STDIO "$NIRI_SOCKET" | ||
| 158 | ''; | ||
| 159 | }; | ||
| 160 | with-select-window-action = config.lib.niri.actions.spawn (lib.getExe with_select_window); | ||
| 161 | |||
| 162 | with_predicate_window = pred: pkgs.writeShellApplication { | ||
| 163 | name = "with-predicate-window"; | ||
| 164 | runtimeInputs = [ niri pkgs.gojq pkgs.socat ]; | ||
| 165 | text = '' | ||
| 166 | action="$1" | ||
| 167 | shift | ||
| 168 | |||
| 169 | windows_json="$(niri msg -j windows)" | ||
| 170 | window_json="$(gojq -rc 'map(select(${pred})) | .[0]' <<<"$windows_json")" | ||
| 171 | |||
| 172 | [[ -z "$window_json" || $window_json = "null" ]] && exit 1 | ||
| 173 | |||
| 174 | jq -c "$action" <<<"$window_json" | socat STDIO "$NIRI_SOCKET" | ||
| 175 | ''; | ||
| 176 | }; | ||
| 177 | |||
| 178 | with-urgent-window-action = config.lib.niri.actions.spawn (lib.getExe (with_predicate_window ".is_urgent")); | ||
| 179 | with-focused-window-action = config.lib.niri.actions.spawn (lib.getExe (with_predicate_window ".is_focused")); | ||
| 180 | in { | ||
| 181 | options = { | ||
| 182 | programs.niri.scratchspaces = lib.mkOption { | ||
| 183 | type = lib.types.listOf (lib.types.submodule ({ config, ... }: { | ||
| 184 | options = { | ||
| 185 | name = lib.mkOption { | ||
| 186 | type = lib.types.str; | ||
| 187 | }; | ||
| 188 | match = lib.mkOption { | ||
| 189 | type = lib.types.listOf (lib.types.attrsOf kdl.types.kdl-args); | ||
| 190 | default = []; | ||
| 191 | }; | ||
| 192 | exclude = lib.mkOption { | ||
| 193 | type = lib.types.listOf (lib.types.attrsOf kdl.types.kdl-args); | ||
| 194 | default = []; | ||
| 195 | }; | ||
| 196 | windowRuleExtra = lib.mkOption { | ||
| 197 | type = kdl.types.kdl-nodes; | ||
| 198 | default = []; | ||
| 199 | }; | ||
| 200 | key = lib.mkOption { | ||
| 201 | type = lib.types.nullOr lib.types.str; | ||
| 202 | default = null; | ||
| 203 | }; | ||
| 204 | moveKey = lib.mkOption { | ||
| 205 | type = lib.types.nullOr lib.types.str; | ||
| 206 | default = let | ||
| 207 | keys = lib.splitString "+" config.key; | ||
| 208 | defMoveKey = lib.concatStringsSep "+" (lib.flatten [ | ||
| 209 | (lib.take (lib.length keys - 1) keys) | ||
| 210 | ["Shift"] | ||
| 211 | (lib.takeEnd 1 keys) | ||
| 212 | ]); | ||
| 213 | in if config.key == null then null else defMoveKey; | ||
| 214 | }; | ||
| 215 | spawn = lib.mkOption { | ||
| 216 | type = lib.types.nullOr (lib.types.listOf lib.types.str); | ||
| 217 | default = null; | ||
| 218 | }; | ||
| 219 | app-id = lib.mkOption { | ||
| 220 | type = lib.types.nullOr lib.types.str; | ||
| 221 | default = null; | ||
| 222 | }; | ||
| 223 | selector = lib.mkOption { | ||
| 224 | type = lib.types.nullOr lib.types.str; | ||
| 225 | default = null; | ||
| 226 | }; | ||
| 227 | }; | ||
| 228 | |||
| 229 | config = lib.mkMerge [ | ||
| 230 | (lib.mkIf (config.app-id != null) { | ||
| 231 | match = lib.mkDefault [ { app-id = "^${lib.escapeRegex config.app-id}$"; } ]; | ||
| 232 | selector = lib.mkDefault "select(.app_id == \"${config.app-id}\")"; | ||
| 233 | }) | ||
| 234 | ]; | ||
| 235 | })); | ||
| 236 | default = []; | ||
| 237 | }; | ||
| 238 | }; | ||
| 239 | |||
| 240 | config = { | ||
| 241 | home.packages = [ pkgs.xwayland-satellite-unstable ]; | ||
| 242 | |||
| 243 | systemd.user.sockets.niri-workspace-history = { | ||
| 244 | Socket = { | ||
| 245 | ListenStream = "%t/niri-workspace-history.sock"; | ||
| 246 | SocketMode = "0600"; | ||
| 247 | }; | ||
| 248 | }; | ||
| 249 | systemd.user.services.niri-workspace-history = { | ||
| 250 | Unit = { | ||
| 251 | BindsTo = [ "niri.service" ]; | ||
| 252 | After = [ "niri.service" ]; | ||
| 253 | }; | ||
| 254 | Install = { | ||
| 255 | WantedBy = [ "niri.service" ]; | ||
| 256 | }; | ||
| 257 | Service = { | ||
| 258 | Type = "simple"; | ||
| 259 | Sockets = [ "niri-workspace-history.socket" ]; | ||
| 260 | ExecStart = pkgs.writers.writePython3 "niri-workspace-history" { flakeIgnore = ["E501"]; } '' | ||
| 261 | import os | ||
| 262 | import socket | ||
| 263 | import json | ||
| 264 | # import sys | ||
| 265 | from collections import defaultdict | ||
| 266 | from threading import Thread, Lock | ||
| 267 | from socketserver import StreamRequestHandler, ThreadingTCPServer | ||
| 268 | from contextlib import contextmanager | ||
| 269 | from io import TextIOWrapper | ||
| 270 | |||
| 271 | |||
| 272 | @contextmanager | ||
| 273 | def detaching(thing): | ||
| 274 | try: | ||
| 275 | yield thing | ||
| 276 | finally: | ||
| 277 | thing.detach() | ||
| 278 | |||
| 279 | |||
| 280 | workspace_history = defaultdict(list) | ||
| 281 | history_lock = Lock() | ||
| 282 | |||
| 283 | |||
| 284 | def monitor_niri(): | ||
| 285 | workspaces = list() | ||
| 286 | |||
| 287 | def focus_workspace(output, workspace): | ||
| 288 | with history_lock: | ||
| 289 | workspace_history[output] = [workspace] + [ws for ws in workspace_history[output] if ws != workspace] | ||
| 290 | # print(json.dumps(workspace_history), file=sys.stderr) | ||
| 291 | |||
| 292 | sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) | ||
| 293 | sock.connect(os.environ["NIRI_SOCKET"]) | ||
| 294 | sock.send(b"\"EventStream\"\n") | ||
| 295 | for line in sock.makefile(buffering=1, encoding='utf-8'): | ||
| 296 | if line_json := json.loads(line): | ||
| 297 | if "WorkspacesChanged" in line_json: | ||
| 298 | workspaces = line_json["WorkspacesChanged"]["workspaces"] | ||
| 299 | for ws in workspaces: | ||
| 300 | if ws["is_focused"]: | ||
| 301 | focus_workspace(ws["output"], ws["id"]) | ||
| 302 | if "WorkspaceActivated" in line_json: | ||
| 303 | for ws in workspaces: | ||
| 304 | if ws["id"] != line_json["WorkspaceActivated"]["id"]: | ||
| 305 | continue | ||
| 306 | focus_workspace(ws["output"], ws["id"]) | ||
| 307 | break | ||
| 308 | |||
| 309 | |||
| 310 | class RequestHandler(StreamRequestHandler): | ||
| 311 | def handle(self): | ||
| 312 | with detaching(TextIOWrapper(self.wfile, encoding='utf-8', write_through=True)) as out: | ||
| 313 | with history_lock: | ||
| 314 | json.dump(workspace_history, out) | ||
| 315 | |||
| 316 | |||
| 317 | class Server(ThreadingTCPServer): | ||
| 318 | def __init__(self): | ||
| 319 | ThreadingTCPServer.__init__(self, ("", 8000), RequestHandler, bind_and_activate=False) | ||
| 320 | self.socket = socket.fromfd(3, self.address_family, self.socket_type) | ||
| 321 | |||
| 322 | |||
| 323 | def run_server(): | ||
| 324 | with Server() as server: | ||
| 325 | server.serve_forever() | ||
| 326 | |||
| 327 | |||
| 328 | niri = Thread(target=monitor_niri) | ||
| 329 | niri.daemon = True | ||
| 330 | niri.start() | ||
| 331 | |||
| 332 | server_thread = Thread(target=run_server) | ||
| 333 | server_thread.daemon = True | ||
| 334 | server_thread.start() | ||
| 335 | |||
| 336 | while True: | ||
| 337 | server_thread.join(timeout=0.5) | ||
| 338 | niri.join(timeout=0.5) | ||
| 339 | |||
| 340 | if not (niri.is_alive() and server_thread.is_alive()): | ||
| 341 | break | ||
| 342 | ''; | ||
| 343 | }; | ||
| 344 | }; | ||
| 345 | systemd.user.services.niri-workspace-sort = { | ||
| 346 | Unit = { | ||
| 347 | BindsTo = [ "niri.service" ]; | ||
| 348 | After = [ "niri.service" ]; | ||
| 349 | }; | ||
| 350 | Install = { | ||
| 351 | WantedBy = [ "niri.service" ]; | ||
| 352 | }; | ||
| 353 | Service = { | ||
| 354 | Type = "simple"; | ||
| 355 | ExecStart = pkgs.writers.writePython3 "niri-workspace-sort" { flakeIgnore = ["E501"]; } '' | ||
| 356 | import os | ||
| 357 | import sys | ||
| 358 | import socket | ||
| 359 | import json | ||
| 360 | |||
| 361 | outputs = None | ||
| 362 | only = {'HDMI-A-1': {'bmr'}, 'eDP-1': {'vid'}} | ||
| 363 | |||
| 364 | |||
| 365 | class Niri(socket.socket): | ||
| 366 | def __init__(self): | ||
| 367 | super().__init__(socket.AF_UNIX, socket.SOCK_STREAM) | ||
| 368 | super().connect(os.environ["NIRI_SOCKET"]) | ||
| 369 | self.fh = super().makefile(mode='rw', buffering=1, encoding='utf-8') | ||
| 370 | |||
| 371 | def cmd(self, obj): | ||
| 372 | print(json.dumps(obj, separators=(',', ':')), flush=True, file=self.fh) | ||
| 373 | |||
| 374 | def event_stream(self): | ||
| 375 | self.cmd("EventStream") | ||
| 376 | return self.fh | ||
| 377 | |||
| 378 | |||
| 379 | with Niri() as niri, Niri().event_stream() as niri_stream: | ||
| 380 | for line in niri_stream: | ||
| 381 | workspaces = None | ||
| 382 | if line_json := json.loads(line): | ||
| 383 | if "WorkspacesChanged" in line_json: | ||
| 384 | workspaces = line_json["WorkspacesChanged"]["workspaces"] | ||
| 385 | |||
| 386 | if workspaces is None: | ||
| 387 | continue | ||
| 388 | |||
| 389 | old_outputs = outputs | ||
| 390 | outputs = {ws["output"] for ws in workspaces} | ||
| 391 | if old_outputs is None: | ||
| 392 | print("Initial outputs: {}".format(outputs), file=sys.stderr) | ||
| 393 | continue | ||
| 394 | |||
| 395 | new_outputs = outputs - old_outputs | ||
| 396 | if not new_outputs: | ||
| 397 | continue | ||
| 398 | print("New outputs: {}".format(new_outputs), file=sys.stderr) | ||
| 399 | |||
| 400 | relevant_workspaces = list(filter(lambda ws: (ws["name"] is not None) or (ws["active_window_id"] is not None), workspaces)) | ||
| 401 | target_output = next(iter(outputs - set(only.keys()))) | ||
| 402 | if not target_output: | ||
| 403 | continue | ||
| 404 | for ws in relevant_workspaces: | ||
| 405 | ws_ident = ws["name"] if ws["name"] is not None else (ws["output"], ws["idx"]) | ||
| 406 | if ws["output"] not in set(only.keys()): | ||
| 407 | continue | ||
| 408 | if ws_ident in only[ws["output"]]: | ||
| 409 | continue | ||
| 410 | |||
| 411 | print("{} -> {}".format(ws_ident, target_output), file=sys.stderr) | ||
| 412 | niri.cmd({"Action": {"MoveWorkspaceToMonitor": {"reference": {"Id": ws["id"]}, "output": target_output}}}) | ||
| 413 | ''; | ||
| 414 | Restart = "on-failure"; | ||
| 415 | RestartSec = 10; | ||
| 416 | }; | ||
| 417 | }; | ||
| 418 | |||
| 419 | programs.niri.scratchspaces = [ | ||
| 420 | { name = "pwctl"; | ||
| 421 | key = "Mod+Control+A"; | ||
| 422 | spawn = ["pwvucontrol"]; | ||
| 423 | app-id = "com.saivert.pwvucontrol"; | ||
| 424 | } | ||
| 425 | { name = "kpxc"; | ||
| 426 | exclude = [ | ||
| 427 | { title = "^Unlock Database.*"; } | ||
| 428 | { title = "^Access Request.*"; } | ||
| 429 | { title = ".*Passkey credentials$"; } | ||
| 430 | ]; | ||
| 431 | windowRuleExtra = with kdl; [ | ||
| 432 | (sleaf "open-focused" false) | ||
| 433 | ]; | ||
| 434 | key = "Mod+Control+P"; | ||
| 435 | app-id = "org.keepassxc.KeePassXC"; | ||
| 436 | spawn = [ "keepassxc" ]; | ||
| 437 | } | ||
| 438 | { name = "bmgr"; | ||
| 439 | key = "Mod+Control+B"; | ||
| 440 | app-id = ".blueman-manager-wrapped"; | ||
| 441 | spawn = [ "blueman-manager" ]; | ||
| 442 | } | ||
| 443 | { name = "term"; | ||
| 444 | key = "Mod+Control+Return"; | ||
| 445 | app-id = "Alacritty-scratch"; | ||
| 446 | spawn = spawnTerminal { extraArgs = ["--class" "Alacritty-scratch"]; }; | ||
| 447 | } | ||
| 448 | { name = "edit"; | ||
| 449 | match = [ { title = "^scratch$"; app-id = "^emacs$"; } ]; | ||
| 450 | key = "Mod+Control+E"; | ||
| 451 | selector = "select(.app_id == \"emacs\" and .title == \"scratch\")"; | ||
| 452 | spawn = [ "emacsclient" "-c" "--frame-parameters=(quote (name . \"scratch\"))" ]; | ||
| 453 | } | ||
| 454 | { name = "eff"; | ||
| 455 | key = "Mod+Control+O"; | ||
| 456 | app-id = "com.github.wwmm.easyeffects"; | ||
| 457 | spawn = [ "easyeffects" ]; | ||
| 458 | } | ||
| 459 | { name = "time"; | ||
| 460 | key = "Mod+Control+K"; | ||
| 461 | app-id = "chrome-kimai.yggdrasil.li__-Default"; | ||
| 462 | spawn = [ (toString (pkgs.resholve.writeScript "kimai" { | ||
| 463 | interpreter = pkgs.runtimeShell; | ||
| 464 | inputs = [ pkgs.dex ]; | ||
| 465 | execer = [ "cannot:${lib.getExe pkgs.dex}" ]; | ||
| 466 | } '' | ||
| 467 | exec dex $HOME/.local/state/nix/profile/share/applications/kimai.desktop | ||
| 468 | '')) ]; | ||
| 469 | windowRuleExtra = with kdl; [ | ||
| 470 | (sleaf "block-out-from" "screencast") | ||
| 471 | ]; | ||
| 472 | } | ||
| 473 | ]; | ||
| 474 | programs.niri.config = | ||
| 475 | let | ||
| 476 | inherit (kdl) node plain leaf flag; | ||
| 477 | optional-node = cond: v: | ||
| 478 | if cond | ||
| 479 | then v | ||
| 480 | else null; | ||
| 481 | opt-props = lib.filterAttrs (lib.const (value: value != null)); | ||
| 482 | normalize-nodes = nodes: lib.remove null (lib.flatten nodes); | ||
| 483 | in | ||
| 484 | normalize-nodes [ | ||
| 485 | (flag "prefer-no-csd") | ||
| 486 | |||
| 487 | (sleaf "screenshot-path" "~/screenshots/%Y-%m-%dT%H:%M:%S.png") | ||
| 488 | |||
| 489 | (plain "hotkey-overlay" [ | ||
| 490 | (flag "skip-at-startup") | ||
| 491 | ]) | ||
| 492 | |||
| 493 | (plain "input" [ | ||
| 494 | (plain "keyboard" [ | ||
| 495 | (sleaf "repeat-delay" 300) | ||
| 496 | (sleaf "repeat-rate" 50) | ||
| 497 | |||
| 498 | (plain "xkb" [ | ||
| 499 | (sleaf "layout" "us,us") | ||
| 500 | (sleaf "variant" "dvp,") | ||
| 501 | (sleaf "options" "compose:caps,grp:win_space_toggle") | ||
| 502 | ]) | ||
| 503 | ]) | ||
| 504 | |||
| 505 | (flag "workspace-auto-back-and-forth") | ||
| 506 | # (sleaf "focus-follows-mouse" {}) | ||
| 507 | # (flag "warp-mouse-to-focus") | ||
| 508 | |||
| 509 | # (plain "touchpad" [ (flag "off") ]) | ||
| 510 | (plain "trackball" [ | ||
| 511 | (sleaf "scroll-method" "on-button-down") | ||
| 512 | (sleaf "scroll-button" 278) | ||
| 513 | ]) | ||
| 514 | (plain "touch" [ | ||
| 515 | (sleaf "map-to-output" "eDP-1") | ||
| 516 | ]) | ||
| 517 | (plain "tablet" [ | ||
| 518 | (sleaf "map-to-output" "eDP-1") | ||
| 519 | ]) | ||
| 520 | ]) | ||
| 521 | |||
| 522 | (plain "gestures" [ | ||
| 523 | (plain "hot-corners" [(flag "off")]) | ||
| 524 | ]) | ||
| 525 | |||
| 526 | (plain "environment" (lib.mapAttrsToList sleaf execEnvironment)) | ||
| 527 | |||
| 528 | (node "output" ["eDP-1"] [ | ||
| 529 | (sleaf "scale" 1.125) | ||
| 530 | (sleaf "position" { x = 0; y = 0; }) | ||
| 531 | (flag "variable-refresh-rate") | ||
| 532 | ]) | ||
| 533 | (node "output" ["Ancor Communications Inc ASUS PB287Q 0x0000DD9B"] [ | ||
| 534 | (sleaf "scale" 1.5) | ||
| 535 | (sleaf "position" { x = 2560; y = 0; }) | ||
| 536 | ]) | ||
| 537 | (node "output" ["HP Inc. HP 727pu CN4417143K"] [ | ||
| 538 | (sleaf "mode" "2560x1440@119.998") | ||
| 539 | (sleaf "scale" 1) | ||
| 540 | (sleaf "position" { x = 2560; y = 0; }) | ||
| 541 | (flag "variable-refresh-rate") | ||
| 542 | ]) | ||
| 543 | |||
| 544 | (plain "animations" [ | ||
| 545 | (sleaf "slowdown" 0.5) | ||
| 546 | (plain "workspace-switch" [(flag "off")]) | ||
| 547 | ]) | ||
| 548 | |||
| 549 | (plain "layout" [ | ||
| 550 | (sleaf "gaps" 8) | ||
| 551 | (plain "struts" [ | ||
| 552 | (sleaf "left" 2) | ||
| 553 | (sleaf "right" 2) | ||
| 554 | (sleaf "top" 0) | ||
| 555 | (sleaf "bottom" 0) | ||
| 556 | ]) | ||
| 557 | (plain "border" [ | ||
| 558 | (sleaf "width" 2) | ||
| 559 | (sleaf "active-gradient" { | ||
| 560 | from = "hsla(195 100% 45% 1)"; | ||
| 561 | to = "hsla(155 100% 37.5% 1)"; | ||
| 562 | angle = 29; | ||
| 563 | relative-to = "workspace-view"; | ||
| 564 | }) | ||
| 565 | (sleaf "inactive-gradient" { | ||
| 566 | from = "hsla(0 0% 27.7% 1)"; | ||
| 567 | to = "hsla(0 0% 23% 1)"; | ||
| 568 | angle = 29; | ||
| 569 | relative-to = "workspace-view"; | ||
| 570 | }) | ||
| 571 | ]) | ||
| 572 | (plain "focus-ring" [ | ||
| 573 | (flag "off") | ||
| 574 | ]) | ||
| 575 | |||
| 576 | (plain "preset-column-widths" (map (prop: sleaf "proportion" prop) [ | ||
| 577 | (1. / 4.) (1. / 3.) (1. / 2.) (2. / 3.) (3. / 4.) (1.) | ||
| 578 | ])) | ||
| 579 | (plain "default-column-width" [ (sleaf "proportion" (1. / 2.)) ]) | ||
| 580 | (plain "preset-window-heights" (map (prop: sleaf "proportion" prop) [ | ||
| 581 | (1. / 3.) (1. / 2.) (2. / 3.) (1.) | ||
| 582 | ])) | ||
| 583 | |||
| 584 | (flag "always-center-single-column") | ||
| 585 | |||
| 586 | (plain "tab-indicator" [ | ||
| 587 | (sleaf "gap" 4) | ||
| 588 | (sleaf "width" 8) | ||
| 589 | (sleaf "gaps-between-tabs" 4) | ||
| 590 | (flag "place-within-column") | ||
| 591 | (sleaf "length" { total-proportion = 1.; }) | ||
| 592 | (sleaf "active-gradient" { | ||
| 593 | from = "hsla(195 100% 60% 0.75)"; | ||
| 594 | to = "hsla(155 100% 50% 0.75)"; | ||
| 595 | angle = 29; | ||
| 596 | relative-to = "workspace-view"; | ||
| 597 | }) | ||
| 598 | (sleaf "inactive-gradient" { | ||
| 599 | from = "hsla(0 0% 42% 0.66)"; | ||
| 600 | to = "hsla(0 0% 35% 0.66)"; | ||
| 601 | angle = 29; | ||
| 602 | relative-to = "workspace-view"; | ||
| 603 | }) | ||
| 604 | ]) | ||
| 605 | ]) | ||
| 606 | |||
| 607 | (plain "cursor" [ | ||
| 608 | (flag "hide-when-typing") | ||
| 609 | ]) | ||
| 610 | |||
| 611 | (map (name: | ||
| 612 | (node "workspace" [name] [ | ||
| 613 | (sleaf "open-on-output" "eDP-1") | ||
| 614 | ]) | ||
| 615 | ) (map ({name, ...}: name) cfg.scratchspaces)) | ||
| 616 | (map (name: | ||
| 617 | (sleaf "workspace" name) | ||
| 618 | ) ["comm" "web" "vid" "bmr"]) | ||
| 619 | |||
| 620 | (plain "window-rule" [ | ||
| 621 | (sleaf "clip-to-geometry" true) | ||
| 622 | ]) | ||
| 623 | |||
| 624 | (plain "window-rule" [ | ||
| 625 | (sleaf "match" { is-floating = true; }) | ||
| 626 | (sleaf "geometry-corner-radius" 8) | ||
| 627 | (plain "shadow" [ (flag "on") ]) | ||
| 628 | ]) | ||
| 629 | |||
| 630 | (plain "window-rule" [ | ||
| 631 | (sleaf "match" { app-id = "^org\\.keepassxc\\.KeePassXC$"; }) | ||
| 632 | (sleaf "block-out-from" "screencast") | ||
| 633 | ]) | ||
| 634 | (plain "window-rule" (normalize-nodes [ | ||
| 635 | (map (title: | ||
| 636 | (sleaf "match" { app-id = "^org\\.keepassxc\\.KeePassXC$"; inherit title; }) | ||
| 637 | ) ["^Unlock Database.*" "^Access Request.*" ".*Passkey credentials$" "Browser Access Request$"]) | ||
| 638 | (sleaf "open-focused" true) | ||
| 639 | (sleaf "open-floating" true) | ||
| 640 | ])) | ||
| 641 | |||
| 642 | (map ({ name, match, exclude, windowRuleExtra, ... }: | ||
| 643 | (optional-node (match != []) (plain "window-rule" (normalize-nodes [ | ||
| 644 | (map (sleaf "match") match) | ||
| 645 | (map (sleaf "exclude") exclude) | ||
| 646 | (sleaf "open-on-workspace" name) | ||
| 647 | (sleaf "open-maximized" true) | ||
| 648 | windowRuleExtra | ||
| 649 | ]))) | ||
| 650 | ) cfg.scratchspaces) | ||
| 651 | |||
| 652 | (plain "window-rule" [ | ||
| 653 | (sleaf "match" { app-id = "^emacs$"; }) | ||
| 654 | (sleaf "match" { app-id = "^firefox$"; }) | ||
| 655 | (sleaf "match" { app-id = "^gnucash$"; }) | ||
| 656 | (sleaf "exclude" { app-id = "^gnucash$"; title = "^(Securities|Price Database)$"; }) | ||
| 657 | (plain "default-column-width" [(sleaf "proportion" (2. / 3.))]) | ||
| 658 | ]) | ||
| 659 | (plain "window-rule" [ | ||
| 660 | (sleaf "match" { app-id = "^Alacritty$"; }) | ||
| 661 | (sleaf "match" { app-id = "^Alacritty-play$"; }) | ||
| 662 | (plain "default-column-width" [(sleaf "proportion" (1. / 3.))]) | ||
| 663 | ]) | ||
| 664 | |||
| 665 | (plain "window-rule" [ | ||
| 666 | (sleaf "match" { app-id = "^thunderbird$"; }) | ||
| 667 | (sleaf "match" { app-id = "^Element$"; }) | ||
| 668 | (sleaf "match" { app-id = "^chrome-web\.openrainbow\.com__-Default$"; }) | ||
| 669 | (sleaf "open-on-workspace" "comm") | ||
| 670 | ]) | ||
| 671 | (plain "window-rule" [ | ||
| 672 | (sleaf "match" { app-id = "^firefox$"; }) | ||
| 673 | (sleaf "open-on-workspace" "web") | ||
| 674 | (sleaf "open-maximized" true) | ||
| 675 | ]) | ||
| 676 | (plain "window-rule" [ | ||
| 677 | (sleaf "match" { app-id = "^mpv$"; }) | ||
| 678 | (sleaf "open-on-workspace" "vid") | ||
| 679 | (plain "default-column-width" [(sleaf "proportion" 1.)]) | ||
| 680 | ]) | ||
| 681 | (plain "window-rule" [ | ||
| 682 | (sleaf "match" { app-id = "^Alacritty-play$"; }) | ||
| 683 | (sleaf "open-on-workspace" "vid") | ||
| 684 | (sleaf "open-focused" false) | ||
| 685 | ]) | ||
| 686 | (plain "window-rule" [ | ||
| 687 | (sleaf "match" { app-id = "^chrome-audiobookshelf\.yggdrasil\.li__-Default$"; }) | ||
| 688 | (sleaf "match" { app-id = "^YouTube Music Desktop App$"; }) | ||
| 689 | (sleaf "open-on-workspace" "vid") | ||
| 690 | ]) | ||
| 691 | (plain "window-rule" [ | ||
| 692 | (sleaf "match" { app-id = "^pdfpc$"; }) | ||
| 693 | (plain "default-column-width" [(sleaf "proportion" 1.)]) | ||
| 694 | ]) | ||
| 695 | (plain "window-rule" [ | ||
| 696 | (sleaf "match" { app-id = "^pdfpc$"; title = "^.*presentation.*$"; }) | ||
| 697 | (plain "default-column-width" [(sleaf "proportion" 1.)]) | ||
| 698 | (sleaf "open-fullscreen" true) | ||
| 699 | (sleaf "open-on-workspace" "bmr") | ||
| 700 | (sleaf "open-focused" false) | ||
| 701 | ]) | ||
| 702 | (plain "window-rule" (normalize-nodes [ | ||
| 703 | (map (sleaf "match") [ | ||
| 704 | { app-id = "^Gimp-"; title = "^Quit GIMP$"; } | ||
| 705 | { app-id = "^org\\.kde\\.polkit-kde-authentication-agent-1$"; } | ||
| 706 | { app-id = "^xdg-desktop-portal-gtk$"; } | ||
| 707 | ]) | ||
| 708 | (sleaf "open-floating" true) | ||
| 709 | ])) | ||
| 710 | (plain "window-rule" [ | ||
| 711 | (sleaf "match" { app-id = "^org\\.pwmt\\.zathura$"; }) | ||
| 712 | (sleaf "match" { app-id = "^evince$"; }) | ||
| 713 | (sleaf "match" { app-id = "^org\\.gnome\\.Papers$"; }) | ||
| 714 | (sleaf "default-column-display" "tabbed") | ||
| 715 | ]) | ||
| 716 | (plain "window-rule" [ | ||
| 717 | (sleaf "match" { is-window-cast-target = true; }) | ||
| 718 | (plain "border" [ | ||
| 719 | (sleaf "width" 2) | ||
| 720 | (sleaf "active-gradient" { | ||
| 721 | from = "hsla(20 100% 45% 1)"; | ||
| 722 | to = "hsla(340 100% 37.5% 1)"; | ||
| 723 | angle = 29; | ||
| 724 | relative-to = "workspace-view"; | ||
| 725 | }) | ||
| 726 | (sleaf "inactive-gradient" { | ||
| 727 | from = "hsla(20 50% 27.7% 1)"; | ||
| 728 | to = "hsla(340 50% 23% 1)"; | ||
| 729 | angle = 29; | ||
| 730 | relative-to = "workspace-view"; | ||
| 731 | }) | ||
| 732 | ]) | ||
| 733 | ]) | ||
| 734 | |||
| 735 | (plain "layer-rule" [ | ||
| 736 | (sleaf "match" { namespace = "^notifications$"; }) | ||
| 737 | (sleaf "match" { namespace = "^bar$"; }) | ||
| 738 | (sleaf "match" { namespace = "^launcher$"; }) | ||
| 739 | (sleaf "block-out-from" "screencast") | ||
| 740 | ]) | ||
| 741 | |||
| 742 | (plain "recent-windows" [ | ||
| 743 | (flag "off") | ||
| 744 | ]) | ||
| 745 | |||
| 746 | (plain "binds" | ||
| 747 | (let | ||
| 748 | bind = name: cfg: node name [(lib.removeAttrs cfg ["action"])] (lib.mapAttrsToList leaf (lib.removeAttrs cfg.action ["__functor"])); | ||
| 749 | |||
| 750 | move-column-to-workspace = kdl.magic-leaf "move-column-to-workspace"; | ||
| 751 | screenshot = kdl.magic-leaf "screenshot"; | ||
| 752 | screenshot-window = kdl.magic-leaf "screenshot-window"; | ||
| 753 | screenshot-screen = kdl.magic-leaf "screenshot-screen"; | ||
| 754 | in | ||
| 755 | normalize-nodes [ | ||
| 756 | (lib.mapAttrsToList bind (with config.lib.niri.actions; { | ||
| 757 | "Mod+Slash".action = show-hotkey-overlay; | ||
| 758 | |||
| 759 | "Mod+Return".action = spawn (spawnTerminal {}); | ||
| 760 | "Mod+Shift+Return".action = spawn (spawnTerminal { | ||
| 761 | command = lib.getExe config.programs.nushell.package; | ||
| 762 | }); | ||
| 763 | "Mod+Q".action = close-window; | ||
| 764 | "Mod+O".action = spawn (lib.getExe config.programs.fuzzel.package); | ||
| 765 | "Mod+Shift+O".action = spawn (lib.getExe config.programs.fuzzel.package) "--list-executables-in-path"; | ||
| 766 | |||
| 767 | "Mod+Alt+E".action = spawn (lib.getExe' config.services.emacs.package "emacsclient") "-c"; | ||
| 768 | "Mod+Alt+Y".action = spawn (lib.getExe (pkgs.writeShellApplication { | ||
| 769 | name = "queue-yt-dlp"; | ||
| 770 | runtimeInputs = with pkgs; [ wl-clipboard-rs socat ]; | ||
| 771 | text = '' | ||
| 772 | socat STDIO UNIX-CONNECT:"$XDG_RUNTIME_DIR"/yt-dlp.sock <<<$'{ "urls": ["'"$(wl-paste)"$'"] }' | ||
| 773 | ''; | ||
| 774 | })); | ||
| 775 | "Mod+Alt+L".action = spawn (lib.getExe (pkgs.writeShellApplication { | ||
| 776 | name = "queue-yt-dlp"; | ||
| 777 | runtimeInputs = with pkgs; [ wl-clipboard-rs ]; | ||
| 778 | text = '' | ||
| 779 | exec -- ${lib.concatStringsSep " " (spawnTerminal { | ||
| 780 | extraArgs = [ "--class" "Alacritty-play" "--working-directory" "\"$HOME\"/media" ]; | ||
| 781 | command = ["mpv" "\"$(wl-paste)\""]; | ||
| 782 | })} | ||
| 783 | ''; | ||
| 784 | })); | ||
| 785 | "Mod+Alt+M".action = spawn (lib.getExe' pkgs.screen-message "sm") "-n" "Fira Mono" "-a" "1" "-f" "#fff" "-b" "#000"; | ||
| 786 | |||
| 787 | "Mod+U".action = spawn (lib.getExe (pkgs.writeShellApplication { | ||
| 788 | name = "qalc-fuzzel"; | ||
| 789 | runtimeInputs = with pkgs; [ wl-clipboard-rs libqalculate config.programs.fuzzel.package coreutils findutils libnotify gnugrep ]; | ||
| 790 | text = '' | ||
| 791 | RESULTS_DIR="$HOME/.cache/qalc-fuzzel" | ||
| 792 | prev() { | ||
| 793 | FOUND=false | ||
| 794 | while IFS= read -r line; do | ||
| 795 | [[ -n "$line" ]] || continue | ||
| 796 | FOUND=true | ||
| 797 | echo "$line" | ||
| 798 | done < <(export LC_ALL=C.UTF-8; echo; find "$RESULTS_DIR" -type f -printf $'%T@ %p\n' | sort -n | cut -d' ' -f2- | xargs -r cat) | ||
| 799 | $FOUND || echo | ||
| 800 | } | ||
| 801 | FUZZEL_RES=$(prev | fuzzel --dmenu --prompt "qalc> " --width=60) || exit $? | ||
| 802 | if [[ "$FUZZEL_RES" =~ .*\ =\ .* ]]; then | ||
| 803 | QALC_RES="$FUZZEL_RES" | ||
| 804 | QALC_RET=0 | ||
| 805 | else | ||
| 806 | QALC_RES=$(qalc -set "autocalc off" "$FUZZEL_RES" 2>&1) | ||
| 807 | QALC_RET=$? | ||
| 808 | fi | ||
| 809 | [[ -n "$QALC_RES" ]] || exit 1 | ||
| 810 | EXISTING=false | ||
| 811 | set +o pipefail | ||
| 812 | grep -Fxrl "$QALC_RES" "$RESULTS_DIR" | xargs -r touch | ||
| 813 | [[ ''${PIPESTATUS[0]} -eq 0 ]] && EXISTING=true | ||
| 814 | set -o pipefail | ||
| 815 | if [[ $QALC_RET -eq 0 ]] && ! $EXISTING; then | ||
| 816 | set +o pipefail | ||
| 817 | RES_FILE="$RESULTS_DIR"/$(date -uIs).$(tr -Cd 'a-zA-Z0-9' </dev/random | head -c 10) | ||
| 818 | set -o pipefail | ||
| 819 | cat >"$RES_FILE" <<<"$QALC_RES" | ||
| 820 | fi | ||
| 821 | [[ "$QALC_RES" =~ .*\ =\ (.*) ]] && QALC_RES="''${BASH_REMATCH[1]}" | ||
| 822 | [[ $QALC_RET -eq 0 ]] && wl-copy "$QALC_RES" | ||
| 823 | notify-send "$QALC_RES" | ||
| 824 | ''; | ||
| 825 | })); | ||
| 826 | "Mod+Shift+U".action = spawn (spawnTerminal { | ||
| 827 | command = lib.getExe pkgs.libqalculate; | ||
| 828 | }); | ||
| 829 | # "Mod+E".action = spawn (lib.getExe (pkgs.writeShellApplication { | ||
| 830 | # name = "emoji-fuzzel"; | ||
| 831 | # runtimeInputs = with pkgs; [ config.programs.fuzzel.package wtype wl-clipboard-rs ]; | ||
| 832 | # text = '' | ||
| 833 | # FUZZEL_RES=$(fuzzel --dmenu --prompt "emoji> " --cache "$HOME"/.cache/fuzzel-emoji --width=60 <"$HOME"/.local/share/emoji-data/list.txt) || exit $? | ||
| 834 | # [[ -n "$FUZZEL_RES" ]] || exit 1 | ||
| 835 | # wl-copy "$(cut -d ':' -f 1 <<<"$FUZZEL_RES" | tr -d '\n')" && wtype -k XF86Paste | ||
| 836 | # ''; | ||
| 837 | # })); | ||
| 838 | "Print".action = screenshot; | ||
| 839 | "Control+Print".action = screenshot-window; | ||
| 840 | "Shift+Print".action = screenshot-screen; | ||
| 841 | "Mod+B".action = with-select-window-action ".workspace_id == ($active_workspace | tonumber)" "{\"Action\":{\"FocusWindow\":{\"id\": .id}}}"; | ||
| 842 | "Mod+Shift+B".action = with-select-window-action "true" "{\"Action\":{\"FocusWindow\":{\"id\": .id}}}"; | ||
| 843 | |||
| 844 | "Mod+Escape" = { | ||
| 845 | allow-inhibiting = false; | ||
| 846 | action = toggle-keyboard-shortcuts-inhibit; | ||
| 847 | }; | ||
| 848 | |||
| 849 | "Mod+H".action = focus-column-left; | ||
| 850 | "Mod+T".action = focus-window-down; | ||
| 851 | "Mod+N".action = focus-window-up; | ||
| 852 | "Mod+S".action = focus-column-right; | ||
| 853 | |||
| 854 | "Mod+Shift+H".action = move-column-left; | ||
| 855 | "Mod+Shift+T".action = move-window-down; | ||
| 856 | "Mod+Shift+N".action = move-window-up; | ||
| 857 | "Mod+Shift+S".action = move-column-right; | ||
| 858 | |||
| 859 | "Mod+Control+H".action = focus-monitor-left; | ||
| 860 | "Mod+Control+T".action = focus-monitor-down; | ||
| 861 | "Mod+Control+N".action = focus-monitor-up; | ||
| 862 | "Mod+Control+S".action = focus-monitor-right; | ||
| 863 | |||
| 864 | "Mod+Shift+Control+H".action = move-workspace-to-monitor-left; | ||
| 865 | "Mod+Shift+Control+T".action = move-workspace-to-monitor-down; | ||
| 866 | "Mod+Shift+Control+N".action = move-workspace-to-monitor-up; | ||
| 867 | "Mod+Shift+Control+S".action = move-workspace-to-monitor-right; | ||
| 868 | |||
| 869 | "Mod+G".action = focus-adjacent-workspace "down"; | ||
| 870 | "Mod+C".action = focus-adjacent-workspace "up"; | ||
| 871 | |||
| 872 | "Mod+Shift+G".action = move-column-to-adjacent-workspace "down"; | ||
| 873 | "Mod+Shift+C".action = move-column-to-adjacent-workspace "up"; | ||
| 874 | |||
| 875 | "Mod+Shift+Control+G".action = move-workspace-down; | ||
| 876 | "Mod+Shift+Control+C".action = move-workspace-up; | ||
| 877 | |||
| 878 | "Mod+ParenLeft".action = focus-workspace "comm"; | ||
| 879 | "Mod+Shift+ParenLeft".action = move-column-to-workspace "comm"; | ||
| 880 | |||
| 881 | "Mod+ParenRight".action = focus-workspace "web"; | ||
| 882 | "Mod+Shift+ParenRight".action = move-column-to-workspace "web"; | ||
| 883 | |||
| 884 | "Mod+BraceRight".action = focus-workspace "read"; | ||
| 885 | "Mod+Shift+BraceRight".action = move-column-to-workspace "read"; | ||
| 886 | |||
| 887 | "Mod+BraceLeft".action = focus-workspace "mon"; | ||
| 888 | "Mod+Shift+BraceLeft".action = move-column-to-workspace "mon"; | ||
| 889 | |||
| 890 | "Mod+Asterisk".action = focus-workspace "vid"; | ||
| 891 | "Mod+Shift+Asterisk".action = move-column-to-workspace "vid"; | ||
| 892 | |||
| 893 | "Mod+Plus".action = with-unnamed-workspace-action ''{"Action":{"FocusWorkspace":{"reference":{"Id": .id}}}}''; | ||
| 894 | "Mod+Shift+Plus".action = with-unnamed-workspace-action ''{"Action":{"MoveColumnToWorkspace":{"reference":{"Id": .id}, "focus": true}}}''; | ||
| 895 | |||
| 896 | "Mod+M".action = consume-or-expel-window-left; | ||
| 897 | "Mod+W".action = consume-or-expel-window-right; | ||
| 898 | |||
| 899 | "Mod+Shift+M".action = toggle-column-tabbed-display; | ||
| 900 | |||
| 901 | "Mod+L".action = maximize-window-to-edges; | ||
| 902 | "Mod+R".action = switch-preset-column-width; | ||
| 903 | "Mod+Shift+R".action = maximize-column; | ||
| 904 | "Mod+Shift+Ctrl+R".action = switch-preset-window-height; | ||
| 905 | "Mod+F".action = center-column; | ||
| 906 | "Mod+Shift+F".action = toggle-windowed-fullscreen; | ||
| 907 | "Mod+Ctrl+Shift+F".action = fullscreen-window; | ||
| 908 | |||
| 909 | "Mod+V".action = switch-focus-between-floating-and-tiling; | ||
| 910 | "Mod+Shift+V".action = toggle-window-floating; | ||
| 911 | |||
| 912 | "Mod+Left".action = set-column-width "-10%"; | ||
| 913 | "Mod+Down".action = set-window-height "-10%"; | ||
| 914 | "Mod+Up".action = set-window-height "+10%"; | ||
| 915 | "Mod+Right".action = set-column-width "+10%"; | ||
| 916 | |||
| 917 | "Mod+Shift+Z" = { | ||
| 918 | action = power-off-monitors; | ||
| 919 | allow-when-locked = true; | ||
| 920 | }; | ||
| 921 | "Mod+Shift+E".action = quit; | ||
| 922 | |||
| 923 | # "Mod+Semicolon".action = spawn makoctl "dismiss" "--group"; | ||
| 924 | # "Mod+Shift+Semicolon".action = spawn makoctl "dismiss" "--all"; | ||
| 925 | # "Mod+Period".action = spawn makoctl "menu" "--" (lib.getExe config.programs.fuzzel.package) "--dmenu"; | ||
| 926 | # "Mod+Comma".action = spawn makoctl "restore"; | ||
| 927 | |||
| 928 | "Mod+Control+W".action = with-empty-unnamed-workspace-action "{\"Action\":{\"FocusWorkspace\":{\"reference\":{\"Id\": $workspace_id}}}}"; | ||
| 929 | "Mod+Control+Shift+W".action = with-empty-unnamed-workspace-action "{\"Action\":{\"MoveColumnToWorkspace\":{\"reference\":{\"Id\": $workspace_id}, \"focus\": true}}}"; | ||
| 930 | |||
| 931 | "Mod+X".action = set-dynamic-cast-window; | ||
| 932 | "Mod+Shift+X".action = set-dynamic-cast-monitor; | ||
| 933 | "Mod+Control+Shift+X".action = clear-dynamic-cast-target; | ||
| 934 | |||
| 935 | "Mod+D".action = with-urgent-window-action "{\"Action\":{\"FocusWindow\":{\"id\": .id}}}"; | ||
| 936 | "Mod+Shift+D".action = with-focused-window-action "{\"Action\":{\"UnsetUrgent\":{\"id\": .id}}}"; | ||
| 937 | |||
| 938 | "Mod+K".action = spawn (toString (pkgs.resholve.writeScript "worktime-ui" { | ||
| 939 | interpreter = pkgs.runtimeShell; | ||
| 940 | inputs = [ pkgs.worktime config.programs.quickshell.package ]; | ||
| 941 | execer = [ | ||
| 942 | "cannot:${lib.getExe' config.programs.quickshell.package "qs"}" | ||
| 943 | ]; | ||
| 944 | } '' | ||
| 945 | worktime-ui && qs ipc call Worktime refresh | ||
| 946 | '')); | ||
| 947 | "Mod+Shift+K".action = spawn (lib.getExe' pkgs.worktime "worktime-stop"); | ||
| 948 | })) | ||
| 949 | (lib.mapAttrsToList (name: cfg: node name [(lib.removeAttrs cfg ["action"])] [cfg.action]) (let | ||
| 950 | shell = obj: leaf "send-unix" [ | ||
| 951 | { path = ''''${XDG_RUNTIME_DIR}/shell.sock''; } | ||
| 952 | (builtins.toJSON obj + "\n") | ||
| 953 | ]; | ||
| 954 | in { | ||
| 955 | "XF86AudioRaiseVolume" = { | ||
| 956 | allow-when-locked = true; | ||
| 957 | action = shell { Volume.volume = "up"; }; | ||
| 958 | }; | ||
| 959 | "XF86AudioLowerVolume" = { | ||
| 960 | allow-when-locked = true; | ||
| 961 | action = shell { Volume.volume = "down"; }; | ||
| 962 | }; | ||
| 963 | "XF86AudioMute" = { | ||
| 964 | allow-when-locked = true; | ||
| 965 | action = shell { Volume.muted = "toggle"; }; | ||
| 966 | }; | ||
| 967 | "XF86AudioMicMute" = { | ||
| 968 | allow-when-locked = true; | ||
| 969 | action = shell { Volume."mic-muted" = "toggle"; }; | ||
| 970 | }; | ||
| 971 | "XF86MonBrightnessUp" = { | ||
| 972 | action = shell { Brightness = "up"; }; | ||
| 973 | allow-when-locked = true; | ||
| 974 | }; | ||
| 975 | "XF86MonBrightnessDown" = { | ||
| 976 | action = shell { Brightness = "down"; }; | ||
| 977 | allow-when-locked = true; | ||
| 978 | }; | ||
| 979 | "Mod+Shift+L".action = shell { LockSession = {}; }; | ||
| 980 | "Mod+Shift+Minus" = { | ||
| 981 | action = shell { Sleep = {}; }; | ||
| 982 | allow-when-locked = true; | ||
| 983 | }; | ||
| 984 | "Mod+Shift+Control+Minus" = { | ||
| 985 | action = shell { Hibernate = {}; }; | ||
| 986 | allow-when-locked = true; | ||
| 987 | }; | ||
| 988 | "Mod+Shift+P" = { | ||
| 989 | action = shell { Mpris = { PauseAll = {}; }; }; | ||
| 990 | allow-when-locked = true; | ||
| 991 | }; | ||
| 992 | "Mod+Semicolon".action = shell { Notifications = { DismissGroup = {}; }; }; | ||
| 993 | "Mod+Shift+Semicolon".action = shell { Notifications = { DismissAll = {}; }; }; | ||
| 994 | "Mod+Print".action = shell { ScreenRecord = { Toggle = {}; }; }; | ||
| 995 | })) | ||
| 996 | (map ({ name, selector, spawn, key, ...}: if key != null && selector != null && spawn != null then bind key { action = focus-or-spawn-action selector name spawn; } else null) cfg.scratchspaces) | ||
| 997 | (map ({ name, moveKey, ...}: if moveKey != null then bind moveKey { action = move-column-to-workspace name; } else null) cfg.scratchspaces) | ||
| 998 | ] | ||
| 999 | )) | ||
| 1000 | ]; | ||
| 1001 | }; | ||
| 1002 | } | ||
diff --git a/accounts/gkleen@skadhi/rzm/default.nix b/accounts/gkleen@skadhi/rzm/default.nix new file mode 100644 index 00000000..ef30278b --- /dev/null +++ b/accounts/gkleen@skadhi/rzm/default.nix | |||
| @@ -0,0 +1,273 @@ | |||
| 1 | { config, pkgs, lib, ... }: | ||
| 2 | let | ||
| 3 | mwnSubnetsPublic = | ||
| 4 | [ "129.187.0.0/16" "141.40.0.0/16" "141.84.0.0/16" | ||
| 5 | "192.68.211.0/24" "192.68.212.0/24" "192.68.213.0/24" "192.68.214.0/24" "192.68.215.0/24" | ||
| 6 | "193.174.96.0/22" | ||
| 7 | "194.95.59.0/24" | ||
| 8 | ]; | ||
| 9 | mwnSubnetsPrivate = | ||
| 10 | [ "10.153.0.0/16" "10.162.0.0/16" "10.156.0.0/16" | ||
| 11 | ]; | ||
| 12 | in { | ||
| 13 | config = { | ||
| 14 | systemd.network = { | ||
| 15 | config.routeTables.wgrz = 1025; | ||
| 16 | netdevs = { | ||
| 17 | wgrz = { | ||
| 18 | netdevConfig = { | ||
| 19 | Name = "wgrz"; | ||
| 20 | Kind = "wireguard"; | ||
| 21 | MTUBytes = "1558"; | ||
| 22 | }; | ||
| 23 | wireguardConfig = { | ||
| 24 | PrivateKeyFile = "/run/credentials/systemd-networkd.service/wgrz.priv"; | ||
| 25 | ListenPort = 51822; | ||
| 26 | # FirewallMark = 1; | ||
| 27 | }; | ||
| 28 | wireguardPeers = [ | ||
| 29 | { AllowedIPs = [ "10.200.116.1/32" "10.163.88.40/32" ] ++ mwnSubnetsPrivate ++ mwnSubnetsPublic; | ||
| 30 | PublicKey = "YlRFLc+rD2k2KXl7pIJbOKbcPgdJCl8ZTsv0xlK4VEI="; | ||
| 31 | PersistentKeepalive = 25; | ||
| 32 | Endpoint = "wg.math.lmu.de:51820"; | ||
| 33 | } | ||
| 34 | ]; | ||
| 35 | }; | ||
| 36 | }; | ||
| 37 | networks = { | ||
| 38 | wgrz = { | ||
| 39 | name = "wgrz"; | ||
| 40 | matchConfig = { | ||
| 41 | Name = "wgrz"; | ||
| 42 | }; | ||
| 43 | address = ["10.200.116.131/24"]; | ||
| 44 | routes = map (Destination: { | ||
| 45 | inherit Destination; | ||
| 46 | Gateway = "10.200.116.1"; | ||
| 47 | GatewayOnLink = true; | ||
| 48 | Table = "wgrz"; | ||
| 49 | }) (mwnSubnetsPrivate ++ mwnSubnetsPublic ++ ["10.163.88.40/32"]); | ||
| 50 | routingPolicyRules = [ | ||
| 51 | { Table = "main"; | ||
| 52 | # FirewallMark = 1; | ||
| 53 | To = "129.187.111.225"; | ||
| 54 | Priority = 100; | ||
| 55 | } | ||
| 56 | { Table = "main"; | ||
| 57 | To = "10.153.91.204"; | ||
| 58 | Priority = 100; | ||
| 59 | } | ||
| 60 | { Table = "wgrz"; | ||
| 61 | From = "10.200.116.131"; | ||
| 62 | Priority = 200; | ||
| 63 | } | ||
| 64 | { Table = "wgrz"; | ||
| 65 | To = "10.163.88.40"; | ||
| 66 | Priority = 200; | ||
| 67 | } | ||
| 68 | ] ++ map (To: { Table = "wgrz"; | ||
| 69 | inherit To; | ||
| 70 | Priority = 200; | ||
| 71 | }) (mwnSubnetsPrivate ++ mwnSubnetsPublic); | ||
| 72 | linkConfig = { | ||
| 73 | RequiredForOnline = false; | ||
| 74 | }; | ||
| 75 | networkConfig = { | ||
| 76 | LLMNR = false; | ||
| 77 | MulticastDNS = false; | ||
| 78 | DNS = ["10.153.88.9" "129.187.111.202" "10.156.33.53"]; | ||
| 79 | # Tunnel = "rz-gre-1"; | ||
| 80 | }; | ||
| 81 | }; | ||
| 82 | }; | ||
| 83 | }; | ||
| 84 | networking.networkmanager.unmanaged = ["wgrz"]; | ||
| 85 | sops.secrets.wgrz = { | ||
| 86 | format = "binary"; | ||
| 87 | sopsFile = ./wgrz.priv; | ||
| 88 | }; | ||
| 89 | systemd.services."systemd-networkd".serviceConfig.LoadCredential = [ | ||
| 90 | "wgrz.priv:${config.sops.secrets.wgrz.path}" | ||
| 91 | ]; | ||
| 92 | |||
| 93 | environment.etc."NetworkManager/dnsmasq.d/wgrz.conf" = { | ||
| 94 | text = '' | ||
| 95 | server=/mathinst.loc/10.153.88.9@wgrz | ||
| 96 | server=/cipmath.loc/10.153.88.9@wgrz | ||
| 97 | ''; | ||
| 98 | }; | ||
| 99 | |||
| 100 | home-manager.users.gkleen = { sysConfig, config, lib, ... }: { | ||
| 101 | home.persistence."/persistent" = { | ||
| 102 | files = [ | ||
| 103 | "rz.kdbx" | ||
| 104 | ]; | ||
| 105 | directories = [ | ||
| 106 | ".config/Element-lmu" ".config/worktime" | ||
| 107 | ".config/chromium-kimai" ".config/chromium-rainbow" | ||
| 108 | ]; | ||
| 109 | }; | ||
| 110 | |||
| 111 | xdg.desktopEntries = { | ||
| 112 | element-lmu = { | ||
| 113 | name = "Element (LMU)"; | ||
| 114 | exec = "element-desktop --profile=lmu %u"; | ||
| 115 | icon = "element"; | ||
| 116 | genericName = "Matrix Client"; | ||
| 117 | categories = [ "Network" "InstantMessaging" "Chat" ]; | ||
| 118 | settings = { | ||
| 119 | StartupWMClass = "Element"; | ||
| 120 | }; | ||
| 121 | }; | ||
| 122 | thunderbird-lmu = { | ||
| 123 | name = "Thunderbird (LMU)"; | ||
| 124 | exec = "thunderbird --name thunderbird -P lmu %U"; | ||
| 125 | icon = "thunderbird"; | ||
| 126 | genericName = "Email Client"; | ||
| 127 | categories = [ "Network" "Chat" "Email" "Feed" "GTK" "News" ]; | ||
| 128 | settings = { | ||
| 129 | StartupWMClass = "thunderbird"; | ||
| 130 | StartupNotify = "true"; | ||
| 131 | }; | ||
| 132 | }; | ||
| 133 | rainbow = { | ||
| 134 | name = "Rainbow"; | ||
| 135 | exec = toString (pkgs.writeShellScript "rainbow" '' | ||
| 136 | exec -- \ | ||
| 137 | ${lib.getExe' sysConfig.systemd.package "systemd-run"} --wait --user --slice-inherit \ | ||
| 138 | --property 'CPUAccounting=yes' --property 'CPUQuotaPeriodSec=50ms' \ | ||
| 139 | -E DSCP=46 -E NIXOS_OZONE_WL \ | ||
| 140 | -- ${lib.getExe pkgs.dscp} ${lib.getExe config.programs.chromium.package} \ | ||
| 141 | --class=Rainbow \ | ||
| 142 | --app="https://web.openrainbow.com" \ | ||
| 143 | --user-data-dir=''${HOME}/.config/chromium-rainbow | ||
| 144 | ''); | ||
| 145 | icon = pkgs.fetchurl { | ||
| 146 | url = "https://web.openrainbow.com/rb/2.174.21/assets/skins/rainbow/images/homepage/logo__rainbow.svg"; | ||
| 147 | hash = "sha256-5fmo8rDqVDpzkGaPjk4Y+SsSZpAsY7VUQSFW6WdHwuU="; | ||
| 148 | }; | ||
| 149 | settings = { | ||
| 150 | StartupWMClass = "Rainbow"; | ||
| 151 | }; | ||
| 152 | }; | ||
| 153 | kimai = { | ||
| 154 | name = "Kimai"; | ||
| 155 | exec = toString (pkgs.writeShellScript "kimai" '' | ||
| 156 | exec -- \ | ||
| 157 | ${lib.getExe config.programs.chromium.package} \ | ||
| 158 | --class=Kimai \ | ||
| 159 | --app="https://kimai.yggdrasil.li" \ | ||
| 160 | --user-data-dir=''${HOME}/.config/chromium-kimai | ||
| 161 | ''); | ||
| 162 | icon = pkgs.fetchurl { | ||
| 163 | url = "https://www.kimai.org/images/kimai_logo.png"; | ||
| 164 | hash = "sha256-lnlOttzR2SwXA70R+egJUkeKr4U5V0avqTk8uX4bqfs="; | ||
| 165 | }; | ||
| 166 | settings = { | ||
| 167 | StartupWMClass = "Kimai"; | ||
| 168 | StartupNotify = "true"; | ||
| 169 | }; | ||
| 170 | }; | ||
| 171 | }; | ||
| 172 | |||
| 173 | programs.zsh.dirHashes = { | ||
| 174 | u2w = "$HOME/projects/uni2work"; | ||
| 175 | rz = "$HOME/projects/rz"; | ||
| 176 | pro = "$HOME/projects/pro"; | ||
| 177 | }; | ||
| 178 | |||
| 179 | programs.ssh.settings = { | ||
| 180 | "repo-apt01" = lib.hm.dag.entryBefore ["*.mathinst.loc"] { | ||
| 181 | User = "root"; | ||
| 182 | Hostname = "repo-apt01.mathinst.loc"; | ||
| 183 | inherit (config.programs.ssh.autosshProxies."mgmt01") ProxyCommand; | ||
| 184 | }; | ||
| 185 | "mgmt01" = lib.hm.dag.entryBefore ["*.mathinst.loc"] { | ||
| 186 | User = "root"; | ||
| 187 | Hostname = "mgmt01.mathinst.loc"; | ||
| 188 | inherit (config.programs.ssh.autosshProxies."mathw0h") ProxyCommand; | ||
| 189 | }; | ||
| 190 | "mathw0e" = lib.hm.dag.entryBefore ["*.mathinst.loc"] { | ||
| 191 | Hostname = "mathw0e.mathinst.loc"; | ||
| 192 | inherit (config.programs.ssh.autosshProxies."mathw0h") ProxyCommand; | ||
| 193 | }; | ||
| 194 | "cip04" = lib.hm.dag.entryBefore ["*.mathinst.loc"] { | ||
| 195 | Hostname = "cip04.cipmath.loc"; | ||
| 196 | inherit (config.programs.ssh.autosshProxies."mathw0h") ProxyCommand; | ||
| 197 | }; | ||
| 198 | "mathw0h" = lib.hm.dag.entryBefore ["*.mathinst.loc"] { | ||
| 199 | Hostname = "mathw0h.mathinst.loc"; | ||
| 200 | inherit (config.programs.ssh.autosshProxies."ssh.math.lmu.de") ProxyCommand; | ||
| 201 | }; | ||
| 202 | "math05" = lib.hm.dag.entryBefore ["*.mathinst.loc"] { | ||
| 203 | Hostname = "math05.mathinst.loc"; | ||
| 204 | inherit (config.programs.ssh.autosshProxies."mathw0h") ProxyCommand; | ||
| 205 | KexAlgorithms = "+diffie-hellman-group1-sha1"; | ||
| 206 | }; | ||
| 207 | "dhcp01" = lib.hm.dag.entryBefore ["*.mathinst.loc"] { | ||
| 208 | Hostname = "dhcp01.mathinst.loc"; | ||
| 209 | User = "root"; | ||
| 210 | inherit (config.programs.ssh.autosshProxies."mathw0h") ProxyCommand; | ||
| 211 | }; | ||
| 212 | "dhcp02" = lib.hm.dag.entryBefore ["*.mathinst.loc"] { | ||
| 213 | Hostname = "dhcp02.mathinst.loc"; | ||
| 214 | User = "root"; | ||
| 215 | inherit (config.programs.ssh.autosshProxies."mathw0h") ProxyCommand; | ||
| 216 | }; | ||
| 217 | "u2w-www01" = lib.hm.dag.entryBefore ["*.mathinst.loc"] { | ||
| 218 | Hostname = "u2w-www01.mathinst.loc"; | ||
| 219 | User = "root"; | ||
| 220 | inherit (config.programs.ssh.autosshProxies."mgmt01") ProxyCommand; | ||
| 221 | }; | ||
| 222 | "mail-mi01" = lib.hm.dag.entryBefore ["*.mathinst.loc"] { | ||
| 223 | Hostname = "mail-mi01.mathinst.loc"; | ||
| 224 | User = "root"; | ||
| 225 | inherit (config.programs.ssh.autosshProxies."mathw0h") ProxyCommand; | ||
| 226 | }; | ||
| 227 | "gitlab-ce.lrz.de" = { | ||
| 228 | User = "git"; | ||
| 229 | IdentityFile = "~/.ssh/gkleen@gitlab-ce.lrz.de"; | ||
| 230 | }; | ||
| 231 | "gitlab.lrz.de" = { | ||
| 232 | User = "git"; | ||
| 233 | IdentityFile = "~/.ssh/gkleen@gitlab.lrz.de"; | ||
| 234 | }; | ||
| 235 | "vrt-kvm05" = { | ||
| 236 | User = "root"; | ||
| 237 | inherit (config.programs.ssh.autosshProxies."mathw0e") ProxyCommand; | ||
| 238 | PasswordAuthentication = "yes"; | ||
| 239 | }; | ||
| 240 | "*.mathinst.loc" = { | ||
| 241 | header = "Match host *.mathinst.loc,*.cipmath.loc,*.math.lmu.de"; | ||
| 242 | IdentityFile = "~/.ssh/gkleen@mathinst.loc"; | ||
| 243 | HostKeyAlgorithms = "+ssh-rsa"; | ||
| 244 | PubkeyAcceptedAlgorithms = "+ssh-rsa"; | ||
| 245 | PasswordAuthentication = "yes"; | ||
| 246 | GlobalKnownHostsFile = toString (pkgs.writeText "ssh_known_hosts" '' | ||
| 247 | @cert-authority *.mathinst.loc,*.math.lmu.de,*.cipmath.loc ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBUTFpVCdETCXiDSDl7YGbR1J4BLTsoBzjDtflHJGO/z ssh-pki@mgmt01 | ||
| 248 | ''); | ||
| 249 | }; | ||
| 250 | }; | ||
| 251 | |||
| 252 | programs.ssh.autosshProxies = { | ||
| 253 | "mgmt01" = { port = 8129; sshpassSecret = "root@mgmt01.mathinst.loc"; }; | ||
| 254 | "mathw0e" = { port = 8125; sshpassSecret = "gkleen@mathw0e.mathinst.loc"; }; | ||
| 255 | "mathw0h" = { port = 8123; sshpassSecret = "gkleen@mathw0h.mathinst.loc"; }; | ||
| 256 | "cip04" = { port = 8127; sshpassSecret = "gkleen@cip04.cipmath.loc"; }; | ||
| 257 | "ssh.math.lmu.de" = { port = 8119; sshpassSecret = "gkleen@ssh.math.lmu.de"; }; | ||
| 258 | }; | ||
| 259 | |||
| 260 | home.file = { | ||
| 261 | ".cups/client.conf".text = '' | ||
| 262 | ServerName cups.mathinst.loc | ||
| 263 | ''; | ||
| 264 | }; | ||
| 265 | |||
| 266 | home.packages = with pkgs; [ | ||
| 267 | cups | ||
| 268 | ]; | ||
| 269 | |||
| 270 | fonts.lmu-hausschrift.enable = true; | ||
| 271 | }; | ||
| 272 | }; | ||
| 273 | } | ||
diff --git a/accounts/gkleen@skadhi/rzm/wgrz.priv b/accounts/gkleen@skadhi/rzm/wgrz.priv new file mode 100644 index 00000000..d34e96ee --- /dev/null +++ b/accounts/gkleen@skadhi/rzm/wgrz.priv | |||
| @@ -0,0 +1,18 @@ | |||
| 1 | { | ||
| 2 | "data": "ENC[AES256_GCM,data:HbX+Vd4IpVcWIH/llV3BWnuWwOzNw/bZfjisD38CFNbd/RCPEnuIb2XCNi+4,iv:at3CY0GIDSSQSmiXlnNgLMIGIT5V8CYOCuFyThjMmGE=,tag:ZAttUMhZV56G5A54a8YXbg==,type:str]", | ||
| 3 | "sops": { | ||
| 4 | "age": [ | ||
| 5 | { | ||
| 6 | "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBRRU1GNkZtbXgwMjVvVlo2\nMXkvc24rcEgyVEpyMVZwL25QTGYrZzBjT25ZCldraUhhNkFveXhLQ09ibjNUOVJl\nSUkzL0MwbkVQQXgzZkNiQjEwM05BVTAKLS0tIE5rSFRJalJqbERwdzFGeHdrTXFG\nWFdPU21PUEtxbGdibXNVZnYxMUdPaTQKw83yVaRBy4d2YLchQJM5ucZrdTpe0PUZ\nM9SdUP1eGbOIWkeUttG/qsKrLfHT2+GDhydxU6gwKiAfwDr9I3IGCA==\n-----END AGE ENCRYPTED FILE-----\n", | ||
| 7 | "recipient": "age1rmmhetcmllq0ahl5qznlr0eya2zdxwl9h6y5wnl97d2wtyx5t99sm2u866" | ||
| 8 | }, | ||
| 9 | { | ||
| 10 | "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBBMDVCaTFYZVpmeUg1dWZs\nRHNYM3BSL2liemlaSGRWRTcya3VJUDd2akNNCjQ0N0V1ZTI1ZDhOZTBYMlBWZDdY\nQU1WSVNoMUhrUkgxQVhwL2VNZFVIeTgKLS0tIFhONzNXOXJoUjhOVFYrZWRPeEZJ\ncnpvblRDMDBKbXJjL2JpVUEwZ2NaRTQKNGtFm9ObnEPUHKKsTJaaALHsqFLPr5oO\nlCYIucEMFOYkM7o5wJCtLs5fsigQT6pAkeI3+N/rSz1hhDWuBB+PrQ==\n-----END AGE ENCRYPTED FILE-----\n", | ||
| 11 | "recipient": "age1u6xegt79rarmyz8qy4pl7jh9lh90vx8fg0frmh4u2mzam7zydq4s4agz4e" | ||
| 12 | } | ||
| 13 | ], | ||
| 14 | "lastmodified": "2026-09-27T10:18:59Z", | ||
| 15 | "mac": "ENC[AES256_GCM,data:BIHCMFB0oMcaByiALqgTaKBd1cNJZlFu3FnB7U0oTtw3Q65mFqrsLsphesuPxZxtD8eAdubT/YIC2rZ5ZCAZz/9eM1nt8tvBkO6ZGXmHeWUGlTpA7K2EAEK4D+8Bo8Xgf8afaTCmbrfKjn64iNQjUrmv8NMoY2Od8sYfIfRdYSs=,iv:d/Jt+ub2VcnJd9n7qwO6/j044D1fNtAmEQtZQrCNeEg=,tag:R7TPkPXyVV5UDsl9x1pboA==,type:str]", | ||
| 16 | "version": "3.13.3" | ||
| 17 | } | ||
| 18 | } | ||
diff --git a/accounts/gkleen@skadhi/shell/default.nix b/accounts/gkleen@skadhi/shell/default.nix new file mode 100644 index 00000000..d38356d3 --- /dev/null +++ b/accounts/gkleen@skadhi/shell/default.nix | |||
| @@ -0,0 +1,123 @@ | |||
| 1 | { config, pkgs, lib, ... }: | ||
| 2 | |||
| 3 | { | ||
| 4 | config = { | ||
| 5 | programs.quickshell = { | ||
| 6 | enable = true; | ||
| 7 | package = pkgs.symlinkJoin { | ||
| 8 | pname = pkgs.quickshell.pname + "-wrapped"; | ||
| 9 | inherit (pkgs.quickshell) version meta; | ||
| 10 | paths = [ pkgs.quickshell ]; | ||
| 11 | buildInputs = [ pkgs.makeWrapper ]; | ||
| 12 | postBuild = '' | ||
| 13 | for binary in quickshell qs; do | ||
| 14 | wrapProgram $out/bin/$binary \ | ||
| 15 | --prefix QT_PLUGIN_PATH : ${pkgs.qt6.qtimageformats}/${pkgs.qt6.qtbase.qtPluginPrefix} \ | ||
| 16 | --prefix QML_IMPORT_PATH : ${pkgs.qt6Packages.callPackage ./quickshell-plugins {}}/${pkgs.qt6.qtbase.qtQmlPrefix} | ||
| 17 | done | ||
| 18 | ''; | ||
| 19 | }; | ||
| 20 | config = { | ||
| 21 | src = ./quickshell; | ||
| 22 | replacements = { | ||
| 23 | ignore_workspaces = builtins.toJSON (map ({ name, ... }: name) config.programs.niri.scratchspaces); | ||
| 24 | wallpapers = builtins.toJSON (pkgs.stdenvNoCC.mkDerivation { | ||
| 25 | name = "wallpapers"; | ||
| 26 | srcs = [ | ||
| 27 | (pkgs.fetchurl { | ||
| 28 | url = "https://esawebb.org/media/archives/images/publicationtiff10k/carinanebula3.tif"; | ||
| 29 | hash = "sha256-YxZEweDKJfvfrdxb/QFmgJhcZDEJYxotoHrG+RRn1tw="; | ||
| 30 | }) | ||
| 31 | (pkgs.fetchurl { | ||
| 32 | url = "https://esawebb.org/media/archives/images/original/pillarsofcreation_composite.tif"; | ||
| 33 | hash = "sha256-qRiODxR0lZWdxgYXna0fNRFFDErpBJDwOJuQl6sNjRc="; | ||
| 34 | }) | ||
| 35 | (pkgs.fetchurl { | ||
| 36 | url = "https://esawebb.org/media/archives/images/publicationtiff10k/weic2212a.tif"; | ||
| 37 | hash = "sha256-l2fqE/z//C1a0xkvZwsnwPbTSb+WuA11h+SUl3E1dhw="; | ||
| 38 | }) | ||
| 39 | (pkgs.fetchurl { | ||
| 40 | url = "https://esawebb.org/media/archives/images/publicationtiff10k/weic2415a.tif"; | ||
| 41 | hash = "sha256-onBy7cPoUpDuzQStbY2E+qmlGgSLXPwFCLX53ukAb4c="; | ||
| 42 | }) | ||
| 43 | (pkgs.fetchurl { | ||
| 44 | url = "https://esawebb.org/media/archives/images/publicationtiff10k/weic2330a.tif"; | ||
| 45 | hash = "sha256-nn0ZtjZIrPcpj3YcLTsrL7XiXvyh3QYgCSmdDMD+3OM="; | ||
| 46 | }) | ||
| 47 | (pkgs.fetchurl { | ||
| 48 | url = "https://esawebb.org/media/archives/images/original/weic2426a.tif"; | ||
| 49 | hash = "sha256-EDnfPn3GE9jt6XPqiGInP7E2F3Az7d25NqATSWltDv0="; | ||
| 50 | }) | ||
| 51 | (pkgs.fetchurl { | ||
| 52 | url = "https://esawebb.org/media/archives/images/original/weic2503a.tif"; | ||
| 53 | hash = "sha256-3/RX6RQp8naELcgReHPd5/zhJkoCjnA10w5BEnNo+qI="; | ||
| 54 | }) | ||
| 55 | (pkgs.fetchurl { | ||
| 56 | url = "https://esawebb.org/media/archives/images/original/weic2506a.tif"; | ||
| 57 | hash = "sha256-aDld0aoY1owRxDVf7Jcyw71TH42M1foYotxn2thyFYw="; | ||
| 58 | }) | ||
| 59 | (pkgs.fetchurl { | ||
| 60 | url = "https://esawebb.org/media/archives/images/original/weic2514a.tif"; | ||
| 61 | hash = "sha256-jTi1G1Ofo5xsF6ggrbtYJHxqLaCQ7edM5B3uORiVQtg="; | ||
| 62 | }) | ||
| 63 | (pkgs.fetchurl { | ||
| 64 | url = "https://esawebb.org/media/archives/images/original/weic2425c.tif"; | ||
| 65 | hash = "sha256-oaEOexSJHEGj090dJF3ct5HAoR+Y5gRiPrUlxdvnTRo="; | ||
| 66 | }) | ||
| 67 | (pkgs.fetchurl { | ||
| 68 | url = "https://esawebb.org/media/archives/images/original/weic2605c.tif"; | ||
| 69 | hash = "sha256-IwWfgkz84LFXkfk77anb5e0Mf0wWiIszum7UC3yZn0U="; | ||
| 70 | }) | ||
| 71 | ]; | ||
| 72 | |||
| 73 | dontUnpack = true; | ||
| 74 | |||
| 75 | buildInputs = [ pkgs.imagemagick ]; | ||
| 76 | buildPhase = '' | ||
| 77 | runHook preBuild | ||
| 78 | |||
| 79 | typeset sources=($srcs) | ||
| 80 | |||
| 81 | mkdir -p $out | ||
| 82 | magick ''${sources[0]} -crop 8702x5801+251+0 +repage -define webp:target-size=10000000 $out/carinanebula3.webp | ||
| 83 | magick ''${sources[1]} -crop 7131x4754+0+166 +repage -define webp:target-size=10000000 $out/pillarsofcreation_composite.webp | ||
| 84 | magick ''${sources[2]} -crop 8675x5783+497+0 +repage -define webp:target-size=10000000 $out/weic2212a.webp | ||
| 85 | magick ''${sources[3]} -crop 7657x5105+1158+618 +repage -define webp:target-size=10000000 $out/weic2415a.webp | ||
| 86 | magick ''${sources[4]} -crop 7582x5055+0+2253 +repage -define webp:target-size=10000000 $out/weic2330a.webp | ||
| 87 | magick ''${sources[5]} -crop 4473x2982+1018+0 +repage -define webp:target-size=10000000 $out/weic2426a.webp | ||
| 88 | magick ''${sources[6]} -crop 4073x2716+147+1709 +repage -define webp:target-size=10000000 $out/weic2503a.webp | ||
| 89 | magick ''${sources[7]} -crop 3626x2417+526+811 +repage -define webp:target-size=10000000 $out/weic2506a.webp | ||
| 90 | magick ''${sources[8]} -crop 4320x2880+0+965 +repage -define webp:target-size=10000000 $out/weic2514a.webp | ||
| 91 | magick ''${sources[9]} -crop 5863x3909+0+326 +repage -define webp:target-size=10000000 $out/weic2425c.webp | ||
| 92 | magick ''${sources[10]} -rotate 90 -crop 4536x3024+1+611 +repage -define webp:target-size=10000000 $out/weic2605c.webp | ||
| 93 | |||
| 94 | runHook postBuild | ||
| 95 | ''; | ||
| 96 | }); | ||
| 97 | niri_session = builtins.toJSON [ | ||
| 98 | (pkgs.writeShellScript "niri-session" '' | ||
| 99 | exec ${lib.getExe pkgs.dex} -w ${config.programs.niri.package}/share/wayland-sessions/niri.desktop &>/tmp/niri-session-$$.log | ||
| 100 | '') | ||
| 101 | # (lib.getExe pkgs.dex) | ||
| 102 | # "${config.programs.niri.package}/share/wayland-sessions/niri.desktop" | ||
| 103 | ]; | ||
| 104 | username = builtins.toJSON config.home.username; | ||
| 105 | mdi = builtins.toJSON (pkgs.fetchFromGitHub { | ||
| 106 | owner = "Templarian"; | ||
| 107 | repo = "MaterialDesign"; | ||
| 108 | rev = "2424e748e0cc63ab7b9c095a099b9fe239b737c0"; | ||
| 109 | hash = "sha256-QMGl7soAhErrrnY3aKOZpt49yebkSNzy10p/v5OaqQ0="; | ||
| 110 | }); | ||
| 111 | worktime = builtins.toJSON (lib.getExe pkgs.worktime); | ||
| 112 | slurp = builtins.toJSON (lib.getExe pkgs.slurp); | ||
| 113 | wf-recorder = builtins.toJSON (lib.getExe pkgs.wf-recorder); | ||
| 114 | }; | ||
| 115 | }; | ||
| 116 | }; | ||
| 117 | systemd.user.services.quickshell = { | ||
| 118 | Service = { | ||
| 119 | RuntimeDirectory = "quickshell"; | ||
| 120 | }; | ||
| 121 | }; | ||
| 122 | }; | ||
| 123 | } | ||
diff --git a/accounts/gkleen@skadhi/shell/quickshell-plugins/CMakeLists.txt b/accounts/gkleen@skadhi/shell/quickshell-plugins/CMakeLists.txt new file mode 100644 index 00000000..6b4f0d48 --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell-plugins/CMakeLists.txt | |||
| @@ -0,0 +1,190 @@ | |||
| 1 | set(INSTALL_QMLDIR "" CACHE STRING "QML install dir") | ||
| 2 | set(INSTALL_QML_PREFIX "" CACHE STRING "QML install prefix") | ||
| 3 | |||
| 4 | # There doesn't seem to be a standard cross-distro qml install path. | ||
| 5 | if ("${INSTALL_QMLDIR}" STREQUAL "" AND "${INSTALL_QML_PREFIX}" STREQUAL "") | ||
| 6 | message(WARNING "Neither INSTALL_QMLDIR nor INSTALL_QML_PREFIX is set. QML modules will not be installed.") | ||
| 7 | else() | ||
| 8 | if ("${INSTALL_QMLDIR}" STREQUAL "") | ||
| 9 | set(QML_FULL_INSTALLDIR "${CMAKE_INSTALL_PREFIX}/${INSTALL_QML_PREFIX}") | ||
| 10 | else() | ||
| 11 | set(QML_FULL_INSTALLDIR "${INSTALL_QMLDIR}") | ||
| 12 | endif() | ||
| 13 | |||
| 14 | message(STATUS "QML install dir: ${QML_FULL_INSTALLDIR}") | ||
| 15 | endif() | ||
| 16 | |||
| 17 | # Install a given target as a QML module. This is mostly pulled from ECM, as there does not seem | ||
| 18 | # to be an official way to do it. | ||
| 19 | # see https://github.com/KDE/extra-cmake-modules/blob/fe0f606bf7f222e36f7560fd7a2c33ef993e23bb/modules/ECMQmlModule6.cmake#L160 | ||
| 20 | function(install_qml_module arg_TARGET) | ||
| 21 | if (NOT DEFINED QML_FULL_INSTALLDIR) | ||
| 22 | return() | ||
| 23 | endif() | ||
| 24 | |||
| 25 | qt_query_qml_module(${arg_TARGET} | ||
| 26 | URI module_uri | ||
| 27 | VERSION module_version | ||
| 28 | PLUGIN_TARGET module_plugin_target | ||
| 29 | TARGET_PATH module_target_path | ||
| 30 | QMLDIR module_qmldir | ||
| 31 | TYPEINFO module_typeinfo | ||
| 32 | QML_FILES module_qml_files | ||
| 33 | RESOURCES module_resources | ||
| 34 | ) | ||
| 35 | |||
| 36 | set(module_dir "${QML_FULL_INSTALLDIR}/${module_target_path}") | ||
| 37 | |||
| 38 | if (NOT TARGET "${module_plugin_target}") | ||
| 39 | message(FATAL_ERROR "install_qml_modules called for a target without a plugin") | ||
| 40 | endif() | ||
| 41 | |||
| 42 | get_target_property(target_type "${arg_TARGET}" TYPE) | ||
| 43 | if (NOT "${target_type}" STREQUAL "STATIC_LIBRARY") | ||
| 44 | install( | ||
| 45 | TARGETS "${arg_TARGET}" | ||
| 46 | LIBRARY DESTINATION "${module_dir}" | ||
| 47 | RUNTIME DESTINATION "${module_dir}" | ||
| 48 | ) | ||
| 49 | |||
| 50 | install( | ||
| 51 | TARGETS "${module_plugin_target}" | ||
| 52 | LIBRARY DESTINATION "${module_dir}" | ||
| 53 | RUNTIME DESTINATION "${module_dir}" | ||
| 54 | ) | ||
| 55 | endif() | ||
| 56 | |||
| 57 | install(FILES "${module_qmldir}" DESTINATION "${module_dir}") | ||
| 58 | install(FILES "${module_typeinfo}" DESTINATION "${module_dir}") | ||
| 59 | |||
| 60 | # Install QML files | ||
| 61 | list(LENGTH module_qml_files num_files) | ||
| 62 | if (NOT "${module_qml_files}" MATCHES "NOTFOUND" AND ${num_files} GREATER 0) | ||
| 63 | qt_query_qml_module(${arg_TARGET} QML_FILES_DEPLOY_PATHS qml_files_deploy_paths) | ||
| 64 | |||
| 65 | math(EXPR last_index "${num_files} - 1") | ||
| 66 | foreach(i RANGE 0 ${last_index}) | ||
| 67 | list(GET module_qml_files ${i} src_file) | ||
| 68 | list(GET qml_files_deploy_paths ${i} deploy_path) | ||
| 69 | get_filename_component(dst_name "${deploy_path}" NAME) | ||
| 70 | get_filename_component(dest_dir "${deploy_path}" DIRECTORY) | ||
| 71 | install(FILES "${src_file}" DESTINATION "${module_dir}/${dest_dir}" RENAME "${dst_name}") | ||
| 72 | endforeach() | ||
| 73 | endif() | ||
| 74 | |||
| 75 | # Install resources | ||
| 76 | list(LENGTH module_resources num_files) | ||
| 77 | if (NOT "${module_resources}" MATCHES "NOTFOUND" AND ${num_files} GREATER 0) | ||
| 78 | qt_query_qml_module(${arg_TARGET} RESOURCES_DEPLOY_PATHS resources_deploy_paths) | ||
| 79 | |||
| 80 | math(EXPR last_index "${num_files} - 1") | ||
| 81 | foreach(i RANGE 0 ${last_index}) | ||
| 82 | list(GET module_resources ${i} src_file) | ||
| 83 | list(GET resources_deploy_paths ${i} deploy_path) | ||
| 84 | get_filename_component(dst_name "${deploy_path}" NAME) | ||
| 85 | get_filename_component(dest_dir "${deploy_path}" DIRECTORY) | ||
| 86 | install(FILES "${src_file}" DESTINATION "${module_dir}/${dest_dir}" RENAME "${dst_name}") | ||
| 87 | endforeach() | ||
| 88 | endif() | ||
| 89 | endfunction() | ||
| 90 | |||
| 91 | |||
| 92 | cmake_minimum_required(VERSION 3.20) | ||
| 93 | project(custom LANGUAGES CXX) | ||
| 94 | |||
| 95 | find_package(Qt6 REQUIRED COMPONENTS Core Qml DBus) | ||
| 96 | |||
| 97 | qt_standard_project_setup(REQUIRES 6.6) | ||
| 98 | |||
| 99 | qt6_policy(SET QTP0001 NEW) | ||
| 100 | qt6_add_qml_module(customplugin | ||
| 101 | URI "Custom" | ||
| 102 | PLUGIN_TARGET customplugin | ||
| 103 | ) | ||
| 104 | |||
| 105 | set_source_files_properties(org.keepassxc.KeePassXC.MainWindow.xml PROPERTIES | ||
| 106 | CLASSNAME DBusKeePassXC | ||
| 107 | NO_NAMESPACE TRUE | ||
| 108 | ) | ||
| 109 | qt_add_dbus_interface(DBUS_INTERFACES | ||
| 110 | org.keepassxc.KeePassXC.MainWindow.xml | ||
| 111 | dbus_keepassxc | ||
| 112 | ) | ||
| 113 | |||
| 114 | set_source_files_properties(org.freedesktop.systemd1.Manager.xml PROPERTIES | ||
| 115 | CLASSNAME DBusSystemdManager | ||
| 116 | NO_NAMESPACE TRUE | ||
| 117 | INCLUDE ListUnitsEntry.hpp | ||
| 118 | ) | ||
| 119 | qt_add_dbus_interface(DBUS_INTERFACES | ||
| 120 | org.freedesktop.systemd1.Manager.xml | ||
| 121 | dbus_systemd_manager | ||
| 122 | ) | ||
| 123 | |||
| 124 | set_source_files_properties(org.freedesktop.login1.Manager.xml PROPERTIES | ||
| 125 | CLASSNAME DBusLogindManager | ||
| 126 | NO_NAMESPACE TRUE | ||
| 127 | ) | ||
| 128 | qt_add_dbus_interface(DBUS_INTERFACES | ||
| 129 | org.freedesktop.login1.Manager.xml | ||
| 130 | dbus_logind_manager | ||
| 131 | ) | ||
| 132 | |||
| 133 | set_source_files_properties(org.freedesktop.login1.Session.xml PROPERTIES | ||
| 134 | CLASSNAME DBusLogindSession | ||
| 135 | NO_NAMESPACE TRUE | ||
| 136 | ) | ||
| 137 | qt_add_dbus_interface(DBUS_INTERFACES | ||
| 138 | org.freedesktop.login1.Session.xml | ||
| 139 | dbus_logind_session | ||
| 140 | ) | ||
| 141 | |||
| 142 | set_source_files_properties(org.freedesktop.systemd1.Unit.xml PROPERTIES | ||
| 143 | CLASSNAME DBusSystemdUnit | ||
| 144 | NO_NAMESPACE TRUE | ||
| 145 | ) | ||
| 146 | qt_add_dbus_interface(DBUS_INTERFACES | ||
| 147 | org.freedesktop.systemd1.Unit.xml | ||
| 148 | dbus_systemd_unit | ||
| 149 | ) | ||
| 150 | |||
| 151 | set_source_files_properties(org.freedesktop.systemd1.Service.xml PROPERTIES | ||
| 152 | CLASSNAME DBusSystemdService | ||
| 153 | NO_NAMESPACE TRUE | ||
| 154 | ) | ||
| 155 | qt_add_dbus_interface(DBUS_INTERFACES | ||
| 156 | org.freedesktop.systemd1.Service.xml | ||
| 157 | dbus_systemd_service | ||
| 158 | ) | ||
| 159 | |||
| 160 | set_source_files_properties(org.freedesktop.DBus.Properties.xml PROPERTIES | ||
| 161 | CLASSNAME DBusProperties | ||
| 162 | NO_NAMESPACE TRUE | ||
| 163 | ) | ||
| 164 | qt_add_dbus_interface(DBUS_INTERFACES | ||
| 165 | org.freedesktop.DBus.Properties.xml | ||
| 166 | dbus_properties | ||
| 167 | ) | ||
| 168 | |||
| 169 | include_directories(${CMAKE_SOURCE_DIR}/build) | ||
| 170 | include_directories(${QUICKSHELL_SRC}/src) | ||
| 171 | |||
| 172 | target_compile_features(customplugin PUBLIC cxx_std_26) | ||
| 173 | |||
| 174 | target_link_libraries(customplugin PRIVATE | ||
| 175 | Qt6::Core | ||
| 176 | Qt6::Qml | ||
| 177 | Qt6::DBus | ||
| 178 | ) | ||
| 179 | |||
| 180 | target_sources(customplugin PRIVATE | ||
| 181 | Chrono.cpp Chrono.hpp | ||
| 182 | FileSelector.cpp FileSelector.hpp | ||
| 183 | KeePassXC.cpp KeePassXC.hpp | ||
| 184 | Systemd.cpp Systemd.hpp | ||
| 185 | ListUnitsEntry.cpp ListUnitsEntry.hpp | ||
| 186 | ${DBUS_INTERFACES} | ||
| 187 | ${QUICKSHELL_SRC}/src/core/model.cpp ${QUICKSHELL_SRC}/src/core/model.hpp | ||
| 188 | ) | ||
| 189 | |||
| 190 | install_qml_module(customplugin) | ||
diff --git a/accounts/gkleen@skadhi/shell/quickshell-plugins/Chrono.cpp b/accounts/gkleen@skadhi/shell/quickshell-plugins/Chrono.cpp new file mode 100644 index 00000000..22b3469b --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell-plugins/Chrono.cpp | |||
| @@ -0,0 +1,83 @@ | |||
| 1 | #include "Chrono.hpp" | ||
| 2 | |||
| 3 | #include <format> | ||
| 4 | #include <iostream> | ||
| 5 | #include <cmath> | ||
| 6 | |||
| 7 | Chrono::Chrono(QObject* parent): QObject(parent) { | ||
| 8 | QObject::connect(&this->timer, &QTimer::timeout, this, &Chrono::onTimeout); | ||
| 9 | this->update(); | ||
| 10 | } | ||
| 11 | |||
| 12 | bool Chrono::enabled() const { return this->mEnabled; } | ||
| 13 | |||
| 14 | void Chrono::setEnabled(bool enabled) { | ||
| 15 | if (enabled == this->mEnabled) return; | ||
| 16 | this->mEnabled = enabled; | ||
| 17 | emit this->enabledChanged(); | ||
| 18 | this->update(); | ||
| 19 | } | ||
| 20 | |||
| 21 | Chrono::Precision Chrono::precision() const { return this->mPrecision; } | ||
| 22 | |||
| 23 | void Chrono::setPrecision(Chrono::Precision precision) { | ||
| 24 | if (precision == this->mPrecision) return; | ||
| 25 | this->mPrecision = precision; | ||
| 26 | emit this->precisionChanged(); | ||
| 27 | this->update(); | ||
| 28 | } | ||
| 29 | |||
| 30 | void Chrono::onTimeout() { | ||
| 31 | this->setTime(this->targetTime); | ||
| 32 | this->schedule(this->targetTime); | ||
| 33 | } | ||
| 34 | |||
| 35 | void Chrono::update() { | ||
| 36 | if (this->mEnabled) { | ||
| 37 | this->setTime(std::chrono::time_point<std::chrono::system_clock>()); | ||
| 38 | this->schedule(std::chrono::time_point<std::chrono::system_clock>()); | ||
| 39 | } else { | ||
| 40 | this->timer.stop(); | ||
| 41 | } | ||
| 42 | } | ||
| 43 | |||
| 44 | void Chrono::setTime(const std::chrono::time_point<std::chrono::system_clock>& targetTime) { | ||
| 45 | using namespace std::chrono_literals; | ||
| 46 | |||
| 47 | auto currentTime = std::chrono::system_clock::now(); | ||
| 48 | auto offset = std::chrono::duration_cast<std::chrono::milliseconds>(targetTime - currentTime); | ||
| 49 | this->currentTime = abs(offset) < 500ms ? targetTime : currentTime; | ||
| 50 | |||
| 51 | switch (this->mPrecision) { | ||
| 52 | case Chrono::Hours: this->currentTime = std::chrono::time_point_cast<std::chrono::hours>(this->currentTime); | ||
| 53 | case Chrono::Minutes: this->currentTime = std::chrono::time_point_cast<std::chrono::minutes>(this->currentTime); | ||
| 54 | case Chrono::Seconds: this->currentTime = std::chrono::time_point_cast<std::chrono::seconds>(this->currentTime); | ||
| 55 | } | ||
| 56 | |||
| 57 | emit this->dateChanged(); | ||
| 58 | } | ||
| 59 | |||
| 60 | void Chrono::schedule(const std::chrono::time_point<std::chrono::system_clock>& targetTime) { | ||
| 61 | using namespace std::chrono_literals; | ||
| 62 | |||
| 63 | auto currentTime = std::chrono::system_clock::now(); | ||
| 64 | auto offset = std::chrono::duration_cast<std::chrono::milliseconds>(targetTime - currentTime); | ||
| 65 | auto nextTime = abs(offset) < 500ms ? targetTime : currentTime; | ||
| 66 | |||
| 67 | switch (this->mPrecision) { | ||
| 68 | case Chrono::Hours: nextTime = std::chrono::time_point_cast<std::chrono::hours>(nextTime) + 1h; | ||
| 69 | case Chrono::Minutes: nextTime = std::chrono::time_point_cast<std::chrono::minutes>(nextTime) + 1min; | ||
| 70 | case Chrono::Seconds: nextTime = std::chrono::time_point_cast<std::chrono::seconds>(nextTime) + 1s; | ||
| 71 | } | ||
| 72 | |||
| 73 | this->targetTime = nextTime; | ||
| 74 | this->timer.start(std::chrono::duration_cast<std::chrono::milliseconds>(nextTime - currentTime)); | ||
| 75 | } | ||
| 76 | |||
| 77 | QString Chrono::format(const QString& fmt) const { | ||
| 78 | return QString::fromStdString(std::format(std::runtime_format(fmt.toStdString()), std::chrono::zoned_time(std::chrono::current_zone(), std::chrono::time_point_cast<std::chrono::seconds>(this->currentTime)))); | ||
| 79 | } | ||
| 80 | |||
| 81 | QDateTime Chrono::date() const { | ||
| 82 | return QDateTime::fromStdTimePoint(std::chrono::time_point_cast<std::chrono::milliseconds>(this->currentTime)); | ||
| 83 | } | ||
diff --git a/accounts/gkleen@skadhi/shell/quickshell-plugins/Chrono.hpp b/accounts/gkleen@skadhi/shell/quickshell-plugins/Chrono.hpp new file mode 100644 index 00000000..04080187 --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell-plugins/Chrono.hpp | |||
| @@ -0,0 +1,55 @@ | |||
| 1 | #pragma once | ||
| 2 | |||
| 3 | #include <chrono> | ||
| 4 | |||
| 5 | #include <QDateTime> | ||
| 6 | #include <QObject> | ||
| 7 | #include <QTimer> | ||
| 8 | |||
| 9 | #include <qqmlintegration.h> | ||
| 10 | |||
| 11 | class Chrono : public QObject { | ||
| 12 | Q_OBJECT; | ||
| 13 | Q_PROPERTY(bool enabled READ enabled WRITE setEnabled NOTIFY enabledChanged); | ||
| 14 | Q_PROPERTY(Chrono::Precision precision READ precision WRITE setPrecision NOTIFY precisionChanged); | ||
| 15 | Q_PROPERTY(QDateTime date READ date NOTIFY dateChanged) | ||
| 16 | QML_ELEMENT; | ||
| 17 | |||
| 18 | public: | ||
| 19 | enum Precision : quint8 { | ||
| 20 | Hours = 1, | ||
| 21 | Minutes = 2, | ||
| 22 | Seconds = 3, | ||
| 23 | }; | ||
| 24 | Q_ENUM(Precision); | ||
| 25 | |||
| 26 | explicit Chrono(QObject* parent = nullptr); | ||
| 27 | |||
| 28 | bool enabled() const; | ||
| 29 | void setEnabled(bool enabled); | ||
| 30 | |||
| 31 | Chrono::Precision precision() const; | ||
| 32 | void setPrecision(Chrono::Precision precision); | ||
| 33 | |||
| 34 | Q_INVOKABLE QString format(const QString& fmt) const; | ||
| 35 | |||
| 36 | QDateTime date() const; | ||
| 37 | |||
| 38 | signals: | ||
| 39 | void enabledChanged(); | ||
| 40 | void precisionChanged(); | ||
| 41 | void dateChanged(); | ||
| 42 | |||
| 43 | private slots: | ||
| 44 | void onTimeout(); | ||
| 45 | |||
| 46 | private: | ||
| 47 | bool mEnabled = true; | ||
| 48 | Chrono::Precision mPrecision = Chrono::Seconds; | ||
| 49 | QTimer timer; | ||
| 50 | std::chrono::time_point<std::chrono::system_clock> currentTime, targetTime; | ||
| 51 | |||
| 52 | void update(); | ||
| 53 | void setTime(const std::chrono::time_point<std::chrono::system_clock>& targetTime); | ||
| 54 | void schedule(const std::chrono::time_point<std::chrono::system_clock>& targetTime); | ||
| 55 | }; | ||
diff --git a/accounts/gkleen@skadhi/shell/quickshell-plugins/FileSelector.cpp b/accounts/gkleen@skadhi/shell/quickshell-plugins/FileSelector.cpp new file mode 100644 index 00000000..d7051d2a --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell-plugins/FileSelector.cpp | |||
| @@ -0,0 +1,102 @@ | |||
| 1 | #include "FileSelector.hpp" | ||
| 2 | |||
| 3 | #include <sstream> | ||
| 4 | #include <vector> | ||
| 5 | #include <random> | ||
| 6 | #include <algorithm> | ||
| 7 | |||
| 8 | #include <iostream> | ||
| 9 | #include <format> | ||
| 10 | |||
| 11 | namespace fs = std::filesystem; | ||
| 12 | |||
| 13 | FileSelector::FileSelector(QObject* parent): QObject(parent) { | ||
| 14 | QObject::connect(&this->timer, &QTimer::timeout, this, &FileSelector::onTimeout); | ||
| 15 | this->timer.setTimerType(Qt::PreciseTimer); | ||
| 16 | } | ||
| 17 | |||
| 18 | QString FileSelector::directory() const { | ||
| 19 | return QString::fromStdString(this->mDirectory->string()); | ||
| 20 | } | ||
| 21 | void FileSelector::setDirectory(QString directory) { | ||
| 22 | this->mDirectory = directory.toStdString(); | ||
| 23 | if (this->mDirectory && this->mEpoch) | ||
| 24 | this->update(); | ||
| 25 | emit this->directoryChanged(); | ||
| 26 | } | ||
| 27 | |||
| 28 | unsigned int FileSelector::epoch() const { | ||
| 29 | return std::chrono::duration_cast<std::chrono::milliseconds>(*this->mEpoch).count(); | ||
| 30 | } | ||
| 31 | void FileSelector::setEpoch(unsigned int epoch) { | ||
| 32 | this->mEpoch = std::chrono::milliseconds{epoch}; | ||
| 33 | if (this->mDirectory && this->mEpoch) | ||
| 34 | this->update(); | ||
| 35 | emit this->epochChanged(); | ||
| 36 | } | ||
| 37 | |||
| 38 | QString FileSelector::seed() const { | ||
| 39 | return this->mSeed; | ||
| 40 | } | ||
| 41 | void FileSelector::setSeed(QString seed) { | ||
| 42 | this->mSeed = seed; | ||
| 43 | emit this->seedChanged(); | ||
| 44 | if (this->mDirectory && this->mEpoch) | ||
| 45 | emit this->selectedChanged(); | ||
| 46 | } | ||
| 47 | |||
| 48 | QString FileSelector::selected() const { | ||
| 49 | if (!this->mDirectory || !this->mEpoch) | ||
| 50 | return QString(); | ||
| 51 | |||
| 52 | std::vector<fs::path> shuffled(this->mFiles.begin(), this->mFiles.end()); | ||
| 53 | std::sort(shuffled.begin(), shuffled.end()); | ||
| 54 | |||
| 55 | auto currentTime = std::chrono::system_clock::now(); | ||
| 56 | uint64_t currentEpoch = currentTime.time_since_epoch() / *this->mEpoch; | ||
| 57 | std::chrono::milliseconds timeInEpoch = std::chrono::duration_cast<std::chrono::milliseconds>(currentTime.time_since_epoch()) % *this->mEpoch; | ||
| 58 | |||
| 59 | std::ostringstream seed; | ||
| 60 | seed << this->mSeed.size() << ";" << this->mSeed.toStdString() << ";"; | ||
| 61 | seed << *this->mEpoch << ";"; | ||
| 62 | seed << currentEpoch << ";"; | ||
| 63 | seed << this->mDirectory->string().size() << ";" << *this->mDirectory << ";"; | ||
| 64 | seed << this->mFiles.size() << ";"; | ||
| 65 | for (const fs::path& p: this->mFiles) | ||
| 66 | seed << p.string().size() << ";" << p << ";"; | ||
| 67 | |||
| 68 | std::vector<std::seed_seq::result_type> v; | ||
| 69 | v.reserve(seed.str().size()); | ||
| 70 | for (const char& c: seed.str()) | ||
| 71 | v.push_back(c); | ||
| 72 | |||
| 73 | std::seed_seq engine_seed(v.begin(), v.end()); | ||
| 74 | std::mt19937 g(engine_seed); | ||
| 75 | std::shuffle(shuffled.begin(), shuffled.end(), g); | ||
| 76 | |||
| 77 | std::vector<fs::path>::size_type ix = shuffled.size() * timeInEpoch / *this->mEpoch; | ||
| 78 | return QString::fromStdString((*this->mDirectory / shuffled[ix]).string()); | ||
| 79 | } | ||
| 80 | |||
| 81 | void FileSelector::onTimeout() { | ||
| 82 | if (!this->mFiles.size()) | ||
| 83 | return; | ||
| 84 | |||
| 85 | auto currentTime = std::chrono::system_clock::now(); | ||
| 86 | uint64_t currentMinorEpoch = currentTime.time_since_epoch() / (*this->mEpoch / this->mFiles.size()); | ||
| 87 | auto nextTime = std::chrono::time_point<std::chrono::system_clock>((currentMinorEpoch + 1) * (*this->mEpoch / this->mFiles.size())); | ||
| 88 | this->timer.start(std::chrono::duration_cast<std::chrono::milliseconds>(nextTime - currentTime)); | ||
| 89 | |||
| 90 | emit this->selectedChanged(); | ||
| 91 | } | ||
| 92 | |||
| 93 | void FileSelector::update() { | ||
| 94 | this->mFiles = std::set<fs::path>{}; | ||
| 95 | for (const fs::directory_entry& entry: | ||
| 96 | fs::recursive_directory_iterator(*this->mDirectory, fs::directory_options::follow_directory_symlink)) | ||
| 97 | { | ||
| 98 | this->mFiles.insert(fs::relative(entry, *this->mDirectory)); | ||
| 99 | } | ||
| 100 | |||
| 101 | this->onTimeout(); | ||
| 102 | } | ||
diff --git a/accounts/gkleen@skadhi/shell/quickshell-plugins/FileSelector.hpp b/accounts/gkleen@skadhi/shell/quickshell-plugins/FileSelector.hpp new file mode 100644 index 00000000..72c4f2a7 --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell-plugins/FileSelector.hpp | |||
| @@ -0,0 +1,52 @@ | |||
| 1 | #pragma once | ||
| 2 | |||
| 3 | #include <filesystem> | ||
| 4 | #include <chrono> | ||
| 5 | #include <set> | ||
| 6 | #include <optional> | ||
| 7 | |||
| 8 | #include <QObject> | ||
| 9 | #include <QTimer> | ||
| 10 | |||
| 11 | #include <qqmlintegration.h> | ||
| 12 | |||
| 13 | class FileSelector : public QObject { | ||
| 14 | Q_OBJECT; | ||
| 15 | Q_PROPERTY(QString directory READ directory WRITE setDirectory NOTIFY directoryChanged REQUIRED); | ||
| 16 | Q_PROPERTY(unsigned int epoch READ epoch WRITE setEpoch NOTIFY epochChanged REQUIRED); | ||
| 17 | Q_PROPERTY(QString seed READ seed WRITE setSeed NOTIFY seedChanged); | ||
| 18 | Q_PROPERTY(QString selected READ selected NOTIFY selectedChanged); | ||
| 19 | QML_ELEMENT; | ||
| 20 | |||
| 21 | public: | ||
| 22 | explicit FileSelector(QObject* parent = nullptr); | ||
| 23 | |||
| 24 | QString directory() const; | ||
| 25 | void setDirectory(QString directory); | ||
| 26 | |||
| 27 | unsigned int epoch() const; | ||
| 28 | void setEpoch(unsigned int epoch); | ||
| 29 | |||
| 30 | QString seed() const; | ||
| 31 | void setSeed(QString seed); | ||
| 32 | |||
| 33 | QString selected() const; | ||
| 34 | |||
| 35 | signals: | ||
| 36 | void directoryChanged(); | ||
| 37 | void epochChanged(); | ||
| 38 | void seedChanged(); | ||
| 39 | void selectedChanged(); | ||
| 40 | |||
| 41 | private slots: | ||
| 42 | void onTimeout(); | ||
| 43 | |||
| 44 | private: | ||
| 45 | std::optional<std::filesystem::path> mDirectory; | ||
| 46 | std::optional<std::chrono::milliseconds> mEpoch; | ||
| 47 | std::set<std::filesystem::path> mFiles; | ||
| 48 | QString mSeed; | ||
| 49 | QTimer timer; | ||
| 50 | |||
| 51 | void update(); | ||
| 52 | }; | ||
diff --git a/accounts/gkleen@skadhi/shell/quickshell-plugins/KeePassXC.cpp b/accounts/gkleen@skadhi/shell/quickshell-plugins/KeePassXC.cpp new file mode 100644 index 00000000..f6e4dd6e --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell-plugins/KeePassXC.cpp | |||
| @@ -0,0 +1,18 @@ | |||
| 1 | #include "KeePassXC.hpp" | ||
| 2 | |||
| 3 | #include <QDBusConnection> | ||
| 4 | |||
| 5 | KeePassXC::KeePassXC() { | ||
| 6 | this->service = new DBusKeePassXC(DBusKeePassXC::staticInterfaceName(), "/keepassxc", QDBusConnection::sessionBus(), this); | ||
| 7 | } | ||
| 8 | KeePassXC::~KeePassXC() { | ||
| 9 | if (this->service) | ||
| 10 | delete this->service; | ||
| 11 | } | ||
| 12 | |||
| 13 | void KeePassXC::lockAllDatabases() { | ||
| 14 | if (!this->service) | ||
| 15 | return; | ||
| 16 | |||
| 17 | this->service->lockAllDatabases(); | ||
| 18 | } | ||
diff --git a/accounts/gkleen@skadhi/shell/quickshell-plugins/KeePassXC.hpp b/accounts/gkleen@skadhi/shell/quickshell-plugins/KeePassXC.hpp new file mode 100644 index 00000000..c4cd71e0 --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell-plugins/KeePassXC.hpp | |||
| @@ -0,0 +1,21 @@ | |||
| 1 | #pragma once | ||
| 2 | |||
| 3 | #include "dbus_keepassxc.h" | ||
| 4 | |||
| 5 | #include <QObject> | ||
| 6 | #include <QtQmlIntegration/qqmlintegration.h> | ||
| 7 | |||
| 8 | class KeePassXC : public QObject { | ||
| 9 | Q_OBJECT; | ||
| 10 | QML_SINGLETON; | ||
| 11 | QML_ELEMENT; | ||
| 12 | |||
| 13 | public: | ||
| 14 | explicit KeePassXC(); | ||
| 15 | ~KeePassXC(); | ||
| 16 | |||
| 17 | Q_INVOKABLE void lockAllDatabases(); | ||
| 18 | |||
| 19 | private: | ||
| 20 | DBusKeePassXC* service = nullptr; | ||
| 21 | }; | ||
diff --git a/accounts/gkleen@skadhi/shell/quickshell-plugins/ListUnitsEntry.cpp b/accounts/gkleen@skadhi/shell/quickshell-plugins/ListUnitsEntry.cpp new file mode 100644 index 00000000..c1f9537c --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell-plugins/ListUnitsEntry.cpp | |||
| @@ -0,0 +1,41 @@ | |||
| 1 | #include "ListUnitsEntry.hpp" | ||
| 2 | |||
| 3 | void ListUnitsEntry::registerMetaType() { | ||
| 4 | qRegisterMetaType<ListUnitsEntry>("ListUnitsEntry"); | ||
| 5 | qDBusRegisterMetaType<ListUnitsEntry>(); | ||
| 6 | } | ||
| 7 | |||
| 8 | QDBusArgument& operator<<(QDBusArgument& argument, const ListUnitsEntry& entry) { | ||
| 9 | argument.beginStructure(); | ||
| 10 | argument | ||
| 11 | << entry.primaryName | ||
| 12 | << entry.description | ||
| 13 | << entry.loadState | ||
| 14 | << entry.activeState | ||
| 15 | << entry.subState | ||
| 16 | << entry.followingUnit | ||
| 17 | << entry.unitPath | ||
| 18 | << entry.jobId | ||
| 19 | << entry.jobType | ||
| 20 | << entry.jobPath; | ||
| 21 | argument.endStructure(); | ||
| 22 | |||
| 23 | return argument; | ||
| 24 | } | ||
| 25 | const QDBusArgument& operator>>(const QDBusArgument& argument, ListUnitsEntry& entry) { | ||
| 26 | argument.beginStructure(); | ||
| 27 | argument | ||
| 28 | >> entry.primaryName | ||
| 29 | >> entry.description | ||
| 30 | >> entry.loadState | ||
| 31 | >> entry.activeState | ||
| 32 | >> entry.subState | ||
| 33 | >> entry.followingUnit | ||
| 34 | >> entry.unitPath | ||
| 35 | >> entry.jobId | ||
| 36 | >> entry.jobType | ||
| 37 | >> entry.jobPath; | ||
| 38 | argument.endStructure(); | ||
| 39 | |||
| 40 | return argument; | ||
| 41 | } | ||
diff --git a/accounts/gkleen@skadhi/shell/quickshell-plugins/ListUnitsEntry.hpp b/accounts/gkleen@skadhi/shell/quickshell-plugins/ListUnitsEntry.hpp new file mode 100644 index 00000000..15d789b9 --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell-plugins/ListUnitsEntry.hpp | |||
| @@ -0,0 +1,26 @@ | |||
| 1 | #pragma once | ||
| 2 | |||
| 3 | #include <QtDBus> | ||
| 4 | #include <QtTypes> | ||
| 5 | |||
| 6 | struct ListUnitsEntry { | ||
| 7 | QString primaryName; | ||
| 8 | QString description; | ||
| 9 | QString loadState; | ||
| 10 | QString activeState; | ||
| 11 | QString subState; | ||
| 12 | QString followingUnit; | ||
| 13 | QDBusObjectPath unitPath; | ||
| 14 | uint jobId; | ||
| 15 | QString jobType; | ||
| 16 | QDBusObjectPath jobPath; | ||
| 17 | |||
| 18 | friend QDBusArgument& operator<<(QDBusArgument& argument, const ListUnitsEntry& entry); | ||
| 19 | friend const QDBusArgument& operator>>(const QDBusArgument& argument, ListUnitsEntry& entry); | ||
| 20 | static void registerMetaType(); | ||
| 21 | }; | ||
| 22 | |||
| 23 | Q_DECLARE_METATYPE(ListUnitsEntry) | ||
| 24 | |||
| 25 | using ListUnitsResult = QList<ListUnitsEntry>; | ||
| 26 | Q_DECLARE_METATYPE(ListUnitsResult) | ||
diff --git a/accounts/gkleen@skadhi/shell/quickshell-plugins/Systemd.cpp b/accounts/gkleen@skadhi/shell/quickshell-plugins/Systemd.cpp new file mode 100644 index 00000000..1fa236f6 --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell-plugins/Systemd.cpp | |||
| @@ -0,0 +1,289 @@ | |||
| 1 | #include "Systemd.hpp" | ||
| 2 | |||
| 3 | #include <sstream> | ||
| 4 | |||
| 5 | #include <QDBusConnection> | ||
| 6 | #include <QDBusReply> | ||
| 7 | #include <QDebug> | ||
| 8 | #include <QDBusUnixFileDescriptor> | ||
| 9 | #include <QDBusObjectPath> | ||
| 10 | |||
| 11 | #include <set> | ||
| 12 | |||
| 13 | Systemd::Systemd(QObject* parent) : QObject(parent) { | ||
| 14 | ListUnitsEntry::registerMetaType(); | ||
| 15 | qDBusRegisterMetaType<ListUnitsResult>(); | ||
| 16 | |||
| 17 | this->systemdManager = new DBusSystemdManager( | ||
| 18 | "org.freedesktop.systemd1", | ||
| 19 | "/org/freedesktop/systemd1", | ||
| 20 | QDBusConnection::sessionBus(), | ||
| 21 | this | ||
| 22 | ); | ||
| 23 | this->logindManager = new DBusLogindManager( | ||
| 24 | "org.freedesktop.login1", | ||
| 25 | "/org/freedesktop/login1", | ||
| 26 | QDBusConnection::systemBus(), | ||
| 27 | this | ||
| 28 | ); | ||
| 29 | |||
| 30 | |||
| 31 | QDBusReply<QDBusObjectPath> sessionPath = this->logindManager->GetSession("auto"); | ||
| 32 | // qDebug() << sessionPath; | ||
| 33 | this->logindSession = new DBusLogindSession( | ||
| 34 | "org.freedesktop.login1", | ||
| 35 | sessionPath.value().path(), | ||
| 36 | QDBusConnection::systemBus(), | ||
| 37 | this | ||
| 38 | ); | ||
| 39 | this->logindSessionProperties = new DBusProperties( | ||
| 40 | "org.freedesktop.login1", | ||
| 41 | sessionPath.value().path(), | ||
| 42 | QDBusConnection::systemBus(), | ||
| 43 | this | ||
| 44 | ); | ||
| 45 | |||
| 46 | QObject::connect(this->logindManager, &DBusLogindManager::PrepareForShutdown, this, &Systemd::prepareForShutdown); | ||
| 47 | QObject::connect(this->logindManager, &DBusLogindManager::PrepareForSleep, this, &Systemd::prepareForSleep); | ||
| 48 | QObject::connect(this->logindSession, &DBusLogindSession::Lock, this, &Systemd::lock); | ||
| 49 | QObject::connect(this->logindSession, &DBusLogindSession::Unlock, this, &Systemd::unlock); | ||
| 50 | QObject::connect(this->logindSessionProperties, &DBusProperties::PropertiesChanged, this, &Systemd::onLogindSessionPropertiesChanged); | ||
| 51 | this->systemdManager->Subscribe(); | ||
| 52 | QObject::connect(this->systemdManager, &DBusSystemdManager::UnitNew, this, &Systemd::onUserUnitNew); | ||
| 53 | QObject::connect(this->systemdManager, &DBusSystemdManager::UnitRemoved, this, &Systemd::onUserUnitRemoved); | ||
| 54 | |||
| 55 | for (const auto& unit: this->systemdManager->ListUnits().value()) | ||
| 56 | this->onUserUnitNew(unit.primaryName, unit.unitPath); | ||
| 57 | } | ||
| 58 | |||
| 59 | void Systemd::onLogindSessionPropertiesChanged(const QString& interface_name, const QVariantMap& changed_properties, const QStringList& invalidated_properties) { | ||
| 60 | if (changed_properties.contains("IdleHint") || invalidated_properties.contains("IdleHint")) | ||
| 61 | emit this->idleHintChanged(); | ||
| 62 | if (changed_properties.contains("LockedHint") || invalidated_properties.contains("LockedHint")) | ||
| 63 | emit this->lockedHintChanged(); | ||
| 64 | } | ||
| 65 | void Systemd::onUserUnitNew(const QString& id, const QDBusObjectPath& object_path) { | ||
| 66 | for (auto unit: this->mUserUnits.valueList()) | ||
| 67 | if (unit->path() == object_path) | ||
| 68 | return; | ||
| 69 | |||
| 70 | for (const auto& unit: this->systemdManager->ListUnits().value()) | ||
| 71 | if (unit.unitPath == object_path) { | ||
| 72 | this->mUserUnits.insertObject(new SystemdUnit(this, object_path, id)); | ||
| 73 | return; | ||
| 74 | } | ||
| 75 | } | ||
| 76 | void Systemd::onUserUnitRemoved(const QString& id, const QDBusObjectPath& object_path) { | ||
| 77 | std::set<SystemdUnit*> toRemove; | ||
| 78 | for (auto unit: this->mUserUnits.valueList()) | ||
| 79 | if (unit->path() == object_path) | ||
| 80 | toRemove.insert(unit); | ||
| 81 | |||
| 82 | for (auto unit: toRemove) { | ||
| 83 | this->mUserUnits.removeObject(unit); | ||
| 84 | delete unit; | ||
| 85 | } | ||
| 86 | } | ||
| 87 | |||
| 88 | SystemdUnit::SystemdUnit(QObject* parent, const QDBusObjectPath& path, const QString& id): QObject(parent), mPath(path), mId(id) { | ||
| 89 | this->mUnitProperties = new DBusProperties( | ||
| 90 | "org.freedesktop.systemd1", | ||
| 91 | this->path().path(), | ||
| 92 | QDBusConnection::sessionBus(), | ||
| 93 | this | ||
| 94 | ); | ||
| 95 | } | ||
| 96 | std::unique_ptr<DBusSystemdUnit> SystemdUnit::systemdUnit() { | ||
| 97 | return std::make_unique<DBusSystemdUnit>( | ||
| 98 | "org.freedesktop.systemd1", | ||
| 99 | this->path().path(), | ||
| 100 | QDBusConnection::sessionBus(), | ||
| 101 | nullptr | ||
| 102 | ); | ||
| 103 | } | ||
| 104 | std::unique_ptr<DBusSystemdService> SystemdUnit::systemdService() { | ||
| 105 | if (!this->id().endsWith(".service")) | ||
| 106 | return std::unique_ptr<DBusSystemdService>(); | ||
| 107 | |||
| 108 | return std::make_unique<DBusSystemdService>( | ||
| 109 | "org.freedesktop.systemd1", | ||
| 110 | this->path().path(), | ||
| 111 | QDBusConnection::sessionBus(), | ||
| 112 | nullptr | ||
| 113 | ); | ||
| 114 | } | ||
| 115 | QList<QString> SystemdUnit::runtimeDirectory() { | ||
| 116 | if (std::unique_ptr<DBusSystemdService> systemdService = this->systemdService()) { | ||
| 117 | if (!this->mRuntimeDirectory) | ||
| 118 | this->mRuntimeDirectory = systemdService->runtimeDirectory(); | ||
| 119 | return *this->mRuntimeDirectory; | ||
| 120 | } | ||
| 121 | |||
| 122 | return QList<QString>{}; | ||
| 123 | } | ||
| 124 | QString SystemdUnit::activeState() { | ||
| 125 | if (!this->mActiveState) { | ||
| 126 | QObject::connect(this->mUnitProperties, &DBusProperties::PropertiesChanged, this, &SystemdUnit::onUnitPropertiesChanged); | ||
| 127 | this->mActiveState = this->systemdUnit()->activeState(); | ||
| 128 | } | ||
| 129 | |||
| 130 | return *this->mActiveState; | ||
| 131 | } | ||
| 132 | |||
| 133 | const QDBusObjectPath& SystemdUnit::path() const { return this->mPath; } | ||
| 134 | const QString& SystemdUnit::id() const { return this->mId; } | ||
| 135 | void SystemdUnit::onUnitPropertiesChanged(const QString& interface_name, const QVariantMap& changed_properties, const QStringList& invalidated_properties) { | ||
| 136 | if (changed_properties.contains("ActiveState") || invalidated_properties.contains("ActiveState")) { | ||
| 137 | this->mActiveState = this->systemdUnit()->activeState(); | ||
| 138 | emit this->activeStateChanged(); | ||
| 139 | } | ||
| 140 | } | ||
| 141 | |||
| 142 | void Systemd::stopUserUnit(const QString& unit, const QString& mode) { this->systemdManager->StopUnit(unit, mode); } | ||
| 143 | |||
| 144 | void Systemd::setBrightness(const QString& subsystem, const QString& name, quint32 brightness) { this->logindSession->SetBrightness(subsystem, name, brightness); } | ||
| 145 | |||
| 146 | bool Systemd::idleHint() { return this->logindSession->idleHint(); } | ||
| 147 | void Systemd::setIdleHint(bool idle) { this->logindSession->SetIdleHint(idle); } | ||
| 148 | bool Systemd::lockedHint() { return this->logindSession->lockedHint(); } | ||
| 149 | void Systemd::setLockedHint(bool locked) { this->logindSession->SetLockedHint(locked); } | ||
| 150 | void Systemd::lockSession() { this->logindSession->call("Lock"); } | ||
| 151 | void Systemd::sleep() { this->logindManager->Sleep(true); } | ||
| 152 | void Systemd::suspend() { this->logindManager->Suspend(true); } | ||
| 153 | void Systemd::hibernate() { this->logindManager->Hibernate(true); } | ||
| 154 | |||
| 155 | ObjectModel<SystemdUnit>* Systemd::userUnits() { return &this->mUserUnits; } | ||
| 156 | |||
| 157 | std::string SystemdInhibitorParams::toString(SystemdInhibitorParams::WhatItem what) { | ||
| 158 | if (what == SystemdInhibitorParams::Shutdown) | ||
| 159 | return "shutdown"; | ||
| 160 | else if (what == SystemdInhibitorParams::Sleep) | ||
| 161 | return "sleep"; | ||
| 162 | else if (what == SystemdInhibitorParams::Idle) | ||
| 163 | return "idle"; | ||
| 164 | else if (what == SystemdInhibitorParams::HandlePowerKey) | ||
| 165 | return "handle-power-key"; | ||
| 166 | else if (what == SystemdInhibitorParams::HandleSuspendKey) | ||
| 167 | return "handle-suspend-key"; | ||
| 168 | else if (what == SystemdInhibitorParams::HandleHibernateKey) | ||
| 169 | return "handle-hibernate-key"; | ||
| 170 | else if (what == SystemdInhibitorParams::HandleLidSwitch) | ||
| 171 | return "handle-lid-switch"; | ||
| 172 | return ""; | ||
| 173 | } | ||
| 174 | |||
| 175 | std::string SystemdInhibitorParams::toString(SystemdInhibitorParams::What what) { | ||
| 176 | std::ostringstream res; | ||
| 177 | bool first = true; | ||
| 178 | for (const WhatItem& item: SystemdInhibitorParams::allWhatItems) { | ||
| 179 | if (!(what & item)) | ||
| 180 | continue; | ||
| 181 | |||
| 182 | if (!first) | ||
| 183 | res << ":"; | ||
| 184 | else | ||
| 185 | first = false; | ||
| 186 | res << SystemdInhibitorParams::toString(item); | ||
| 187 | } | ||
| 188 | return res.str(); | ||
| 189 | } | ||
| 190 | |||
| 191 | std::string SystemdInhibitorParams::toString(SystemdInhibitorParams::Mode mode) { | ||
| 192 | if (mode == SystemdInhibitorParams::Block) | ||
| 193 | return "block"; | ||
| 194 | else if (mode == SystemdInhibitorParams::BlockWeak) | ||
| 195 | return "block-weak"; | ||
| 196 | else if (mode == SystemdInhibitorParams::Delay) | ||
| 197 | return "delay"; | ||
| 198 | return ""; | ||
| 199 | } | ||
| 200 | |||
| 201 | bool SystemdInhibitor::enabled() const { return static_cast<bool>(this->activeInhibitor); } | ||
| 202 | void SystemdInhibitor::setEnabled(bool enabled) { | ||
| 203 | this->mEnabled = enabled; | ||
| 204 | |||
| 205 | if (enabled) | ||
| 206 | this->update(); | ||
| 207 | else | ||
| 208 | this->release(); | ||
| 209 | } | ||
| 210 | |||
| 211 | SystemdInhibitorParams::What SystemdInhibitor::what() const { return this->mWhat; } | ||
| 212 | void SystemdInhibitor::setWhat(SystemdInhibitorParams::What what) { | ||
| 213 | this->mWhat = what; | ||
| 214 | this->update(); | ||
| 215 | } | ||
| 216 | |||
| 217 | QString SystemdInhibitor::who() const { return this->mWho; } | ||
| 218 | void SystemdInhibitor::setWho(QString who) { | ||
| 219 | this->mWho = who; | ||
| 220 | this->update(); | ||
| 221 | } | ||
| 222 | |||
| 223 | QString SystemdInhibitor::why() const { return this->mWhy; } | ||
| 224 | void SystemdInhibitor::setWhy(QString why) { | ||
| 225 | this->mWhy = why; | ||
| 226 | this->update(); | ||
| 227 | } | ||
| 228 | |||
| 229 | SystemdInhibitorParams::Mode SystemdInhibitor::mode() const { return this->mMode; } | ||
| 230 | void SystemdInhibitor::setMode(SystemdInhibitorParams::Mode mode) { | ||
| 231 | this->mMode = mode; | ||
| 232 | this->update(); | ||
| 233 | } | ||
| 234 | |||
| 235 | SystemdInhibitor::ActiveSystemdInhibitor::ActiveSystemdInhibitor(SystemdInhibitorParams::What what_, QString who_, QString why_, SystemdInhibitorParams::Mode mode_): what(what_), who(who_), why(why_), mode(mode_) { | ||
| 236 | DBusLogindManager logindManager( | ||
| 237 | "org.freedesktop.login1", | ||
| 238 | "/org/freedesktop/login1", | ||
| 239 | QDBusConnection::systemBus() | ||
| 240 | ); | ||
| 241 | QDBusReply<QDBusUnixFileDescriptor> fd_ = logindManager.Inhibit(QString::fromStdString(SystemdInhibitorParams::toString(what)), who, why, QString::fromStdString(SystemdInhibitorParams::toString(mode))); | ||
| 242 | if (fd_.error().isValid()) | ||
| 243 | throw fd_.error(); | ||
| 244 | this->fd = ::dup(fd_.value().fileDescriptor()); | ||
| 245 | } | ||
| 246 | SystemdInhibitor::ActiveSystemdInhibitor::~ActiveSystemdInhibitor() { | ||
| 247 | if (this->fd != -1) | ||
| 248 | ::close(this->fd); | ||
| 249 | } | ||
| 250 | |||
| 251 | void SystemdInhibitor::release() { | ||
| 252 | if (!this->activeInhibitor) | ||
| 253 | return; | ||
| 254 | |||
| 255 | this->activeInhibitor.reset(); | ||
| 256 | emit this->enabledChanged(); | ||
| 257 | } | ||
| 258 | |||
| 259 | void SystemdInhibitor::update() { | ||
| 260 | if (!this->mWhat || this->mWho.isEmpty() || this->mWhy.isEmpty() || !this->mMode || !this->mEnabled) | ||
| 261 | if (this->activeInhibitor) | ||
| 262 | this->release(); | ||
| 263 | else | ||
| 264 | return; | ||
| 265 | |||
| 266 | if (this->activeInhibitor && this->mWhat == this->activeInhibitor->what && this->mWho == this->activeInhibitor->who && this->mWhy == this->activeInhibitor->why && this->mMode == this->activeInhibitor->mode) | ||
| 267 | return; | ||
| 268 | |||
| 269 | std::unique_ptr<ActiveSystemdInhibitor> otherInhibitor; | ||
| 270 | try { | ||
| 271 | otherInhibitor.reset(new SystemdInhibitor::ActiveSystemdInhibitor(this->mWhat, this->mWho, this->mWhy, this->mMode)); | ||
| 272 | } catch (const QDBusError& err) { | ||
| 273 | qCritical().noquote() | ||
| 274 | << err.name().toStdString() << " " << err.message().toStdString(); | ||
| 275 | return; | ||
| 276 | } | ||
| 277 | this->activeInhibitor.swap(otherInhibitor); | ||
| 278 | |||
| 279 | if (!otherInhibitor && this->activeInhibitor) | ||
| 280 | emit this->enabledChanged(); | ||
| 281 | if (otherInhibitor && otherInhibitor->what != this->activeInhibitor->what) | ||
| 282 | emit this->whatChanged(); | ||
| 283 | if (otherInhibitor && otherInhibitor->who != this->activeInhibitor->who) | ||
| 284 | emit this->whoChanged(); | ||
| 285 | if (otherInhibitor && otherInhibitor->why != this->activeInhibitor->why) | ||
| 286 | emit this->whyChanged(); | ||
| 287 | if (otherInhibitor && otherInhibitor->mode != this->activeInhibitor->mode) | ||
| 288 | emit this->modeChanged(); | ||
| 289 | } | ||
diff --git a/accounts/gkleen@skadhi/shell/quickshell-plugins/Systemd.hpp b/accounts/gkleen@skadhi/shell/quickshell-plugins/Systemd.hpp new file mode 100644 index 00000000..52df6470 --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell-plugins/Systemd.hpp | |||
| @@ -0,0 +1,194 @@ | |||
| 1 | #pragma once | ||
| 2 | |||
| 3 | #include <cstdint> | ||
| 4 | #include <memory> | ||
| 5 | #include <string> | ||
| 6 | #include <optional> | ||
| 7 | |||
| 8 | #include <QObject> | ||
| 9 | #include <QDBusInterface> | ||
| 10 | #include <QtQmlIntegration/qqmlintegration.h> | ||
| 11 | |||
| 12 | #include "dbus_systemd_manager.h" | ||
| 13 | #include "dbus_logind_manager.h" | ||
| 14 | #include "dbus_logind_session.h" | ||
| 15 | #include "dbus_systemd_unit.h" | ||
| 16 | #include "dbus_systemd_service.h" | ||
| 17 | #include "dbus_properties.h" | ||
| 18 | |||
| 19 | #include "core/model.hpp" | ||
| 20 | |||
| 21 | class SystemdUnit : public QObject { | ||
| 22 | Q_OBJECT; | ||
| 23 | QML_ELEMENT; | ||
| 24 | QML_UNCREATABLE("SystemdUnits cannot be created directly"); | ||
| 25 | |||
| 26 | public: | ||
| 27 | explicit SystemdUnit(QObject* parent, const QDBusObjectPath& path, const QString& id); | ||
| 28 | |||
| 29 | Q_PROPERTY(QDBusObjectPath path READ path CONSTANT); | ||
| 30 | Q_PROPERTY(QString id READ id CONSTANT); | ||
| 31 | Q_PROPERTY(QList<QString> runtimeDirectory READ runtimeDirectory CONSTANT); | ||
| 32 | Q_PROPERTY(QString activeState READ activeState NOTIFY activeStateChanged); | ||
| 33 | |||
| 34 | const QDBusObjectPath& path() const; | ||
| 35 | const QString& id() const; | ||
| 36 | QList<QString> runtimeDirectory(); | ||
| 37 | QString activeState(); | ||
| 38 | |||
| 39 | signals: | ||
| 40 | void activeStateChanged(); | ||
| 41 | |||
| 42 | private slots: | ||
| 43 | void onUnitPropertiesChanged(const QString& interface_name, const QVariantMap& changed_properties, const QStringList& invalidated_properties); | ||
| 44 | |||
| 45 | private: | ||
| 46 | std::unique_ptr<DBusSystemdUnit> systemdUnit(); | ||
| 47 | std::unique_ptr<DBusSystemdService> systemdService(); | ||
| 48 | |||
| 49 | DBusProperties* mUnitProperties; | ||
| 50 | QDBusObjectPath mPath; | ||
| 51 | QString mId; | ||
| 52 | std::optional<QString> mActiveState; | ||
| 53 | std::optional<QList<QString>> mRuntimeDirectory; | ||
| 54 | }; | ||
| 55 | |||
| 56 | class Systemd : public QObject { | ||
| 57 | Q_OBJECT; | ||
| 58 | QML_SINGLETON; | ||
| 59 | QML_ELEMENT; | ||
| 60 | |||
| 61 | public: | ||
| 62 | explicit Systemd(QObject* parent = nullptr); | ||
| 63 | |||
| 64 | Q_PROPERTY(bool idleHint READ idleHint WRITE setIdleHint NOTIFY idleHintChanged) | ||
| 65 | Q_PROPERTY(bool lockedHint READ lockedHint WRITE setLockedHint NOTIFY lockedHintChanged) | ||
| 66 | Q_PROPERTY(UntypedObjectModel* userUnits READ userUnits CONSTANT) | ||
| 67 | |||
| 68 | Q_INVOKABLE void stopUserUnit(const QString& unit, const QString& mode); | ||
| 69 | Q_INVOKABLE void setBrightness(const QString& subsystem, const QString& name, quint32 brightness); | ||
| 70 | Q_INVOKABLE void setIdleHint(bool idle); | ||
| 71 | Q_INVOKABLE void setLockedHint(bool locked); | ||
| 72 | Q_INVOKABLE void lockSession(); | ||
| 73 | Q_INVOKABLE void sleep(); | ||
| 74 | Q_INVOKABLE void suspend(); | ||
| 75 | Q_INVOKABLE void hibernate(); | ||
| 76 | |||
| 77 | bool idleHint(); | ||
| 78 | bool lockedHint(); | ||
| 79 | ObjectModel<SystemdUnit>* userUnits(); | ||
| 80 | |||
| 81 | signals: | ||
| 82 | void prepareForShutdown(bool before); | ||
| 83 | void prepareForSleep(bool before); | ||
| 84 | void lock(); | ||
| 85 | void unlock(); | ||
| 86 | void idleHintChanged(); | ||
| 87 | void lockedHintChanged(); | ||
| 88 | |||
| 89 | private slots: | ||
| 90 | void onLogindSessionPropertiesChanged(const QString& interface_name, const QVariantMap& changed_properties, const QStringList& invalidated_properties); | ||
| 91 | void onUserUnitNew(const QString& id, const QDBusObjectPath& objectPath); | ||
| 92 | void onUserUnitRemoved(const QString& id, const QDBusObjectPath& objectPath); | ||
| 93 | |||
| 94 | private: | ||
| 95 | DBusSystemdManager* systemdManager; | ||
| 96 | DBusLogindManager* logindManager; | ||
| 97 | DBusLogindSession* logindSession; | ||
| 98 | DBusProperties* logindSessionProperties; | ||
| 99 | |||
| 100 | ObjectModel<SystemdUnit> mUserUnits{this}; | ||
| 101 | }; | ||
| 102 | |||
| 103 | class SystemdInhibitorParams : public QObject { | ||
| 104 | Q_OBJECT; | ||
| 105 | QML_ELEMENT; | ||
| 106 | QML_SINGLETON; | ||
| 107 | |||
| 108 | public: | ||
| 109 | enum WhatItem : uint8_t { | ||
| 110 | Shutdown = 0b1, | ||
| 111 | Sleep = 0b10, | ||
| 112 | Idle = 0b100, | ||
| 113 | HandlePowerKey = 0b1000, | ||
| 114 | HandleSuspendKey = 0b10000, | ||
| 115 | HandleHibernateKey = 0b100000, | ||
| 116 | HandleLidSwitch = 0b1000000, | ||
| 117 | }; | ||
| 118 | Q_ENUM(WhatItem); | ||
| 119 | Q_DECLARE_FLAGS(What, WhatItem); | ||
| 120 | |||
| 121 | enum Mode : uint8_t { | ||
| 122 | Block = 1, | ||
| 123 | BlockWeak = 2, | ||
| 124 | Delay = 3, | ||
| 125 | }; | ||
| 126 | Q_ENUM(Mode); | ||
| 127 | |||
| 128 | Q_INVOKABLE static std::string toString(WhatItem what); | ||
| 129 | Q_INVOKABLE static std::string toString(What what); | ||
| 130 | Q_INVOKABLE static std::string toString(Mode mode); | ||
| 131 | |||
| 132 | static constexpr WhatItem allWhatItems[] = { Shutdown, Sleep, Idle, HandlePowerKey, HandleSuspendKey, HandleHibernateKey, HandleLidSwitch }; | ||
| 133 | }; | ||
| 134 | Q_DECLARE_OPERATORS_FOR_FLAGS(SystemdInhibitorParams::What) | ||
| 135 | |||
| 136 | class SystemdInhibitor : public QObject { | ||
| 137 | Q_OBJECT; | ||
| 138 | Q_PROPERTY(bool enabled READ enabled WRITE setEnabled NOTIFY enabledChanged); | ||
| 139 | Q_PROPERTY(SystemdInhibitorParams::What what READ what WRITE setWhat NOTIFY whatChanged); | ||
| 140 | Q_PROPERTY(QString who READ who WRITE setWho NOTIFY whoChanged); | ||
| 141 | Q_PROPERTY(QString why READ why WRITE setWhy NOTIFY whyChanged); | ||
| 142 | Q_PROPERTY(SystemdInhibitorParams::Mode mode READ mode WRITE setMode NOTIFY modeChanged); | ||
| 143 | QML_ELEMENT; | ||
| 144 | |||
| 145 | public: | ||
| 146 | explicit SystemdInhibitor(QObject* parent = nullptr): QObject(parent) {} | ||
| 147 | |||
| 148 | bool enabled() const; | ||
| 149 | void setEnabled(bool enabled); | ||
| 150 | |||
| 151 | SystemdInhibitorParams::What what() const; | ||
| 152 | void setWhat(SystemdInhibitorParams::What what); | ||
| 153 | |||
| 154 | QString who() const; | ||
| 155 | void setWho(QString who); | ||
| 156 | |||
| 157 | QString why() const; | ||
| 158 | void setWhy(QString why); | ||
| 159 | |||
| 160 | SystemdInhibitorParams::Mode mode() const; | ||
| 161 | void setMode(SystemdInhibitorParams::Mode mode); | ||
| 162 | |||
| 163 | Q_INVOKABLE void release(); | ||
| 164 | |||
| 165 | signals: | ||
| 166 | void enabledChanged(); | ||
| 167 | void whatChanged(); | ||
| 168 | void whoChanged(); | ||
| 169 | void whyChanged(); | ||
| 170 | void modeChanged(); | ||
| 171 | |||
| 172 | private: | ||
| 173 | class ActiveSystemdInhibitor { | ||
| 174 | public: | ||
| 175 | uint32_t fd = -1; | ||
| 176 | SystemdInhibitorParams::What what; | ||
| 177 | QString who; | ||
| 178 | QString why; | ||
| 179 | SystemdInhibitorParams::Mode mode; | ||
| 180 | |||
| 181 | ActiveSystemdInhibitor(SystemdInhibitorParams::What what_, QString who_, QString why_, SystemdInhibitorParams::Mode mode_); | ||
| 182 | ~ActiveSystemdInhibitor(); | ||
| 183 | }; | ||
| 184 | |||
| 185 | void update(); | ||
| 186 | |||
| 187 | bool mEnabled = true; | ||
| 188 | std::unique_ptr<ActiveSystemdInhibitor> activeInhibitor; | ||
| 189 | SystemdInhibitorParams::What mWhat = static_cast<SystemdInhibitorParams::What>(0); | ||
| 190 | QString mWho; | ||
| 191 | QString mWhy; | ||
| 192 | SystemdInhibitorParams::Mode mMode = static_cast<SystemdInhibitorParams::Mode>(0); | ||
| 193 | }; | ||
| 194 | |||
diff --git a/accounts/gkleen@skadhi/shell/quickshell-plugins/customplugin.h b/accounts/gkleen@skadhi/shell/quickshell-plugins/customplugin.h new file mode 100644 index 00000000..e66ba9e3 --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell-plugins/customplugin.h | |||
| @@ -0,0 +1,7 @@ | |||
| 1 | #include <QQmlEngineExtensionPlugin> | ||
| 2 | |||
| 3 | class CustomPlugin : public QQmlEngineExtensionPlugin | ||
| 4 | { | ||
| 5 | Q_OBJECT | ||
| 6 | Q_PLUGIN_METADATA(IID QQmlEngineExtensionInterface_iid) | ||
| 7 | }; | ||
diff --git a/accounts/gkleen@skadhi/shell/quickshell-plugins/default.nix b/accounts/gkleen@skadhi/shell/quickshell-plugins/default.nix new file mode 100644 index 00000000..dfe93bca --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell-plugins/default.nix | |||
| @@ -0,0 +1,32 @@ | |||
| 1 | { lib | ||
| 2 | , stdenv | ||
| 3 | , cmake | ||
| 4 | , qt6 | ||
| 5 | , fmt | ||
| 6 | , keepassxc | ||
| 7 | , systemd | ||
| 8 | , quickshell | ||
| 9 | }: | ||
| 10 | |||
| 11 | stdenv.mkDerivation rec { | ||
| 12 | name = "quickshell-custom"; | ||
| 13 | |||
| 14 | src = ./.; | ||
| 15 | |||
| 16 | prePatch = '' | ||
| 17 | cp ${keepassxc.src}/src/gui/org.keepassxc.KeePassXC.MainWindow.xml . | ||
| 18 | ''; | ||
| 19 | |||
| 20 | nativeBuildInputs = [ cmake qt6.wrapQtAppsHook ]; | ||
| 21 | buildInputs = [ | ||
| 22 | qt6.qtbase | ||
| 23 | qt6.qtdeclarative | ||
| 24 | ]; | ||
| 25 | |||
| 26 | cmakeFlags = [ | ||
| 27 | (lib.cmakeFeature "INSTALL_QML_PREFIX" qt6.qtbase.qtQmlPrefix) | ||
| 28 | (lib.cmakeOptionType "string" "QUICKSHELL_SRC" (toString quickshell.src)) | ||
| 29 | ]; | ||
| 30 | |||
| 31 | LC_ALL = "C.UTF-8"; | ||
| 32 | } | ||
diff --git a/accounts/gkleen@skadhi/shell/quickshell-plugins/org.freedesktop.DBus.Properties.xml b/accounts/gkleen@skadhi/shell/quickshell-plugins/org.freedesktop.DBus.Properties.xml new file mode 100644 index 00000000..7588e7a5 --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell-plugins/org.freedesktop.DBus.Properties.xml | |||
| @@ -0,0 +1,28 @@ | |||
| 1 | <!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" | ||
| 2 | "https://www.freedesktop.org/standards/dbus/1.0/introspect.dtd"> | ||
| 3 | <node> | ||
| 4 | <interface name="org.freedesktop.DBus.Properties"> | ||
| 5 | <method name="Get"> | ||
| 6 | <arg name="interface_name" direction="in" type="s"/> | ||
| 7 | <arg name="property_name" direction="in" type="s"/> | ||
| 8 | <arg name="value" direction="out" type="v"/> | ||
| 9 | </method> | ||
| 10 | <method name="GetAll"> | ||
| 11 | <arg name="interface_name" direction="in" type="s"/> | ||
| 12 | <arg name="props" direction="out" type="a{sv}"/> | ||
| 13 | <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QVariantMap"/> | ||
| 14 | </method> | ||
| 15 | <method name="Set"> | ||
| 16 | <arg name="interface_name" direction="in" type="s"/> | ||
| 17 | <arg name="property_name" direction="in" type="s"/> | ||
| 18 | <arg name="value" direction="in" type="v"/> | ||
| 19 | </method> | ||
| 20 | <signal name="PropertiesChanged"> | ||
| 21 | <arg type="s" name="interface_name"/> | ||
| 22 | <arg type="a{sv}" name="changed_properties"/> | ||
| 23 | <annotation name="org.qtproject.QtDBus.QtTypeName.Out1" value="QVariantMap"/> | ||
| 24 | <arg type="as" name="invalidated_properties"/> | ||
| 25 | </signal> | ||
| 26 | </interface> | ||
| 27 | </node> | ||
| 28 | |||
diff --git a/accounts/gkleen@skadhi/shell/quickshell-plugins/org.freedesktop.login1.Manager.xml b/accounts/gkleen@skadhi/shell/quickshell-plugins/org.freedesktop.login1.Manager.xml new file mode 100644 index 00000000..120a06d9 --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell-plugins/org.freedesktop.login1.Manager.xml | |||
| @@ -0,0 +1,445 @@ | |||
| 1 | <!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" | ||
| 2 | "https://www.freedesktop.org/standards/dbus/1.0/introspect.dtd"> | ||
| 3 | <node> | ||
| 4 | <interface name="org.freedesktop.login1.Manager"> | ||
| 5 | <property name="EnableWallMessages" type="b" access="readwrite"> | ||
| 6 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 7 | <annotation name="org.freedesktop.systemd1.Privileged" value="true"/> | ||
| 8 | </property> | ||
| 9 | <property name="WallMessage" type="s" access="readwrite"> | ||
| 10 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 11 | <annotation name="org.freedesktop.systemd1.Privileged" value="true"/> | ||
| 12 | </property> | ||
| 13 | <property name="NAutoVTs" type="u" access="read"> | ||
| 14 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 15 | </property> | ||
| 16 | <property name="KillOnlyUsers" type="as" access="read"> | ||
| 17 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 18 | </property> | ||
| 19 | <property name="KillExcludeUsers" type="as" access="read"> | ||
| 20 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 21 | </property> | ||
| 22 | <property name="KillUserProcesses" type="b" access="read"> | ||
| 23 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 24 | </property> | ||
| 25 | <property name="RebootParameter" type="s" access="read"> | ||
| 26 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 27 | </property> | ||
| 28 | <property name="RebootToFirmwareSetup" type="b" access="read"> | ||
| 29 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 30 | </property> | ||
| 31 | <property name="RebootToBootLoaderMenu" type="t" access="read"> | ||
| 32 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 33 | </property> | ||
| 34 | <property name="RebootToBootLoaderEntry" type="s" access="read"> | ||
| 35 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 36 | </property> | ||
| 37 | <property name="BootLoaderEntries" type="as" access="read"> | ||
| 38 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 39 | </property> | ||
| 40 | <property name="IdleHint" type="b" access="read"> | ||
| 41 | </property> | ||
| 42 | <property name="IdleSinceHint" type="t" access="read"> | ||
| 43 | </property> | ||
| 44 | <property name="IdleSinceHintMonotonic" type="t" access="read"> | ||
| 45 | </property> | ||
| 46 | <property name="BlockInhibited" type="s" access="read"> | ||
| 47 | </property> | ||
| 48 | <property name="BlockWeakInhibited" type="s" access="read"> | ||
| 49 | </property> | ||
| 50 | <property name="DelayInhibited" type="s" access="read"> | ||
| 51 | </property> | ||
| 52 | <property name="InhibitDelayMaxUSec" type="t" access="read"> | ||
| 53 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 54 | </property> | ||
| 55 | <property name="UserStopDelayUSec" type="t" access="read"> | ||
| 56 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 57 | </property> | ||
| 58 | <property name="SleepOperation" type="as" access="read"> | ||
| 59 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 60 | </property> | ||
| 61 | <property name="HandlePowerKey" type="s" access="read"> | ||
| 62 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 63 | </property> | ||
| 64 | <property name="HandlePowerKeyLongPress" type="s" access="read"> | ||
| 65 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 66 | </property> | ||
| 67 | <property name="HandleRebootKey" type="s" access="read"> | ||
| 68 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 69 | </property> | ||
| 70 | <property name="HandleRebootKeyLongPress" type="s" access="read"> | ||
| 71 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 72 | </property> | ||
| 73 | <property name="HandleSuspendKey" type="s" access="read"> | ||
| 74 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 75 | </property> | ||
| 76 | <property name="HandleSuspendKeyLongPress" type="s" access="read"> | ||
| 77 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 78 | </property> | ||
| 79 | <property name="HandleHibernateKey" type="s" access="read"> | ||
| 80 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 81 | </property> | ||
| 82 | <property name="HandleHibernateKeyLongPress" type="s" access="read"> | ||
| 83 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 84 | </property> | ||
| 85 | <property name="HandleLidSwitch" type="s" access="read"> | ||
| 86 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 87 | </property> | ||
| 88 | <property name="HandleLidSwitchExternalPower" type="s" access="read"> | ||
| 89 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 90 | </property> | ||
| 91 | <property name="HandleLidSwitchDocked" type="s" access="read"> | ||
| 92 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 93 | </property> | ||
| 94 | <property name="HandleSecureAttentionKey" type="s" access="read"> | ||
| 95 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 96 | </property> | ||
| 97 | <property name="HoldoffTimeoutUSec" type="t" access="read"> | ||
| 98 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 99 | </property> | ||
| 100 | <property name="IdleAction" type="s" access="read"> | ||
| 101 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 102 | </property> | ||
| 103 | <property name="IdleActionUSec" type="t" access="read"> | ||
| 104 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 105 | </property> | ||
| 106 | <property name="PreparingForShutdown" type="b" access="read"> | ||
| 107 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 108 | </property> | ||
| 109 | <property name="PreparingForShutdownWithMetadata" type="a{sv}" access="read"> | ||
| 110 | <annotation name="org.qtproject.QtDBus.QtTypeName" value="QVariantMap"/> | ||
| 111 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 112 | </property> | ||
| 113 | <property name="PreparingForSleep" type="b" access="read"> | ||
| 114 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 115 | </property> | ||
| 116 | <!-- <property name="ScheduledShutdown" type="(st)" access="read"> --> | ||
| 117 | <!-- </property> --> | ||
| 118 | <property name="DesignatedMaintenanceTime" type="s" access="read"> | ||
| 119 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 120 | </property> | ||
| 121 | <property name="Docked" type="b" access="read"> | ||
| 122 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 123 | </property> | ||
| 124 | <property name="LidClosed" type="b" access="read"> | ||
| 125 | </property> | ||
| 126 | <property name="OnExternalPower" type="b" access="read"> | ||
| 127 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 128 | </property> | ||
| 129 | <property name="RemoveIPC" type="b" access="read"> | ||
| 130 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 131 | </property> | ||
| 132 | <property name="RuntimeDirectorySize" type="t" access="read"> | ||
| 133 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 134 | </property> | ||
| 135 | <property name="RuntimeDirectoryInodesMax" type="t" access="read"> | ||
| 136 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 137 | </property> | ||
| 138 | <property name="InhibitorsMax" type="t" access="read"> | ||
| 139 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 140 | </property> | ||
| 141 | <property name="NCurrentInhibitors" type="t" access="read"> | ||
| 142 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 143 | </property> | ||
| 144 | <property name="SessionsMax" type="t" access="read"> | ||
| 145 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 146 | </property> | ||
| 147 | <property name="NCurrentSessions" type="t" access="read"> | ||
| 148 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 149 | </property> | ||
| 150 | <property name="StopIdleSessionUSec" type="t" access="read"> | ||
| 151 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 152 | </property> | ||
| 153 | <method name="GetSession"> | ||
| 154 | <arg type="s" name="session_id" direction="in"/> | ||
| 155 | <arg type="o" name="object_path" direction="out"/> | ||
| 156 | </method> | ||
| 157 | <method name="GetSessionByPID"> | ||
| 158 | <arg type="u" name="pid" direction="in"/> | ||
| 159 | <arg type="o" name="object_path" direction="out"/> | ||
| 160 | </method> | ||
| 161 | <method name="GetUser"> | ||
| 162 | <arg type="u" name="uid" direction="in"/> | ||
| 163 | <arg type="o" name="object_path" direction="out"/> | ||
| 164 | </method> | ||
| 165 | <method name="GetUserByPID"> | ||
| 166 | <arg type="u" name="pid" direction="in"/> | ||
| 167 | <arg type="o" name="object_path" direction="out"/> | ||
| 168 | </method> | ||
| 169 | <method name="GetSeat"> | ||
| 170 | <arg type="s" name="seat_id" direction="in"/> | ||
| 171 | <arg type="o" name="object_path" direction="out"/> | ||
| 172 | </method> | ||
| 173 | <!-- <method name="ListSessions"> --> | ||
| 174 | <!-- <arg type="a(susso)" name="sessions" direction="out"/> --> | ||
| 175 | <!-- </method> --> | ||
| 176 | <!-- <method name="ListSessionsEx"> --> | ||
| 177 | <!-- <arg type="a(sussussbto)" name="sessions" direction="out"/> --> | ||
| 178 | <!-- </method> --> | ||
| 179 | <!-- <method name="ListUsers"> --> | ||
| 180 | <!-- <arg type="a(uso)" name="users" direction="out"/> --> | ||
| 181 | <!-- </method> --> | ||
| 182 | <!-- <method name="ListSeats"> --> | ||
| 183 | <!-- <arg type="a(so)" name="seats" direction="out"/> --> | ||
| 184 | <!-- </method> --> | ||
| 185 | <!-- <method name="ListInhibitors"> --> | ||
| 186 | <!-- <arg type="a(ssssuu)" name="inhibitors" direction="out"/> --> | ||
| 187 | <!-- </method> --> | ||
| 188 | <!-- <method name="CreateSession"> --> | ||
| 189 | <!-- <arg type="u" name="uid" direction="in"/> --> | ||
| 190 | <!-- <arg type="u" name="pid" direction="in"/> --> | ||
| 191 | <!-- <arg type="s" name="service" direction="in"/> --> | ||
| 192 | <!-- <arg type="s" name="type" direction="in"/> --> | ||
| 193 | <!-- <arg type="s" name="class" direction="in"/> --> | ||
| 194 | <!-- <arg type="s" name="desktop" direction="in"/> --> | ||
| 195 | <!-- <arg type="s" name="seat_id" direction="in"/> --> | ||
| 196 | <!-- <arg type="u" name="vtnr" direction="in"/> --> | ||
| 197 | <!-- <arg type="s" name="tty" direction="in"/> --> | ||
| 198 | <!-- <arg type="s" name="display" direction="in"/> --> | ||
| 199 | <!-- <arg type="b" name="remote" direction="in"/> --> | ||
| 200 | <!-- <arg type="s" name="remote_user" direction="in"/> --> | ||
| 201 | <!-- <arg type="s" name="remote_host" direction="in"/> --> | ||
| 202 | <!-- <arg type="a(sv)" name="properties" direction="in"/> --> | ||
| 203 | <!-- <arg type="s" name="session_id" direction="out"/> --> | ||
| 204 | <!-- <arg type="o" name="object_path" direction="out"/> --> | ||
| 205 | <!-- <arg type="s" name="runtime_path" direction="out"/> --> | ||
| 206 | <!-- <arg type="h" name="fifo_fd" direction="out"/> --> | ||
| 207 | <!-- <arg type="u" name="uid" direction="out"/> --> | ||
| 208 | <!-- <arg type="s" name="seat_id" direction="out"/> --> | ||
| 209 | <!-- <arg type="u" name="vtnr" direction="out"/> --> | ||
| 210 | <!-- <arg type="b" name="existing" direction="out"/> --> | ||
| 211 | <!-- <annotation name="org.freedesktop.systemd1.Privileged" value="true"/> --> | ||
| 212 | <!-- </method> --> | ||
| 213 | <!-- <method name="CreateSessionWithPIDFD"> --> | ||
| 214 | <!-- <arg type="u" name="uid" direction="in"/> --> | ||
| 215 | <!-- <arg type="h" name="pidfd" direction="in"/> --> | ||
| 216 | <!-- <arg type="s" name="service" direction="in"/> --> | ||
| 217 | <!-- <arg type="s" name="type" direction="in"/> --> | ||
| 218 | <!-- <arg type="s" name="class" direction="in"/> --> | ||
| 219 | <!-- <arg type="s" name="desktop" direction="in"/> --> | ||
| 220 | <!-- <arg type="s" name="seat_id" direction="in"/> --> | ||
| 221 | <!-- <arg type="u" name="vtnr" direction="in"/> --> | ||
| 222 | <!-- <arg type="s" name="tty" direction="in"/> --> | ||
| 223 | <!-- <arg type="s" name="display" direction="in"/> --> | ||
| 224 | <!-- <arg type="b" name="remote" direction="in"/> --> | ||
| 225 | <!-- <arg type="s" name="remote_user" direction="in"/> --> | ||
| 226 | <!-- <arg type="s" name="remote_host" direction="in"/> --> | ||
| 227 | <!-- <arg type="t" name="flags" direction="in"/> --> | ||
| 228 | <!-- <arg type="a(sv)" name="properties" direction="in"/> --> | ||
| 229 | <!-- <arg type="s" name="session_id" direction="out"/> --> | ||
| 230 | <!-- <arg type="o" name="object_path" direction="out"/> --> | ||
| 231 | <!-- <arg type="s" name="runtime_path" direction="out"/> --> | ||
| 232 | <!-- <arg type="h" name="fifo_fd" direction="out"/> --> | ||
| 233 | <!-- <arg type="u" name="uid" direction="out"/> --> | ||
| 234 | <!-- <arg type="s" name="seat_id" direction="out"/> --> | ||
| 235 | <!-- <arg type="u" name="vtnr" direction="out"/> --> | ||
| 236 | <!-- <arg type="b" name="existing" direction="out"/> --> | ||
| 237 | <!-- <annotation name="org.freedesktop.systemd1.Privileged" value="true"/> --> | ||
| 238 | <!-- </method> --> | ||
| 239 | <method name="ReleaseSession"> | ||
| 240 | <arg type="s" name="session_id" direction="in"/> | ||
| 241 | </method> | ||
| 242 | <method name="ActivateSession"> | ||
| 243 | <arg type="s" name="session_id" direction="in"/> | ||
| 244 | </method> | ||
| 245 | <method name="ActivateSessionOnSeat"> | ||
| 246 | <arg type="s" name="session_id" direction="in"/> | ||
| 247 | <arg type="s" name="seat_id" direction="in"/> | ||
| 248 | </method> | ||
| 249 | <method name="LockSession"> | ||
| 250 | <arg type="s" name="session_id" direction="in"/> | ||
| 251 | </method> | ||
| 252 | <method name="UnlockSession"> | ||
| 253 | <arg type="s" name="session_id" direction="in"/> | ||
| 254 | </method> | ||
| 255 | <method name="LockSessions"> | ||
| 256 | </method> | ||
| 257 | <method name="UnlockSessions"> | ||
| 258 | </method> | ||
| 259 | <method name="KillSession"> | ||
| 260 | <arg type="s" name="session_id" direction="in"/> | ||
| 261 | <arg type="s" name="whom" direction="in"/> | ||
| 262 | <arg type="i" name="signal_number" direction="in"/> | ||
| 263 | </method> | ||
| 264 | <method name="KillUser"> | ||
| 265 | <arg type="u" name="uid" direction="in"/> | ||
| 266 | <arg type="i" name="signal_number" direction="in"/> | ||
| 267 | </method> | ||
| 268 | <method name="TerminateSession"> | ||
| 269 | <arg type="s" name="session_id" direction="in"/> | ||
| 270 | </method> | ||
| 271 | <method name="TerminateUser"> | ||
| 272 | <arg type="u" name="uid" direction="in"/> | ||
| 273 | </method> | ||
| 274 | <method name="TerminateSeat"> | ||
| 275 | <arg type="s" name="seat_id" direction="in"/> | ||
| 276 | </method> | ||
| 277 | <method name="SetUserLinger"> | ||
| 278 | <arg type="u" name="uid" direction="in"/> | ||
| 279 | <arg type="b" name="enable" direction="in"/> | ||
| 280 | <arg type="b" name="interactive" direction="in"/> | ||
| 281 | </method> | ||
| 282 | <method name="AttachDevice"> | ||
| 283 | <arg type="s" name="seat_id" direction="in"/> | ||
| 284 | <arg type="s" name="sysfs_path" direction="in"/> | ||
| 285 | <arg type="b" name="interactive" direction="in"/> | ||
| 286 | </method> | ||
| 287 | <method name="FlushDevices"> | ||
| 288 | <arg type="b" name="interactive" direction="in"/> | ||
| 289 | </method> | ||
| 290 | <method name="PowerOff"> | ||
| 291 | <arg type="b" name="interactive" direction="in"/> | ||
| 292 | </method> | ||
| 293 | <method name="PowerOffWithFlags"> | ||
| 294 | <arg type="t" name="flags" direction="in"/> | ||
| 295 | </method> | ||
| 296 | <method name="Reboot"> | ||
| 297 | <arg type="b" name="interactive" direction="in"/> | ||
| 298 | </method> | ||
| 299 | <method name="RebootWithFlags"> | ||
| 300 | <arg type="t" name="flags" direction="in"/> | ||
| 301 | </method> | ||
| 302 | <method name="Halt"> | ||
| 303 | <arg type="b" name="interactive" direction="in"/> | ||
| 304 | </method> | ||
| 305 | <method name="HaltWithFlags"> | ||
| 306 | <arg type="t" name="flags" direction="in"/> | ||
| 307 | </method> | ||
| 308 | <method name="Suspend"> | ||
| 309 | <arg type="b" name="interactive" direction="in"/> | ||
| 310 | </method> | ||
| 311 | <method name="SuspendWithFlags"> | ||
| 312 | <arg type="t" name="flags" direction="in"/> | ||
| 313 | </method> | ||
| 314 | <method name="Hibernate"> | ||
| 315 | <arg type="b" name="interactive" direction="in"/> | ||
| 316 | </method> | ||
| 317 | <method name="HibernateWithFlags"> | ||
| 318 | <arg type="t" name="flags" direction="in"/> | ||
| 319 | </method> | ||
| 320 | <method name="HybridSleep"> | ||
| 321 | <arg type="b" name="interactive" direction="in"/> | ||
| 322 | </method> | ||
| 323 | <method name="HybridSleepWithFlags"> | ||
| 324 | <arg type="t" name="flags" direction="in"/> | ||
| 325 | </method> | ||
| 326 | <method name="SuspendThenHibernate"> | ||
| 327 | <arg type="b" name="interactive" direction="in"/> | ||
| 328 | </method> | ||
| 329 | <method name="SuspendThenHibernateWithFlags"> | ||
| 330 | <arg type="t" name="flags" direction="in"/> | ||
| 331 | </method> | ||
| 332 | <method name="Sleep"> | ||
| 333 | <arg type="t" name="flags" direction="in"/> | ||
| 334 | </method> | ||
| 335 | <method name="CanPowerOff"> | ||
| 336 | <arg type="s" name="result" direction="out"/> | ||
| 337 | </method> | ||
| 338 | <method name="CanReboot"> | ||
| 339 | <arg type="s" name="result" direction="out"/> | ||
| 340 | </method> | ||
| 341 | <method name="CanHalt"> | ||
| 342 | <arg type="s" name="result" direction="out"/> | ||
| 343 | </method> | ||
| 344 | <method name="CanSuspend"> | ||
| 345 | <arg type="s" name="result" direction="out"/> | ||
| 346 | </method> | ||
| 347 | <method name="CanHibernate"> | ||
| 348 | <arg type="s" name="result" direction="out"/> | ||
| 349 | </method> | ||
| 350 | <method name="CanHybridSleep"> | ||
| 351 | <arg type="s" name="result" direction="out"/> | ||
| 352 | </method> | ||
| 353 | <method name="CanSuspendThenHibernate"> | ||
| 354 | <arg type="s" name="result" direction="out"/> | ||
| 355 | </method> | ||
| 356 | <method name="CanSleep"> | ||
| 357 | <arg type="s" name="result" direction="out"/> | ||
| 358 | </method> | ||
| 359 | <method name="ScheduleShutdown"> | ||
| 360 | <arg type="s" name="type" direction="in"/> | ||
| 361 | <arg type="t" name="usec" direction="in"/> | ||
| 362 | </method> | ||
| 363 | <method name="CancelScheduledShutdown"> | ||
| 364 | <arg type="b" name="cancelled" direction="out"/> | ||
| 365 | </method> | ||
| 366 | <method name="Inhibit"> | ||
| 367 | <arg type="s" name="what" direction="in"/> | ||
| 368 | <arg type="s" name="who" direction="in"/> | ||
| 369 | <arg type="s" name="why" direction="in"/> | ||
| 370 | <arg type="s" name="mode" direction="in"/> | ||
| 371 | <arg type="h" name="pipe_fd" direction="out"/> | ||
| 372 | </method> | ||
| 373 | <method name="CanRebootParameter"> | ||
| 374 | <arg type="s" name="result" direction="out"/> | ||
| 375 | </method> | ||
| 376 | <method name="SetRebootParameter"> | ||
| 377 | <arg type="s" name="parameter" direction="in"/> | ||
| 378 | </method> | ||
| 379 | <method name="CanRebootToFirmwareSetup"> | ||
| 380 | <arg type="s" name="result" direction="out"/> | ||
| 381 | </method> | ||
| 382 | <method name="SetRebootToFirmwareSetup"> | ||
| 383 | <arg type="b" name="enable" direction="in"/> | ||
| 384 | </method> | ||
| 385 | <method name="CanRebootToBootLoaderMenu"> | ||
| 386 | <arg type="s" name="result" direction="out"/> | ||
| 387 | </method> | ||
| 388 | <method name="SetRebootToBootLoaderMenu"> | ||
| 389 | <arg type="t" name="timeout" direction="in"/> | ||
| 390 | </method> | ||
| 391 | <method name="CanRebootToBootLoaderEntry"> | ||
| 392 | <arg type="s" name="result" direction="out"/> | ||
| 393 | </method> | ||
| 394 | <method name="SetRebootToBootLoaderEntry"> | ||
| 395 | <arg type="s" name="boot_loader_entry" direction="in"/> | ||
| 396 | </method> | ||
| 397 | <method name="SetWallMessage"> | ||
| 398 | <arg type="s" name="wall_message" direction="in"/> | ||
| 399 | <arg type="b" name="enable" direction="in"/> | ||
| 400 | </method> | ||
| 401 | <signal name="SecureAttentionKey"> | ||
| 402 | <arg type="s" name="seat_id"/> | ||
| 403 | <arg type="o" name="object_path"/> | ||
| 404 | </signal> | ||
| 405 | <signal name="SessionNew"> | ||
| 406 | <arg type="s" name="session_id"/> | ||
| 407 | <arg type="o" name="object_path"/> | ||
| 408 | </signal> | ||
| 409 | <signal name="SessionRemoved"> | ||
| 410 | <arg type="s" name="session_id"/> | ||
| 411 | <arg type="o" name="object_path"/> | ||
| 412 | </signal> | ||
| 413 | <signal name="UserNew"> | ||
| 414 | <arg type="u" name="uid"/> | ||
| 415 | <arg type="o" name="object_path"/> | ||
| 416 | </signal> | ||
| 417 | <signal name="UserRemoved"> | ||
| 418 | <arg type="u" name="uid"/> | ||
| 419 | <arg type="o" name="object_path"/> | ||
| 420 | </signal> | ||
| 421 | <signal name="SeatNew"> | ||
| 422 | <arg type="s" name="seat_id"/> | ||
| 423 | <arg type="o" name="object_path"/> | ||
| 424 | </signal> | ||
| 425 | <signal name="SeatRemoved"> | ||
| 426 | <arg type="s" name="seat_id"/> | ||
| 427 | <arg type="o" name="object_path"/> | ||
| 428 | </signal> | ||
| 429 | <signal name="PrepareForShutdown"> | ||
| 430 | <arg type="b" name="start"/> | ||
| 431 | </signal> | ||
| 432 | <signal name="PrepareForShutdownWithMetadata"> | ||
| 433 | <arg type="b" name="start"/> | ||
| 434 | <arg type="a{sv}" name="metadata"/> | ||
| 435 | <annotation name="org.qtproject.QtDBus.QtTypeName.Out1" value="QVariantMap"/> | ||
| 436 | </signal> | ||
| 437 | <signal name="PrepareForSleep"> | ||
| 438 | <arg type="b" name="start"/> | ||
| 439 | </signal> | ||
| 440 | </interface> | ||
| 441 | <node name="user"/> | ||
| 442 | <node name="session"/> | ||
| 443 | <node name="seat"/> | ||
| 444 | </node> | ||
| 445 | |||
diff --git a/accounts/gkleen@skadhi/shell/quickshell-plugins/org.freedesktop.login1.Session.xml b/accounts/gkleen@skadhi/shell/quickshell-plugins/org.freedesktop.login1.Session.xml new file mode 100644 index 00000000..7d6fc8ee --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell-plugins/org.freedesktop.login1.Session.xml | |||
| @@ -0,0 +1,146 @@ | |||
| 1 | <!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" | ||
| 2 | "https://www.freedesktop.org/standards/dbus/1.0/introspect.dtd"> | ||
| 3 | <node> | ||
| 4 | <interface name="org.freedesktop.login1.Session"> | ||
| 5 | <property name="Id" type="s" access="read"> | ||
| 6 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 7 | </property> | ||
| 8 | <property name="User" type="o" access="read"> | ||
| 9 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 10 | </property> | ||
| 11 | <property name="Name" type="s" access="read"> | ||
| 12 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 13 | </property> | ||
| 14 | <property name="Timestamp" type="t" access="read"> | ||
| 15 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 16 | </property> | ||
| 17 | <property name="TimestampMonotonic" type="t" access="read"> | ||
| 18 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 19 | </property> | ||
| 20 | <property name="VTNr" type="u" access="read"> | ||
| 21 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 22 | </property> | ||
| 23 | <property name="Seat" type="o" access="read"> | ||
| 24 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 25 | </property> | ||
| 26 | <property name="TTY" type="s" access="read"> | ||
| 27 | </property> | ||
| 28 | <property name="Display" type="s" access="read"> | ||
| 29 | </property> | ||
| 30 | <property name="Remote" type="b" access="read"> | ||
| 31 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 32 | </property> | ||
| 33 | <property name="RemoteHost" type="s" access="read"> | ||
| 34 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 35 | </property> | ||
| 36 | <property name="RemoteUser" type="s" access="read"> | ||
| 37 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 38 | </property> | ||
| 39 | <property name="Service" type="s" access="read"> | ||
| 40 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 41 | </property> | ||
| 42 | <property name="Desktop" type="s" access="read"> | ||
| 43 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 44 | </property> | ||
| 45 | <property name="Scope" type="s" access="read"> | ||
| 46 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 47 | </property> | ||
| 48 | <property name="Leader" type="u" access="read"> | ||
| 49 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 50 | </property> | ||
| 51 | <property name="Audit" type="u" access="read"> | ||
| 52 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 53 | </property> | ||
| 54 | <property name="Type" type="s" access="read"> | ||
| 55 | </property> | ||
| 56 | <!-- <property name="Class" type="s" access="read"> --> | ||
| 57 | <!-- </property> --> | ||
| 58 | <property name="Active" type="b" access="read"> | ||
| 59 | </property> | ||
| 60 | <property name="State" type="s" access="read"> | ||
| 61 | </property> | ||
| 62 | <property name="IdleHint" type="b" access="read"> | ||
| 63 | </property> | ||
| 64 | <property name="IdleSinceHint" type="t" access="read"> | ||
| 65 | </property> | ||
| 66 | <property name="IdleSinceHintMonotonic" type="t" access="read"> | ||
| 67 | </property> | ||
| 68 | <property name="CanIdle" type="b" access="read"> | ||
| 69 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 70 | </property> | ||
| 71 | <property name="CanLock" type="b" access="read"> | ||
| 72 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 73 | </property> | ||
| 74 | <property name="LockedHint" type="b" access="read"> | ||
| 75 | </property> | ||
| 76 | <method name="Terminate"> | ||
| 77 | </method> | ||
| 78 | <method name="Activate"> | ||
| 79 | </method> | ||
| 80 | <!-- <method name="Lock"> --> | ||
| 81 | <!-- </method> --> | ||
| 82 | <!-- <method name="Unlock"> --> | ||
| 83 | <!-- </method> --> | ||
| 84 | <method name="SetIdleHint"> | ||
| 85 | <arg type="b" name="idle" direction="in"/> | ||
| 86 | </method> | ||
| 87 | <method name="SetLockedHint"> | ||
| 88 | <arg type="b" name="locked" direction="in"/> | ||
| 89 | </method> | ||
| 90 | <method name="Kill"> | ||
| 91 | <arg type="s" name="whom" direction="in"/> | ||
| 92 | <arg type="i" name="signal_number" direction="in"/> | ||
| 93 | </method> | ||
| 94 | <method name="TakeControl"> | ||
| 95 | <arg type="b" name="force" direction="in"/> | ||
| 96 | </method> | ||
| 97 | <method name="ReleaseControl"> | ||
| 98 | </method> | ||
| 99 | <method name="SetType"> | ||
| 100 | <arg type="s" name="type" direction="in"/> | ||
| 101 | </method> | ||
| 102 | <!-- <method name="SetClass"> --> | ||
| 103 | <!-- <arg type="s" name="class" direction="in"/> --> | ||
| 104 | <!-- </method> --> | ||
| 105 | <method name="SetDisplay"> | ||
| 106 | <arg type="s" name="display" direction="in"/> | ||
| 107 | </method> | ||
| 108 | <method name="SetTTY"> | ||
| 109 | <arg type="h" name="tty_fd" direction="in"/> | ||
| 110 | </method> | ||
| 111 | <method name="TakeDevice"> | ||
| 112 | <arg type="u" name="major" direction="in"/> | ||
| 113 | <arg type="u" name="minor" direction="in"/> | ||
| 114 | <arg type="h" name="fd" direction="out"/> | ||
| 115 | <arg type="b" name="inactive" direction="out"/> | ||
| 116 | </method> | ||
| 117 | <method name="ReleaseDevice"> | ||
| 118 | <arg type="u" name="major" direction="in"/> | ||
| 119 | <arg type="u" name="minor" direction="in"/> | ||
| 120 | </method> | ||
| 121 | <method name="PauseDeviceComplete"> | ||
| 122 | <arg type="u" name="major" direction="in"/> | ||
| 123 | <arg type="u" name="minor" direction="in"/> | ||
| 124 | </method> | ||
| 125 | <method name="SetBrightness"> | ||
| 126 | <arg type="s" name="subsystem" direction="in"/> | ||
| 127 | <arg type="s" name="name" direction="in"/> | ||
| 128 | <arg type="u" name="brightness" direction="in"/> | ||
| 129 | </method> | ||
| 130 | <signal name="PauseDevice"> | ||
| 131 | <arg type="u" name="major"/> | ||
| 132 | <arg type="u" name="minor"/> | ||
| 133 | <arg type="s" name="type"/> | ||
| 134 | </signal> | ||
| 135 | <signal name="ResumeDevice"> | ||
| 136 | <arg type="u" name="major"/> | ||
| 137 | <arg type="u" name="minor"/> | ||
| 138 | <arg type="h" name="fd"/> | ||
| 139 | </signal> | ||
| 140 | <signal name="Lock"> | ||
| 141 | </signal> | ||
| 142 | <signal name="Unlock"> | ||
| 143 | </signal> | ||
| 144 | </interface> | ||
| 145 | </node> | ||
| 146 | |||
diff --git a/accounts/gkleen@skadhi/shell/quickshell-plugins/org.freedesktop.systemd1.Manager.xml b/accounts/gkleen@skadhi/shell/quickshell-plugins/org.freedesktop.systemd1.Manager.xml new file mode 100644 index 00000000..1dadbc55 --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell-plugins/org.freedesktop.systemd1.Manager.xml | |||
| @@ -0,0 +1,821 @@ | |||
| 1 | <!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" | ||
| 2 | "https://www.freedesktop.org/standards/dbus/1.0/introspect.dtd"> | ||
| 3 | <node> | ||
| 4 | <interface name="org.freedesktop.systemd1.Manager"> | ||
| 5 | <property name="Version" type="s" access="read"> | ||
| 6 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 7 | </property> | ||
| 8 | <property name="Features" type="s" access="read"> | ||
| 9 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 10 | </property> | ||
| 11 | <property name="Virtualization" type="s" access="read"> | ||
| 12 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 13 | </property> | ||
| 14 | <property name="ConfidentialVirtualization" type="s" access="read"> | ||
| 15 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 16 | </property> | ||
| 17 | <property name="Architecture" type="s" access="read"> | ||
| 18 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 19 | </property> | ||
| 20 | <property name="Tainted" type="s" access="read"> | ||
| 21 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 22 | </property> | ||
| 23 | <property name="FirmwareTimestamp" type="t" access="read"> | ||
| 24 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 25 | </property> | ||
| 26 | <property name="FirmwareTimestampMonotonic" type="t" access="read"> | ||
| 27 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 28 | </property> | ||
| 29 | <property name="LoaderTimestamp" type="t" access="read"> | ||
| 30 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 31 | </property> | ||
| 32 | <property name="LoaderTimestampMonotonic" type="t" access="read"> | ||
| 33 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 34 | </property> | ||
| 35 | <property name="KernelTimestamp" type="t" access="read"> | ||
| 36 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 37 | </property> | ||
| 38 | <property name="KernelTimestampMonotonic" type="t" access="read"> | ||
| 39 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 40 | </property> | ||
| 41 | <property name="InitRDTimestamp" type="t" access="read"> | ||
| 42 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 43 | </property> | ||
| 44 | <property name="InitRDTimestampMonotonic" type="t" access="read"> | ||
| 45 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 46 | </property> | ||
| 47 | <property name="UserspaceTimestamp" type="t" access="read"> | ||
| 48 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 49 | </property> | ||
| 50 | <property name="UserspaceTimestampMonotonic" type="t" access="read"> | ||
| 51 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 52 | </property> | ||
| 53 | <property name="FinishTimestamp" type="t" access="read"> | ||
| 54 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 55 | </property> | ||
| 56 | <property name="FinishTimestampMonotonic" type="t" access="read"> | ||
| 57 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 58 | </property> | ||
| 59 | <property name="ShutdownStartTimestamp" type="t" access="read"> | ||
| 60 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 61 | </property> | ||
| 62 | <property name="ShutdownStartTimestampMonotonic" type="t" access="read"> | ||
| 63 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 64 | </property> | ||
| 65 | <property name="SecurityStartTimestamp" type="t" access="read"> | ||
| 66 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 67 | </property> | ||
| 68 | <property name="SecurityStartTimestampMonotonic" type="t" access="read"> | ||
| 69 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 70 | </property> | ||
| 71 | <property name="SecurityFinishTimestamp" type="t" access="read"> | ||
| 72 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 73 | </property> | ||
| 74 | <property name="SecurityFinishTimestampMonotonic" type="t" access="read"> | ||
| 75 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 76 | </property> | ||
| 77 | <property name="GeneratorsStartTimestamp" type="t" access="read"> | ||
| 78 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 79 | </property> | ||
| 80 | <property name="GeneratorsStartTimestampMonotonic" type="t" access="read"> | ||
| 81 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 82 | </property> | ||
| 83 | <property name="GeneratorsFinishTimestamp" type="t" access="read"> | ||
| 84 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 85 | </property> | ||
| 86 | <property name="GeneratorsFinishTimestampMonotonic" type="t" access="read"> | ||
| 87 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 88 | </property> | ||
| 89 | <property name="UnitsLoadStartTimestamp" type="t" access="read"> | ||
| 90 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 91 | </property> | ||
| 92 | <property name="UnitsLoadStartTimestampMonotonic" type="t" access="read"> | ||
| 93 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 94 | </property> | ||
| 95 | <property name="UnitsLoadFinishTimestamp" type="t" access="read"> | ||
| 96 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 97 | </property> | ||
| 98 | <property name="UnitsLoadFinishTimestampMonotonic" type="t" access="read"> | ||
| 99 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 100 | </property> | ||
| 101 | <property name="UnitsLoadTimestamp" type="t" access="read"> | ||
| 102 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 103 | </property> | ||
| 104 | <property name="UnitsLoadTimestampMonotonic" type="t" access="read"> | ||
| 105 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 106 | </property> | ||
| 107 | <property name="InitRDSecurityStartTimestamp" type="t" access="read"> | ||
| 108 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 109 | </property> | ||
| 110 | <property name="InitRDSecurityStartTimestampMonotonic" type="t" access="read"> | ||
| 111 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 112 | </property> | ||
| 113 | <property name="InitRDSecurityFinishTimestamp" type="t" access="read"> | ||
| 114 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 115 | </property> | ||
| 116 | <property name="InitRDSecurityFinishTimestampMonotonic" type="t" access="read"> | ||
| 117 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 118 | </property> | ||
| 119 | <property name="InitRDGeneratorsStartTimestamp" type="t" access="read"> | ||
| 120 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 121 | </property> | ||
| 122 | <property name="InitRDGeneratorsStartTimestampMonotonic" type="t" access="read"> | ||
| 123 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 124 | </property> | ||
| 125 | <property name="InitRDGeneratorsFinishTimestamp" type="t" access="read"> | ||
| 126 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 127 | </property> | ||
| 128 | <property name="InitRDGeneratorsFinishTimestampMonotonic" type="t" access="read"> | ||
| 129 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 130 | </property> | ||
| 131 | <property name="InitRDUnitsLoadStartTimestamp" type="t" access="read"> | ||
| 132 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 133 | </property> | ||
| 134 | <property name="InitRDUnitsLoadStartTimestampMonotonic" type="t" access="read"> | ||
| 135 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 136 | </property> | ||
| 137 | <property name="InitRDUnitsLoadFinishTimestamp" type="t" access="read"> | ||
| 138 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 139 | </property> | ||
| 140 | <property name="InitRDUnitsLoadFinishTimestampMonotonic" type="t" access="read"> | ||
| 141 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 142 | </property> | ||
| 143 | <property name="LogLevel" type="s" access="readwrite"> | ||
| 144 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 145 | <annotation name="org.freedesktop.systemd1.Privileged" value="true"/> | ||
| 146 | </property> | ||
| 147 | <property name="LogTarget" type="s" access="readwrite"> | ||
| 148 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 149 | <annotation name="org.freedesktop.systemd1.Privileged" value="true"/> | ||
| 150 | </property> | ||
| 151 | <property name="NNames" type="u" access="read"> | ||
| 152 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 153 | </property> | ||
| 154 | <property name="NFailedUnits" type="u" access="read"> | ||
| 155 | </property> | ||
| 156 | <property name="NJobs" type="u" access="read"> | ||
| 157 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 158 | </property> | ||
| 159 | <property name="NInstalledJobs" type="u" access="read"> | ||
| 160 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 161 | </property> | ||
| 162 | <property name="NFailedJobs" type="u" access="read"> | ||
| 163 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 164 | </property> | ||
| 165 | <property name="Progress" type="d" access="read"> | ||
| 166 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 167 | </property> | ||
| 168 | <property name="Environment" type="as" access="read"> | ||
| 169 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 170 | </property> | ||
| 171 | <property name="ConfirmSpawn" type="b" access="read"> | ||
| 172 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 173 | </property> | ||
| 174 | <property name="ShowStatus" type="b" access="read"> | ||
| 175 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 176 | </property> | ||
| 177 | <property name="UnitPath" type="as" access="read"> | ||
| 178 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 179 | </property> | ||
| 180 | <property name="DefaultStandardOutput" type="s" access="read"> | ||
| 181 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 182 | </property> | ||
| 183 | <property name="DefaultStandardError" type="s" access="read"> | ||
| 184 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 185 | </property> | ||
| 186 | <property name="WatchdogDevice" type="s" access="read"> | ||
| 187 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 188 | </property> | ||
| 189 | <property name="WatchdogLastPingTimestamp" type="t" access="read"> | ||
| 190 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 191 | </property> | ||
| 192 | <property name="WatchdogLastPingTimestampMonotonic" type="t" access="read"> | ||
| 193 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 194 | </property> | ||
| 195 | <property name="RuntimeWatchdogUSec" type="t" access="readwrite"> | ||
| 196 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 197 | <annotation name="org.freedesktop.systemd1.Privileged" value="true"/> | ||
| 198 | </property> | ||
| 199 | <property name="RuntimeWatchdogPreUSec" type="t" access="readwrite"> | ||
| 200 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 201 | <annotation name="org.freedesktop.systemd1.Privileged" value="true"/> | ||
| 202 | </property> | ||
| 203 | <property name="RuntimeWatchdogPreGovernor" type="s" access="readwrite"> | ||
| 204 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 205 | <annotation name="org.freedesktop.systemd1.Privileged" value="true"/> | ||
| 206 | </property> | ||
| 207 | <property name="RebootWatchdogUSec" type="t" access="readwrite"> | ||
| 208 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 209 | <annotation name="org.freedesktop.systemd1.Privileged" value="true"/> | ||
| 210 | </property> | ||
| 211 | <property name="KExecWatchdogUSec" type="t" access="readwrite"> | ||
| 212 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 213 | <annotation name="org.freedesktop.systemd1.Privileged" value="true"/> | ||
| 214 | </property> | ||
| 215 | <property name="ServiceWatchdogs" type="b" access="readwrite"> | ||
| 216 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 217 | <annotation name="org.freedesktop.systemd1.Privileged" value="true"/> | ||
| 218 | </property> | ||
| 219 | <property name="ControlGroup" type="s" access="read"> | ||
| 220 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 221 | </property> | ||
| 222 | <property name="SystemState" type="s" access="read"> | ||
| 223 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 224 | </property> | ||
| 225 | <property name="ExitCode" type="y" access="read"> | ||
| 226 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 227 | </property> | ||
| 228 | <property name="DefaultTimerAccuracyUSec" type="t" access="read"> | ||
| 229 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 230 | </property> | ||
| 231 | <property name="DefaultTimeoutStartUSec" type="t" access="read"> | ||
| 232 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 233 | </property> | ||
| 234 | <property name="DefaultTimeoutStopUSec" type="t" access="read"> | ||
| 235 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 236 | </property> | ||
| 237 | <property name="DefaultTimeoutAbortUSec" type="t" access="read"> | ||
| 238 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 239 | </property> | ||
| 240 | <property name="DefaultDeviceTimeoutUSec" type="t" access="read"> | ||
| 241 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 242 | </property> | ||
| 243 | <property name="DefaultRestartUSec" type="t" access="read"> | ||
| 244 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 245 | </property> | ||
| 246 | <property name="DefaultStartLimitIntervalUSec" type="t" access="read"> | ||
| 247 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 248 | </property> | ||
| 249 | <property name="DefaultStartLimitBurst" type="u" access="read"> | ||
| 250 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 251 | </property> | ||
| 252 | <property name="DefaultCPUAccounting" type="b" access="read"> | ||
| 253 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 254 | </property> | ||
| 255 | <property name="DefaultBlockIOAccounting" type="b" access="read"> | ||
| 256 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 257 | </property> | ||
| 258 | <property name="DefaultIOAccounting" type="b" access="read"> | ||
| 259 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 260 | </property> | ||
| 261 | <property name="DefaultIPAccounting" type="b" access="read"> | ||
| 262 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 263 | </property> | ||
| 264 | <property name="DefaultMemoryAccounting" type="b" access="read"> | ||
| 265 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 266 | </property> | ||
| 267 | <property name="DefaultTasksAccounting" type="b" access="read"> | ||
| 268 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 269 | </property> | ||
| 270 | <property name="DefaultLimitCPU" type="t" access="read"> | ||
| 271 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 272 | </property> | ||
| 273 | <property name="DefaultLimitCPUSoft" type="t" access="read"> | ||
| 274 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 275 | </property> | ||
| 276 | <property name="DefaultLimitFSIZE" type="t" access="read"> | ||
| 277 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 278 | </property> | ||
| 279 | <property name="DefaultLimitFSIZESoft" type="t" access="read"> | ||
| 280 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 281 | </property> | ||
| 282 | <property name="DefaultLimitDATA" type="t" access="read"> | ||
| 283 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 284 | </property> | ||
| 285 | <property name="DefaultLimitDATASoft" type="t" access="read"> | ||
| 286 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 287 | </property> | ||
| 288 | <property name="DefaultLimitSTACK" type="t" access="read"> | ||
| 289 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 290 | </property> | ||
| 291 | <property name="DefaultLimitSTACKSoft" type="t" access="read"> | ||
| 292 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 293 | </property> | ||
| 294 | <property name="DefaultLimitCORE" type="t" access="read"> | ||
| 295 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 296 | </property> | ||
| 297 | <property name="DefaultLimitCORESoft" type="t" access="read"> | ||
| 298 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 299 | </property> | ||
| 300 | <property name="DefaultLimitRSS" type="t" access="read"> | ||
| 301 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 302 | </property> | ||
| 303 | <property name="DefaultLimitRSSSoft" type="t" access="read"> | ||
| 304 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 305 | </property> | ||
| 306 | <property name="DefaultLimitNOFILE" type="t" access="read"> | ||
| 307 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 308 | </property> | ||
| 309 | <property name="DefaultLimitNOFILESoft" type="t" access="read"> | ||
| 310 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 311 | </property> | ||
| 312 | <property name="DefaultLimitAS" type="t" access="read"> | ||
| 313 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 314 | </property> | ||
| 315 | <property name="DefaultLimitASSoft" type="t" access="read"> | ||
| 316 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 317 | </property> | ||
| 318 | <property name="DefaultLimitNPROC" type="t" access="read"> | ||
| 319 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 320 | </property> | ||
| 321 | <property name="DefaultLimitNPROCSoft" type="t" access="read"> | ||
| 322 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 323 | </property> | ||
| 324 | <property name="DefaultLimitMEMLOCK" type="t" access="read"> | ||
| 325 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 326 | </property> | ||
| 327 | <property name="DefaultLimitMEMLOCKSoft" type="t" access="read"> | ||
| 328 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 329 | </property> | ||
| 330 | <property name="DefaultLimitLOCKS" type="t" access="read"> | ||
| 331 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 332 | </property> | ||
| 333 | <property name="DefaultLimitLOCKSSoft" type="t" access="read"> | ||
| 334 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 335 | </property> | ||
| 336 | <property name="DefaultLimitSIGPENDING" type="t" access="read"> | ||
| 337 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 338 | </property> | ||
| 339 | <property name="DefaultLimitSIGPENDINGSoft" type="t" access="read"> | ||
| 340 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 341 | </property> | ||
| 342 | <property name="DefaultLimitMSGQUEUE" type="t" access="read"> | ||
| 343 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 344 | </property> | ||
| 345 | <property name="DefaultLimitMSGQUEUESoft" type="t" access="read"> | ||
| 346 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 347 | </property> | ||
| 348 | <property name="DefaultLimitNICE" type="t" access="read"> | ||
| 349 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 350 | </property> | ||
| 351 | <property name="DefaultLimitNICESoft" type="t" access="read"> | ||
| 352 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 353 | </property> | ||
| 354 | <property name="DefaultLimitRTPRIO" type="t" access="read"> | ||
| 355 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 356 | </property> | ||
| 357 | <property name="DefaultLimitRTPRIOSoft" type="t" access="read"> | ||
| 358 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 359 | </property> | ||
| 360 | <property name="DefaultLimitRTTIME" type="t" access="read"> | ||
| 361 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 362 | </property> | ||
| 363 | <property name="DefaultLimitRTTIMESoft" type="t" access="read"> | ||
| 364 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 365 | </property> | ||
| 366 | <property name="DefaultTasksMax" type="t" access="read"> | ||
| 367 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 368 | </property> | ||
| 369 | <property name="DefaultMemoryPressureThresholdUSec" type="t" access="read"> | ||
| 370 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 371 | </property> | ||
| 372 | <property name="DefaultMemoryPressureWatch" type="s" access="read"> | ||
| 373 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 374 | </property> | ||
| 375 | <property name="TimerSlackNSec" type="t" access="read"> | ||
| 376 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 377 | </property> | ||
| 378 | <property name="DefaultOOMPolicy" type="s" access="read"> | ||
| 379 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 380 | </property> | ||
| 381 | <property name="DefaultOOMScoreAdjust" type="i" access="read"> | ||
| 382 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 383 | </property> | ||
| 384 | <property name="CtrlAltDelBurstAction" type="s" access="read"> | ||
| 385 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 386 | </property> | ||
| 387 | <property name="SoftRebootsCount" type="u" access="read"> | ||
| 388 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 389 | </property> | ||
| 390 | <method name="GetUnit"> | ||
| 391 | <arg type="s" name="name" direction="in"/> | ||
| 392 | <arg type="o" name="unit" direction="out"/> | ||
| 393 | </method> | ||
| 394 | <method name="GetUnitByPID"> | ||
| 395 | <arg type="u" name="pid" direction="in"/> | ||
| 396 | <arg type="o" name="unit" direction="out"/> | ||
| 397 | </method> | ||
| 398 | <method name="GetUnitByInvocationID"> | ||
| 399 | <arg type="ay" name="invocation_id" direction="in"/> | ||
| 400 | <arg type="o" name="unit" direction="out"/> | ||
| 401 | </method> | ||
| 402 | <method name="GetUnitByControlGroup"> | ||
| 403 | <arg type="s" name="cgroup" direction="in"/> | ||
| 404 | <arg type="o" name="unit" direction="out"/> | ||
| 405 | </method> | ||
| 406 | <method name="GetUnitByPIDFD"> | ||
| 407 | <arg type="h" name="pidfd" direction="in"/> | ||
| 408 | <arg type="o" name="unit" direction="out"/> | ||
| 409 | <arg type="s" name="unit_id" direction="out"/> | ||
| 410 | <arg type="ay" name="invocation_id" direction="out"/> | ||
| 411 | </method> | ||
| 412 | <method name="LoadUnit"> | ||
| 413 | <arg type="s" name="name" direction="in"/> | ||
| 414 | <arg type="o" name="unit" direction="out"/> | ||
| 415 | </method> | ||
| 416 | <method name="StartUnit"> | ||
| 417 | <arg type="s" name="name" direction="in"/> | ||
| 418 | <arg type="s" name="mode" direction="in"/> | ||
| 419 | <arg type="o" name="job" direction="out"/> | ||
| 420 | </method> | ||
| 421 | <method name="StartUnitWithFlags"> | ||
| 422 | <arg type="s" name="name" direction="in"/> | ||
| 423 | <arg type="s" name="mode" direction="in"/> | ||
| 424 | <arg type="t" name="flags" direction="in"/> | ||
| 425 | <arg type="o" name="job" direction="out"/> | ||
| 426 | </method> | ||
| 427 | <method name="StartUnitReplace"> | ||
| 428 | <arg type="s" name="old_unit" direction="in"/> | ||
| 429 | <arg type="s" name="new_unit" direction="in"/> | ||
| 430 | <arg type="s" name="mode" direction="in"/> | ||
| 431 | <arg type="o" name="job" direction="out"/> | ||
| 432 | </method> | ||
| 433 | <method name="StopUnit"> | ||
| 434 | <arg type="s" name="name" direction="in"/> | ||
| 435 | <arg type="s" name="mode" direction="in"/> | ||
| 436 | <arg type="o" name="job" direction="out"/> | ||
| 437 | </method> | ||
| 438 | <method name="ReloadUnit"> | ||
| 439 | <arg type="s" name="name" direction="in"/> | ||
| 440 | <arg type="s" name="mode" direction="in"/> | ||
| 441 | <arg type="o" name="job" direction="out"/> | ||
| 442 | </method> | ||
| 443 | <method name="RestartUnit"> | ||
| 444 | <arg type="s" name="name" direction="in"/> | ||
| 445 | <arg type="s" name="mode" direction="in"/> | ||
| 446 | <arg type="o" name="job" direction="out"/> | ||
| 447 | </method> | ||
| 448 | <method name="TryRestartUnit"> | ||
| 449 | <arg type="s" name="name" direction="in"/> | ||
| 450 | <arg type="s" name="mode" direction="in"/> | ||
| 451 | <arg type="o" name="job" direction="out"/> | ||
| 452 | </method> | ||
| 453 | <method name="ReloadOrRestartUnit"> | ||
| 454 | <arg type="s" name="name" direction="in"/> | ||
| 455 | <arg type="s" name="mode" direction="in"/> | ||
| 456 | <arg type="o" name="job" direction="out"/> | ||
| 457 | </method> | ||
| 458 | <method name="ReloadOrTryRestartUnit"> | ||
| 459 | <arg type="s" name="name" direction="in"/> | ||
| 460 | <arg type="s" name="mode" direction="in"/> | ||
| 461 | <arg type="o" name="job" direction="out"/> | ||
| 462 | </method> | ||
| 463 | <!-- <method name="EnqueueUnitJob"> --> | ||
| 464 | <!-- <arg type="s" name="name" direction="in"/> --> | ||
| 465 | <!-- <arg type="s" name="job_type" direction="in"/> --> | ||
| 466 | <!-- <arg type="s" name="job_mode" direction="in"/> --> | ||
| 467 | <!-- <arg type="u" name="job_id" direction="out"/> --> | ||
| 468 | <!-- <arg type="o" name="job_path" direction="out"/> --> | ||
| 469 | <!-- <arg type="s" name="unit_id" direction="out"/> --> | ||
| 470 | <!-- <arg type="o" name="unit_path" direction="out"/> --> | ||
| 471 | <!-- <arg type="s" name="job_type" direction="out"/> --> | ||
| 472 | <!-- <arg type="a(uosos)" name="affected_jobs" direction="out"/> --> | ||
| 473 | <!-- </method> --> | ||
| 474 | <method name="KillUnit"> | ||
| 475 | <arg type="s" name="name" direction="in"/> | ||
| 476 | <arg type="s" name="whom" direction="in"/> | ||
| 477 | <arg type="i" name="signal" direction="in"/> | ||
| 478 | </method> | ||
| 479 | <method name="QueueSignalUnit"> | ||
| 480 | <arg type="s" name="name" direction="in"/> | ||
| 481 | <arg type="s" name="whom" direction="in"/> | ||
| 482 | <arg type="i" name="signal" direction="in"/> | ||
| 483 | <arg type="i" name="value" direction="in"/> | ||
| 484 | </method> | ||
| 485 | <method name="CleanUnit"> | ||
| 486 | <arg type="s" name="name" direction="in"/> | ||
| 487 | <arg type="as" name="mask" direction="in"/> | ||
| 488 | </method> | ||
| 489 | <method name="FreezeUnit"> | ||
| 490 | <arg type="s" name="name" direction="in"/> | ||
| 491 | </method> | ||
| 492 | <method name="ThawUnit"> | ||
| 493 | <arg type="s" name="name" direction="in"/> | ||
| 494 | </method> | ||
| 495 | <method name="ResetFailedUnit"> | ||
| 496 | <arg type="s" name="name" direction="in"/> | ||
| 497 | </method> | ||
| 498 | <!-- <method name="SetUnitProperties"> --> | ||
| 499 | <!-- <arg type="s" name="name" direction="in"/> --> | ||
| 500 | <!-- <arg type="b" name="runtime" direction="in"/> --> | ||
| 501 | <!-- <arg type="a(sv)" name="properties" direction="in"/> --> | ||
| 502 | <!-- </method> --> | ||
| 503 | <method name="BindMountUnit"> | ||
| 504 | <arg type="s" name="name" direction="in"/> | ||
| 505 | <arg type="s" name="source" direction="in"/> | ||
| 506 | <arg type="s" name="destination" direction="in"/> | ||
| 507 | <arg type="b" name="read_only" direction="in"/> | ||
| 508 | <arg type="b" name="mkdir" direction="in"/> | ||
| 509 | </method> | ||
| 510 | <!-- <method name="MountImageUnit"> --> | ||
| 511 | <!-- <arg type="s" name="name" direction="in"/> --> | ||
| 512 | <!-- <arg type="s" name="source" direction="in"/> --> | ||
| 513 | <!-- <arg type="s" name="destination" direction="in"/> --> | ||
| 514 | <!-- <arg type="b" name="read_only" direction="in"/> --> | ||
| 515 | <!-- <arg type="b" name="mkdir" direction="in"/> --> | ||
| 516 | <!-- <arg type="a(ss)" name="options" direction="in"/> --> | ||
| 517 | <!-- </method> --> | ||
| 518 | <method name="RefUnit"> | ||
| 519 | <arg type="s" name="name" direction="in"/> | ||
| 520 | </method> | ||
| 521 | <method name="UnrefUnit"> | ||
| 522 | <arg type="s" name="name" direction="in"/> | ||
| 523 | </method> | ||
| 524 | <!-- <method name="StartTransientUnit"> --> | ||
| 525 | <!-- <arg type="s" name="name" direction="in"/> --> | ||
| 526 | <!-- <arg type="s" name="mode" direction="in"/> --> | ||
| 527 | <!-- <arg type="a(sv)" name="properties" direction="in"/> --> | ||
| 528 | <!-- <arg type="a(sa(sv))" name="aux" direction="in"/> --> | ||
| 529 | <!-- <arg type="o" name="job" direction="out"/> --> | ||
| 530 | <!-- </method> --> | ||
| 531 | <!-- <method name="GetUnitProcesses"> --> | ||
| 532 | <!-- <arg type="s" name="name" direction="in"/> --> | ||
| 533 | <!-- <arg type="a(sus)" name="processes" direction="out"/> --> | ||
| 534 | <!-- </method> --> | ||
| 535 | <!-- <method name="AttachProcessesToUnit"> --> | ||
| 536 | <!-- <arg type="s" name="unit_name" direction="in"/> --> | ||
| 537 | <!-- <arg type="s" name="subcgroup" direction="in"/> --> | ||
| 538 | <!-- <arg type="au" name="pids" direction="in"/> --> | ||
| 539 | <!-- </method> --> | ||
| 540 | <method name="AbandonScope"> | ||
| 541 | <arg type="s" name="name" direction="in"/> | ||
| 542 | </method> | ||
| 543 | <method name="GetJob"> | ||
| 544 | <arg type="u" name="id" direction="in"/> | ||
| 545 | <arg type="o" name="job" direction="out"/> | ||
| 546 | </method> | ||
| 547 | <!-- <method name="GetJobAfter"> --> | ||
| 548 | <!-- <arg type="u" name="id" direction="in"/> --> | ||
| 549 | <!-- <arg type="a(usssoo)" name="jobs" direction="out"/> --> | ||
| 550 | <!-- </method> --> | ||
| 551 | <!-- <method name="GetJobBefore"> --> | ||
| 552 | <!-- <arg type="u" name="id" direction="in"/> --> | ||
| 553 | <!-- <arg type="a(usssoo)" name="jobs" direction="out"/> --> | ||
| 554 | <!-- </method> --> | ||
| 555 | <method name="CancelJob"> | ||
| 556 | <arg type="u" name="id" direction="in"/> | ||
| 557 | </method> | ||
| 558 | <method name="ClearJobs"> | ||
| 559 | </method> | ||
| 560 | <method name="ResetFailed"> | ||
| 561 | </method> | ||
| 562 | <method name="SetShowStatus"> | ||
| 563 | <arg type="s" name="mode" direction="in"/> | ||
| 564 | </method> | ||
| 565 | <method name="ListUnits"> | ||
| 566 | <arg type="a(ssssssouso)" name="units" direction="out"/> | ||
| 567 | <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="ListUnitsResult"/> | ||
| 568 | </method> | ||
| 569 | <method name="ListUnitsFiltered"> | ||
| 570 | <arg type="as" name="states" direction="in"/> | ||
| 571 | <arg type="a(ssssssouso)" name="units" direction="out"/> | ||
| 572 | <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="ListUnitsResult"/> | ||
| 573 | </method> | ||
| 574 | <method name="ListUnitsByPatterns"> | ||
| 575 | <arg type="as" name="states" direction="in"/> | ||
| 576 | <arg type="as" name="patterns" direction="in"/> | ||
| 577 | <arg type="a(ssssssouso)" name="units" direction="out"/> | ||
| 578 | <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="ListUnitsResult"/> | ||
| 579 | </method> | ||
| 580 | <method name="ListUnitsByNames"> | ||
| 581 | <arg type="as" name="names" direction="in"/> | ||
| 582 | <arg type="a(ssssssouso)" name="units" direction="out"/> | ||
| 583 | <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="ListUnitsResult"/> | ||
| 584 | </method> | ||
| 585 | <!-- <method name="ListJobs"> --> | ||
| 586 | <!-- <arg type="a(usssoo)" name="jobs" direction="out"/> --> | ||
| 587 | <!-- </method> --> | ||
| 588 | <method name="Subscribe"> | ||
| 589 | </method> | ||
| 590 | <method name="Unsubscribe"> | ||
| 591 | </method> | ||
| 592 | <method name="Dump"> | ||
| 593 | <arg type="s" name="output" direction="out"/> | ||
| 594 | </method> | ||
| 595 | <method name="DumpUnitsMatchingPatterns"> | ||
| 596 | <arg type="as" name="patterns" direction="in"/> | ||
| 597 | <arg type="s" name="output" direction="out"/> | ||
| 598 | </method> | ||
| 599 | <method name="DumpByFileDescriptor"> | ||
| 600 | <arg type="h" name="fd" direction="out"/> | ||
| 601 | </method> | ||
| 602 | <method name="DumpUnitsMatchingPatternsByFileDescriptor"> | ||
| 603 | <arg type="as" name="patterns" direction="in"/> | ||
| 604 | <arg type="h" name="fd" direction="out"/> | ||
| 605 | </method> | ||
| 606 | <method name="Reload"> | ||
| 607 | </method> | ||
| 608 | <method name="Reexecute"> | ||
| 609 | <annotation name="org.freedesktop.DBus.Method.NoReply" value="true"/> | ||
| 610 | </method> | ||
| 611 | <method name="Exit"> | ||
| 612 | <annotation name="org.freedesktop.systemd1.Privileged" value="true"/> | ||
| 613 | </method> | ||
| 614 | <method name="Reboot"> | ||
| 615 | <annotation name="org.freedesktop.systemd1.Privileged" value="true"/> | ||
| 616 | </method> | ||
| 617 | <method name="SoftReboot"> | ||
| 618 | <arg type="s" name="new_root" direction="in"/> | ||
| 619 | <annotation name="org.freedesktop.systemd1.Privileged" value="true"/> | ||
| 620 | </method> | ||
| 621 | <method name="PowerOff"> | ||
| 622 | <annotation name="org.freedesktop.systemd1.Privileged" value="true"/> | ||
| 623 | </method> | ||
| 624 | <method name="Halt"> | ||
| 625 | <annotation name="org.freedesktop.systemd1.Privileged" value="true"/> | ||
| 626 | </method> | ||
| 627 | <method name="KExec"> | ||
| 628 | <annotation name="org.freedesktop.systemd1.Privileged" value="true"/> | ||
| 629 | </method> | ||
| 630 | <method name="SwitchRoot"> | ||
| 631 | <arg type="s" name="new_root" direction="in"/> | ||
| 632 | <arg type="s" name="init" direction="in"/> | ||
| 633 | <annotation name="org.freedesktop.systemd1.Privileged" value="true"/> | ||
| 634 | </method> | ||
| 635 | <method name="SetEnvironment"> | ||
| 636 | <arg type="as" name="assignments" direction="in"/> | ||
| 637 | </method> | ||
| 638 | <method name="UnsetEnvironment"> | ||
| 639 | <arg type="as" name="names" direction="in"/> | ||
| 640 | </method> | ||
| 641 | <method name="UnsetAndSetEnvironment"> | ||
| 642 | <arg type="as" name="names" direction="in"/> | ||
| 643 | <arg type="as" name="assignments" direction="in"/> | ||
| 644 | </method> | ||
| 645 | <method name="EnqueueMarkedJobs"> | ||
| 646 | <arg type="ao" name="jobs" direction="out"/> | ||
| 647 | </method> | ||
| 648 | <!-- <method name="ListUnitFiles"> --> | ||
| 649 | <!-- <arg type="a(ss)" name="unit_files" direction="out"/> --> | ||
| 650 | <!-- </method> --> | ||
| 651 | <!-- <method name="ListUnitFilesByPatterns"> --> | ||
| 652 | <!-- <arg type="as" name="states" direction="in"/> --> | ||
| 653 | <!-- <arg type="as" name="patterns" direction="in"/> --> | ||
| 654 | <!-- <arg type="a(ss)" name="unit_files" direction="out"/> --> | ||
| 655 | <!-- </method> --> | ||
| 656 | <method name="GetUnitFileState"> | ||
| 657 | <arg type="s" name="file" direction="in"/> | ||
| 658 | <arg type="s" name="state" direction="out"/> | ||
| 659 | </method> | ||
| 660 | <!-- <method name="EnableUnitFiles"> --> | ||
| 661 | <!-- <arg type="as" name="files" direction="in"/> --> | ||
| 662 | <!-- <arg type="b" name="runtime" direction="in"/> --> | ||
| 663 | <!-- <arg type="b" name="force" direction="in"/> --> | ||
| 664 | <!-- <arg type="b" name="carries_install_info" direction="out"/> --> | ||
| 665 | <!-- <arg type="a(sss)" name="changes" direction="out"/> --> | ||
| 666 | <!-- </method> --> | ||
| 667 | <!-- <method name="DisableUnitFiles"> --> | ||
| 668 | <!-- <arg type="as" name="files" direction="in"/> --> | ||
| 669 | <!-- <arg type="b" name="runtime" direction="in"/> --> | ||
| 670 | <!-- <arg type="a(sss)" name="changes" direction="out"/> --> | ||
| 671 | <!-- </method> --> | ||
| 672 | <!-- <method name="EnableUnitFilesWithFlags"> --> | ||
| 673 | <!-- <arg type="as" name="files" direction="in"/> --> | ||
| 674 | <!-- <arg type="t" name="flags" direction="in"/> --> | ||
| 675 | <!-- <arg type="b" name="carries_install_info" direction="out"/> --> | ||
| 676 | <!-- <arg type="a(sss)" name="changes" direction="out"/> --> | ||
| 677 | <!-- </method> --> | ||
| 678 | <!-- <method name="DisableUnitFilesWithFlags"> --> | ||
| 679 | <!-- <arg type="as" name="files" direction="in"/> --> | ||
| 680 | <!-- <arg type="t" name="flags" direction="in"/> --> | ||
| 681 | <!-- <arg type="a(sss)" name="changes" direction="out"/> --> | ||
| 682 | <!-- </method> --> | ||
| 683 | <!-- <method name="DisableUnitFilesWithFlagsAndInstallInfo"> --> | ||
| 684 | <!-- <arg type="as" name="files" direction="in"/> --> | ||
| 685 | <!-- <arg type="t" name="flags" direction="in"/> --> | ||
| 686 | <!-- <arg type="b" name="carries_install_info" direction="out"/> --> | ||
| 687 | <!-- <arg type="a(sss)" name="changes" direction="out"/> --> | ||
| 688 | <!-- </method> --> | ||
| 689 | <!-- <method name="ReenableUnitFiles"> --> | ||
| 690 | <!-- <arg type="as" name="files" direction="in"/> --> | ||
| 691 | <!-- <arg type="b" name="runtime" direction="in"/> --> | ||
| 692 | <!-- <arg type="b" name="force" direction="in"/> --> | ||
| 693 | <!-- <arg type="b" name="carries_install_info" direction="out"/> --> | ||
| 694 | <!-- <arg type="a(sss)" name="changes" direction="out"/> --> | ||
| 695 | <!-- </method> --> | ||
| 696 | <!-- <method name="LinkUnitFiles"> --> | ||
| 697 | <!-- <arg type="as" name="files" direction="in"/> --> | ||
| 698 | <!-- <arg type="b" name="runtime" direction="in"/> --> | ||
| 699 | <!-- <arg type="b" name="force" direction="in"/> --> | ||
| 700 | <!-- <arg type="a(sss)" name="changes" direction="out"/> --> | ||
| 701 | <!-- </method> --> | ||
| 702 | <!-- <method name="PresetUnitFiles"> --> | ||
| 703 | <!-- <arg type="as" name="files" direction="in"/> --> | ||
| 704 | <!-- <arg type="b" name="runtime" direction="in"/> --> | ||
| 705 | <!-- <arg type="b" name="force" direction="in"/> --> | ||
| 706 | <!-- <arg type="b" name="carries_install_info" direction="out"/> --> | ||
| 707 | <!-- <arg type="a(sss)" name="changes" direction="out"/> --> | ||
| 708 | <!-- </method> --> | ||
| 709 | <!-- <method name="PresetUnitFilesWithMode"> --> | ||
| 710 | <!-- <arg type="as" name="files" direction="in"/> --> | ||
| 711 | <!-- <arg type="s" name="mode" direction="in"/> --> | ||
| 712 | <!-- <arg type="b" name="runtime" direction="in"/> --> | ||
| 713 | <!-- <arg type="b" name="force" direction="in"/> --> | ||
| 714 | <!-- <arg type="b" name="carries_install_info" direction="out"/> --> | ||
| 715 | <!-- <arg type="a(sss)" name="changes" direction="out"/> --> | ||
| 716 | <!-- </method> --> | ||
| 717 | <!-- <method name="MaskUnitFiles"> --> | ||
| 718 | <!-- <arg type="as" name="files" direction="in"/> --> | ||
| 719 | <!-- <arg type="b" name="runtime" direction="in"/> --> | ||
| 720 | <!-- <arg type="b" name="force" direction="in"/> --> | ||
| 721 | <!-- <arg type="a(sss)" name="changes" direction="out"/> --> | ||
| 722 | <!-- </method> --> | ||
| 723 | <!-- <method name="UnmaskUnitFiles"> --> | ||
| 724 | <!-- <arg type="as" name="files" direction="in"/> --> | ||
| 725 | <!-- <arg type="b" name="runtime" direction="in"/> --> | ||
| 726 | <!-- <arg type="a(sss)" name="changes" direction="out"/> --> | ||
| 727 | <!-- </method> --> | ||
| 728 | <!-- <method name="RevertUnitFiles"> --> | ||
| 729 | <!-- <arg type="as" name="files" direction="in"/> --> | ||
| 730 | <!-- <arg type="a(sss)" name="changes" direction="out"/> --> | ||
| 731 | <!-- </method> --> | ||
| 732 | <!-- <method name="SetDefaultTarget"> --> | ||
| 733 | <!-- <arg type="s" name="name" direction="in"/> --> | ||
| 734 | <!-- <arg type="b" name="force" direction="in"/> --> | ||
| 735 | <!-- <arg type="a(sss)" name="changes" direction="out"/> --> | ||
| 736 | <!-- </method> --> | ||
| 737 | <method name="GetDefaultTarget"> | ||
| 738 | <arg type="s" name="name" direction="out"/> | ||
| 739 | </method> | ||
| 740 | <!-- <method name="PresetAllUnitFiles"> --> | ||
| 741 | <!-- <arg type="s" name="mode" direction="in"/> --> | ||
| 742 | <!-- <arg type="b" name="runtime" direction="in"/> --> | ||
| 743 | <!-- <arg type="b" name="force" direction="in"/> --> | ||
| 744 | <!-- <arg type="a(sss)" name="changes" direction="out"/> --> | ||
| 745 | <!-- </method> --> | ||
| 746 | <!-- <method name="AddDependencyUnitFiles"> --> | ||
| 747 | <!-- <arg type="as" name="files" direction="in"/> --> | ||
| 748 | <!-- <arg type="s" name="target" direction="in"/> --> | ||
| 749 | <!-- <arg type="s" name="type" direction="in"/> --> | ||
| 750 | <!-- <arg type="b" name="runtime" direction="in"/> --> | ||
| 751 | <!-- <arg type="b" name="force" direction="in"/> --> | ||
| 752 | <!-- <arg type="a(sss)" name="changes" direction="out"/> --> | ||
| 753 | <!-- </method> --> | ||
| 754 | <method name="GetUnitFileLinks"> | ||
| 755 | <arg type="s" name="name" direction="in"/> | ||
| 756 | <arg type="b" name="runtime" direction="in"/> | ||
| 757 | <arg type="as" name="links" direction="out"/> | ||
| 758 | </method> | ||
| 759 | <method name="SetExitCode"> | ||
| 760 | <arg type="y" name="number" direction="in"/> | ||
| 761 | </method> | ||
| 762 | <method name="LookupDynamicUserByName"> | ||
| 763 | <arg type="s" name="name" direction="in"/> | ||
| 764 | <arg type="u" name="uid" direction="out"/> | ||
| 765 | </method> | ||
| 766 | <method name="LookupDynamicUserByUID"> | ||
| 767 | <arg type="u" name="uid" direction="in"/> | ||
| 768 | <arg type="s" name="name" direction="out"/> | ||
| 769 | </method> | ||
| 770 | <!-- <method name="GetDynamicUsers"> --> | ||
| 771 | <!-- <arg type="a(us)" name="users" direction="out"/> --> | ||
| 772 | <!-- </method> --> | ||
| 773 | <!-- <method name="DumpUnitFileDescriptorStore"> --> | ||
| 774 | <!-- <arg type="s" name="name" direction="in"/> --> | ||
| 775 | <!-- <arg type="a(suuutuusu)" name="entries" direction="out"/> --> | ||
| 776 | <!-- </method> --> | ||
| 777 | <!-- <method name="StartAuxiliaryScope"> --> | ||
| 778 | <!-- <arg type="s" name="name" direction="in"/> --> | ||
| 779 | <!-- <arg type="ah" name="pidfds" direction="in"/> --> | ||
| 780 | <!-- <arg type="t" name="flags" direction="in"/> --> | ||
| 781 | <!-- <arg type="a(sv)" name="properties" direction="in"/> --> | ||
| 782 | <!-- <arg type="o" name="job" direction="out"/> --> | ||
| 783 | <!-- <annotation name="org.freedesktop.DBus.Deprecated" value="true"/> --> | ||
| 784 | <!-- </method> --> | ||
| 785 | <signal name="UnitNew"> | ||
| 786 | <arg type="s" name="id"/> | ||
| 787 | <arg type="o" name="unit"/> | ||
| 788 | </signal> | ||
| 789 | <signal name="UnitRemoved"> | ||
| 790 | <arg type="s" name="id"/> | ||
| 791 | <arg type="o" name="unit"/> | ||
| 792 | </signal> | ||
| 793 | <signal name="JobNew"> | ||
| 794 | <arg type="u" name="id"/> | ||
| 795 | <arg type="o" name="job"/> | ||
| 796 | <arg type="s" name="unit"/> | ||
| 797 | </signal> | ||
| 798 | <signal name="JobRemoved"> | ||
| 799 | <arg type="u" name="id"/> | ||
| 800 | <arg type="o" name="job"/> | ||
| 801 | <arg type="s" name="unit"/> | ||
| 802 | <arg type="s" name="result"/> | ||
| 803 | </signal> | ||
| 804 | <signal name="StartupFinished"> | ||
| 805 | <arg type="t" name="firmware"/> | ||
| 806 | <arg type="t" name="loader"/> | ||
| 807 | <arg type="t" name="kernel"/> | ||
| 808 | <arg type="t" name="initrd"/> | ||
| 809 | <arg type="t" name="userspace"/> | ||
| 810 | <arg type="t" name="total"/> | ||
| 811 | </signal> | ||
| 812 | <signal name="UnitFilesChanged"> | ||
| 813 | </signal> | ||
| 814 | <signal name="Reloading"> | ||
| 815 | <arg type="b" name="active"/> | ||
| 816 | </signal> | ||
| 817 | </interface> | ||
| 818 | <node name="unit"/> | ||
| 819 | <node name="job"/> | ||
| 820 | </node> | ||
| 821 | |||
diff --git a/accounts/gkleen@skadhi/shell/quickshell-plugins/org.freedesktop.systemd1.Service.xml b/accounts/gkleen@skadhi/shell/quickshell-plugins/org.freedesktop.systemd1.Service.xml new file mode 100644 index 00000000..316dd080 --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell-plugins/org.freedesktop.systemd1.Service.xml | |||
| @@ -0,0 +1,1100 @@ | |||
| 1 | <!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" | ||
| 2 | "https://www.freedesktop.org/standards/dbus/1.0/introspect.dtd"> | ||
| 3 | <node> | ||
| 4 | <interface name="org.freedesktop.systemd1.Service"> | ||
| 5 | <property name="Type" type="s" access="read"> | ||
| 6 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 7 | </property> | ||
| 8 | <property name="ExitType" type="s" access="read"> | ||
| 9 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 10 | </property> | ||
| 11 | <property name="Restart" type="s" access="read"> | ||
| 12 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 13 | </property> | ||
| 14 | <property name="RestartMode" type="s" access="read"> | ||
| 15 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 16 | </property> | ||
| 17 | <property name="PIDFile" type="s" access="read"> | ||
| 18 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 19 | </property> | ||
| 20 | <property name="NotifyAccess" type="s" access="read"> | ||
| 21 | </property> | ||
| 22 | <property name="RestartUSec" type="t" access="read"> | ||
| 23 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 24 | </property> | ||
| 25 | <property name="RestartSteps" type="u" access="read"> | ||
| 26 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 27 | </property> | ||
| 28 | <property name="RestartMaxDelayUSec" type="t" access="read"> | ||
| 29 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 30 | </property> | ||
| 31 | <property name="RestartUSecNext" type="t" access="read"> | ||
| 32 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 33 | </property> | ||
| 34 | <property name="TimeoutStartUSec" type="t" access="read"> | ||
| 35 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 36 | </property> | ||
| 37 | <property name="TimeoutStopUSec" type="t" access="read"> | ||
| 38 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 39 | </property> | ||
| 40 | <property name="TimeoutAbortUSec" type="t" access="read"> | ||
| 41 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 42 | </property> | ||
| 43 | <property name="TimeoutStartFailureMode" type="s" access="read"> | ||
| 44 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 45 | </property> | ||
| 46 | <property name="TimeoutStopFailureMode" type="s" access="read"> | ||
| 47 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 48 | </property> | ||
| 49 | <property name="RuntimeMaxUSec" type="t" access="read"> | ||
| 50 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 51 | </property> | ||
| 52 | <property name="RuntimeRandomizedExtraUSec" type="t" access="read"> | ||
| 53 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 54 | </property> | ||
| 55 | <property name="WatchdogUSec" type="t" access="read"> | ||
| 56 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 57 | </property> | ||
| 58 | <property name="WatchdogTimestamp" type="t" access="read"> | ||
| 59 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 60 | </property> | ||
| 61 | <property name="WatchdogTimestampMonotonic" type="t" access="read"> | ||
| 62 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 63 | </property> | ||
| 64 | <property name="RootDirectoryStartOnly" type="b" access="read"> | ||
| 65 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 66 | </property> | ||
| 67 | <property name="RemainAfterExit" type="b" access="read"> | ||
| 68 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 69 | </property> | ||
| 70 | <property name="GuessMainPID" type="b" access="read"> | ||
| 71 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 72 | </property> | ||
| 73 | <!-- <property name="RestartPreventExitStatus" type="(aiai)" access="read"> --> | ||
| 74 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> --> | ||
| 75 | <!-- </property> --> | ||
| 76 | <!-- <property name="RestartForceExitStatus" type="(aiai)" access="read"> --> | ||
| 77 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> --> | ||
| 78 | <!-- </property> --> | ||
| 79 | <!-- <property name="SuccessExitStatus" type="(aiai)" access="read"> --> | ||
| 80 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> --> | ||
| 81 | <!-- </property> --> | ||
| 82 | <property name="MainPID" type="u" access="read"> | ||
| 83 | </property> | ||
| 84 | <property name="ControlPID" type="u" access="read"> | ||
| 85 | </property> | ||
| 86 | <property name="BusName" type="s" access="read"> | ||
| 87 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 88 | </property> | ||
| 89 | <property name="FileDescriptorStoreMax" type="u" access="read"> | ||
| 90 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 91 | </property> | ||
| 92 | <property name="NFileDescriptorStore" type="u" access="read"> | ||
| 93 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 94 | </property> | ||
| 95 | <property name="FileDescriptorStorePreserve" type="s" access="read"> | ||
| 96 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 97 | </property> | ||
| 98 | <property name="StatusText" type="s" access="read"> | ||
| 99 | </property> | ||
| 100 | <property name="StatusErrno" type="i" access="read"> | ||
| 101 | </property> | ||
| 102 | <property name="StatusBusError" type="s" access="read"> | ||
| 103 | </property> | ||
| 104 | <property name="StatusVarlinkError" type="s" access="read"> | ||
| 105 | </property> | ||
| 106 | <property name="Result" type="s" access="read"> | ||
| 107 | </property> | ||
| 108 | <property name="ReloadResult" type="s" access="read"> | ||
| 109 | </property> | ||
| 110 | <property name="CleanResult" type="s" access="read"> | ||
| 111 | </property> | ||
| 112 | <property name="LiveMountResult" type="s" access="read"> | ||
| 113 | </property> | ||
| 114 | <property name="USBFunctionDescriptors" type="s" access="read"> | ||
| 115 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 116 | </property> | ||
| 117 | <property name="USBFunctionStrings" type="s" access="read"> | ||
| 118 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 119 | </property> | ||
| 120 | <property name="UID" type="u" access="read"> | ||
| 121 | </property> | ||
| 122 | <property name="GID" type="u" access="read"> | ||
| 123 | </property> | ||
| 124 | <property name="NRestarts" type="u" access="read"> | ||
| 125 | </property> | ||
| 126 | <property name="OOMPolicy" type="s" access="read"> | ||
| 127 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 128 | </property> | ||
| 129 | <!-- <property name="OpenFile" type="a(sst)" access="read"> --> | ||
| 130 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> --> | ||
| 131 | <!-- </property> --> | ||
| 132 | <property name="ExtraFileDescriptorNames" type="as" access="read"> | ||
| 133 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 134 | </property> | ||
| 135 | <property name="ReloadSignal" type="i" access="read"> | ||
| 136 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 137 | </property> | ||
| 138 | <property name="RefreshOnReload" type="as" access="read"> | ||
| 139 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 140 | </property> | ||
| 141 | <property name="ExecMainStartTimestamp" type="t" access="read"> | ||
| 142 | </property> | ||
| 143 | <property name="ExecMainStartTimestampMonotonic" type="t" access="read"> | ||
| 144 | </property> | ||
| 145 | <property name="ExecMainExitTimestamp" type="t" access="read"> | ||
| 146 | </property> | ||
| 147 | <property name="ExecMainExitTimestampMonotonic" type="t" access="read"> | ||
| 148 | </property> | ||
| 149 | <property name="ExecMainHandoffTimestamp" type="t" access="read"> | ||
| 150 | </property> | ||
| 151 | <property name="ExecMainHandoffTimestampMonotonic" type="t" access="read"> | ||
| 152 | </property> | ||
| 153 | <property name="ExecMainPID" type="u" access="read"> | ||
| 154 | </property> | ||
| 155 | <property name="ExecMainCode" type="i" access="read"> | ||
| 156 | </property> | ||
| 157 | <property name="ExecMainStatus" type="i" access="read"> | ||
| 158 | </property> | ||
| 159 | <!-- <property name="ExecCondition" type="a(sasbttttuii)" access="read"> --> | ||
| 160 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="invalidates"/> --> | ||
| 161 | <!-- </property> --> | ||
| 162 | <!-- <property name="ExecConditionEx" type="a(sasasttttuii)" access="read"> --> | ||
| 163 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="invalidates"/> --> | ||
| 164 | <!-- </property> --> | ||
| 165 | <!-- <property name="ExecStartPre" type="a(sasbttttuii)" access="read"> --> | ||
| 166 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="invalidates"/> --> | ||
| 167 | <!-- </property> --> | ||
| 168 | <!-- <property name="ExecStartPreEx" type="a(sasasttttuii)" access="read"> --> | ||
| 169 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="invalidates"/> --> | ||
| 170 | <!-- </property> --> | ||
| 171 | <!-- <property name="ExecStart" type="a(sasbttttuii)" access="read"> --> | ||
| 172 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="invalidates"/> --> | ||
| 173 | <!-- </property> --> | ||
| 174 | <!-- <property name="ExecStartEx" type="a(sasasttttuii)" access="read"> --> | ||
| 175 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="invalidates"/> --> | ||
| 176 | <!-- </property> --> | ||
| 177 | <!-- <property name="ExecStartPost" type="a(sasbttttuii)" access="read"> --> | ||
| 178 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="invalidates"/> --> | ||
| 179 | <!-- </property> --> | ||
| 180 | <!-- <property name="ExecStartPostEx" type="a(sasasttttuii)" access="read"> --> | ||
| 181 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="invalidates"/> --> | ||
| 182 | <!-- </property> --> | ||
| 183 | <!-- <property name="ExecReload" type="a(sasbttttuii)" access="read"> --> | ||
| 184 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="invalidates"/> --> | ||
| 185 | <!-- </property> --> | ||
| 186 | <!-- <property name="ExecReloadEx" type="a(sasasttttuii)" access="read"> --> | ||
| 187 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="invalidates"/> --> | ||
| 188 | <!-- </property> --> | ||
| 189 | <!-- <property name="ExecReloadPost" type="a(sasbttttuii)" access="read"> --> | ||
| 190 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="invalidates"/> --> | ||
| 191 | <!-- </property> --> | ||
| 192 | <!-- <property name="ExecReloadPostEx" type="a(sasasttttuii)" access="read"> --> | ||
| 193 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="invalidates"/> --> | ||
| 194 | <!-- </property> --> | ||
| 195 | <!-- <property name="ExecStop" type="a(sasbttttuii)" access="read"> --> | ||
| 196 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="invalidates"/> --> | ||
| 197 | <!-- </property> --> | ||
| 198 | <!-- <property name="ExecStopEx" type="a(sasasttttuii)" access="read"> --> | ||
| 199 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="invalidates"/> --> | ||
| 200 | <!-- </property> --> | ||
| 201 | <!-- <property name="ExecStopPost" type="a(sasbttttuii)" access="read"> --> | ||
| 202 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="invalidates"/> --> | ||
| 203 | <!-- </property> --> | ||
| 204 | <!-- <property name="ExecStopPostEx" type="a(sasasttttuii)" access="read"> --> | ||
| 205 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="invalidates"/> --> | ||
| 206 | <!-- </property> --> | ||
| 207 | <method name="BindMount"> | ||
| 208 | <arg type="s" name="source" direction="in"/> | ||
| 209 | <arg type="s" name="destination" direction="in"/> | ||
| 210 | <arg type="b" name="read_only" direction="in"/> | ||
| 211 | <arg type="b" name="mkdir" direction="in"/> | ||
| 212 | </method> | ||
| 213 | <!-- <method name="MountImage"> --> | ||
| 214 | <!-- <arg type="s" name="source" direction="in"/> --> | ||
| 215 | <!-- <arg type="s" name="destination" direction="in"/> --> | ||
| 216 | <!-- <arg type="b" name="read_only" direction="in"/> --> | ||
| 217 | <!-- <arg type="b" name="mkdir" direction="in"/> --> | ||
| 218 | <!-- <arg type="a(ss)" name="options" direction="in"/> --> | ||
| 219 | <!-- </method> --> | ||
| 220 | <!-- <method name="DumpFileDescriptorStore"> --> | ||
| 221 | <!-- <arg type="a(suuutuusu)" name="entries" direction="out"/> --> | ||
| 222 | <!-- </method> --> | ||
| 223 | <property name="Slice" type="s" access="read"> | ||
| 224 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 225 | </property> | ||
| 226 | <property name="ControlGroup" type="s" access="read"> | ||
| 227 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 228 | </property> | ||
| 229 | <property name="ControlGroupId" type="t" access="read"> | ||
| 230 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 231 | </property> | ||
| 232 | <property name="MemoryCurrent" type="t" access="read"> | ||
| 233 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 234 | </property> | ||
| 235 | <property name="MemoryPeak" type="t" access="read"> | ||
| 236 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 237 | </property> | ||
| 238 | <property name="MemorySwapCurrent" type="t" access="read"> | ||
| 239 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 240 | </property> | ||
| 241 | <property name="MemorySwapPeak" type="t" access="read"> | ||
| 242 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 243 | </property> | ||
| 244 | <property name="MemoryZSwapCurrent" type="t" access="read"> | ||
| 245 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 246 | </property> | ||
| 247 | <property name="MemoryAvailable" type="t" access="read"> | ||
| 248 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 249 | </property> | ||
| 250 | <property name="EffectiveMemoryMax" type="t" access="read"> | ||
| 251 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 252 | </property> | ||
| 253 | <property name="EffectiveMemoryHigh" type="t" access="read"> | ||
| 254 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 255 | </property> | ||
| 256 | <property name="CPUUsageNSec" type="t" access="read"> | ||
| 257 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 258 | </property> | ||
| 259 | <property name="EffectiveCPUs" type="ay" access="read"> | ||
| 260 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 261 | </property> | ||
| 262 | <property name="EffectiveMemoryNodes" type="ay" access="read"> | ||
| 263 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 264 | </property> | ||
| 265 | <property name="TasksCurrent" type="t" access="read"> | ||
| 266 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 267 | </property> | ||
| 268 | <property name="EffectiveTasksMax" type="t" access="read"> | ||
| 269 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 270 | </property> | ||
| 271 | <property name="IPIngressBytes" type="t" access="read"> | ||
| 272 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 273 | </property> | ||
| 274 | <property name="IPIngressPackets" type="t" access="read"> | ||
| 275 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 276 | </property> | ||
| 277 | <property name="IPEgressBytes" type="t" access="read"> | ||
| 278 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 279 | </property> | ||
| 280 | <property name="IPEgressPackets" type="t" access="read"> | ||
| 281 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 282 | </property> | ||
| 283 | <property name="IOReadBytes" type="t" access="read"> | ||
| 284 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 285 | </property> | ||
| 286 | <property name="IOReadOperations" type="t" access="read"> | ||
| 287 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 288 | </property> | ||
| 289 | <property name="IOWriteBytes" type="t" access="read"> | ||
| 290 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 291 | </property> | ||
| 292 | <property name="IOWriteOperations" type="t" access="read"> | ||
| 293 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 294 | </property> | ||
| 295 | <property name="OOMKills" type="t" access="read"> | ||
| 296 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 297 | </property> | ||
| 298 | <property name="ManagedOOMKills" type="t" access="read"> | ||
| 299 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 300 | </property> | ||
| 301 | <!-- <method name="GetProcesses"> --> | ||
| 302 | <!-- <arg type="a(sus)" name="processes" direction="out"/> --> | ||
| 303 | <!-- </method> --> | ||
| 304 | <!-- <method name="AttachProcesses"> --> | ||
| 305 | <!-- <arg type="s" name="subcgroup" direction="in"/> --> | ||
| 306 | <!-- <arg type="au" name="pids" direction="in"/> --> | ||
| 307 | <!-- </method> --> | ||
| 308 | <method name="RemoveSubgroup"> | ||
| 309 | <arg type="s" name="subcgroup" direction="in"/> | ||
| 310 | <arg type="t" name="flags" direction="in"/> | ||
| 311 | </method> | ||
| 312 | <property name="Delegate" type="b" access="read"> | ||
| 313 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 314 | </property> | ||
| 315 | <property name="DelegateControllers" type="as" access="read"> | ||
| 316 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 317 | </property> | ||
| 318 | <property name="DelegateSubgroup" type="s" access="read"> | ||
| 319 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 320 | </property> | ||
| 321 | <property name="CPUWeight" type="t" access="read"> | ||
| 322 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 323 | </property> | ||
| 324 | <property name="StartupCPUWeight" type="t" access="read"> | ||
| 325 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 326 | </property> | ||
| 327 | <property name="CPUQuotaPerSecUSec" type="t" access="read"> | ||
| 328 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 329 | </property> | ||
| 330 | <property name="CPUQuotaPeriodUSec" type="t" access="read"> | ||
| 331 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 332 | </property> | ||
| 333 | <property name="AllowedCPUs" type="ay" access="read"> | ||
| 334 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 335 | </property> | ||
| 336 | <property name="StartupAllowedCPUs" type="ay" access="read"> | ||
| 337 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 338 | </property> | ||
| 339 | <property name="AllowedMemoryNodes" type="ay" access="read"> | ||
| 340 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 341 | </property> | ||
| 342 | <property name="StartupAllowedMemoryNodes" type="ay" access="read"> | ||
| 343 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 344 | </property> | ||
| 345 | <property name="IOAccounting" type="b" access="read"> | ||
| 346 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 347 | </property> | ||
| 348 | <property name="IOWeight" type="t" access="read"> | ||
| 349 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 350 | </property> | ||
| 351 | <property name="StartupIOWeight" type="t" access="read"> | ||
| 352 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 353 | </property> | ||
| 354 | <!-- <property name="IODeviceWeight" type="a(st)" access="read"> --> | ||
| 355 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> --> | ||
| 356 | <!-- </property> --> | ||
| 357 | <!-- <property name="IOReadBandwidthMax" type="a(st)" access="read"> --> | ||
| 358 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> --> | ||
| 359 | <!-- </property> --> | ||
| 360 | <!-- <property name="IOWriteBandwidthMax" type="a(st)" access="read"> --> | ||
| 361 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> --> | ||
| 362 | <!-- </property> --> | ||
| 363 | <!-- <property name="IOReadIOPSMax" type="a(st)" access="read"> --> | ||
| 364 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> --> | ||
| 365 | <!-- </property> --> | ||
| 366 | <!-- <property name="IOWriteIOPSMax" type="a(st)" access="read"> --> | ||
| 367 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> --> | ||
| 368 | <!-- </property> --> | ||
| 369 | <!-- <property name="IODeviceLatencyTargetUSec" type="a(st)" access="read"> --> | ||
| 370 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> --> | ||
| 371 | <!-- </property> --> | ||
| 372 | <property name="MemoryAccounting" type="b" access="read"> | ||
| 373 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 374 | </property> | ||
| 375 | <property name="MemoryMin" type="t" access="read"> | ||
| 376 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 377 | </property> | ||
| 378 | <property name="MemoryLow" type="t" access="read"> | ||
| 379 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 380 | </property> | ||
| 381 | <property name="StartupMemoryLow" type="t" access="read"> | ||
| 382 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 383 | </property> | ||
| 384 | <property name="MemoryHigh" type="t" access="read"> | ||
| 385 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 386 | </property> | ||
| 387 | <property name="StartupMemoryHigh" type="t" access="read"> | ||
| 388 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 389 | </property> | ||
| 390 | <property name="MemoryMax" type="t" access="read"> | ||
| 391 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 392 | </property> | ||
| 393 | <property name="StartupMemoryMax" type="t" access="read"> | ||
| 394 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 395 | </property> | ||
| 396 | <property name="MemorySwapMax" type="t" access="read"> | ||
| 397 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 398 | </property> | ||
| 399 | <property name="StartupMemorySwapMax" type="t" access="read"> | ||
| 400 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 401 | </property> | ||
| 402 | <property name="MemoryZSwapMax" type="t" access="read"> | ||
| 403 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 404 | </property> | ||
| 405 | <property name="StartupMemoryZSwapMax" type="t" access="read"> | ||
| 406 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 407 | </property> | ||
| 408 | <property name="MemoryZSwapWriteback" type="b" access="read"> | ||
| 409 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 410 | </property> | ||
| 411 | <property name="DevicePolicy" type="s" access="read"> | ||
| 412 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 413 | </property> | ||
| 414 | <!-- <property name="DeviceAllow" type="a(ss)" access="read"> --> | ||
| 415 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> --> | ||
| 416 | <!-- </property> --> | ||
| 417 | <property name="TasksAccounting" type="b" access="read"> | ||
| 418 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 419 | </property> | ||
| 420 | <property name="TasksMax" type="t" access="read"> | ||
| 421 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 422 | </property> | ||
| 423 | <property name="IPAccounting" type="b" access="read"> | ||
| 424 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 425 | </property> | ||
| 426 | <!-- <property name="IPAddressAllow" type="a(iayu)" access="read"> --> | ||
| 427 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> --> | ||
| 428 | <!-- </property> --> | ||
| 429 | <!-- <property name="IPAddressDeny" type="a(iayu)" access="read"> --> | ||
| 430 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> --> | ||
| 431 | <!-- </property> --> | ||
| 432 | <property name="IPIngressFilterPath" type="as" access="read"> | ||
| 433 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 434 | </property> | ||
| 435 | <property name="IPEgressFilterPath" type="as" access="read"> | ||
| 436 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 437 | </property> | ||
| 438 | <property name="DisableControllers" type="as" access="read"> | ||
| 439 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 440 | </property> | ||
| 441 | <property name="ManagedOOMSwap" type="s" access="read"> | ||
| 442 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 443 | </property> | ||
| 444 | <property name="ManagedOOMMemoryPressure" type="s" access="read"> | ||
| 445 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 446 | </property> | ||
| 447 | <property name="ManagedOOMMemoryPressureLimit" type="u" access="read"> | ||
| 448 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 449 | </property> | ||
| 450 | <property name="ManagedOOMMemoryPressureDurationUSec" type="t" access="read"> | ||
| 451 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 452 | </property> | ||
| 453 | <property name="ManagedOOMPreference" type="s" access="read"> | ||
| 454 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 455 | </property> | ||
| 456 | <!-- <property name="BPFProgram" type="a(ss)" access="read"> --> | ||
| 457 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> --> | ||
| 458 | <!-- </property> --> | ||
| 459 | <!-- <property name="SocketBindAllow" type="a(iiqq)" access="read"> --> | ||
| 460 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> --> | ||
| 461 | <!-- </property> --> | ||
| 462 | <!-- <property name="SocketBindDeny" type="a(iiqq)" access="read"> --> | ||
| 463 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> --> | ||
| 464 | <!-- </property> --> | ||
| 465 | <!-- <property name="RestrictNetworkInterfaces" type="(bas)" access="read"> --> | ||
| 466 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> --> | ||
| 467 | <!-- </property> --> | ||
| 468 | <property name="BindNetworkInterface" type="s" access="read"> | ||
| 469 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 470 | </property> | ||
| 471 | <property name="MemoryPressureWatch" type="s" access="read"> | ||
| 472 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 473 | </property> | ||
| 474 | <property name="MemoryPressureThresholdUSec" type="t" access="read"> | ||
| 475 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 476 | </property> | ||
| 477 | <!-- <property name="NFTSet" type="a(iiss)" access="read"> --> | ||
| 478 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> --> | ||
| 479 | <!-- </property> --> | ||
| 480 | <property name="CoredumpReceive" type="b" access="read"> | ||
| 481 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 482 | </property> | ||
| 483 | <property name="Environment" type="as" access="read"> | ||
| 484 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 485 | </property> | ||
| 486 | <!-- <property name="EnvironmentFiles" type="a(sb)" access="read"> --> | ||
| 487 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> --> | ||
| 488 | <!-- </property> --> | ||
| 489 | <property name="PassEnvironment" type="as" access="read"> | ||
| 490 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 491 | </property> | ||
| 492 | <property name="UnsetEnvironment" type="as" access="read"> | ||
| 493 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 494 | </property> | ||
| 495 | <property name="UMask" type="u" access="read"> | ||
| 496 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 497 | </property> | ||
| 498 | <property name="LimitCPU" type="t" access="read"> | ||
| 499 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 500 | </property> | ||
| 501 | <property name="LimitCPUSoft" type="t" access="read"> | ||
| 502 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 503 | </property> | ||
| 504 | <property name="LimitFSIZE" type="t" access="read"> | ||
| 505 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 506 | </property> | ||
| 507 | <property name="LimitFSIZESoft" type="t" access="read"> | ||
| 508 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 509 | </property> | ||
| 510 | <property name="LimitDATA" type="t" access="read"> | ||
| 511 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 512 | </property> | ||
| 513 | <property name="LimitDATASoft" type="t" access="read"> | ||
| 514 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 515 | </property> | ||
| 516 | <property name="LimitSTACK" type="t" access="read"> | ||
| 517 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 518 | </property> | ||
| 519 | <property name="LimitSTACKSoft" type="t" access="read"> | ||
| 520 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 521 | </property> | ||
| 522 | <property name="LimitCORE" type="t" access="read"> | ||
| 523 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 524 | </property> | ||
| 525 | <property name="LimitCORESoft" type="t" access="read"> | ||
| 526 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 527 | </property> | ||
| 528 | <property name="LimitRSS" type="t" access="read"> | ||
| 529 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 530 | </property> | ||
| 531 | <property name="LimitRSSSoft" type="t" access="read"> | ||
| 532 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 533 | </property> | ||
| 534 | <property name="LimitNOFILE" type="t" access="read"> | ||
| 535 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 536 | </property> | ||
| 537 | <property name="LimitNOFILESoft" type="t" access="read"> | ||
| 538 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 539 | </property> | ||
| 540 | <property name="LimitAS" type="t" access="read"> | ||
| 541 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 542 | </property> | ||
| 543 | <property name="LimitASSoft" type="t" access="read"> | ||
| 544 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 545 | </property> | ||
| 546 | <property name="LimitNPROC" type="t" access="read"> | ||
| 547 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 548 | </property> | ||
| 549 | <property name="LimitNPROCSoft" type="t" access="read"> | ||
| 550 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 551 | </property> | ||
| 552 | <property name="LimitMEMLOCK" type="t" access="read"> | ||
| 553 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 554 | </property> | ||
| 555 | <property name="LimitMEMLOCKSoft" type="t" access="read"> | ||
| 556 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 557 | </property> | ||
| 558 | <property name="LimitLOCKS" type="t" access="read"> | ||
| 559 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 560 | </property> | ||
| 561 | <property name="LimitLOCKSSoft" type="t" access="read"> | ||
| 562 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 563 | </property> | ||
| 564 | <property name="LimitSIGPENDING" type="t" access="read"> | ||
| 565 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 566 | </property> | ||
| 567 | <property name="LimitSIGPENDINGSoft" type="t" access="read"> | ||
| 568 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 569 | </property> | ||
| 570 | <property name="LimitMSGQUEUE" type="t" access="read"> | ||
| 571 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 572 | </property> | ||
| 573 | <property name="LimitMSGQUEUESoft" type="t" access="read"> | ||
| 574 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 575 | </property> | ||
| 576 | <property name="LimitNICE" type="t" access="read"> | ||
| 577 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 578 | </property> | ||
| 579 | <property name="LimitNICESoft" type="t" access="read"> | ||
| 580 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 581 | </property> | ||
| 582 | <property name="LimitRTPRIO" type="t" access="read"> | ||
| 583 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 584 | </property> | ||
| 585 | <property name="LimitRTPRIOSoft" type="t" access="read"> | ||
| 586 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 587 | </property> | ||
| 588 | <property name="LimitRTTIME" type="t" access="read"> | ||
| 589 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 590 | </property> | ||
| 591 | <property name="LimitRTTIMESoft" type="t" access="read"> | ||
| 592 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 593 | </property> | ||
| 594 | <property name="WorkingDirectory" type="s" access="read"> | ||
| 595 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 596 | </property> | ||
| 597 | <property name="RootDirectory" type="s" access="read"> | ||
| 598 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 599 | </property> | ||
| 600 | <property name="RootImage" type="s" access="read"> | ||
| 601 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 602 | </property> | ||
| 603 | <!-- <property name="RootImageOptions" type="a(ss)" access="read"> --> | ||
| 604 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> --> | ||
| 605 | <!-- </property> --> | ||
| 606 | <property name="RootHash" type="ay" access="read"> | ||
| 607 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 608 | </property> | ||
| 609 | <property name="RootHashPath" type="s" access="read"> | ||
| 610 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 611 | </property> | ||
| 612 | <property name="RootHashSignature" type="ay" access="read"> | ||
| 613 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 614 | </property> | ||
| 615 | <property name="RootHashSignaturePath" type="s" access="read"> | ||
| 616 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 617 | </property> | ||
| 618 | <property name="RootVerity" type="s" access="read"> | ||
| 619 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 620 | </property> | ||
| 621 | <property name="RootEphemeral" type="b" access="read"> | ||
| 622 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 623 | </property> | ||
| 624 | <property name="RootMStack" type="s" access="read"> | ||
| 625 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 626 | </property> | ||
| 627 | <property name="ExtensionDirectories" type="as" access="read"> | ||
| 628 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 629 | </property> | ||
| 630 | <!-- <property name="ExtensionImages" type="a(sba(ss))" access="read"> --> | ||
| 631 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> --> | ||
| 632 | <!-- </property> --> | ||
| 633 | <!-- <property name="MountImages" type="a(ssba(ss))" access="read"> --> | ||
| 634 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> --> | ||
| 635 | <!-- </property> --> | ||
| 636 | <property name="OOMScoreAdjust" type="i" access="read"> | ||
| 637 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 638 | </property> | ||
| 639 | <property name="CoredumpFilter" type="t" access="read"> | ||
| 640 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 641 | </property> | ||
| 642 | <property name="Nice" type="i" access="read"> | ||
| 643 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 644 | </property> | ||
| 645 | <property name="IOSchedulingClass" type="i" access="read"> | ||
| 646 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 647 | </property> | ||
| 648 | <property name="IOSchedulingPriority" type="i" access="read"> | ||
| 649 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 650 | </property> | ||
| 651 | <property name="CPUSchedulingPolicy" type="i" access="read"> | ||
| 652 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 653 | </property> | ||
| 654 | <property name="CPUSchedulingPriority" type="i" access="read"> | ||
| 655 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 656 | </property> | ||
| 657 | <property name="CPUAffinity" type="ay" access="read"> | ||
| 658 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 659 | </property> | ||
| 660 | <property name="CPUAffinityFromNUMA" type="b" access="read"> | ||
| 661 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 662 | </property> | ||
| 663 | <property name="NUMAPolicy" type="i" access="read"> | ||
| 664 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 665 | </property> | ||
| 666 | <property name="NUMAMask" type="ay" access="read"> | ||
| 667 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 668 | </property> | ||
| 669 | <property name="TimerSlackNSec" type="t" access="read"> | ||
| 670 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 671 | </property> | ||
| 672 | <property name="CPUSchedulingResetOnFork" type="b" access="read"> | ||
| 673 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 674 | </property> | ||
| 675 | <property name="NonBlocking" type="b" access="read"> | ||
| 676 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 677 | </property> | ||
| 678 | <property name="StandardInput" type="s" access="read"> | ||
| 679 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 680 | </property> | ||
| 681 | <property name="StandardInputFileDescriptorName" type="s" access="read"> | ||
| 682 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 683 | </property> | ||
| 684 | <property name="StandardInputData" type="ay" access="read"> | ||
| 685 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 686 | </property> | ||
| 687 | <property name="StandardOutput" type="s" access="read"> | ||
| 688 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 689 | </property> | ||
| 690 | <property name="StandardOutputFileDescriptorName" type="s" access="read"> | ||
| 691 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 692 | </property> | ||
| 693 | <property name="StandardError" type="s" access="read"> | ||
| 694 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 695 | </property> | ||
| 696 | <property name="StandardErrorFileDescriptorName" type="s" access="read"> | ||
| 697 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 698 | </property> | ||
| 699 | <property name="TTYPath" type="s" access="read"> | ||
| 700 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 701 | </property> | ||
| 702 | <property name="TTYReset" type="b" access="read"> | ||
| 703 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 704 | </property> | ||
| 705 | <property name="TTYVHangup" type="b" access="read"> | ||
| 706 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 707 | </property> | ||
| 708 | <property name="TTYVTDisallocate" type="b" access="read"> | ||
| 709 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 710 | </property> | ||
| 711 | <property name="TTYRows" type="q" access="read"> | ||
| 712 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 713 | </property> | ||
| 714 | <property name="TTYColumns" type="q" access="read"> | ||
| 715 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 716 | </property> | ||
| 717 | <property name="SyslogPriority" type="i" access="read"> | ||
| 718 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 719 | </property> | ||
| 720 | <property name="SyslogIdentifier" type="s" access="read"> | ||
| 721 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 722 | </property> | ||
| 723 | <property name="SyslogLevelPrefix" type="b" access="read"> | ||
| 724 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 725 | </property> | ||
| 726 | <property name="SyslogLevel" type="i" access="read"> | ||
| 727 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 728 | </property> | ||
| 729 | <property name="SyslogFacility" type="i" access="read"> | ||
| 730 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 731 | </property> | ||
| 732 | <property name="LogLevelMax" type="i" access="read"> | ||
| 733 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 734 | </property> | ||
| 735 | <property name="LogRateLimitIntervalUSec" type="t" access="read"> | ||
| 736 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 737 | </property> | ||
| 738 | <property name="LogRateLimitBurst" type="u" access="read"> | ||
| 739 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 740 | </property> | ||
| 741 | <!-- <property name="LogExtraFields" type="aay" access="read"> --> | ||
| 742 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> --> | ||
| 743 | <!-- </property> --> | ||
| 744 | <!-- <property name="LogFilterPatterns" type="a(bs)" access="read"> --> | ||
| 745 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> --> | ||
| 746 | <!-- </property> --> | ||
| 747 | <property name="LogNamespace" type="s" access="read"> | ||
| 748 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 749 | </property> | ||
| 750 | <property name="SecureBits" type="i" access="read"> | ||
| 751 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 752 | </property> | ||
| 753 | <property name="CapabilityBoundingSet" type="t" access="read"> | ||
| 754 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 755 | </property> | ||
| 756 | <property name="AmbientCapabilities" type="t" access="read"> | ||
| 757 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 758 | </property> | ||
| 759 | <property name="User" type="s" access="read"> | ||
| 760 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 761 | </property> | ||
| 762 | <property name="Group" type="s" access="read"> | ||
| 763 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 764 | </property> | ||
| 765 | <property name="DynamicUser" type="b" access="read"> | ||
| 766 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 767 | </property> | ||
| 768 | <property name="SetLoginEnvironment" type="b" access="read"> | ||
| 769 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 770 | </property> | ||
| 771 | <property name="RemoveIPC" type="b" access="read"> | ||
| 772 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 773 | </property> | ||
| 774 | <!-- <property name="SetCredential" type="a(say)" access="read"> --> | ||
| 775 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> --> | ||
| 776 | <!-- </property> --> | ||
| 777 | <!-- <property name="SetCredentialEncrypted" type="a(say)" access="read"> --> | ||
| 778 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> --> | ||
| 779 | <!-- </property> --> | ||
| 780 | <!-- <property name="LoadCredential" type="a(ss)" access="read"> --> | ||
| 781 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> --> | ||
| 782 | <!-- </property> --> | ||
| 783 | <!-- <property name="LoadCredentialEncrypted" type="a(ss)" access="read"> --> | ||
| 784 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> --> | ||
| 785 | <!-- </property> --> | ||
| 786 | <property name="ImportCredential" type="as" access="read"> | ||
| 787 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 788 | </property> | ||
| 789 | <!-- <property name="ImportCredentialEx" type="a(ss)" access="read"> --> | ||
| 790 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> --> | ||
| 791 | <!-- </property> --> | ||
| 792 | <property name="SupplementaryGroups" type="as" access="read"> | ||
| 793 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 794 | </property> | ||
| 795 | <property name="PAMName" type="s" access="read"> | ||
| 796 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 797 | </property> | ||
| 798 | <property name="ReadWritePaths" type="as" access="read"> | ||
| 799 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 800 | </property> | ||
| 801 | <property name="ReadOnlyPaths" type="as" access="read"> | ||
| 802 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 803 | </property> | ||
| 804 | <property name="InaccessiblePaths" type="as" access="read"> | ||
| 805 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 806 | </property> | ||
| 807 | <property name="ExecPaths" type="as" access="read"> | ||
| 808 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 809 | </property> | ||
| 810 | <property name="NoExecPaths" type="as" access="read"> | ||
| 811 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 812 | </property> | ||
| 813 | <property name="ExecSearchPath" type="as" access="read"> | ||
| 814 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 815 | </property> | ||
| 816 | <property name="MountFlags" type="t" access="read"> | ||
| 817 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 818 | </property> | ||
| 819 | <property name="PrivateTmp" type="b" access="read"> | ||
| 820 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 821 | </property> | ||
| 822 | <property name="PrivateTmpEx" type="s" access="read"> | ||
| 823 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 824 | </property> | ||
| 825 | <property name="PrivateDevices" type="b" access="read"> | ||
| 826 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 827 | </property> | ||
| 828 | <property name="ProtectClock" type="b" access="read"> | ||
| 829 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 830 | </property> | ||
| 831 | <property name="ProtectKernelTunables" type="b" access="read"> | ||
| 832 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 833 | </property> | ||
| 834 | <property name="ProtectKernelModules" type="b" access="read"> | ||
| 835 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 836 | </property> | ||
| 837 | <property name="ProtectKernelLogs" type="b" access="read"> | ||
| 838 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 839 | </property> | ||
| 840 | <property name="ProtectControlGroups" type="b" access="read"> | ||
| 841 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 842 | </property> | ||
| 843 | <property name="ProtectControlGroupsEx" type="s" access="read"> | ||
| 844 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 845 | </property> | ||
| 846 | <property name="PrivateNetwork" type="b" access="read"> | ||
| 847 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 848 | </property> | ||
| 849 | <property name="PrivateUsers" type="b" access="read"> | ||
| 850 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 851 | </property> | ||
| 852 | <property name="PrivateUsersEx" type="s" access="read"> | ||
| 853 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 854 | </property> | ||
| 855 | <property name="PrivateMounts" type="b" access="read"> | ||
| 856 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 857 | </property> | ||
| 858 | <property name="PrivateIPC" type="b" access="read"> | ||
| 859 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 860 | </property> | ||
| 861 | <property name="PrivatePIDs" type="s" access="read"> | ||
| 862 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 863 | </property> | ||
| 864 | <property name="ProtectHome" type="s" access="read"> | ||
| 865 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 866 | </property> | ||
| 867 | <property name="ProtectSystem" type="s" access="read"> | ||
| 868 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 869 | </property> | ||
| 870 | <property name="SameProcessGroup" type="b" access="read"> | ||
| 871 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 872 | </property> | ||
| 873 | <property name="UtmpIdentifier" type="s" access="read"> | ||
| 874 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 875 | </property> | ||
| 876 | <property name="UtmpMode" type="s" access="read"> | ||
| 877 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 878 | </property> | ||
| 879 | <!-- <property name="SELinuxContext" type="(bs)" access="read"> --> | ||
| 880 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> --> | ||
| 881 | <!-- </property> --> | ||
| 882 | <!-- <property name="AppArmorProfile" type="(bs)" access="read"> --> | ||
| 883 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> --> | ||
| 884 | <!-- </property> --> | ||
| 885 | <!-- <property name="SmackProcessLabel" type="(bs)" access="read"> --> | ||
| 886 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> --> | ||
| 887 | <!-- </property> --> | ||
| 888 | <property name="IgnoreSIGPIPE" type="b" access="read"> | ||
| 889 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 890 | </property> | ||
| 891 | <property name="NoNewPrivileges" type="b" access="read"> | ||
| 892 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 893 | </property> | ||
| 894 | <!-- <property name="SystemCallFilter" type="(bas)" access="read"> --> | ||
| 895 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> --> | ||
| 896 | <!-- </property> --> | ||
| 897 | <property name="SystemCallArchitectures" type="as" access="read"> | ||
| 898 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 899 | </property> | ||
| 900 | <property name="SystemCallErrorNumber" type="i" access="read"> | ||
| 901 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 902 | </property> | ||
| 903 | <!-- <property name="SystemCallLog" type="(bas)" access="read"> --> | ||
| 904 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> --> | ||
| 905 | <!-- </property> --> | ||
| 906 | <property name="Personality" type="s" access="read"> | ||
| 907 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 908 | </property> | ||
| 909 | <property name="LockPersonality" type="b" access="read"> | ||
| 910 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 911 | </property> | ||
| 912 | <!-- <property name="RestrictAddressFamilies" type="(bas)" access="read"> --> | ||
| 913 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> --> | ||
| 914 | <!-- </property> --> | ||
| 915 | <!-- <property name="RuntimeDirectorySymlink" type="a(sst)" access="read"> --> | ||
| 916 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> --> | ||
| 917 | <!-- </property> --> | ||
| 918 | <property name="RuntimeDirectoryPreserve" type="s" access="read"> | ||
| 919 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 920 | </property> | ||
| 921 | <property name="RuntimeDirectoryMode" type="u" access="read"> | ||
| 922 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 923 | </property> | ||
| 924 | <property name="RuntimeDirectory" type="as" access="read"> | ||
| 925 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 926 | </property> | ||
| 927 | <!-- <property name="StateDirectorySymlink" type="a(sst)" access="read"> --> | ||
| 928 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> --> | ||
| 929 | <!-- </property> --> | ||
| 930 | <property name="StateDirectoryMode" type="u" access="read"> | ||
| 931 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 932 | </property> | ||
| 933 | <property name="StateDirectoryAccounting" type="b" access="read"> | ||
| 934 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 935 | </property> | ||
| 936 | <!-- <property name="StateDirectoryQuota" type="(tus)" access="read"> --> | ||
| 937 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> --> | ||
| 938 | <!-- </property> --> | ||
| 939 | <property name="StateDirectory" type="as" access="read"> | ||
| 940 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 941 | </property> | ||
| 942 | <!-- <property name="CacheDirectorySymlink" type="a(sst)" access="read"> --> | ||
| 943 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> --> | ||
| 944 | <!-- </property> --> | ||
| 945 | <property name="CacheDirectoryMode" type="u" access="read"> | ||
| 946 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 947 | </property> | ||
| 948 | <property name="CacheDirectoryAccounting" type="b" access="read"> | ||
| 949 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 950 | </property> | ||
| 951 | <!-- <property name="CacheDirectoryQuota" type="(tus)" access="read"> --> | ||
| 952 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> --> | ||
| 953 | <!-- </property> --> | ||
| 954 | <property name="CacheDirectory" type="as" access="read"> | ||
| 955 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 956 | </property> | ||
| 957 | <!-- <property name="LogsDirectorySymlink" type="a(sst)" access="read"> --> | ||
| 958 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> --> | ||
| 959 | <!-- </property> --> | ||
| 960 | <property name="LogsDirectoryMode" type="u" access="read"> | ||
| 961 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 962 | </property> | ||
| 963 | <property name="LogsDirectoryAccounting" type="b" access="read"> | ||
| 964 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 965 | </property> | ||
| 966 | <!-- <property name="LogsDirectoryQuota" type="(tus)" access="read"> --> | ||
| 967 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> --> | ||
| 968 | <!-- </property> --> | ||
| 969 | <property name="LogsDirectory" type="as" access="read"> | ||
| 970 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 971 | </property> | ||
| 972 | <property name="ConfigurationDirectoryMode" type="u" access="read"> | ||
| 973 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 974 | </property> | ||
| 975 | <property name="ConfigurationDirectory" type="as" access="read"> | ||
| 976 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 977 | </property> | ||
| 978 | <property name="TimeoutCleanUSec" type="t" access="read"> | ||
| 979 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 980 | </property> | ||
| 981 | <property name="MemoryDenyWriteExecute" type="b" access="read"> | ||
| 982 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 983 | </property> | ||
| 984 | <property name="RestrictRealtime" type="b" access="read"> | ||
| 985 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 986 | </property> | ||
| 987 | <property name="RestrictSUIDSGID" type="b" access="read"> | ||
| 988 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 989 | </property> | ||
| 990 | <property name="RestrictNamespaces" type="t" access="read"> | ||
| 991 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 992 | </property> | ||
| 993 | <property name="DelegateNamespaces" type="t" access="read"> | ||
| 994 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 995 | </property> | ||
| 996 | <!-- <property name="RestrictFileSystems" type="(bas)" access="read"> --> | ||
| 997 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> --> | ||
| 998 | <!-- </property> --> | ||
| 999 | <!-- <property name="BindPaths" type="a(ssbt)" access="read"> --> | ||
| 1000 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> --> | ||
| 1001 | <!-- </property> --> | ||
| 1002 | <!-- <property name="BindReadOnlyPaths" type="a(ssbt)" access="read"> --> | ||
| 1003 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> --> | ||
| 1004 | <!-- </property> --> | ||
| 1005 | <!-- <property name="TemporaryFileSystem" type="a(ss)" access="read"> --> | ||
| 1006 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> --> | ||
| 1007 | <!-- </property> --> | ||
| 1008 | <property name="MountAPIVFS" type="b" access="read"> | ||
| 1009 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 1010 | </property> | ||
| 1011 | <property name="BindLogSockets" type="b" access="read"> | ||
| 1012 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 1013 | </property> | ||
| 1014 | <property name="KeyringMode" type="s" access="read"> | ||
| 1015 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 1016 | </property> | ||
| 1017 | <property name="ProtectProc" type="s" access="read"> | ||
| 1018 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 1019 | </property> | ||
| 1020 | <property name="ProcSubset" type="s" access="read"> | ||
| 1021 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 1022 | </property> | ||
| 1023 | <property name="ProtectHostname" type="b" access="read"> | ||
| 1024 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 1025 | </property> | ||
| 1026 | <!-- <property name="ProtectHostnameEx" type="(ss)" access="read"> --> | ||
| 1027 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> --> | ||
| 1028 | <!-- </property> --> | ||
| 1029 | <property name="PrivateBPF" type="s" access="read"> | ||
| 1030 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 1031 | </property> | ||
| 1032 | <property name="BPFDelegateCommands" type="s" access="read"> | ||
| 1033 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 1034 | </property> | ||
| 1035 | <property name="BPFDelegateMaps" type="s" access="read"> | ||
| 1036 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 1037 | </property> | ||
| 1038 | <property name="BPFDelegatePrograms" type="s" access="read"> | ||
| 1039 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 1040 | </property> | ||
| 1041 | <property name="BPFDelegateAttachments" type="s" access="read"> | ||
| 1042 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 1043 | </property> | ||
| 1044 | <property name="MemoryKSM" type="b" access="read"> | ||
| 1045 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 1046 | </property> | ||
| 1047 | <property name="MemoryTHP" type="s" access="read"> | ||
| 1048 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 1049 | </property> | ||
| 1050 | <property name="UserNamespacePath" type="s" access="read"> | ||
| 1051 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 1052 | </property> | ||
| 1053 | <property name="NetworkNamespacePath" type="s" access="read"> | ||
| 1054 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 1055 | </property> | ||
| 1056 | <property name="IPCNamespacePath" type="s" access="read"> | ||
| 1057 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 1058 | </property> | ||
| 1059 | <property name="RootImagePolicy" type="s" access="read"> | ||
| 1060 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 1061 | </property> | ||
| 1062 | <property name="MountImagePolicy" type="s" access="read"> | ||
| 1063 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 1064 | </property> | ||
| 1065 | <property name="ExtensionImagePolicy" type="s" access="read"> | ||
| 1066 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 1067 | </property> | ||
| 1068 | <!-- <property name="StateDirectoryQuotaUsage" type="(tt)" access="read"> --> | ||
| 1069 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> --> | ||
| 1070 | <!-- </property> --> | ||
| 1071 | <!-- <property name="CacheDirectoryQuotaUsage" type="(tt)" access="read"> --> | ||
| 1072 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> --> | ||
| 1073 | <!-- </property> --> | ||
| 1074 | <!-- <property name="LogsDirectoryQuotaUsage" type="(tt)" access="read"> --> | ||
| 1075 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> --> | ||
| 1076 | <!-- </property> --> | ||
| 1077 | <property name="KillMode" type="s" access="read"> | ||
| 1078 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 1079 | </property> | ||
| 1080 | <property name="KillSignal" type="i" access="read"> | ||
| 1081 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 1082 | </property> | ||
| 1083 | <property name="RestartKillSignal" type="i" access="read"> | ||
| 1084 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 1085 | </property> | ||
| 1086 | <property name="FinalKillSignal" type="i" access="read"> | ||
| 1087 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 1088 | </property> | ||
| 1089 | <property name="SendSIGKILL" type="b" access="read"> | ||
| 1090 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 1091 | </property> | ||
| 1092 | <property name="SendSIGHUP" type="b" access="read"> | ||
| 1093 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 1094 | </property> | ||
| 1095 | <property name="WatchdogSignal" type="i" access="read"> | ||
| 1096 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 1097 | </property> | ||
| 1098 | </interface> | ||
| 1099 | </node> | ||
| 1100 | |||
diff --git a/accounts/gkleen@skadhi/shell/quickshell-plugins/org.freedesktop.systemd1.Unit.xml b/accounts/gkleen@skadhi/shell/quickshell-plugins/org.freedesktop.systemd1.Unit.xml new file mode 100644 index 00000000..a554f513 --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell-plugins/org.freedesktop.systemd1.Unit.xml | |||
| @@ -0,0 +1,359 @@ | |||
| 1 | <!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" | ||
| 2 | "https://www.freedesktop.org/standards/dbus/1.0/introspect.dtd"> | ||
| 3 | <node> | ||
| 4 | <interface name="org.freedesktop.systemd1.Unit"> | ||
| 5 | <property name="Id" type="s" access="read"> | ||
| 6 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 7 | </property> | ||
| 8 | <property name="Names" type="as" access="read"> | ||
| 9 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 10 | </property> | ||
| 11 | <property name="Following" type="s" access="read"> | ||
| 12 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 13 | </property> | ||
| 14 | <!-- <property name="Requires" type="as" access="read"> --> | ||
| 15 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> --> | ||
| 16 | <!-- </property> --> | ||
| 17 | <property name="Requisite" type="as" access="read"> | ||
| 18 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 19 | </property> | ||
| 20 | <property name="Wants" type="as" access="read"> | ||
| 21 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 22 | </property> | ||
| 23 | <property name="BindsTo" type="as" access="read"> | ||
| 24 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 25 | </property> | ||
| 26 | <property name="PartOf" type="as" access="read"> | ||
| 27 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 28 | </property> | ||
| 29 | <property name="Upholds" type="as" access="read"> | ||
| 30 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 31 | </property> | ||
| 32 | <property name="RequiredBy" type="as" access="read"> | ||
| 33 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 34 | </property> | ||
| 35 | <property name="RequisiteOf" type="as" access="read"> | ||
| 36 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 37 | </property> | ||
| 38 | <property name="WantedBy" type="as" access="read"> | ||
| 39 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 40 | </property> | ||
| 41 | <property name="BoundBy" type="as" access="read"> | ||
| 42 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 43 | </property> | ||
| 44 | <property name="UpheldBy" type="as" access="read"> | ||
| 45 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 46 | </property> | ||
| 47 | <property name="ConsistsOf" type="as" access="read"> | ||
| 48 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 49 | </property> | ||
| 50 | <property name="Conflicts" type="as" access="read"> | ||
| 51 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 52 | </property> | ||
| 53 | <property name="ConflictedBy" type="as" access="read"> | ||
| 54 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 55 | </property> | ||
| 56 | <property name="Before" type="as" access="read"> | ||
| 57 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 58 | </property> | ||
| 59 | <property name="After" type="as" access="read"> | ||
| 60 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 61 | </property> | ||
| 62 | <property name="OnSuccess" type="as" access="read"> | ||
| 63 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 64 | </property> | ||
| 65 | <property name="OnSuccessOf" type="as" access="read"> | ||
| 66 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 67 | </property> | ||
| 68 | <property name="OnFailure" type="as" access="read"> | ||
| 69 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 70 | </property> | ||
| 71 | <property name="OnFailureOf" type="as" access="read"> | ||
| 72 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 73 | </property> | ||
| 74 | <property name="Triggers" type="as" access="read"> | ||
| 75 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 76 | </property> | ||
| 77 | <property name="TriggeredBy" type="as" access="read"> | ||
| 78 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 79 | </property> | ||
| 80 | <property name="PropagatesReloadTo" type="as" access="read"> | ||
| 81 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 82 | </property> | ||
| 83 | <property name="ReloadPropagatedFrom" type="as" access="read"> | ||
| 84 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 85 | </property> | ||
| 86 | <property name="PropagatesStopTo" type="as" access="read"> | ||
| 87 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 88 | </property> | ||
| 89 | <property name="StopPropagatedFrom" type="as" access="read"> | ||
| 90 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 91 | </property> | ||
| 92 | <property name="JoinsNamespaceOf" type="as" access="read"> | ||
| 93 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 94 | </property> | ||
| 95 | <property name="SliceOf" type="as" access="read"> | ||
| 96 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 97 | </property> | ||
| 98 | <property name="RequiresMountsFor" type="as" access="read"> | ||
| 99 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 100 | </property> | ||
| 101 | <property name="WantsMountsFor" type="as" access="read"> | ||
| 102 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 103 | </property> | ||
| 104 | <property name="Documentation" type="as" access="read"> | ||
| 105 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 106 | </property> | ||
| 107 | <property name="Description" type="s" access="read"> | ||
| 108 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 109 | </property> | ||
| 110 | <property name="AccessSELinuxContext" type="s" access="read"> | ||
| 111 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 112 | </property> | ||
| 113 | <property name="LoadState" type="s" access="read"> | ||
| 114 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 115 | </property> | ||
| 116 | <property name="ActiveState" type="s" access="read"> | ||
| 117 | </property> | ||
| 118 | <property name="FreezerState" type="s" access="read"> | ||
| 119 | </property> | ||
| 120 | <property name="SubState" type="s" access="read"> | ||
| 121 | </property> | ||
| 122 | <property name="FragmentPath" type="s" access="read"> | ||
| 123 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 124 | </property> | ||
| 125 | <property name="SourcePath" type="s" access="read"> | ||
| 126 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 127 | </property> | ||
| 128 | <property name="DropInPaths" type="as" access="read"> | ||
| 129 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 130 | </property> | ||
| 131 | <property name="UnitFileState" type="s" access="read"> | ||
| 132 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 133 | </property> | ||
| 134 | <property name="UnitFilePreset" type="s" access="read"> | ||
| 135 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 136 | </property> | ||
| 137 | <property name="StateChangeTimestamp" type="t" access="read"> | ||
| 138 | </property> | ||
| 139 | <property name="StateChangeTimestampMonotonic" type="t" access="read"> | ||
| 140 | </property> | ||
| 141 | <property name="InactiveExitTimestamp" type="t" access="read"> | ||
| 142 | </property> | ||
| 143 | <property name="InactiveExitTimestampMonotonic" type="t" access="read"> | ||
| 144 | </property> | ||
| 145 | <property name="ActiveEnterTimestamp" type="t" access="read"> | ||
| 146 | </property> | ||
| 147 | <property name="ActiveEnterTimestampMonotonic" type="t" access="read"> | ||
| 148 | </property> | ||
| 149 | <property name="ActiveExitTimestamp" type="t" access="read"> | ||
| 150 | </property> | ||
| 151 | <property name="ActiveExitTimestampMonotonic" type="t" access="read"> | ||
| 152 | </property> | ||
| 153 | <property name="InactiveEnterTimestamp" type="t" access="read"> | ||
| 154 | </property> | ||
| 155 | <property name="InactiveEnterTimestampMonotonic" type="t" access="read"> | ||
| 156 | </property> | ||
| 157 | <property name="CanStart" type="b" access="read"> | ||
| 158 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 159 | </property> | ||
| 160 | <property name="CanStop" type="b" access="read"> | ||
| 161 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 162 | </property> | ||
| 163 | <property name="CanReload" type="b" access="read"> | ||
| 164 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 165 | </property> | ||
| 166 | <property name="CanIsolate" type="b" access="read"> | ||
| 167 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 168 | </property> | ||
| 169 | <property name="CanClean" type="as" access="read"> | ||
| 170 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 171 | </property> | ||
| 172 | <property name="CanFreeze" type="b" access="read"> | ||
| 173 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 174 | </property> | ||
| 175 | <property name="CanLiveMount" type="b" access="read"> | ||
| 176 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 177 | </property> | ||
| 178 | <!-- <property name="Job" type="(uo)" access="read"> --> | ||
| 179 | <!-- </property> --> | ||
| 180 | <property name="StopWhenUnneeded" type="b" access="read"> | ||
| 181 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 182 | </property> | ||
| 183 | <property name="RefuseManualStart" type="b" access="read"> | ||
| 184 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 185 | </property> | ||
| 186 | <property name="RefuseManualStop" type="b" access="read"> | ||
| 187 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 188 | </property> | ||
| 189 | <property name="AllowIsolate" type="b" access="read"> | ||
| 190 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 191 | </property> | ||
| 192 | <property name="DefaultDependencies" type="b" access="read"> | ||
| 193 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 194 | </property> | ||
| 195 | <property name="SurviveFinalKillSignal" type="b" access="read"> | ||
| 196 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 197 | </property> | ||
| 198 | <property name="OnSuccessJobMode" type="s" access="read"> | ||
| 199 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 200 | </property> | ||
| 201 | <property name="OnFailureJobMode" type="s" access="read"> | ||
| 202 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 203 | </property> | ||
| 204 | <property name="IgnoreOnIsolate" type="b" access="read"> | ||
| 205 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 206 | </property> | ||
| 207 | <property name="NeedDaemonReload" type="b" access="read"> | ||
| 208 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 209 | </property> | ||
| 210 | <property name="Markers" type="as" access="read"> | ||
| 211 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 212 | </property> | ||
| 213 | <property name="JobTimeoutUSec" type="t" access="read"> | ||
| 214 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 215 | </property> | ||
| 216 | <property name="JobRunningTimeoutUSec" type="t" access="read"> | ||
| 217 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 218 | </property> | ||
| 219 | <property name="JobTimeoutAction" type="s" access="read"> | ||
| 220 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 221 | </property> | ||
| 222 | <property name="JobTimeoutRebootArgument" type="s" access="read"> | ||
| 223 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 224 | </property> | ||
| 225 | <property name="ConditionResult" type="b" access="read"> | ||
| 226 | </property> | ||
| 227 | <property name="AssertResult" type="b" access="read"> | ||
| 228 | </property> | ||
| 229 | <property name="ConditionTimestamp" type="t" access="read"> | ||
| 230 | </property> | ||
| 231 | <property name="ConditionTimestampMonotonic" type="t" access="read"> | ||
| 232 | </property> | ||
| 233 | <property name="AssertTimestamp" type="t" access="read"> | ||
| 234 | </property> | ||
| 235 | <property name="AssertTimestampMonotonic" type="t" access="read"> | ||
| 236 | </property> | ||
| 237 | <!-- <property name="Conditions" type="a(sbbsi)" access="read"> --> | ||
| 238 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="invalidates"/> --> | ||
| 239 | <!-- </property> --> | ||
| 240 | <!-- <property name="Asserts" type="a(sbbsi)" access="read"> --> | ||
| 241 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="invalidates"/> --> | ||
| 242 | <!-- </property> --> | ||
| 243 | <!-- <property name="LoadError" type="(ss)" access="read"> --> | ||
| 244 | <!-- <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> --> | ||
| 245 | <!-- </property> --> | ||
| 246 | <property name="Transient" type="b" access="read"> | ||
| 247 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 248 | </property> | ||
| 249 | <property name="Perpetual" type="b" access="read"> | ||
| 250 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 251 | </property> | ||
| 252 | <property name="StartLimitIntervalUSec" type="t" access="read"> | ||
| 253 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 254 | </property> | ||
| 255 | <property name="StartLimitBurst" type="u" access="read"> | ||
| 256 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 257 | </property> | ||
| 258 | <property name="StartLimitAction" type="s" access="read"> | ||
| 259 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 260 | </property> | ||
| 261 | <property name="FailureAction" type="s" access="read"> | ||
| 262 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 263 | </property> | ||
| 264 | <property name="FailureActionExitStatus" type="i" access="read"> | ||
| 265 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 266 | </property> | ||
| 267 | <property name="SuccessAction" type="s" access="read"> | ||
| 268 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 269 | </property> | ||
| 270 | <property name="SuccessActionExitStatus" type="i" access="read"> | ||
| 271 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 272 | </property> | ||
| 273 | <property name="RebootArgument" type="s" access="read"> | ||
| 274 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 275 | </property> | ||
| 276 | <property name="InvocationID" type="ay" access="read"> | ||
| 277 | </property> | ||
| 278 | <property name="CollectMode" type="s" access="read"> | ||
| 279 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/> | ||
| 280 | </property> | ||
| 281 | <property name="Refs" type="as" access="read"> | ||
| 282 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 283 | </property> | ||
| 284 | <!-- <property name="ActivationDetails" type="a(ss)" access="read"> --> | ||
| 285 | <!-- </property> --> | ||
| 286 | <property name="DebugInvocation" type="b" access="read"> | ||
| 287 | <annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="false"/> | ||
| 288 | </property> | ||
| 289 | <method name="Start"> | ||
| 290 | <arg type="s" name="mode" direction="in"/> | ||
| 291 | <arg type="o" name="job" direction="out"/> | ||
| 292 | </method> | ||
| 293 | <method name="Stop"> | ||
| 294 | <arg type="s" name="mode" direction="in"/> | ||
| 295 | <arg type="o" name="job" direction="out"/> | ||
| 296 | </method> | ||
| 297 | <method name="Reload"> | ||
| 298 | <arg type="s" name="mode" direction="in"/> | ||
| 299 | <arg type="o" name="job" direction="out"/> | ||
| 300 | </method> | ||
| 301 | <method name="Restart"> | ||
| 302 | <arg type="s" name="mode" direction="in"/> | ||
| 303 | <arg type="o" name="job" direction="out"/> | ||
| 304 | </method> | ||
| 305 | <method name="TryRestart"> | ||
| 306 | <arg type="s" name="mode" direction="in"/> | ||
| 307 | <arg type="o" name="job" direction="out"/> | ||
| 308 | </method> | ||
| 309 | <method name="ReloadOrRestart"> | ||
| 310 | <arg type="s" name="mode" direction="in"/> | ||
| 311 | <arg type="o" name="job" direction="out"/> | ||
| 312 | </method> | ||
| 313 | <method name="ReloadOrTryRestart"> | ||
| 314 | <arg type="s" name="mode" direction="in"/> | ||
| 315 | <arg type="o" name="job" direction="out"/> | ||
| 316 | </method> | ||
| 317 | <!-- <method name="EnqueueJob"> --> | ||
| 318 | <!-- <arg type="s" name="job_type" direction="in"/> --> | ||
| 319 | <!-- <arg type="s" name="job_mode" direction="in"/> --> | ||
| 320 | <!-- <arg type="u" name="job_id" direction="out"/> --> | ||
| 321 | <!-- <arg type="o" name="job_path" direction="out"/> --> | ||
| 322 | <!-- <arg type="s" name="unit_id" direction="out"/> --> | ||
| 323 | <!-- <arg type="o" name="unit_path" direction="out"/> --> | ||
| 324 | <!-- <arg type="s" name="job_type" direction="out"/> --> | ||
| 325 | <!-- <arg type="a(uosos)" name="affected_jobs" direction="out"/> --> | ||
| 326 | <!-- </method> --> | ||
| 327 | <method name="Kill"> | ||
| 328 | <arg type="s" name="whom" direction="in"/> | ||
| 329 | <arg type="i" name="signal" direction="in"/> | ||
| 330 | </method> | ||
| 331 | <method name="KillSubgroup"> | ||
| 332 | <arg type="s" name="subgroup" direction="in"/> | ||
| 333 | <arg type="i" name="signal" direction="in"/> | ||
| 334 | </method> | ||
| 335 | <method name="QueueSignal"> | ||
| 336 | <arg type="s" name="whom" direction="in"/> | ||
| 337 | <arg type="i" name="signal" direction="in"/> | ||
| 338 | <arg type="i" name="value" direction="in"/> | ||
| 339 | </method> | ||
| 340 | <method name="ResetFailed"> | ||
| 341 | </method> | ||
| 342 | <!-- <method name="SetProperties"> --> | ||
| 343 | <!-- <arg type="b" name="runtime" direction="in"/> --> | ||
| 344 | <!-- <arg type="a(sv)" name="properties" direction="in"/> --> | ||
| 345 | <!-- </method> --> | ||
| 346 | <method name="Ref"> | ||
| 347 | </method> | ||
| 348 | <method name="Unref"> | ||
| 349 | </method> | ||
| 350 | <method name="Clean"> | ||
| 351 | <arg type="as" name="mask" direction="in"/> | ||
| 352 | </method> | ||
| 353 | <method name="Freeze"> | ||
| 354 | </method> | ||
| 355 | <method name="Thaw"> | ||
| 356 | </method> | ||
| 357 | </interface> | ||
| 358 | </node> | ||
| 359 | |||
diff --git a/accounts/gkleen@skadhi/shell/quickshell/ActiveWindowDisplay.qml b/accounts/gkleen@skadhi/shell/quickshell/ActiveWindowDisplay.qml new file mode 100644 index 00000000..ac1cbf3a --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell/ActiveWindowDisplay.qml | |||
| @@ -0,0 +1,172 @@ | |||
| 1 | import QtQuick | ||
| 2 | import qs.Services | ||
| 3 | import Quickshell | ||
| 4 | import Quickshell.Widgets | ||
| 5 | |||
| 6 | Item { | ||
| 7 | id: activeWindowDisplay | ||
| 8 | |||
| 9 | required property int maxWidth | ||
| 10 | required property var screen | ||
| 11 | |||
| 12 | property var activeWindow: { | ||
| 13 | let currWindowId = Array.from(NiriService.workspaces).find(ws => { | ||
| 14 | return ws.output === screen?.name && ws.is_active; | ||
| 15 | })?.active_window_id; | ||
| 16 | |||
| 17 | return currWindowId ? Array.from(NiriService.windows).find(win => win.id == currWindowId) : null; | ||
| 18 | } | ||
| 19 | property var windowEntry: activeWindow ? DesktopEntries.heuristicLookup(activeWindow.app_id) : null | ||
| 20 | |||
| 21 | anchors.verticalCenter: parent.verticalCenter | ||
| 22 | width: activeWindowDisplayContent.width | ||
| 23 | height: parent.height | ||
| 24 | |||
| 25 | WrapperMouseArea { | ||
| 26 | id: widgetMouseArea | ||
| 27 | |||
| 28 | anchors.fill: parent | ||
| 29 | |||
| 30 | hoverEnabled: true | ||
| 31 | |||
| 32 | Item { | ||
| 33 | anchors.fill: parent | ||
| 34 | |||
| 35 | Row { | ||
| 36 | id: activeWindowDisplayContent | ||
| 37 | |||
| 38 | width: childrenRect.width | ||
| 39 | height: parent.height | ||
| 40 | anchors.verticalCenter: parent.verticalCenter | ||
| 41 | spacing: 8 | ||
| 42 | |||
| 43 | IconImage { | ||
| 44 | id: activeWindowIcon | ||
| 45 | |||
| 46 | implicitSize: 14 | ||
| 47 | |||
| 48 | anchors.verticalCenter: parent.verticalCenter | ||
| 49 | |||
| 50 | source: { | ||
| 51 | let icon = activeWindowDisplay.windowEntry?.icon | ||
| 52 | if (typeof icon === 'string' || icon instanceof String) { | ||
| 53 | if (icon.includes("?path=")) { | ||
| 54 | const split = icon.split("?path=") | ||
| 55 | if (split.length !== 2) | ||
| 56 | return icon | ||
| 57 | const name = split[0] | ||
| 58 | const path = split[1] | ||
| 59 | const fileName = name.substring( | ||
| 60 | name.lastIndexOf("/") + 1) | ||
| 61 | return `file://${path}/${fileName}` | ||
| 62 | } else | ||
| 63 | icon = Quickshell.iconPath(icon); | ||
| 64 | return icon | ||
| 65 | } | ||
| 66 | return "" | ||
| 67 | } | ||
| 68 | asynchronous: true | ||
| 69 | smooth: true | ||
| 70 | mipmap: true | ||
| 71 | } | ||
| 72 | |||
| 73 | Text { | ||
| 74 | id: windowTitle | ||
| 75 | |||
| 76 | width: Math.min(implicitWidth, activeWindowDisplay.maxWidth - activeWindowIcon.width - activeWindowDisplayContent.spacing) | ||
| 77 | |||
| 78 | property var appAliases: { "Firefox": "Mozilla Firefox", "mpv Media Player": "mpv", "Thunderbird": "Mozilla Thunderbird", "Thunderbird (LMU)": "Mozilla Thunderbird" } | ||
| 79 | |||
| 80 | elide: Text.ElideRight | ||
| 81 | maximumLineCount: 1 | ||
| 82 | color: "white" | ||
| 83 | anchors.verticalCenter: parent.verticalCenter | ||
| 84 | text: { | ||
| 85 | if (!activeWindowDisplay.activeWindow) | ||
| 86 | return ""; | ||
| 87 | |||
| 88 | var title = activeWindowDisplay.activeWindow.title; | ||
| 89 | var appName = activeWindowDisplay.windowEntry?.name; | ||
| 90 | if (appAliases[appName]) | ||
| 91 | appName = appAliases[appName]; | ||
| 92 | if (appName && title.endsWith(appName)) { | ||
| 93 | const oldTitle = title; | ||
| 94 | title = title.substring(0, title.length - appName.length); | ||
| 95 | title = title.replace(/\s*(—|-)\s*$/, ""); | ||
| 96 | if (!title) | ||
| 97 | title = oldTitle; | ||
| 98 | } | ||
| 99 | return title; | ||
| 100 | } | ||
| 101 | } | ||
| 102 | } | ||
| 103 | } | ||
| 104 | } | ||
| 105 | |||
| 106 | Loader { | ||
| 107 | id: tooltipLoader | ||
| 108 | |||
| 109 | active: false | ||
| 110 | |||
| 111 | Connections { | ||
| 112 | target: widgetMouseArea | ||
| 113 | function onContainsMouseChanged() { | ||
| 114 | if (widgetMouseArea.containsMouse) | ||
| 115 | tooltipLoader.active = true; | ||
| 116 | } | ||
| 117 | } | ||
| 118 | |||
| 119 | PopupWindow { | ||
| 120 | id: tooltip | ||
| 121 | |||
| 122 | property bool nextVisible: widgetMouseArea.containsMouse || tooltipMouseArea.containsMouse | ||
| 123 | |||
| 124 | anchor { | ||
| 125 | item: widgetMouseArea | ||
| 126 | edges: Edges.Bottom | Edges.Left | ||
| 127 | } | ||
| 128 | visible: false | ||
| 129 | |||
| 130 | onNextVisibleChanged: hangTimer.restart() | ||
| 131 | |||
| 132 | Timer { | ||
| 133 | id: hangTimer | ||
| 134 | interval: tooltip.visible ? 100 : 500 | ||
| 135 | onTriggered: { | ||
| 136 | tooltip.visible = tooltip.nextVisible; | ||
| 137 | if (!tooltip.visible) | ||
| 138 | tooltipLoader.active = false; | ||
| 139 | } | ||
| 140 | } | ||
| 141 | |||
| 142 | implicitWidth: widgetTooltipText.contentWidth + 16 | ||
| 143 | implicitHeight: widgetTooltipText.contentHeight + 16 | ||
| 144 | color: "black" | ||
| 145 | |||
| 146 | WrapperMouseArea { | ||
| 147 | id: tooltipMouseArea | ||
| 148 | |||
| 149 | hoverEnabled: true | ||
| 150 | enabled: true | ||
| 151 | |||
| 152 | anchors.fill: parent | ||
| 153 | |||
| 154 | Item { | ||
| 155 | anchors.fill: parent | ||
| 156 | |||
| 157 | Text { | ||
| 158 | id: widgetTooltipText | ||
| 159 | |||
| 160 | anchors.centerIn: parent | ||
| 161 | |||
| 162 | font.pointSize: 10 | ||
| 163 | font.family: "Fira Mono" | ||
| 164 | color: "white" | ||
| 165 | |||
| 166 | text: JSON.stringify(Object.assign({}, activeWindowDisplay.activeWindow), null, 2) | ||
| 167 | } | ||
| 168 | } | ||
| 169 | } | ||
| 170 | } | ||
| 171 | } | ||
| 172 | } | ||
diff --git a/accounts/gkleen@skadhi/shell/quickshell/Bar.qml b/accounts/gkleen@skadhi/shell/quickshell/Bar.qml new file mode 100644 index 00000000..fdaa8f56 --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell/Bar.qml | |||
| @@ -0,0 +1,138 @@ | |||
| 1 | import Quickshell | ||
| 2 | import Quickshell.Wayland | ||
| 3 | import QtQuick | ||
| 4 | import qs.Services | ||
| 5 | |||
| 6 | PanelWindow { | ||
| 7 | id: bar | ||
| 8 | |||
| 9 | WlrLayershell.namespace: "bar" | ||
| 10 | |||
| 11 | property bool haveMaximizedWindow: { | ||
| 12 | let currWindowId = Array.from(NiriService.workspaces).find(ws => { | ||
| 13 | return ws.output === bar.screen.name && ws.is_active; | ||
| 14 | })?.active_window_id; | ||
| 15 | let activeWindowTileSize = Array.from(NiriService.windows).find(win => win.id == currWindowId)?.layout?.tile_size; | ||
| 16 | |||
| 17 | if (!activeWindowTileSize) | ||
| 18 | return false; | ||
| 19 | return activeWindowTileSize[0] >= bar.screen.width && activeWindowTileSize[1] >= bar.screen.height - bar.height; | ||
| 20 | } | ||
| 21 | |||
| 22 | anchors { | ||
| 23 | top: true | ||
| 24 | left: true | ||
| 25 | right: true | ||
| 26 | } | ||
| 27 | margins { | ||
| 28 | left: bar.haveMaximizedWindow ? 0 : 8 + 2 | ||
| 29 | right: bar.haveMaximizedWindow ? 0 : 8 + 2 | ||
| 30 | } | ||
| 31 | |||
| 32 | implicitHeight: 21 | ||
| 33 | color: "transparent" | ||
| 34 | |||
| 35 | property bool haveScreenshare: Array.from(NiriService.casts).some(cast => cast.target.Output?.name == bar.screen.name) | ||
| 36 | |||
| 37 | Rectangle { | ||
| 38 | color: Qt.rgba(bar.haveScreenshare ? 0.2 : 0, 0, 0, bar.haveMaximizedWindow ? 1 : 0.75) | ||
| 39 | anchors.fill: parent | ||
| 40 | // bottomLeftRadius: 8 | ||
| 41 | // bottomRightRadius: 8 | ||
| 42 | } | ||
| 43 | |||
| 44 | Row { | ||
| 45 | id: left | ||
| 46 | |||
| 47 | height: parent.height | ||
| 48 | width: childrenRect.width | ||
| 49 | anchors.left: parent.left | ||
| 50 | anchors.leftMargin: 8 | ||
| 51 | anchors.verticalCenter: parent.verticalCenter | ||
| 52 | spacing: 8 | ||
| 53 | |||
| 54 | WorkspaceSwitcher { | ||
| 55 | screen: bar.screen | ||
| 56 | } | ||
| 57 | } | ||
| 58 | |||
| 59 | Row { | ||
| 60 | id: center | ||
| 61 | |||
| 62 | height: parent.height | ||
| 63 | width: childrenRect.width | ||
| 64 | anchors.centerIn: parent | ||
| 65 | spacing: 5 | ||
| 66 | |||
| 67 | ActiveWindowDisplay { | ||
| 68 | screen: bar.screen | ||
| 69 | maxWidth: bar.width - 2*Math.max(left.width, right.width) - 2*8 | ||
| 70 | } | ||
| 71 | } | ||
| 72 | |||
| 73 | Row { | ||
| 74 | id: right | ||
| 75 | |||
| 76 | height: parent.height | ||
| 77 | width: childrenRect.width | ||
| 78 | anchors.right: parent.right | ||
| 79 | anchors.rightMargin: 8 | ||
| 80 | anchors.verticalCenter: parent.verticalCenter | ||
| 81 | spacing: 0 | ||
| 82 | |||
| 83 | WorktimeWidget {} | ||
| 84 | |||
| 85 | KeyboardLayout {} | ||
| 86 | |||
| 87 | Item { | ||
| 88 | visible: privacy.visible || ytDlp.visible | ||
| 89 | height: parent.height | ||
| 90 | width: 8 - 4 | ||
| 91 | } | ||
| 92 | |||
| 93 | PrivacyWidget { | ||
| 94 | id: privacy | ||
| 95 | } | ||
| 96 | |||
| 97 | Item { | ||
| 98 | visible: privacy.visible && ytDlp.visible | ||
| 99 | height: parent.height | ||
| 100 | width: 8 - 4 | ||
| 101 | } | ||
| 102 | |||
| 103 | YtDlpWidget { | ||
| 104 | id: ytDlp | ||
| 105 | } | ||
| 106 | |||
| 107 | Item { | ||
| 108 | visible: privacy.visible || ytDlp.visible | ||
| 109 | height: parent.height | ||
| 110 | width: 8 - 4 | ||
| 111 | } | ||
| 112 | |||
| 113 | SystemTray {} | ||
| 114 | |||
| 115 | PipewireWidget {} | ||
| 116 | |||
| 117 | BrightnessWidget {} | ||
| 118 | |||
| 119 | BatteryWidget {} | ||
| 120 | |||
| 121 | LockscreenInhibitorWidget {} | ||
| 122 | |||
| 123 | WaylandInhibitorWidget { | ||
| 124 | window: bar | ||
| 125 | } | ||
| 126 | |||
| 127 | LidSwitchInhibitorWidget {} | ||
| 128 | |||
| 129 | NotificationInhibitorWidget {} | ||
| 130 | |||
| 131 | Item { | ||
| 132 | height: parent.height | ||
| 133 | width: 8 - 4 | ||
| 134 | } | ||
| 135 | |||
| 136 | Clock {} | ||
| 137 | } | ||
| 138 | } \ No newline at end of file | ||
diff --git a/accounts/gkleen@skadhi/shell/quickshell/BatteryWidget.qml b/accounts/gkleen@skadhi/shell/quickshell/BatteryWidget.qml new file mode 100644 index 00000000..f465fa20 --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell/BatteryWidget.qml | |||
| @@ -0,0 +1,139 @@ | |||
| 1 | import QtQuick | ||
| 2 | import Quickshell | ||
| 3 | import Quickshell.Widgets | ||
| 4 | import Quickshell.Services.UPower | ||
| 5 | |||
| 6 | Item { | ||
| 7 | id: root | ||
| 8 | |||
| 9 | height: parent.height | ||
| 10 | width: batteryIcon.width + 8 | ||
| 11 | anchors.verticalCenter: parent.verticalCenter | ||
| 12 | |||
| 13 | property var batteryDevice: Array.from(UPower.devices.values).find(dev => dev.isLaptopBattery) | ||
| 14 | |||
| 15 | WrapperMouseArea { | ||
| 16 | id: widgetMouseArea | ||
| 17 | |||
| 18 | anchors.fill: parent | ||
| 19 | |||
| 20 | hoverEnabled: true | ||
| 21 | |||
| 22 | Item { | ||
| 23 | anchors.fill: parent | ||
| 24 | |||
| 25 | MaterialDesignIcon { | ||
| 26 | id: batteryIcon | ||
| 27 | |||
| 28 | implicitSize: 14 | ||
| 29 | anchors.centerIn: parent | ||
| 30 | |||
| 31 | icon: { | ||
| 32 | if (!root.batteryDevice?.ready) | ||
| 33 | return "battery-unknown"; | ||
| 34 | |||
| 35 | if (root.batteryDevice.state == UPowerDeviceState.FullyCharged) | ||
| 36 | return "power-plug-battery"; | ||
| 37 | |||
| 38 | const perdec = 10 * Math.max(1, Math.ceil(root.batteryDevice.percentage * 10)); | ||
| 39 | if (root.batteryDevice.state == UPowerDeviceState.Charging) | ||
| 40 | return `battery-charging-${perdec}`; | ||
| 41 | if (perdec == 100) | ||
| 42 | return "battery"; | ||
| 43 | return `battery-${perdec}`; | ||
| 44 | } | ||
| 45 | color: { | ||
| 46 | if (!root.batteryDevice?.ready) | ||
| 47 | return "#555"; | ||
| 48 | |||
| 49 | if (root.batteryDevice.state != UPowerDeviceState.FullyCharged && root.batteryDevice.state != UPowerDeviceState.Charging && root.batteryDevice.timeToEmpty < 20 * 60) | ||
| 50 | return "#f2201f"; | ||
| 51 | if (root.batteryDevice.state != UPowerDeviceState.FullyCharged && root.batteryDevice.state != UPowerDeviceState.Charging && root.batteryDevice.timeToEmpty < 40 * 60) | ||
| 52 | return "#f28a21"; | ||
| 53 | if (root.batteryDevice.state != UPowerDeviceState.FullyCharged) | ||
| 54 | return "#fff"; | ||
| 55 | return "#555"; | ||
| 56 | } | ||
| 57 | } | ||
| 58 | } | ||
| 59 | } | ||
| 60 | |||
| 61 | PopupWindow { | ||
| 62 | id: tooltip | ||
| 63 | |||
| 64 | property bool nextVisible: widgetMouseArea.containsMouse || tooltipMouseArea.containsMouse | ||
| 65 | |||
| 66 | anchor { | ||
| 67 | item: widgetMouseArea | ||
| 68 | edges: Edges.Bottom | Edges.Left | ||
| 69 | } | ||
| 70 | visible: false | ||
| 71 | |||
| 72 | onNextVisibleChanged: hangTimer.restart() | ||
| 73 | |||
| 74 | Timer { | ||
| 75 | id: hangTimer | ||
| 76 | interval: 100 | ||
| 77 | onTriggered: tooltip.visible = tooltip.nextVisible | ||
| 78 | } | ||
| 79 | |||
| 80 | implicitWidth: widgetTooltipText.contentWidth + 16 | ||
| 81 | implicitHeight: widgetTooltipText.contentHeight + 16 | ||
| 82 | color: "black" | ||
| 83 | |||
| 84 | WrapperMouseArea { | ||
| 85 | id: tooltipMouseArea | ||
| 86 | |||
| 87 | hoverEnabled: true | ||
| 88 | enabled: true | ||
| 89 | |||
| 90 | anchors.fill: parent | ||
| 91 | |||
| 92 | Item { | ||
| 93 | anchors.fill: parent | ||
| 94 | |||
| 95 | Text { | ||
| 96 | id: widgetTooltipText | ||
| 97 | |||
| 98 | anchors.centerIn: parent | ||
| 99 | |||
| 100 | font.pointSize: 10 | ||
| 101 | font.family: "Fira Sans" | ||
| 102 | color: "white" | ||
| 103 | |||
| 104 | text: { | ||
| 105 | if (!root.batteryDevice?.ready) | ||
| 106 | return "Not ready"; | ||
| 107 | |||
| 108 | const stateStr = UPowerDeviceState.toString(root.batteryDevice.state); | ||
| 109 | var outStr = stateStr; | ||
| 110 | if (root.batteryDevice.state !== UPowerDeviceState.FullyCharged) | ||
| 111 | outStr += ` ${Math.round(root.batteryDevice.percentage * 100)}%`; | ||
| 112 | |||
| 113 | function formatTime(t) { | ||
| 114 | var res = ""; | ||
| 115 | for (const unit of [{ "s": "h", "v": 3600 }, { "s": "m", "v": 60 }, { "s": "s", "v": 1 }]) { | ||
| 116 | if (t < unit.v) | ||
| 117 | continue; | ||
| 118 | res += Math.floor(t / unit.v) + unit.s; | ||
| 119 | t %= unit.v; | ||
| 120 | } | ||
| 121 | return res; | ||
| 122 | } | ||
| 123 | if (root.batteryDevice.timeToEmpty != 0) { | ||
| 124 | const tStr = formatTime(Math.floor(root.batteryDevice.timeToEmpty / 60) * 60); | ||
| 125 | if (tStr) | ||
| 126 | outStr += " " + tStr; | ||
| 127 | } else if (root.batteryDevice.timeToFull != 0) { | ||
| 128 | const tStr = formatTime(Math.ceil(root.batteryDevice.timeToFull / 60) * 60); | ||
| 129 | if (tStr) | ||
| 130 | outStr += " " + tStr; | ||
| 131 | } | ||
| 132 | |||
| 133 | return outStr; | ||
| 134 | } | ||
| 135 | } | ||
| 136 | } | ||
| 137 | } | ||
| 138 | } | ||
| 139 | } | ||
diff --git a/accounts/gkleen@skadhi/shell/quickshell/BrightnessOSD.qml b/accounts/gkleen@skadhi/shell/quickshell/BrightnessOSD.qml new file mode 100644 index 00000000..a432179e --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell/BrightnessOSD.qml | |||
| @@ -0,0 +1,117 @@ | |||
| 1 | import QtQuick | ||
| 2 | import QtQuick.Layouts | ||
| 3 | import Quickshell | ||
| 4 | import Quickshell.Widgets | ||
| 5 | import qs.Services | ||
| 6 | |||
| 7 | Scope { | ||
| 8 | id: root | ||
| 9 | |||
| 10 | property bool show: false | ||
| 11 | property bool inhibited: true | ||
| 12 | |||
| 13 | Connections { | ||
| 14 | target: Brightness | ||
| 15 | |||
| 16 | function onCurrBrightnessChanged() { | ||
| 17 | root.show = true; | ||
| 18 | hideTimer.restart(); | ||
| 19 | } | ||
| 20 | } | ||
| 21 | |||
| 22 | onShowChanged: { | ||
| 23 | if (show) | ||
| 24 | hideTimer.restart(); | ||
| 25 | } | ||
| 26 | |||
| 27 | Timer { | ||
| 28 | id: hideTimer | ||
| 29 | interval: 1000 | ||
| 30 | onTriggered: root.show = false | ||
| 31 | } | ||
| 32 | |||
| 33 | Timer { | ||
| 34 | id: startInhibit | ||
| 35 | interval: 100 | ||
| 36 | running: true | ||
| 37 | onTriggered: { | ||
| 38 | root.show = false; | ||
| 39 | root.inhibited = false; | ||
| 40 | } | ||
| 41 | } | ||
| 42 | |||
| 43 | LazyLoader { | ||
| 44 | active: root.show && !root.inhibited | ||
| 45 | |||
| 46 | Variants { | ||
| 47 | model: Quickshell.screens | ||
| 48 | |||
| 49 | delegate: Scope { | ||
| 50 | id: screenScope | ||
| 51 | |||
| 52 | required property var modelData | ||
| 53 | |||
| 54 | PanelWindow { | ||
| 55 | id: window | ||
| 56 | |||
| 57 | screen: screenScope.modelData | ||
| 58 | |||
| 59 | anchors.top: true | ||
| 60 | margins.top: screen.height / 2 - 50 + 3.5 | ||
| 61 | exclusiveZone: 0 | ||
| 62 | exclusionMode: ExclusionMode.Ignore | ||
| 63 | |||
| 64 | implicitWidth: 400 | ||
| 65 | implicitHeight: 50 | ||
| 66 | |||
| 67 | mask: Region {} | ||
| 68 | |||
| 69 | color: "transparent" | ||
| 70 | |||
| 71 | Rectangle { | ||
| 72 | anchors.fill: parent | ||
| 73 | color: Qt.rgba(0, 0, 0, 0.75) | ||
| 74 | } | ||
| 75 | |||
| 76 | RowLayout { | ||
| 77 | id: layout | ||
| 78 | |||
| 79 | anchors.centerIn: parent | ||
| 80 | |||
| 81 | height: 50 - 8*2 | ||
| 82 | width: 400 - 8*2 | ||
| 83 | |||
| 84 | MaterialDesignIcon { | ||
| 85 | id: volumeIcon | ||
| 86 | |||
| 87 | implicitWidth: parent.height | ||
| 88 | implicitHeight: parent.height | ||
| 89 | |||
| 90 | icon: `brightness-${Math.min(7, Math.floor(Brightness.currBrightness * 7) + 1)}` | ||
| 91 | } | ||
| 92 | |||
| 93 | Rectangle { | ||
| 94 | Layout.fillWidth: true | ||
| 95 | |||
| 96 | implicitHeight: 10 | ||
| 97 | |||
| 98 | color: "#50ffffff" | ||
| 99 | |||
| 100 | Rectangle { | ||
| 101 | anchors { | ||
| 102 | left: parent.left | ||
| 103 | top: parent.top | ||
| 104 | bottom: parent.bottom | ||
| 105 | } | ||
| 106 | |||
| 107 | color: "white" | ||
| 108 | |||
| 109 | implicitWidth: parent.width * Brightness.currBrightness | ||
| 110 | } | ||
| 111 | } | ||
| 112 | } | ||
| 113 | } | ||
| 114 | } | ||
| 115 | } | ||
| 116 | } | ||
| 117 | } | ||
diff --git a/accounts/gkleen@skadhi/shell/quickshell/BrightnessWidget.qml b/accounts/gkleen@skadhi/shell/quickshell/BrightnessWidget.qml new file mode 100644 index 00000000..3bb5a80e --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell/BrightnessWidget.qml | |||
| @@ -0,0 +1,84 @@ | |||
| 1 | import QtQuick | ||
| 2 | import Quickshell | ||
| 3 | import Quickshell.Widgets | ||
| 4 | import qs.Services | ||
| 5 | |||
| 6 | Item { | ||
| 7 | height: parent.height | ||
| 8 | width: brightnessIcon.width + 8 | ||
| 9 | anchors.verticalCenter: parent.verticalCenter | ||
| 10 | |||
| 11 | WrapperMouseArea { | ||
| 12 | id: widgetMouseArea | ||
| 13 | |||
| 14 | anchors.fill: parent | ||
| 15 | |||
| 16 | hoverEnabled: true | ||
| 17 | |||
| 18 | property real sensitivity: (1 / 50) / 120 | ||
| 19 | onWheel: event => Brightness.currBrightness += event.angleDelta.y * sensitivity | ||
| 20 | |||
| 21 | Item { | ||
| 22 | anchors.fill: parent | ||
| 23 | |||
| 24 | MaterialDesignIcon { | ||
| 25 | id: brightnessIcon | ||
| 26 | |||
| 27 | implicitSize: 14 | ||
| 28 | anchors.centerIn: parent | ||
| 29 | |||
| 30 | icon: `brightness-${Math.min(7, Math.floor(Brightness.currBrightness * 7) + 1)}` | ||
| 31 | color: "#555" | ||
| 32 | } | ||
| 33 | } | ||
| 34 | } | ||
| 35 | |||
| 36 | PopupWindow { | ||
| 37 | id: tooltip | ||
| 38 | |||
| 39 | property bool nextVisible: widgetMouseArea.containsMouse || tooltipMouseArea.containsMouse | ||
| 40 | |||
| 41 | anchor { | ||
| 42 | item: widgetMouseArea | ||
| 43 | edges: Edges.Bottom | Edges.Left | ||
| 44 | } | ||
| 45 | visible: false | ||
| 46 | |||
| 47 | onNextVisibleChanged: hangTimer.restart() | ||
| 48 | |||
| 49 | Timer { | ||
| 50 | id: hangTimer | ||
| 51 | interval: 100 | ||
| 52 | onTriggered: tooltip.visible = tooltip.nextVisible | ||
| 53 | } | ||
| 54 | |||
| 55 | implicitWidth: widgetTooltipText.contentWidth + 16 | ||
| 56 | implicitHeight: widgetTooltipText.contentHeight + 16 | ||
| 57 | color: "black" | ||
| 58 | |||
| 59 | WrapperMouseArea { | ||
| 60 | id: tooltipMouseArea | ||
| 61 | |||
| 62 | hoverEnabled: true | ||
| 63 | enabled: true | ||
| 64 | |||
| 65 | anchors.fill: parent | ||
| 66 | |||
| 67 | Item { | ||
| 68 | anchors.fill: parent | ||
| 69 | |||
| 70 | Text { | ||
| 71 | id: widgetTooltipText | ||
| 72 | |||
| 73 | anchors.centerIn: parent | ||
| 74 | |||
| 75 | font.pointSize: 10 | ||
| 76 | font.family: "Fira Sans" | ||
| 77 | color: "white" | ||
| 78 | |||
| 79 | text: `${Math.round(Brightness.currBrightness * 100)}%` | ||
| 80 | } | ||
| 81 | } | ||
| 82 | } | ||
| 83 | } | ||
| 84 | } | ||
diff --git a/accounts/gkleen@skadhi/shell/quickshell/Clock.qml b/accounts/gkleen@skadhi/shell/quickshell/Clock.qml new file mode 100644 index 00000000..58a80b8b --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell/Clock.qml | |||
| @@ -0,0 +1,295 @@ | |||
| 1 | import QtQml | ||
| 2 | import QtQuick | ||
| 3 | import Quickshell | ||
| 4 | import Custom as Custom | ||
| 5 | import QtQuick.Controls | ||
| 6 | import QtQuick.Layouts | ||
| 7 | import Quickshell.Widgets | ||
| 8 | |||
| 9 | Item { | ||
| 10 | id: clockItem | ||
| 11 | |||
| 12 | property bool calendarPopup: true | ||
| 13 | |||
| 14 | width: clock.contentWidth | ||
| 15 | height: parent.height | ||
| 16 | anchors.verticalCenter: parent.verticalCenter | ||
| 17 | |||
| 18 | WrapperMouseArea { | ||
| 19 | id: clockMouseArea | ||
| 20 | |||
| 21 | anchors.fill: parent | ||
| 22 | hoverEnabled: true | ||
| 23 | enabled: clockItem.calendarPopup | ||
| 24 | |||
| 25 | Item { | ||
| 26 | anchors.fill: parent | ||
| 27 | |||
| 28 | Text { | ||
| 29 | id: clock | ||
| 30 | color: "white" | ||
| 31 | |||
| 32 | anchors.verticalCenter: parent.verticalCenter | ||
| 33 | |||
| 34 | Custom.Chrono { | ||
| 35 | id: chrono | ||
| 36 | |||
| 37 | onDateChanged: clock.text = format("W{0:%V-%u} {0:%F} {0:%H:%M:%S%Ez}") | ||
| 38 | } | ||
| 39 | |||
| 40 | font.pointSize: 10 | ||
| 41 | font.family: "Fira Sans" | ||
| 42 | font.features: { "tnum": 1 } | ||
| 43 | } | ||
| 44 | } | ||
| 45 | } | ||
| 46 | |||
| 47 | Loader { | ||
| 48 | id: tooltipLoader | ||
| 49 | |||
| 50 | active: false | ||
| 51 | |||
| 52 | Connections { | ||
| 53 | target: clockMouseArea | ||
| 54 | function onContainsMouseChanged() { | ||
| 55 | if (clockMouseArea.containsMouse) | ||
| 56 | tooltipLoader.active = true; | ||
| 57 | } | ||
| 58 | } | ||
| 59 | |||
| 60 | sourceComponent: PopupWindow { | ||
| 61 | id: tooltip | ||
| 62 | |||
| 63 | property bool nextVisible: clockMouseArea.containsMouse || tooltipMouseArea.containsMouse | ||
| 64 | |||
| 65 | anchor { | ||
| 66 | item: clockMouseArea | ||
| 67 | edges: Edges.Bottom | Edges.Left | ||
| 68 | } | ||
| 69 | visible: false | ||
| 70 | |||
| 71 | onNextVisibleChanged: hangTimer.restart() | ||
| 72 | |||
| 73 | Timer { | ||
| 74 | id: hangTimer | ||
| 75 | interval: 100 | ||
| 76 | onTriggered: { | ||
| 77 | tooltip.visible = tooltip.nextVisible; | ||
| 78 | if (!tooltip.visible) | ||
| 79 | tooltipLoader.active = false; | ||
| 80 | } | ||
| 81 | } | ||
| 82 | |||
| 83 | implicitWidth: tooltipLayout.childrenRect.width + 16 | ||
| 84 | implicitHeight: tooltipLayout.childrenRect.height + 16 | ||
| 85 | color: "black" | ||
| 86 | |||
| 87 | onVisibleChanged: { | ||
| 88 | yearCalendar.year = chrono.date.getFullYear(); | ||
| 89 | yearCalendar.angleRem = 0; | ||
| 90 | } | ||
| 91 | |||
| 92 | WrapperMouseArea { | ||
| 93 | id: tooltipMouseArea | ||
| 94 | |||
| 95 | hoverEnabled: true | ||
| 96 | enabled: true | ||
| 97 | |||
| 98 | onWheel: event => yearCalendar.scrollYear(event) | ||
| 99 | |||
| 100 | anchors.fill: parent | ||
| 101 | |||
| 102 | Item { | ||
| 103 | id: clockTooltipContent | ||
| 104 | |||
| 105 | anchors.fill: parent | ||
| 106 | |||
| 107 | ColumnLayout { | ||
| 108 | id: tooltipLayout | ||
| 109 | |||
| 110 | anchors { | ||
| 111 | left: parent.left | ||
| 112 | top: parent.top | ||
| 113 | leftMargin: 8 | ||
| 114 | topMargin: 8 | ||
| 115 | } | ||
| 116 | |||
| 117 | Text { | ||
| 118 | id: yearLabel | ||
| 119 | |||
| 120 | horizontalAlignment: Text.AlignHCenter | ||
| 121 | |||
| 122 | font.pointSize: 14 | ||
| 123 | font.family: "Fira Sans" | ||
| 124 | font.features: { "tnum": 1 } | ||
| 125 | color: "white" | ||
| 126 | |||
| 127 | text: yearCalendar.year | ||
| 128 | |||
| 129 | Layout.fillWidth: true | ||
| 130 | Layout.bottomMargin: 8 | ||
| 131 | } | ||
| 132 | |||
| 133 | GridLayout { | ||
| 134 | property int year: chrono.date.getFullYear() | ||
| 135 | |||
| 136 | id: yearCalendar | ||
| 137 | |||
| 138 | columns: 3 | ||
| 139 | columnSpacing: 16 | ||
| 140 | rowSpacing: 16 | ||
| 141 | |||
| 142 | Layout.alignment: Qt.AlignHCenter | ||
| 143 | Layout.fillWidth: false | ||
| 144 | |||
| 145 | property real angleRem: 0 | ||
| 146 | property real sensitivity: 1 / 120 | ||
| 147 | |||
| 148 | function scrollYear(event) { | ||
| 149 | angleRem += event.angleDelta.y; | ||
| 150 | const d = Math.round(angleRem * sensitivity); | ||
| 151 | yearCalendar.year -= d; | ||
| 152 | angleRem -= d / sensitivity; | ||
| 153 | } | ||
| 154 | |||
| 155 | Connections { | ||
| 156 | target: clockMouseArea | ||
| 157 | function onWheel(event) { yearCalendar.scrollYear(event); } | ||
| 158 | } | ||
| 159 | |||
| 160 | Repeater { | ||
| 161 | model: 12 | ||
| 162 | |||
| 163 | GridLayout { | ||
| 164 | columns: 2 | ||
| 165 | |||
| 166 | required property int index | ||
| 167 | property int month: index | ||
| 168 | |||
| 169 | id: monthCalendar | ||
| 170 | |||
| 171 | Layout.alignment: Qt.AlignTop | Qt.AlignRight | ||
| 172 | Layout.fillWidth: false | ||
| 173 | |||
| 174 | Text { | ||
| 175 | Layout.column: 1 | ||
| 176 | Layout.fillWidth: true | ||
| 177 | |||
| 178 | horizontalAlignment: Text.AlignHCenter | ||
| 179 | |||
| 180 | font.pointSize: 10 | ||
| 181 | font.family: "Fira Sans" | ||
| 182 | |||
| 183 | text: new Date(yearCalendar.year, monthCalendar.month, 1).toLocaleString(Qt.locale("en_DK"), "MMMM") | ||
| 184 | |||
| 185 | color: "#ffead3" | ||
| 186 | } | ||
| 187 | |||
| 188 | DayOfWeekRow { | ||
| 189 | locale: grid.locale | ||
| 190 | |||
| 191 | Layout.row: 1 | ||
| 192 | Layout.column: 1 | ||
| 193 | Layout.fillWidth: true | ||
| 194 | |||
| 195 | delegate: WrapperItem { | ||
| 196 | required property string shortName | ||
| 197 | |||
| 198 | width: dowLabel.contentWidth + 6 | ||
| 199 | |||
| 200 | Text { | ||
| 201 | id: dowLabel | ||
| 202 | |||
| 203 | anchors.fill: parent | ||
| 204 | |||
| 205 | font.pointSize: 10 | ||
| 206 | font.family: "Fira Sans" | ||
| 207 | |||
| 208 | text: parent.shortName | ||
| 209 | color: "#ffcc66" | ||
| 210 | |||
| 211 | horizontalAlignment: Text.AlignHCenter | ||
| 212 | verticalAlignment: Text.AlignVCenter | ||
| 213 | } | ||
| 214 | } | ||
| 215 | } | ||
| 216 | |||
| 217 | WeekNumberColumn { | ||
| 218 | month: grid.month | ||
| 219 | year: grid.year | ||
| 220 | locale: grid.locale | ||
| 221 | |||
| 222 | Layout.fillHeight: true | ||
| 223 | |||
| 224 | delegate: Text { | ||
| 225 | required property int weekNumber | ||
| 226 | |||
| 227 | opacity: { | ||
| 228 | const simple = new Date(weekNumber == 1 && monthCalendar.month == 12 ? yearCalendar.year + 1 : yearCalendar.year, 0, 1 + (weekNumber - 1) * 7); | ||
| 229 | const dayOfWeek = simple.getDay(); | ||
| 230 | const isoWeekStart = simple; | ||
| 231 | |||
| 232 | isoWeekStart.setDate(simple.getDate() - dayOfWeek + 1); | ||
| 233 | if (dayOfWeek > 4) { | ||
| 234 | isoWeekStart.setDate(isoWeekStart.getDate() + 7); | ||
| 235 | } | ||
| 236 | |||
| 237 | for (let i = 0; i < 7; i++) { | ||
| 238 | const dayInWeek = new Date(isoWeekStart); | ||
| 239 | dayInWeek.setDate(dayInWeek.getDate() + i); | ||
| 240 | if (dayInWeek.getMonth() == monthCalendar.month) | ||
| 241 | return 1; | ||
| 242 | } | ||
| 243 | |||
| 244 | return 0; | ||
| 245 | } | ||
| 246 | |||
| 247 | font.pointSize: 10 | ||
| 248 | font.family: "Fira Sans" | ||
| 249 | font.features: { "tnum": 1 } | ||
| 250 | |||
| 251 | text: weekNumber | ||
| 252 | color: "#99ffdd" | ||
| 253 | |||
| 254 | horizontalAlignment: Text.AlignRight | ||
| 255 | verticalAlignment: Text.AlignVCenter | ||
| 256 | } | ||
| 257 | } | ||
| 258 | |||
| 259 | MonthGrid { | ||
| 260 | id: grid | ||
| 261 | |||
| 262 | year: yearCalendar.year | ||
| 263 | month: monthCalendar.month | ||
| 264 | locale: Qt.locale("en_DK") | ||
| 265 | |||
| 266 | Layout.fillWidth: true | ||
| 267 | Layout.fillHeight: true | ||
| 268 | |||
| 269 | delegate: Text { | ||
| 270 | required property var model | ||
| 271 | |||
| 272 | opacity: model.month === monthCalendar.month ? 1 : 0 | ||
| 273 | |||
| 274 | font.pointSize: 10 | ||
| 275 | font.family: "Fira Sans" | ||
| 276 | font.features: { "tnum": 1 } | ||
| 277 | |||
| 278 | property bool today: chrono.date.getFullYear() == model.year && chrono.date.getMonth() == model.month && chrono.date.getDate() == model.day | ||
| 279 | |||
| 280 | text: model.day | ||
| 281 | color: today ? "#ff6699" : "white" | ||
| 282 | |||
| 283 | horizontalAlignment: Text.AlignRight | ||
| 284 | verticalAlignment: Text.AlignVCenter | ||
| 285 | } | ||
| 286 | } | ||
| 287 | } | ||
| 288 | } | ||
| 289 | } | ||
| 290 | } | ||
| 291 | } | ||
| 292 | } | ||
| 293 | } | ||
| 294 | } | ||
| 295 | } | ||
diff --git a/accounts/gkleen@skadhi/shell/quickshell/KeyboardLayout.qml b/accounts/gkleen@skadhi/shell/quickshell/KeyboardLayout.qml new file mode 100644 index 00000000..46302e54 --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell/KeyboardLayout.qml | |||
| @@ -0,0 +1,112 @@ | |||
| 1 | import Quickshell | ||
| 2 | import QtQuick | ||
| 3 | import qs.Services | ||
| 4 | import Quickshell.Widgets | ||
| 5 | |||
| 6 | Item { | ||
| 7 | width: kbdLabel.contentWidth + 8 | ||
| 8 | height: parent.height | ||
| 9 | anchors.verticalCenter: parent.verticalCenter | ||
| 10 | |||
| 11 | WrapperMouseArea { | ||
| 12 | id: kbdMouseArea | ||
| 13 | |||
| 14 | anchors.fill: parent | ||
| 15 | |||
| 16 | hoverEnabled: true | ||
| 17 | cursorShape: Qt.PointingHandCursor | ||
| 18 | enabled: true | ||
| 19 | onClicked: { | ||
| 20 | NiriService.sendCommand({ "Action": { "SwitchLayout": { "layout": "Next" } } }, _ => {}) | ||
| 21 | } | ||
| 22 | onWheel: event => { | ||
| 23 | NiriService.sendCommand({ "Action": { "SwitchLayout": { "layout": event.angleDelta > 0 ? "Next" : "Prev" } } }, _ => {}) | ||
| 24 | } | ||
| 25 | |||
| 26 | Rectangle { | ||
| 27 | id: kbdWidget | ||
| 28 | |||
| 29 | property var keyboardAbbrev: { "English (programmer Dvorak)": "dvp", "English (US)": "us" } | ||
| 30 | |||
| 31 | anchors.fill: parent | ||
| 32 | color: { | ||
| 33 | if (kbdMouseArea.containsMouse) { | ||
| 34 | return "#33808080"; | ||
| 35 | } | ||
| 36 | return "transparent"; | ||
| 37 | } | ||
| 38 | |||
| 39 | Text { | ||
| 40 | id: kbdLabel | ||
| 41 | |||
| 42 | font.pointSize: 10 | ||
| 43 | font.family: "Fira Sans" | ||
| 44 | color: { | ||
| 45 | if (NiriService.keyboardLayouts?.current_idx === 0) | ||
| 46 | return "#555"; | ||
| 47 | return "white"; | ||
| 48 | } | ||
| 49 | anchors.centerIn: parent | ||
| 50 | |||
| 51 | text: { | ||
| 52 | const currentLayout = NiriService.keyboardLayouts?.names?.[NiriService.keyboardLayouts.current_idx]; | ||
| 53 | if (!currentLayout) | ||
| 54 | return ""; | ||
| 55 | return kbdWidget.keyboardAbbrev[currentLayout] ? kbdWidget.keyboardAbbrev[currentLayout] : currentLayout; | ||
| 56 | } | ||
| 57 | } | ||
| 58 | } | ||
| 59 | } | ||
| 60 | |||
| 61 | PopupWindow { | ||
| 62 | id: tooltip | ||
| 63 | |||
| 64 | property bool nextVisible: kbdMouseArea.containsMouse || tooltipMouseArea.containsMouse | ||
| 65 | |||
| 66 | anchor { | ||
| 67 | item: kbdMouseArea | ||
| 68 | edges: Edges.Bottom | Edges.Left | ||
| 69 | } | ||
| 70 | visible: false | ||
| 71 | |||
| 72 | onNextVisibleChanged: hangTimer.restart() | ||
| 73 | |||
| 74 | Timer { | ||
| 75 | id: hangTimer | ||
| 76 | interval: 100 | ||
| 77 | onTriggered: tooltip.visible = tooltip.nextVisible | ||
| 78 | } | ||
| 79 | |||
| 80 | implicitWidth: kbdTooltipText.contentWidth + 16 | ||
| 81 | implicitHeight: kbdTooltipText.contentHeight + 16 | ||
| 82 | color: "black" | ||
| 83 | |||
| 84 | WrapperMouseArea { | ||
| 85 | id: tooltipMouseArea | ||
| 86 | |||
| 87 | hoverEnabled: true | ||
| 88 | enabled: true | ||
| 89 | |||
| 90 | anchors.fill: parent | ||
| 91 | |||
| 92 | Item { | ||
| 93 | anchors.fill: parent | ||
| 94 | |||
| 95 | Text { | ||
| 96 | id: kbdTooltipText | ||
| 97 | |||
| 98 | anchors.centerIn: parent | ||
| 99 | |||
| 100 | font.pointSize: 10 | ||
| 101 | font.family: "Fira Sans" | ||
| 102 | color: "white" | ||
| 103 | |||
| 104 | text: { | ||
| 105 | const currentLayout = NiriService.keyboardLayouts?.names?.[NiriService.keyboardLayouts.current_idx]; | ||
| 106 | return currentLayout || ""; | ||
| 107 | } | ||
| 108 | } | ||
| 109 | } | ||
| 110 | } | ||
| 111 | } | ||
| 112 | } | ||
diff --git a/accounts/gkleen@skadhi/shell/quickshell/LidSwitchInhibitorWidget.qml b/accounts/gkleen@skadhi/shell/quickshell/LidSwitchInhibitorWidget.qml new file mode 100644 index 00000000..8410dcda --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell/LidSwitchInhibitorWidget.qml | |||
| @@ -0,0 +1,47 @@ | |||
| 1 | import Quickshell | ||
| 2 | import QtQuick | ||
| 3 | import Quickshell.Widgets | ||
| 4 | import qs.Services | ||
| 5 | |||
| 6 | Item { | ||
| 7 | id: root | ||
| 8 | |||
| 9 | width: icon.width + 8 | ||
| 10 | height: parent.height | ||
| 11 | anchors.verticalCenter: parent.verticalCenter | ||
| 12 | |||
| 13 | WrapperMouseArea { | ||
| 14 | id: widgetMouseArea | ||
| 15 | |||
| 16 | anchors.fill: parent | ||
| 17 | |||
| 18 | hoverEnabled: true | ||
| 19 | cursorShape: Qt.PointingHandCursor | ||
| 20 | |||
| 21 | onClicked: InhibitorState.lidSwitchInhibited = !InhibitorState.lidSwitchInhibited | ||
| 22 | |||
| 23 | Rectangle { | ||
| 24 | anchors.fill: parent | ||
| 25 | color: { | ||
| 26 | if (widgetMouseArea.containsMouse) { | ||
| 27 | return "#33808080"; | ||
| 28 | } | ||
| 29 | return "transparent"; | ||
| 30 | } | ||
| 31 | |||
| 32 | Item { | ||
| 33 | anchors.fill: parent | ||
| 34 | |||
| 35 | MaterialDesignIcon { | ||
| 36 | id: icon | ||
| 37 | |||
| 38 | implicitSize: 14 | ||
| 39 | anchors.centerIn: parent | ||
| 40 | |||
| 41 | icon: InhibitorState.lidSwitchInhibited ? "laptop-off" : "laptop" | ||
| 42 | color: InhibitorState.lidSwitchInhibited ? "#f28a21" : "#555" | ||
| 43 | } | ||
| 44 | } | ||
| 45 | } | ||
| 46 | } | ||
| 47 | } | ||
diff --git a/accounts/gkleen@skadhi/shell/quickshell/LockSurface.qml b/accounts/gkleen@skadhi/shell/quickshell/LockSurface.qml new file mode 100644 index 00000000..f4f8f0cd --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell/LockSurface.qml | |||
| @@ -0,0 +1,227 @@ | |||
| 1 | import Quickshell.Widgets | ||
| 2 | import QtQuick.Effects | ||
| 3 | import QtQuick.Layouts | ||
| 4 | import QtQuick | ||
| 5 | import QtQuick.Controls | ||
| 6 | import QtQuick.Controls.Fusion | ||
| 7 | import qs.Services | ||
| 8 | import QtQml | ||
| 9 | |||
| 10 | Item { | ||
| 11 | id: lockSurface | ||
| 12 | |||
| 13 | property var screen | ||
| 14 | property list<var> messages: [] | ||
| 15 | property bool responseRequired: false | ||
| 16 | property bool responseVisible: false | ||
| 17 | property string currentText: "" | ||
| 18 | property bool authRunning: false | ||
| 19 | |||
| 20 | signal response(string responseText) | ||
| 21 | |||
| 22 | anchors.fill: parent | ||
| 23 | |||
| 24 | Item { | ||
| 25 | id: background | ||
| 26 | |||
| 27 | anchors.fill: parent | ||
| 28 | |||
| 29 | property Img current: one | ||
| 30 | property string source: selector.selected | ||
| 31 | |||
| 32 | WallpaperSelector { | ||
| 33 | id: selector | ||
| 34 | seed: lockSurface.screen?.name || "" | ||
| 35 | } | ||
| 36 | |||
| 37 | onSourceChanged: { | ||
| 38 | if (!source) | ||
| 39 | current = null; | ||
| 40 | else if (current === one) | ||
| 41 | two.update() | ||
| 42 | else | ||
| 43 | one.update() | ||
| 44 | } | ||
| 45 | |||
| 46 | Img { id: one } | ||
| 47 | Img { id: two } | ||
| 48 | |||
| 49 | component Img: Item { | ||
| 50 | id: img | ||
| 51 | |||
| 52 | property string source | ||
| 53 | |||
| 54 | function update() { | ||
| 55 | source = background.source || "" | ||
| 56 | } | ||
| 57 | |||
| 58 | anchors.fill: parent | ||
| 59 | |||
| 60 | Image { | ||
| 61 | id: imageSource | ||
| 62 | |||
| 63 | source: img.source | ||
| 64 | sourceSize: Qt.size(parent.width, parent.height) | ||
| 65 | fillMode: Image.PreserveAspectCrop | ||
| 66 | smooth: true | ||
| 67 | visible: false | ||
| 68 | asynchronous: true | ||
| 69 | cache: false | ||
| 70 | |||
| 71 | onStatusChanged: { | ||
| 72 | if (status === Image.Ready) { | ||
| 73 | background.current = img | ||
| 74 | } | ||
| 75 | } | ||
| 76 | } | ||
| 77 | |||
| 78 | MultiEffect { | ||
| 79 | id: imageEffect | ||
| 80 | |||
| 81 | source: imageSource | ||
| 82 | anchors.fill: parent | ||
| 83 | blurEnabled: true | ||
| 84 | blur: 1 | ||
| 85 | blurMax: 64 | ||
| 86 | blurMultiplier: 2 | ||
| 87 | |||
| 88 | opacity: 0 | ||
| 89 | |||
| 90 | states: State { | ||
| 91 | name: "visible" | ||
| 92 | when: background.current === img | ||
| 93 | |||
| 94 | PropertyChanges { | ||
| 95 | imageEffect.opacity: 1 | ||
| 96 | } | ||
| 97 | StateChangeScript { | ||
| 98 | name: "unloadOther" | ||
| 99 | script: { | ||
| 100 | if (img === one) | ||
| 101 | two.source = "" | ||
| 102 | if (img === two) | ||
| 103 | one.source = "" | ||
| 104 | } | ||
| 105 | } | ||
| 106 | } | ||
| 107 | |||
| 108 | transitions: Transition { | ||
| 109 | SequentialAnimation { | ||
| 110 | NumberAnimation { | ||
| 111 | target: imageEffect | ||
| 112 | properties: "opacity" | ||
| 113 | duration: { | ||
| 114 | if (img === one && two.source == "" || img === two && one.source == "") | ||
| 115 | return 0; | ||
| 116 | return 5000; | ||
| 117 | } | ||
| 118 | easing.type: Easing.OutCubic | ||
| 119 | } | ||
| 120 | ScriptAction { | ||
| 121 | scriptName: "unloadOther" | ||
| 122 | } | ||
| 123 | } | ||
| 124 | } | ||
| 125 | } | ||
| 126 | } | ||
| 127 | } | ||
| 128 | |||
| 129 | Item { | ||
| 130 | anchors { | ||
| 131 | top: lockSurface.top | ||
| 132 | left: lockSurface.left | ||
| 133 | right: lockSurface.right | ||
| 134 | } | ||
| 135 | |||
| 136 | implicitWidth: lockSurface.width | ||
| 137 | implicitHeight: 21 | ||
| 138 | |||
| 139 | Rectangle { | ||
| 140 | anchors.fill: parent | ||
| 141 | color: Qt.rgba(0, 0, 0, 0.75) | ||
| 142 | } | ||
| 143 | |||
| 144 | Clock { | ||
| 145 | anchors.centerIn: parent | ||
| 146 | calendarPopup: false | ||
| 147 | } | ||
| 148 | } | ||
| 149 | |||
| 150 | WrapperRectangle { | ||
| 151 | id: unlockUi | ||
| 152 | |||
| 153 | Keys.onPressed: event => { | ||
| 154 | if (!lockSurface.authRunning) { | ||
| 155 | event.accepted = true; | ||
| 156 | lockSurface.authRunning = true; | ||
| 157 | } | ||
| 158 | } | ||
| 159 | focus: !passwordBox.visible | ||
| 160 | |||
| 161 | visible: lockSurface.authRunning | ||
| 162 | |||
| 163 | color: Qt.rgba(0, 0, 0, 0.75) | ||
| 164 | margin: 8 | ||
| 165 | |||
| 166 | anchors.centerIn: parent | ||
| 167 | |||
| 168 | ColumnLayout { | ||
| 169 | spacing: 4 | ||
| 170 | |||
| 171 | BusyIndicator { | ||
| 172 | visible: running | ||
| 173 | running: !Array.from(lockSurface.messages).length && !lockSurface.responseRequired | ||
| 174 | } | ||
| 175 | |||
| 176 | Repeater { | ||
| 177 | model: lockSurface.messages | ||
| 178 | |||
| 179 | Text { | ||
| 180 | required property var modelData | ||
| 181 | |||
| 182 | font.pointSize: 10 | ||
| 183 | font.family: "Fira Sans" | ||
| 184 | color: modelData.error ? "#f28a21" : "#ffffff" | ||
| 185 | |||
| 186 | text: String(modelData.text).trim() | ||
| 187 | |||
| 188 | Layout.fillWidth: true | ||
| 189 | horizontalAlignment: Text.AlignHCenter | ||
| 190 | } | ||
| 191 | } | ||
| 192 | |||
| 193 | TextField { | ||
| 194 | id: passwordBox | ||
| 195 | |||
| 196 | visible: lockSurface.responseRequired | ||
| 197 | echoMode: lockSurface.responseVisible ? TextInput.Normal : TextInput.Password | ||
| 198 | inputMethodHints: Qt.ImhSensitiveData | ||
| 199 | |||
| 200 | onTextChanged: lockSurface.currentText = passwordBox.text | ||
| 201 | onAccepted: { | ||
| 202 | passwordBox.readOnly = true; | ||
| 203 | lockSurface.response(lockSurface.currentText); | ||
| 204 | } | ||
| 205 | |||
| 206 | Connections { | ||
| 207 | target: lockSurface | ||
| 208 | function onCurrentTextChanged() { | ||
| 209 | passwordBox.text = lockSurface.currentText | ||
| 210 | } | ||
| 211 | } | ||
| 212 | Connections { | ||
| 213 | target: lockSurface | ||
| 214 | function onResponseRequiredChanged() { | ||
| 215 | if (lockSurface.responseRequired) | ||
| 216 | passwordBox.readOnly = false; | ||
| 217 | passwordBox.focus = true; | ||
| 218 | passwordBox.selectAll(); | ||
| 219 | } | ||
| 220 | } | ||
| 221 | |||
| 222 | Layout.topMargin: 4 | ||
| 223 | Layout.fillWidth: true | ||
| 224 | } | ||
| 225 | } | ||
| 226 | } | ||
| 227 | } | ||
diff --git a/accounts/gkleen@skadhi/shell/quickshell/Lockscreen.qml b/accounts/gkleen@skadhi/shell/quickshell/Lockscreen.qml new file mode 100644 index 00000000..373692df --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell/Lockscreen.qml | |||
| @@ -0,0 +1,128 @@ | |||
| 1 | import Quickshell | ||
| 2 | import Quickshell.Wayland | ||
| 3 | import Quickshell.Io | ||
| 4 | import Quickshell.Services.Pam | ||
| 5 | import Quickshell.Services.Mpris | ||
| 6 | import Custom as Custom | ||
| 7 | import qs.Services | ||
| 8 | import QtQml | ||
| 9 | |||
| 10 | Scope { | ||
| 11 | id: lockscreen | ||
| 12 | |||
| 13 | property string currentText: "" | ||
| 14 | |||
| 15 | PamContext { | ||
| 16 | id: pam | ||
| 17 | |||
| 18 | property list<var> messages: [] | ||
| 19 | |||
| 20 | config: "quickshell" | ||
| 21 | onCompleted: result => { | ||
| 22 | if (result === PamResult.Success) { | ||
| 23 | lock.locked = false; | ||
| 24 | } | ||
| 25 | } | ||
| 26 | onPamMessage: { | ||
| 27 | messages = Array.from(messages).concat([{ "text": pam.message, "error": pam.messageIsError }]) | ||
| 28 | } | ||
| 29 | onActiveChanged: { | ||
| 30 | messages = []; | ||
| 31 | } | ||
| 32 | } | ||
| 33 | |||
| 34 | Connections { | ||
| 35 | target: Custom.Systemd | ||
| 36 | function onPrepareForSleep(before: bool) { | ||
| 37 | console.log(`received prepare for sleep ${before}`); | ||
| 38 | if (before) { | ||
| 39 | lock.locked = true; | ||
| 40 | if (pam.active) | ||
| 41 | pam.abort(); | ||
| 42 | } | ||
| 43 | } | ||
| 44 | function onLock() { lock.locked = true; } | ||
| 45 | function onUnlock() { lock.locked = false; } | ||
| 46 | } | ||
| 47 | |||
| 48 | IdleMonitor { | ||
| 49 | id: idleMonitor | ||
| 50 | enabled: !lock.secure && !InhibitorState.lockscreenInhibited | ||
| 51 | timeout: 600 | ||
| 52 | respectInhibitors: true | ||
| 53 | |||
| 54 | onIsIdleChanged: { | ||
| 55 | if (idleMonitor.isIdle) | ||
| 56 | lock.locked = true; | ||
| 57 | } | ||
| 58 | } | ||
| 59 | |||
| 60 | Custom.SystemdInhibitor { | ||
| 61 | enabled: !lock.secure | ||
| 62 | |||
| 63 | what: Custom.SystemdInhibitorParams.Sleep | ||
| 64 | who: "quickshell" | ||
| 65 | why: "Lock session" | ||
| 66 | mode: Custom.SystemdInhibitorParams.Delay | ||
| 67 | } | ||
| 68 | |||
| 69 | Binding { | ||
| 70 | target: NotificationManager | ||
| 71 | property: "lockscreenActive" | ||
| 72 | value: lock.locked | ||
| 73 | } | ||
| 74 | |||
| 75 | WlSessionLock { | ||
| 76 | id: lock | ||
| 77 | |||
| 78 | onLockStateChanged: { | ||
| 79 | if (!locked && pam.active) | ||
| 80 | pam.abort(); | ||
| 81 | |||
| 82 | if (locked) { | ||
| 83 | NiriService.sendCommand({ "Action": { "PowerOffMonitors": {} } }, _ => {}); | ||
| 84 | Custom.KeePassXC.lockAllDatabases(); | ||
| 85 | Array.from(MprisProxy.players).forEach(player => { | ||
| 86 | if (player.canPause && player.isPlaying) | ||
| 87 | player.pause(); | ||
| 88 | }); | ||
| 89 | // Custom.Systemd.stopUserUnit("gpg-agent.service", "replace"); | ||
| 90 | GpgAgent.reloadAgent(); | ||
| 91 | } | ||
| 92 | } | ||
| 93 | Component.onCompleted: { (_ => {})(MprisProxy.players); } | ||
| 94 | |||
| 95 | onSecureStateChanged: Custom.Systemd.lockedHint = lock.secure | ||
| 96 | |||
| 97 | WlSessionLockSurface { | ||
| 98 | id: lockSurface | ||
| 99 | |||
| 100 | color: "black" | ||
| 101 | |||
| 102 | LockSurface { | ||
| 103 | id: surfaceContent | ||
| 104 | |||
| 105 | onResponse: responseText => pam.respond(responseText) | ||
| 106 | onAuthRunningChanged: { | ||
| 107 | if (authRunning) | ||
| 108 | pam.start(); | ||
| 109 | } | ||
| 110 | Connections { | ||
| 111 | target: pam | ||
| 112 | function onMessagesChanged() { surfaceContent.messages = pam.messages; } | ||
| 113 | function onResponseRequiredChanged() { surfaceContent.responseRequired = pam.responseRequired; } | ||
| 114 | function onActiveChanged() { surfaceContent.authRunning = pam.active; } | ||
| 115 | } | ||
| 116 | onCurrentTextChanged: lockscreen.currentText = currentText | ||
| 117 | Connections { | ||
| 118 | target: lockscreen | ||
| 119 | function onCurrentTextChanged() { surfaceContent.currentText = lockscreen.currentText; } | ||
| 120 | } | ||
| 121 | Connections { | ||
| 122 | target: lockSurface | ||
| 123 | function onScreenChanged() { surfaceContent.screen = lockSurface.screen; } | ||
| 124 | } | ||
| 125 | } | ||
| 126 | } | ||
| 127 | } | ||
| 128 | } | ||
diff --git a/accounts/gkleen@skadhi/shell/quickshell/LockscreenInhibitorWidget.qml b/accounts/gkleen@skadhi/shell/quickshell/LockscreenInhibitorWidget.qml new file mode 100644 index 00000000..1cbf3f16 --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell/LockscreenInhibitorWidget.qml | |||
| @@ -0,0 +1,48 @@ | |||
| 1 | import Quickshell | ||
| 2 | import QtQuick | ||
| 3 | import Quickshell.Widgets | ||
| 4 | import qs.Services | ||
| 5 | |||
| 6 | Item { | ||
| 7 | id: root | ||
| 8 | |||
| 9 | width: icon.width + 8 | ||
| 10 | height: parent.height | ||
| 11 | anchors.verticalCenter: parent.verticalCenter | ||
| 12 | |||
| 13 | WrapperMouseArea { | ||
| 14 | id: widgetMouseArea | ||
| 15 | |||
| 16 | anchors.fill: parent | ||
| 17 | |||
| 18 | // enabled: InhibitorState.lockscreenInhibited || !InhibitorState.waylandIdleInhibited | ||
| 19 | hoverEnabled: true | ||
| 20 | cursorShape: widgetMouseArea.enabled ? Qt.PointingHandCursor : undefined | ||
| 21 | |||
| 22 | onClicked: InhibitorState.lockscreenInhibited = !InhibitorState.lockscreenInhibited | ||
| 23 | |||
| 24 | Rectangle { | ||
| 25 | anchors.fill: parent | ||
| 26 | color: { | ||
| 27 | if (widgetMouseArea.containsMouse) { | ||
| 28 | return "#33808080"; | ||
| 29 | } | ||
| 30 | return "transparent"; | ||
| 31 | } | ||
| 32 | |||
| 33 | Item { | ||
| 34 | anchors.fill: parent | ||
| 35 | |||
| 36 | MaterialDesignIcon { | ||
| 37 | id: icon | ||
| 38 | |||
| 39 | implicitSize: 14 | ||
| 40 | anchors.centerIn: parent | ||
| 41 | |||
| 42 | icon: InhibitorState.lockscreenInhibited || InhibitorState.waylandIdleInhibited ? "lock-off" : "lock" | ||
| 43 | color: InhibitorState.lockscreenInhibited ? "#f28a21" : "#555" | ||
| 44 | } | ||
| 45 | } | ||
| 46 | } | ||
| 47 | } | ||
| 48 | } | ||
diff --git a/accounts/gkleen@skadhi/shell/quickshell/MaterialDesignIcon.qml b/accounts/gkleen@skadhi/shell/quickshell/MaterialDesignIcon.qml new file mode 100644 index 00000000..155a009e --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell/MaterialDesignIcon.qml | |||
| @@ -0,0 +1,35 @@ | |||
| 1 | import QtQuick | ||
| 2 | import QtQuick.Effects | ||
| 3 | |||
| 4 | Item { | ||
| 5 | id: root | ||
| 6 | |||
| 7 | required property string icon | ||
| 8 | property color color: "white" | ||
| 9 | |||
| 10 | property real implicitSize: 0 | ||
| 11 | |||
| 12 | readonly property real actualSize: Math.min(root.width, root.height) | ||
| 13 | |||
| 14 | implicitWidth: root.implicitSize | ||
| 15 | implicitHeight: root.implicitSize | ||
| 16 | |||
| 17 | Image { | ||
| 18 | id: sourceImage | ||
| 19 | source: "file://" + @mdi@ + "/svg/" + root.icon + ".svg" | ||
| 20 | anchors.fill: parent | ||
| 21 | fillMode: Image.PreserveAspectFit | ||
| 22 | |||
| 23 | sourceSize.width: root.actualSize | ||
| 24 | sourceSize.height: root.actualSize | ||
| 25 | |||
| 26 | layer.enabled: true | ||
| 27 | layer.effect: MultiEffect { | ||
| 28 | id: effect | ||
| 29 | |||
| 30 | brightness: 1 | ||
| 31 | colorization: 1 | ||
| 32 | colorizationColor: root.color | ||
| 33 | } | ||
| 34 | } | ||
| 35 | } | ||
diff --git a/accounts/gkleen@skadhi/shell/quickshell/NiriIdle.qml b/accounts/gkleen@skadhi/shell/quickshell/NiriIdle.qml new file mode 100644 index 00000000..fb1cfa4d --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell/NiriIdle.qml | |||
| @@ -0,0 +1,30 @@ | |||
| 1 | import QtQml | ||
| 2 | import Quickshell | ||
| 3 | import Quickshell.Wayland | ||
| 4 | import qs.Services | ||
| 5 | import Custom as Custom | ||
| 6 | |||
| 7 | Scope { | ||
| 8 | IdleMonitor { | ||
| 9 | id: idleMonitor30 | ||
| 10 | timeout: 30 | ||
| 11 | |||
| 12 | onIsIdleChanged: Custom.Systemd.setIdleHint(idleMonitor30.isIdle) | ||
| 13 | } | ||
| 14 | IdleMonitor { | ||
| 15 | id: idleMonitor540 | ||
| 16 | timeout: 540 | ||
| 17 | |||
| 18 | onIsIdleChanged: { | ||
| 19 | if (idleMonitor540.isIdle) | ||
| 20 | NiriService.sendCommand({ "Action": { "PowerOffMonitors": {} } }, _ => {}); | ||
| 21 | } | ||
| 22 | } | ||
| 23 | Connections { | ||
| 24 | target: Custom.Systemd | ||
| 25 | function onPrepareForSleep(before: bool) { | ||
| 26 | if (!before) | ||
| 27 | NiriService.sendCommand({ "Action": { "PowerOnMonitors": {} } }, _ => {}); | ||
| 28 | } | ||
| 29 | } | ||
| 30 | } | ||
diff --git a/accounts/gkleen@skadhi/shell/quickshell/NotificationDisplay.qml b/accounts/gkleen@skadhi/shell/quickshell/NotificationDisplay.qml new file mode 100644 index 00000000..51c3f9f7 --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell/NotificationDisplay.qml | |||
| @@ -0,0 +1,340 @@ | |||
| 1 | import QtQml | ||
| 2 | import QtQml.Models | ||
| 3 | import QtQuick | ||
| 4 | import Quickshell | ||
| 5 | import Quickshell.Widgets | ||
| 6 | import Quickshell.Wayland | ||
| 7 | import qs.Services | ||
| 8 | import QtQuick.Layouts | ||
| 9 | import Quickshell.Services.Notifications | ||
| 10 | |||
| 11 | Scope { | ||
| 12 | id: root | ||
| 13 | |||
| 14 | property var activeScreen: Array.from(Quickshell.screens).find(screen => screen.name === Array.from(NiriService.workspaces).find(ws => ws.is_focused)?.output) ?? null | ||
| 15 | |||
| 16 | Instantiator { | ||
| 17 | id: notifsRepeater | ||
| 18 | |||
| 19 | model: ScriptModel { | ||
| 20 | values: NotificationManager.groups | ||
| 21 | } | ||
| 22 | |||
| 23 | delegate: PanelWindow { | ||
| 24 | id: notifWindow | ||
| 25 | |||
| 26 | visible: NotificationManager.active | ||
| 27 | |||
| 28 | screen: root.activeScreen | ||
| 29 | |||
| 30 | WlrLayershell.namespace: "notifications" | ||
| 31 | |||
| 32 | required property var modelData | ||
| 33 | required property var index | ||
| 34 | |||
| 35 | property int activeIx: modelData.length - 1 | ||
| 36 | onModelDataChanged: { | ||
| 37 | notifWindow.activeIx = modelData.length - 1; | ||
| 38 | } | ||
| 39 | |||
| 40 | property color textColor: { | ||
| 41 | if (notifWindow.modelData?.[notifWindow.activeIx]?.urgency == NotificationUrgency.Low) | ||
| 42 | return "#ff999999"; | ||
| 43 | return "white"; | ||
| 44 | } | ||
| 45 | property color backgroundColor: { | ||
| 46 | if (notifWindow.modelData?.[notifWindow.activeIx]?.urgency == NotificationUrgency.Critical) | ||
| 47 | return "#dd900000"; | ||
| 48 | return "black"; | ||
| 49 | } | ||
| 50 | |||
| 51 | anchors { | ||
| 52 | right: true | ||
| 53 | top: true | ||
| 54 | } | ||
| 55 | |||
| 56 | readonly property real spaceAbove: { | ||
| 57 | var res = 0; | ||
| 58 | for (let i = 0; i < notifWindow.index; i++) { | ||
| 59 | (_ => {})(notifsRepeater.objectAt(i).modelData); | ||
| 60 | res += notifsRepeater.objectAt(i).height + 8; | ||
| 61 | } | ||
| 62 | return res; | ||
| 63 | } | ||
| 64 | |||
| 65 | margins { | ||
| 66 | right: 2 + 8 | ||
| 67 | top: 8 + spaceAbove | ||
| 68 | } | ||
| 69 | |||
| 70 | color: "transparent" | ||
| 71 | |||
| 72 | implicitHeight: Math.max(notifCount.visible ? notifCount.contentHeight : 0, notifSummary.contentHeight) + (notifBody.visible ? 8 + notifBody.contentHeight : 0) + (notifActions.visible ? 8 + notifActions.height : 0) + (notifTime.visible ? 8 + notifTime.contentHeight : 0) + 16 | ||
| 73 | implicitWidth: 400 | ||
| 74 | |||
| 75 | WrapperMouseArea { | ||
| 76 | enabled: true | ||
| 77 | |||
| 78 | anchors.fill: parent | ||
| 79 | |||
| 80 | cursorShape: Qt.PointingHandCursor | ||
| 81 | |||
| 82 | onClicked: { | ||
| 83 | for (const notif of notifWindow.modelData) | ||
| 84 | notif.dismiss(); | ||
| 85 | } | ||
| 86 | |||
| 87 | property real angleRem: 0 | ||
| 88 | property real sensitivity: 1 / 120 | ||
| 89 | onWheel: event => { | ||
| 90 | angleRem += event.angleDelta.y; | ||
| 91 | const d = Math.round(angleRem * sensitivity); | ||
| 92 | angleRem -= d / sensitivity; | ||
| 93 | notifWindow.activeIx = ((notifWindow.modelData?.length ?? 1) + notifWindow.activeIx - d) % (notifWindow.modelData?.length ?? 1); | ||
| 94 | } | ||
| 95 | |||
| 96 | Rectangle { | ||
| 97 | color: notifWindow.backgroundColor | ||
| 98 | anchors.fill: parent | ||
| 99 | border { | ||
| 100 | color: Qt.hsla(195/360, 1, 0.45, 1) | ||
| 101 | width: 2 | ||
| 102 | } | ||
| 103 | |||
| 104 | GridLayout { | ||
| 105 | id: notifLayout | ||
| 106 | |||
| 107 | width: 400 - 16 | ||
| 108 | anchors.fill: parent | ||
| 109 | anchors.margins: 8 | ||
| 110 | columnSpacing: 8 | ||
| 111 | rowSpacing: 8 | ||
| 112 | |||
| 113 | columns: notifImage.visible ? 3 : 2 | ||
| 114 | rows: { | ||
| 115 | var res = 1; | ||
| 116 | if (notifBody.visible) | ||
| 117 | res += 1; | ||
| 118 | if (notifActions.visible) | ||
| 119 | res += 1; | ||
| 120 | if (notifTime.visible) | ||
| 121 | res += 1; | ||
| 122 | return res; | ||
| 123 | } | ||
| 124 | |||
| 125 | Text { | ||
| 126 | id: notifCount | ||
| 127 | |||
| 128 | visible: notifWindow.modelData?.length > 1 ?? false | ||
| 129 | text: `${notifWindow.activeIx + 1}/${notifWindow.modelData?.length ?? ""}` | ||
| 130 | |||
| 131 | font.pointSize: 10 | ||
| 132 | font.family: "Fira Sans" | ||
| 133 | font.bold: true | ||
| 134 | font.features: { "tnum": 1 } | ||
| 135 | color: notifWindow.textColor | ||
| 136 | maximumLineCount: 1 | ||
| 137 | |||
| 138 | Layout.fillWidth: false | ||
| 139 | Layout.row: 0 | ||
| 140 | Layout.column: notifImage.visible ? 1 : 0 | ||
| 141 | } | ||
| 142 | |||
| 143 | Text { | ||
| 144 | id: notifSummary | ||
| 145 | |||
| 146 | text: notifWindow.modelData?.[notifWindow.activeIx]?.summary ?? "" | ||
| 147 | |||
| 148 | font.pointSize: 10 | ||
| 149 | font.family: "Fira Sans" | ||
| 150 | font.italic: true | ||
| 151 | color: notifWindow.textColor | ||
| 152 | maximumLineCount: 1 | ||
| 153 | elide: Text.ElideRight | ||
| 154 | |||
| 155 | Layout.fillWidth: true | ||
| 156 | Layout.row: 0 | ||
| 157 | Layout.column: (notifCount.visible ? 1 : 0) + (notifImage.visible ? 1 : 0) | ||
| 158 | Layout.columnSpan: notifCount.visible ? 1 : 2 | ||
| 159 | } | ||
| 160 | |||
| 161 | Image { | ||
| 162 | id: notifImage | ||
| 163 | |||
| 164 | visible: (notifWindow.modelData?.[notifWindow.activeIx]?.image || notifWindow.modelData?.[notifWindow.activeIx]?.appIcon) ?? false | ||
| 165 | |||
| 166 | onStatusChanged: { | ||
| 167 | if (notifImage.status == Image.Error) | ||
| 168 | notifImage.visible = false; | ||
| 169 | } | ||
| 170 | |||
| 171 | source: (notifWindow.modelData?.[notifWindow.activeIx]?.image || notifWindow.modelData?.[notifWindow.activeIx]?.appIcon) ?? "" | ||
| 172 | fillMode: Image.PreserveAspectFit | ||
| 173 | asynchronous: true | ||
| 174 | smooth: true | ||
| 175 | mipmap: true | ||
| 176 | |||
| 177 | Layout.maximumWidth: 50 | ||
| 178 | Layout.column: 0 | ||
| 179 | Layout.row: 0 | ||
| 180 | Layout.fillHeight: true | ||
| 181 | Layout.rowSpan: 1 + (notifBody.visible ? 1 : 0) + (notifTime.visible ? 1 : 0) | ||
| 182 | } | ||
| 183 | |||
| 184 | Text { | ||
| 185 | id: notifBody | ||
| 186 | |||
| 187 | visible: notifWindow.modelData?.[notifWindow.activeIx]?.body ?? false | ||
| 188 | text: notifWindow.modelData?.[notifWindow.activeIx]?.body ?? "" | ||
| 189 | textFormat: Text.RichText | ||
| 190 | wrapMode: Text.Wrap | ||
| 191 | |||
| 192 | font.pointSize: 10 | ||
| 193 | font.family: "Fira Sans" | ||
| 194 | color: notifWindow.textColor | ||
| 195 | |||
| 196 | Layout.fillWidth: true | ||
| 197 | Layout.row: 1 | ||
| 198 | Layout.column: notifImage.visible ? 1 : 0 | ||
| 199 | Layout.columnSpan: notifCount.visible ? 2 : 1 | ||
| 200 | } | ||
| 201 | |||
| 202 | Text { | ||
| 203 | id: notifTime | ||
| 204 | |||
| 205 | Connections { | ||
| 206 | target: NotificationManager.clock | ||
| 207 | function onDateChanged() { | ||
| 208 | notifTime.text = NotificationManager.formatTime(notifWindow.modelData?.[notifWindow.activeIx]?.receivedTime); | ||
| 209 | } | ||
| 210 | } | ||
| 211 | |||
| 212 | visible: notifTime.text && notifTime.text !== "now" | ||
| 213 | text: NotificationManager.formatTime(notifWindow.modelData?.[notifWindow.activeIx]?.receivedTime) | ||
| 214 | |||
| 215 | font.pointSize: 8 | ||
| 216 | font.family: "Fira Sans" | ||
| 217 | font.italic: true | ||
| 218 | color: "#555" | ||
| 219 | maximumLineCount: 1 | ||
| 220 | horizontalAlignment: Text.AlignRight | ||
| 221 | |||
| 222 | Layout.fillWidth: true | ||
| 223 | Layout.row: notifBody.visible ? 2 : 1 | ||
| 224 | Layout.column: notifImage.visible ? 1 : 0 | ||
| 225 | Layout.columnSpan: 2 | ||
| 226 | } | ||
| 227 | |||
| 228 | RowLayout { | ||
| 229 | id: notifActions | ||
| 230 | |||
| 231 | visible: notifWindow.modelData?.[notifWindow.activeIx]?.actions.length > 0 ?? false | ||
| 232 | |||
| 233 | spacing: 8 | ||
| 234 | uniformCellSizes: true | ||
| 235 | |||
| 236 | width: 400 - 16 | ||
| 237 | Layout.row: 1 + (notifBody.visible ? 1 : 0) + (notifTime.visible ? 1 : 0) | ||
| 238 | Layout.column: 0 | ||
| 239 | Layout.columnSpan: 2 + (notifImage.visible ? 1 : 0) | ||
| 240 | |||
| 241 | Repeater { | ||
| 242 | model: ScriptModel { | ||
| 243 | values: notifWindow.modelData?.[notifWindow.activeIx]?.actions | ||
| 244 | } | ||
| 245 | |||
| 246 | delegate: WrapperMouseArea { | ||
| 247 | id: actionMouseArea | ||
| 248 | |||
| 249 | required property var modelData | ||
| 250 | |||
| 251 | height: actionLabelWrapper.implicitHeight | ||
| 252 | Layout.fillWidth: true | ||
| 253 | Layout.horizontalStretchFactor: 1 | ||
| 254 | |||
| 255 | hoverEnabled: true | ||
| 256 | cursorShape: Qt.PointingHandCursor | ||
| 257 | |||
| 258 | onClicked: actionMouseArea.modelData?.invoke() | ||
| 259 | |||
| 260 | Rectangle { | ||
| 261 | anchors.fill: parent | ||
| 262 | |||
| 263 | color: actionMouseArea.containsMouse ? "#20ffffff" : "transparent" | ||
| 264 | |||
| 265 | border { | ||
| 266 | width: 2 | ||
| 267 | color: "#20ffffff" | ||
| 268 | } | ||
| 269 | |||
| 270 | WrapperItem { | ||
| 271 | id: actionLabelWrapper | ||
| 272 | |||
| 273 | margin: 8 | ||
| 274 | anchors.centerIn: parent | ||
| 275 | |||
| 276 | RowLayout { | ||
| 277 | id: actionLabelLayout | ||
| 278 | |||
| 279 | spacing: 8 | ||
| 280 | |||
| 281 | IconImage { | ||
| 282 | id: actionIcon | ||
| 283 | |||
| 284 | visible: notifWindow.modelData?.[notifWindow.activeIx]?.hasActionIcons | ||
| 285 | |||
| 286 | onStatusChanged: { | ||
| 287 | if (actionIcon.status == Image.Error) | ||
| 288 | actionIcon.visible = false; | ||
| 289 | } | ||
| 290 | |||
| 291 | implicitSize: 16 | ||
| 292 | source: { | ||
| 293 | if (!actionIcon.visible) | ||
| 294 | return ""; | ||
| 295 | |||
| 296 | let icon = actionMouseArea.modelData?.identifier ?? "" | ||
| 297 | if (icon.includes("?path=")) { | ||
| 298 | const split = icon.split("?path=") | ||
| 299 | if (split.length !== 2) | ||
| 300 | return icon | ||
| 301 | const name = split[0] | ||
| 302 | const path = split[1] | ||
| 303 | const fileName = name.substring( | ||
| 304 | name.lastIndexOf("/") + 1) | ||
| 305 | return `file://${path}/${fileName}` | ||
| 306 | } | ||
| 307 | return icon | ||
| 308 | } | ||
| 309 | asynchronous: true | ||
| 310 | smooth: true | ||
| 311 | mipmap: true | ||
| 312 | |||
| 313 | Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter | ||
| 314 | } | ||
| 315 | |||
| 316 | Text { | ||
| 317 | id: actionLabel | ||
| 318 | |||
| 319 | visible: actionMouseArea.modelData?.text ?? false | ||
| 320 | |||
| 321 | text: actionMouseArea.modelData?.text ?? "" | ||
| 322 | |||
| 323 | font.pointSize: 10 | ||
| 324 | font.family: "Fira Sans" | ||
| 325 | color: notifWindow.textColor | ||
| 326 | maximumLineCount: 1 | ||
| 327 | elide: Text.ElideRight | ||
| 328 | } | ||
| 329 | } | ||
| 330 | } | ||
| 331 | } | ||
| 332 | } | ||
| 333 | } | ||
| 334 | } | ||
| 335 | } | ||
| 336 | } | ||
| 337 | } | ||
| 338 | } | ||
| 339 | } | ||
| 340 | } | ||
diff --git a/accounts/gkleen@skadhi/shell/quickshell/NotificationInhibitorWidget.qml b/accounts/gkleen@skadhi/shell/quickshell/NotificationInhibitorWidget.qml new file mode 100644 index 00000000..80cbba19 --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell/NotificationInhibitorWidget.qml | |||
| @@ -0,0 +1,266 @@ | |||
| 1 | import Quickshell | ||
| 2 | import QtQuick | ||
| 3 | import Quickshell.Widgets | ||
| 4 | import qs.Services | ||
| 5 | import QtQuick.Controls | ||
| 6 | import QtQuick.Layouts | ||
| 7 | import QtQuick.Shapes | ||
| 8 | |||
| 9 | Item { | ||
| 10 | id: root | ||
| 11 | |||
| 12 | width: icon.width + 8 | ||
| 13 | height: parent.height | ||
| 14 | anchors.verticalCenter: parent.verticalCenter | ||
| 15 | |||
| 16 | WrapperMouseArea { | ||
| 17 | id: widgetMouseArea | ||
| 18 | |||
| 19 | anchors.fill: parent | ||
| 20 | |||
| 21 | hoverEnabled: true | ||
| 22 | cursorShape: Qt.PointingHandCursor | ||
| 23 | |||
| 24 | onClicked: NotificationManager.displayInhibited = !NotificationManager.displayInhibited | ||
| 25 | |||
| 26 | Rectangle { | ||
| 27 | anchors.fill: parent | ||
| 28 | color: { | ||
| 29 | if (widgetMouseArea.containsMouse) { | ||
| 30 | return "#33808080"; | ||
| 31 | } | ||
| 32 | return "transparent"; | ||
| 33 | } | ||
| 34 | |||
| 35 | Item { | ||
| 36 | anchors.fill: parent | ||
| 37 | |||
| 38 | MaterialDesignIcon { | ||
| 39 | id: icon | ||
| 40 | |||
| 41 | implicitSize: 14 | ||
| 42 | anchors.centerIn: parent | ||
| 43 | |||
| 44 | icon: NotificationManager.active ? "message" : "message-off" | ||
| 45 | color: { | ||
| 46 | if (!NotificationManager.active && !NotificationManager.displayInhibited) | ||
| 47 | return "#f28a21"; | ||
| 48 | if (NotificationManager.displayInhibited) | ||
| 49 | return "white"; | ||
| 50 | return "#555"; | ||
| 51 | } | ||
| 52 | } | ||
| 53 | } | ||
| 54 | } | ||
| 55 | } | ||
| 56 | |||
| 57 | Loader { | ||
| 58 | id: tooltipLoader | ||
| 59 | |||
| 60 | active: false | ||
| 61 | |||
| 62 | Connections { | ||
| 63 | target: widgetMouseArea | ||
| 64 | function onContainsMouseChanged() { | ||
| 65 | if (widgetMouseArea.containsMouse) | ||
| 66 | tooltipLoader.active = true; | ||
| 67 | } | ||
| 68 | } | ||
| 69 | |||
| 70 | sourceComponent: PopupWindow { | ||
| 71 | id: tooltip | ||
| 72 | |||
| 73 | property bool nextVisible: NotificationManager.active && NotificationManager.history.length > 0 && (widgetMouseArea.containsMouse || tooltipMouseArea.containsMouse) | ||
| 74 | |||
| 75 | anchor { | ||
| 76 | item: widgetMouseArea | ||
| 77 | edges: Edges.Bottom | Edges.Left | ||
| 78 | } | ||
| 79 | visible: false | ||
| 80 | |||
| 81 | onNextVisibleChanged: hangTimer.restart() | ||
| 82 | |||
| 83 | Timer { | ||
| 84 | id: hangTimer | ||
| 85 | interval: tooltip.visible ? 100 : 500 | ||
| 86 | onTriggered: { | ||
| 87 | tooltip.visible = tooltip.nextVisible; | ||
| 88 | if (!tooltip.visible) | ||
| 89 | tooltipLoader.active = false; | ||
| 90 | } | ||
| 91 | } | ||
| 92 | |||
| 93 | implicitWidth: 400 | ||
| 94 | implicitHeight: Math.min(tooltip.screen.height * 0.66, Math.max(100, scroll.contentHeight + 16)) | ||
| 95 | color: "black" | ||
| 96 | |||
| 97 | WrapperMouseArea { | ||
| 98 | id: tooltipMouseArea | ||
| 99 | |||
| 100 | hoverEnabled: true | ||
| 101 | enabled: true | ||
| 102 | |||
| 103 | anchors.fill: parent | ||
| 104 | |||
| 105 | WrapperItem { | ||
| 106 | margin: 8 | ||
| 107 | |||
| 108 | ScrollView { | ||
| 109 | id: scroll | ||
| 110 | |||
| 111 | contentWidth: availableWidth | ||
| 112 | // ScrollBar.vertical.policy: ScrollBar.AlwaysOn | ||
| 113 | |||
| 114 | ColumnLayout { | ||
| 115 | id: historyLayout | ||
| 116 | anchors { | ||
| 117 | left: parent.left | ||
| 118 | right: parent.right | ||
| 119 | } | ||
| 120 | |||
| 121 | spacing: 8 | ||
| 122 | |||
| 123 | Repeater { | ||
| 124 | model: ScriptModel { | ||
| 125 | values: [...NotificationManager.history].reverse().map(o => o.notification) | ||
| 126 | } | ||
| 127 | |||
| 128 | delegate: GridLayout { | ||
| 129 | id: notif | ||
| 130 | |||
| 131 | Layout.fillWidth: true | ||
| 132 | Layout.preferredHeight: notifSummary.contentHeight + (notifBody.visible ? notifBody.contentHeight + 8 : 0) + (notifSep.visible ? notifSep.height + 8 : 0) + notifTime.contentHeight + 8 | ||
| 133 | |||
| 134 | required property var modelData | ||
| 135 | required property int index | ||
| 136 | |||
| 137 | columnSpacing: 8 | ||
| 138 | rowSpacing: 8 | ||
| 139 | |||
| 140 | columns: notifImage.visible ? 2 : 1 | ||
| 141 | rows: { | ||
| 142 | var res = 2; | ||
| 143 | if (notifBody.visible) | ||
| 144 | res += 1; | ||
| 145 | if (notifSep.visible) | ||
| 146 | res += 1; | ||
| 147 | return res; | ||
| 148 | } | ||
| 149 | |||
| 150 | Shape { | ||
| 151 | id: notifSep | ||
| 152 | |||
| 153 | visible: notif.index != 0 | ||
| 154 | |||
| 155 | height: 2 | ||
| 156 | width: 400 - 32 | ||
| 157 | |||
| 158 | ShapePath { | ||
| 159 | strokeWidth: 2 | ||
| 160 | strokeColor: "#20ffffff" | ||
| 161 | startX: 0; startY: 0; | ||
| 162 | PathLine { x: 400 - 32; y: 0; } | ||
| 163 | } | ||
| 164 | |||
| 165 | Layout.row: 0 | ||
| 166 | Layout.column: 0 | ||
| 167 | Layout.columnSpan: notifImage.visible ? 2 : 1 | ||
| 168 | Layout.alignment: Qt.AlignHCenter | ||
| 169 | } | ||
| 170 | |||
| 171 | Text { | ||
| 172 | id: notifSummary | ||
| 173 | |||
| 174 | text: notif.modelData?.summary ?? "" | ||
| 175 | |||
| 176 | font.pointSize: 10 | ||
| 177 | font.family: "Fira Sans" | ||
| 178 | font.italic: true | ||
| 179 | color: "white" | ||
| 180 | maximumLineCount: 1 | ||
| 181 | elide: Text.ElideRight | ||
| 182 | |||
| 183 | Layout.fillWidth: true | ||
| 184 | Layout.row: notifSep.visible ? 1 : 0 | ||
| 185 | Layout.column: notifImage.visible ? 1 : 0 | ||
| 186 | } | ||
| 187 | |||
| 188 | Image { | ||
| 189 | id: notifImage | ||
| 190 | |||
| 191 | visible: (notif.modelData?.image || notif.modelData?.appIcon) ?? false | ||
| 192 | |||
| 193 | onStatusChanged: { | ||
| 194 | if (notifImage.status == Image.Error) | ||
| 195 | notifImage.visible = false; | ||
| 196 | } | ||
| 197 | |||
| 198 | source: (notif.modelData?.image || notif.modelData?.appIcon) ?? "" | ||
| 199 | fillMode: Image.PreserveAspectFit | ||
| 200 | asynchronous: true | ||
| 201 | smooth: true | ||
| 202 | mipmap: true | ||
| 203 | |||
| 204 | Layout.maximumWidth: 50 | ||
| 205 | Layout.column: 0 | ||
| 206 | Layout.row: notifSep.visible ? 1 : 0 | ||
| 207 | Layout.fillHeight: true | ||
| 208 | Layout.rowSpan: notifBody.visible ? 3 : 2 | ||
| 209 | } | ||
| 210 | |||
| 211 | Text { | ||
| 212 | id: notifBody | ||
| 213 | |||
| 214 | visible: notif.modelData?.body ?? false | ||
| 215 | text: notif.modelData?.body ?? "" | ||
| 216 | textFormat: Text.RichText | ||
| 217 | wrapMode: Text.Wrap | ||
| 218 | |||
| 219 | font.pointSize: 10 | ||
| 220 | font.family: "Fira Sans" | ||
| 221 | color: "white" | ||
| 222 | |||
| 223 | Layout.fillWidth: true | ||
| 224 | Layout.row: notifSep.visible ? 2 : 1 | ||
| 225 | Layout.column: notifImage.visible ? 1 : 0 | ||
| 226 | } | ||
| 227 | |||
| 228 | Text { | ||
| 229 | id: notifTime | ||
| 230 | |||
| 231 | Connections { | ||
| 232 | target: NotificationManager.clock | ||
| 233 | function onDateChanged() { | ||
| 234 | notifTime.text = NotificationManager.formatTime(notif.modelData?.receivedTime); | ||
| 235 | } | ||
| 236 | } | ||
| 237 | |||
| 238 | text: NotificationManager.formatTime(notif.modelData?.receivedTime) | ||
| 239 | |||
| 240 | font.pointSize: 8 | ||
| 241 | font.family: "Fira Sans" | ||
| 242 | font.italic: true | ||
| 243 | color: "#555" | ||
| 244 | maximumLineCount: 1 | ||
| 245 | horizontalAlignment: Text.AlignRight | ||
| 246 | |||
| 247 | Layout.fillWidth: true | ||
| 248 | Layout.row: { | ||
| 249 | var res = 1; | ||
| 250 | if (notifSep.visible) | ||
| 251 | res += 1; | ||
| 252 | if (notifBody.visible) | ||
| 253 | res += 1; | ||
| 254 | return res; | ||
| 255 | } | ||
| 256 | Layout.column: notifImage.visible ? 1 : 0 | ||
| 257 | } | ||
| 258 | } | ||
| 259 | } | ||
| 260 | } | ||
| 261 | } | ||
| 262 | } | ||
| 263 | } | ||
| 264 | } | ||
| 265 | } | ||
| 266 | } | ||
diff --git a/accounts/gkleen@skadhi/shell/quickshell/PipewireWidget.qml b/accounts/gkleen@skadhi/shell/quickshell/PipewireWidget.qml new file mode 100644 index 00000000..9c6b65a4 --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell/PipewireWidget.qml | |||
| @@ -0,0 +1,483 @@ | |||
| 1 | import QtQuick | ||
| 2 | import QtQuick.Layouts | ||
| 3 | import QtQuick.Controls.Fusion | ||
| 4 | import Quickshell | ||
| 5 | import Quickshell.Services.Pipewire | ||
| 6 | import Quickshell.Widgets | ||
| 7 | |||
| 8 | Item { | ||
| 9 | height: parent.height | ||
| 10 | width: volumeIcon.width + 8 | ||
| 11 | anchors.verticalCenter: parent.verticalCenter | ||
| 12 | |||
| 13 | PwObjectTracker { | ||
| 14 | objects: [Pipewire.defaultAudioSink] | ||
| 15 | } | ||
| 16 | |||
| 17 | WrapperMouseArea { | ||
| 18 | id: widgetMouseArea | ||
| 19 | |||
| 20 | anchors.fill: parent | ||
| 21 | hoverEnabled: true | ||
| 22 | cursorShape: Qt.PointingHandCursor | ||
| 23 | |||
| 24 | onClicked: { | ||
| 25 | if (!Pipewire.defaultAudioSink) | ||
| 26 | return; | ||
| 27 | Pipewire.defaultAudioSink.audio.muted = !Pipewire.defaultAudioSink.audio.muted; | ||
| 28 | } | ||
| 29 | |||
| 30 | property real sensitivity: (1 / 40) / 120 | ||
| 31 | onWheel: event => { | ||
| 32 | if (!Pipewire.defaultAudioSink) | ||
| 33 | return; | ||
| 34 | Pipewire.defaultAudioSink.audio.volume += event.angleDelta.y * sensitivity; | ||
| 35 | } | ||
| 36 | |||
| 37 | Rectangle { | ||
| 38 | id: volumeWidget | ||
| 39 | |||
| 40 | anchors.fill: parent | ||
| 41 | color: { | ||
| 42 | if (widgetMouseArea.containsMouse) | ||
| 43 | return "#33808080"; | ||
| 44 | return "transparent"; | ||
| 45 | } | ||
| 46 | |||
| 47 | Item { | ||
| 48 | anchors.fill: parent | ||
| 49 | |||
| 50 | MaterialDesignIcon { | ||
| 51 | id: volumeIcon | ||
| 52 | |||
| 53 | implicitSize: 14 | ||
| 54 | anchors.centerIn: parent | ||
| 55 | |||
| 56 | icon: { | ||
| 57 | if (!Pipewire.defaultAudioSink || Pipewire.defaultAudioSink.audio.muted) | ||
| 58 | return "volume-off"; | ||
| 59 | if (Pipewire.defaultAudioSink.audio.volume <= 0.33) | ||
| 60 | return "volume-low"; | ||
| 61 | if (Pipewire.defaultAudioSink.audio.volume <= 0.67) | ||
| 62 | return "volume-medium"; | ||
| 63 | return "volume-high"; | ||
| 64 | } | ||
| 65 | color: "#555" | ||
| 66 | } | ||
| 67 | } | ||
| 68 | } | ||
| 69 | } | ||
| 70 | |||
| 71 | Loader { | ||
| 72 | id: tooltipLoader | ||
| 73 | |||
| 74 | active: false | ||
| 75 | |||
| 76 | Connections { | ||
| 77 | target: widgetMouseArea | ||
| 78 | function onContainsMouseChanged() { | ||
| 79 | if (widgetMouseArea.containsMouse) | ||
| 80 | tooltipLoader.active = true; | ||
| 81 | } | ||
| 82 | } | ||
| 83 | |||
| 84 | PwObjectTracker { | ||
| 85 | objects: Pipewire.devices | ||
| 86 | } | ||
| 87 | PwObjectTracker { | ||
| 88 | objects: Pipewire.nodes | ||
| 89 | } | ||
| 90 | |||
| 91 | sourceComponent: PopupWindow { | ||
| 92 | id: tooltip | ||
| 93 | |||
| 94 | property bool openPopup: false | ||
| 95 | property bool nextVisible: widgetMouseArea.containsMouse || tooltipMouseArea.containsMouse || openPopup | ||
| 96 | |||
| 97 | anchor { | ||
| 98 | item: widgetMouseArea | ||
| 99 | edges: Edges.Bottom | Edges.Left | ||
| 100 | } | ||
| 101 | visible: false | ||
| 102 | |||
| 103 | onNextVisibleChanged: hangTimer.restart() | ||
| 104 | |||
| 105 | Timer { | ||
| 106 | id: hangTimer | ||
| 107 | interval: 100 | ||
| 108 | onTriggered: { | ||
| 109 | tooltip.visible = tooltip.nextVisible; | ||
| 110 | if (!tooltip.visible) | ||
| 111 | tooltipLoader.active = false; | ||
| 112 | } | ||
| 113 | } | ||
| 114 | |||
| 115 | implicitWidth: tooltipContent.width | ||
| 116 | implicitHeight: tooltipContent.height | ||
| 117 | color: "transparent" | ||
| 118 | |||
| 119 | Rectangle { | ||
| 120 | width: tooltip.width | ||
| 121 | height: tooltipLayout.childrenRect.height + 16 | ||
| 122 | color: "black" | ||
| 123 | } | ||
| 124 | |||
| 125 | WrapperItem { | ||
| 126 | id: tooltipContent | ||
| 127 | |||
| 128 | bottomMargin: Math.max(0, 200 - tooltipLayout.implicitHeight) | ||
| 129 | |||
| 130 | WrapperMouseArea { | ||
| 131 | id: tooltipMouseArea | ||
| 132 | |||
| 133 | hoverEnabled: true | ||
| 134 | enabled: true | ||
| 135 | |||
| 136 | WrapperItem { | ||
| 137 | margin: 8 | ||
| 138 | bottomMargin: 8 | ||
| 139 | |||
| 140 | GridLayout { | ||
| 141 | id: tooltipLayout | ||
| 142 | |||
| 143 | columns: 4 | ||
| 144 | |||
| 145 | Repeater { | ||
| 146 | model: Array.from(Pipewire.devices.values).filter(dev => dev.type == "Audio/Device") | ||
| 147 | |||
| 148 | Item { | ||
| 149 | id: descItem | ||
| 150 | |||
| 151 | required property var modelData | ||
| 152 | required property int index | ||
| 153 | |||
| 154 | Layout.column: 0 | ||
| 155 | Layout.row: index | ||
| 156 | |||
| 157 | implicitWidth: descText.contentWidth | ||
| 158 | implicitHeight: descText.contentHeight | ||
| 159 | |||
| 160 | Text { | ||
| 161 | id: descText | ||
| 162 | |||
| 163 | color: "white" | ||
| 164 | font.pointSize: 10 | ||
| 165 | font.family: "Fira Sans" | ||
| 166 | |||
| 167 | text: descItem.modelData.description | ||
| 168 | } | ||
| 169 | } | ||
| 170 | } | ||
| 171 | |||
| 172 | Repeater { | ||
| 173 | id: defaultSinkRepeater | ||
| 174 | |||
| 175 | model: { | ||
| 176 | Array.from(Pipewire.devices.values) | ||
| 177 | .filter(dev => dev.type == "Audio/Device") | ||
| 178 | .map(device => Array.from(Pipewire.nodes.values).find(node => node.type == PwNodeType.AudioSink && node.device?.id == device.id )); | ||
| 179 | } | ||
| 180 | |||
| 181 | Item { | ||
| 182 | id: defaultSinkItem | ||
| 183 | |||
| 184 | required property var modelData | ||
| 185 | required property int index | ||
| 186 | |||
| 187 | visible: Boolean(modelData) | ||
| 188 | |||
| 189 | PwObjectTracker { | ||
| 190 | objects: [defaultSinkItem.modelData] | ||
| 191 | } | ||
| 192 | |||
| 193 | Layout.column: 1 | ||
| 194 | Layout.row: index | ||
| 195 | |||
| 196 | Layout.fillHeight: true | ||
| 197 | |||
| 198 | implicitWidth: 16 + 8 | ||
| 199 | |||
| 200 | WrapperMouseArea { | ||
| 201 | id: defaultSinkMouseArea | ||
| 202 | |||
| 203 | anchors.fill: parent | ||
| 204 | hoverEnabled: true | ||
| 205 | cursorShape: Qt.PointingHandCursor | ||
| 206 | |||
| 207 | onClicked: { | ||
| 208 | Pipewire.preferredDefaultAudioSink = defaultSinkItem.modelData | ||
| 209 | } | ||
| 210 | |||
| 211 | onWheel: event => scrollVolume(event); | ||
| 212 | property real sensitivity: (1 / 40) / 120 | ||
| 213 | function scrollVolume(event) { | ||
| 214 | defaultSinkItem.modelData.audio.volume += event.angleDelta.y * sensitivity; | ||
| 215 | } | ||
| 216 | |||
| 217 | Rectangle { | ||
| 218 | id: defaultSinkWidget | ||
| 219 | |||
| 220 | anchors.fill: parent | ||
| 221 | color: { | ||
| 222 | if (defaultSinkMouseArea.containsMouse) | ||
| 223 | return "#33808080"; | ||
| 224 | return "transparent"; | ||
| 225 | } | ||
| 226 | |||
| 227 | MaterialDesignIcon { | ||
| 228 | width: 16 | ||
| 229 | height: 16 | ||
| 230 | anchors.centerIn: parent | ||
| 231 | |||
| 232 | icon: { | ||
| 233 | if (defaultSinkItem.modelData?.id == Pipewire.defaultAudioSink?.id) | ||
| 234 | return "speaker"; | ||
| 235 | return "speaker-off"; | ||
| 236 | } | ||
| 237 | color: icon == "speaker" ? "white" : "#555" | ||
| 238 | } | ||
| 239 | } | ||
| 240 | } | ||
| 241 | |||
| 242 | PopupWindow { | ||
| 243 | id: volumeTooltip | ||
| 244 | |||
| 245 | property bool nextVisible: defaultSinkMouseArea.containsMouse || volumeTooltipMouseArea.containsMouse | ||
| 246 | |||
| 247 | anchor { | ||
| 248 | item: defaultSinkMouseArea | ||
| 249 | edges: Edges.Bottom | Edges.Left | ||
| 250 | } | ||
| 251 | visible: false | ||
| 252 | |||
| 253 | onNextVisibleChanged: volumeHangTimer.restart() | ||
| 254 | |||
| 255 | onVisibleChanged: tooltip.openPopup = volumeTooltip.visible | ||
| 256 | |||
| 257 | Timer { | ||
| 258 | id: volumeHangTimer | ||
| 259 | interval: 100 | ||
| 260 | onTriggered: volumeTooltip.visible = volumeTooltip.nextVisible | ||
| 261 | } | ||
| 262 | |||
| 263 | implicitWidth: volumeTooltipText.contentWidth + 16 | ||
| 264 | implicitHeight: volumeTooltipText.contentHeight + 16 | ||
| 265 | color: "black" | ||
| 266 | |||
| 267 | WrapperMouseArea { | ||
| 268 | id: volumeTooltipMouseArea | ||
| 269 | |||
| 270 | hoverEnabled: true | ||
| 271 | enabled: true | ||
| 272 | |||
| 273 | onWheel: event => defaultSinkMouseArea.scrollVolume(event); | ||
| 274 | |||
| 275 | anchors.fill: parent | ||
| 276 | |||
| 277 | Item { | ||
| 278 | anchors.fill: parent | ||
| 279 | |||
| 280 | Text { | ||
| 281 | id: volumeTooltipText | ||
| 282 | |||
| 283 | anchors.centerIn: parent | ||
| 284 | |||
| 285 | font.pointSize: 10 | ||
| 286 | font.family: "Fira Sans" | ||
| 287 | color: "white" | ||
| 288 | |||
| 289 | text: `${Math.round(defaultSinkItem.modelData?.audio?.volume * 100)}%` | ||
| 290 | } | ||
| 291 | } | ||
| 292 | } | ||
| 293 | } | ||
| 294 | } | ||
| 295 | } | ||
| 296 | |||
| 297 | Repeater { | ||
| 298 | id: defaultSourceRepeater | ||
| 299 | |||
| 300 | model: { | ||
| 301 | Array.from(Pipewire.devices.values) | ||
| 302 | .filter(dev => dev.type == "Audio/Device") | ||
| 303 | .map(device => Array.from(Pipewire.nodes.values).find(node => node.type == PwNodeType.AudioSource && node.device?.id == device.id )); | ||
| 304 | } | ||
| 305 | |||
| 306 | Item { | ||
| 307 | id: defaultSourceItem | ||
| 308 | |||
| 309 | required property var modelData | ||
| 310 | required property int index | ||
| 311 | |||
| 312 | visible: Boolean(modelData) | ||
| 313 | |||
| 314 | PwObjectTracker { | ||
| 315 | objects: [defaultSourceItem.modelData] | ||
| 316 | } | ||
| 317 | |||
| 318 | Layout.column: 2 | ||
| 319 | Layout.row: index | ||
| 320 | |||
| 321 | Layout.fillHeight: true | ||
| 322 | |||
| 323 | implicitWidth: 16 + 8 | ||
| 324 | |||
| 325 | WrapperMouseArea { | ||
| 326 | id: defaultSourceMouseArea | ||
| 327 | |||
| 328 | anchors.fill: parent | ||
| 329 | hoverEnabled: true | ||
| 330 | cursorShape: Qt.PointingHandCursor | ||
| 331 | |||
| 332 | onClicked: { | ||
| 333 | Pipewire.preferredDefaultAudioSource = defaultSourceItem.modelData | ||
| 334 | } | ||
| 335 | |||
| 336 | onWheel: event => scrollVolume(event); | ||
| 337 | property real sensitivity: (1 / 40) / 120 | ||
| 338 | function scrollVolume(event) { | ||
| 339 | defaultSourceItem.modelData.audio.volume += event.angleDelta.y * sensitivity; | ||
| 340 | } | ||
| 341 | |||
| 342 | Rectangle { | ||
| 343 | id: defaultSourceWidget | ||
| 344 | |||
| 345 | anchors.fill: parent | ||
| 346 | color: { | ||
| 347 | if (defaultSourceMouseArea.containsMouse) | ||
| 348 | return "#33808080"; | ||
| 349 | return "transparent"; | ||
| 350 | } | ||
| 351 | |||
| 352 | MaterialDesignIcon { | ||
| 353 | width: 16 | ||
| 354 | height: 16 | ||
| 355 | anchors.centerIn: parent | ||
| 356 | |||
| 357 | icon: { | ||
| 358 | if (defaultSourceItem.modelData?.id == Pipewire.defaultAudioSource?.id) | ||
| 359 | return "microphone"; | ||
| 360 | return "microphone-off"; | ||
| 361 | } | ||
| 362 | color: icon == "microphone" ? "white" : "#555" | ||
| 363 | } | ||
| 364 | } | ||
| 365 | } | ||
| 366 | |||
| 367 | PopupWindow { | ||
| 368 | id: volumeTooltip | ||
| 369 | |||
| 370 | property bool nextVisible: defaultSourceMouseArea.containsMouse || volumeTooltipMouseArea.containsMouse | ||
| 371 | |||
| 372 | anchor { | ||
| 373 | item: defaultSourceMouseArea | ||
| 374 | edges: Edges.Bottom | Edges.Left | ||
| 375 | } | ||
| 376 | visible: false | ||
| 377 | |||
| 378 | onNextVisibleChanged: volumeHangTimer.restart() | ||
| 379 | |||
| 380 | onVisibleChanged: tooltip.openPopup = volumeTooltip.visible | ||
| 381 | |||
| 382 | Timer { | ||
| 383 | id: volumeHangTimer | ||
| 384 | interval: 100 | ||
| 385 | onTriggered: volumeTooltip.visible = volumeTooltip.nextVisible | ||
| 386 | } | ||
| 387 | |||
| 388 | implicitWidth: volumeTooltipText.contentWidth + 16 | ||
| 389 | implicitHeight: volumeTooltipText.contentHeight + 16 | ||
| 390 | color: "black" | ||
| 391 | |||
| 392 | WrapperMouseArea { | ||
| 393 | id: volumeTooltipMouseArea | ||
| 394 | |||
| 395 | hoverEnabled: true | ||
| 396 | enabled: true | ||
| 397 | |||
| 398 | onWheel: event => defaultSourceMouseArea.scrollVolume(event); | ||
| 399 | |||
| 400 | anchors.fill: parent | ||
| 401 | |||
| 402 | Item { | ||
| 403 | anchors.fill: parent | ||
| 404 | |||
| 405 | Text { | ||
| 406 | id: volumeTooltipText | ||
| 407 | |||
| 408 | anchors.centerIn: parent | ||
| 409 | |||
| 410 | font.pointSize: 10 | ||
| 411 | font.family: "Fira Sans" | ||
| 412 | color: "white" | ||
| 413 | |||
| 414 | text: `${Math.round(defaultSourceItem.modelData?.audio?.volume * 100)}%` | ||
| 415 | } | ||
| 416 | } | ||
| 417 | } | ||
| 418 | } | ||
| 419 | } | ||
| 420 | } | ||
| 421 | |||
| 422 | Repeater { | ||
| 423 | id: profileRepeater | ||
| 424 | |||
| 425 | model: Array.from(Pipewire.devices.values).filter(dev => dev.type == "Audio/Device") | ||
| 426 | |||
| 427 | Item { | ||
| 428 | id: profileItem | ||
| 429 | |||
| 430 | required property var modelData | ||
| 431 | required property int index | ||
| 432 | |||
| 433 | PwObjectTracker { | ||
| 434 | objects: [profileItem.modelData] | ||
| 435 | } | ||
| 436 | |||
| 437 | Layout.column: 3 | ||
| 438 | Layout.row: index | ||
| 439 | |||
| 440 | Layout.fillWidth: true | ||
| 441 | |||
| 442 | implicitWidth: Math.max(profileBox.implicitWidth, 300) | ||
| 443 | implicitHeight: profileBox.height | ||
| 444 | |||
| 445 | ComboBox { | ||
| 446 | id: profileBox | ||
| 447 | |||
| 448 | model: profileItem.modelData.profiles | ||
| 449 | |||
| 450 | textRole: "description" | ||
| 451 | valueRole: "index" | ||
| 452 | onActivated: profileItem.modelData.setProfile(currentValue) | ||
| 453 | |||
| 454 | anchors.fill: parent | ||
| 455 | |||
| 456 | implicitContentWidthPolicy: ComboBox.WidestText | ||
| 457 | |||
| 458 | Connections { | ||
| 459 | target: profileItem.modelData | ||
| 460 | function onCurrentProfileChanged() { | ||
| 461 | profileBox.currentIndex = Array.from(profileItem.modelData.profiles).findIndex(profile => profile.index == profileItem.modelData.currentProfile); | ||
| 462 | } | ||
| 463 | } | ||
| 464 | Component.onCompleted: { | ||
| 465 | profileBox.currentIndex = Array.from(profileItem.modelData.profiles).findIndex(profile => profile.index == profileItem.modelData.currentProfile); | ||
| 466 | } | ||
| 467 | |||
| 468 | Connections { | ||
| 469 | target: profileBox.popup | ||
| 470 | function onVisibleChanged() { | ||
| 471 | tooltip.openPopup = profileBox.popup.visible | ||
| 472 | } | ||
| 473 | } | ||
| 474 | } | ||
| 475 | } | ||
| 476 | } | ||
| 477 | } | ||
| 478 | } | ||
| 479 | } | ||
| 480 | } | ||
| 481 | } | ||
| 482 | } | ||
| 483 | } | ||
diff --git a/accounts/gkleen@skadhi/shell/quickshell/PrivacyWidget.qml b/accounts/gkleen@skadhi/shell/quickshell/PrivacyWidget.qml new file mode 100644 index 00000000..d7ffadfe --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell/PrivacyWidget.qml | |||
| @@ -0,0 +1,49 @@ | |||
| 1 | import QtQuick | ||
| 2 | import QtQuick.Layouts | ||
| 3 | import Quickshell | ||
| 4 | import Quickshell.Widgets | ||
| 5 | import qs.Services | ||
| 6 | |||
| 7 | Item { | ||
| 8 | height: parent.height | ||
| 9 | width: layout.childrenRect.width | ||
| 10 | anchors.verticalCenter: parent.verticalCenter | ||
| 11 | |||
| 12 | visible: Array.from(Privacy.activeItems).length > 0 | ||
| 13 | |||
| 14 | RowLayout { | ||
| 15 | id: layout | ||
| 16 | |||
| 17 | anchors.fill: parent | ||
| 18 | |||
| 19 | spacing: 8 | ||
| 20 | |||
| 21 | Repeater { | ||
| 22 | model: Privacy.activeItems | ||
| 23 | |||
| 24 | Item { | ||
| 25 | id: privacyItem | ||
| 26 | |||
| 27 | required property var modelData; | ||
| 28 | |||
| 29 | height: parent.height | ||
| 30 | width: icon.width | ||
| 31 | |||
| 32 | MaterialDesignIcon { | ||
| 33 | id: icon | ||
| 34 | |||
| 35 | implicitSize: 14 | ||
| 36 | anchors.centerIn: parent | ||
| 37 | |||
| 38 | icon: { | ||
| 39 | if (privacyItem.modelData == Privacy.Item.Microphone) | ||
| 40 | return "microphone"; | ||
| 41 | if (privacyItem.modelData == Privacy.Item.Screensharing) | ||
| 42 | return "monitor-share"; | ||
| 43 | } | ||
| 44 | color: "#f2201f" | ||
| 45 | } | ||
| 46 | } | ||
| 47 | } | ||
| 48 | } | ||
| 49 | } | ||
diff --git a/accounts/gkleen@skadhi/shell/quickshell/Services/Brightness.qml b/accounts/gkleen@skadhi/shell/quickshell/Services/Brightness.qml new file mode 100644 index 00000000..fc7a5355 --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell/Services/Brightness.qml | |||
| @@ -0,0 +1,107 @@ | |||
| 1 | pragma Singleton | ||
| 2 | |||
| 3 | import QtQml | ||
| 4 | import Quickshell | ||
| 5 | import Quickshell.Io | ||
| 6 | import Custom as Custom | ||
| 7 | import qs.Services | ||
| 8 | |||
| 9 | Singleton { | ||
| 10 | id: root | ||
| 11 | |||
| 12 | property string subsystem: "backlight" | ||
| 13 | property string device: "amdgpu_bl1" | ||
| 14 | |||
| 15 | property real currBrightness | ||
| 16 | property real exponent: 1 | ||
| 17 | |||
| 18 | function calcCurrBrightness() { | ||
| 19 | if (!currFile.loaded || !maxFile.loaded) | ||
| 20 | return undefined; | ||
| 21 | const curr = Number(currFile.text()); | ||
| 22 | const max = Number(maxFile.text()); | ||
| 23 | const val = Math.pow(curr / max, 1 / root.exponent); | ||
| 24 | return val; | ||
| 25 | } | ||
| 26 | |||
| 27 | Connections { | ||
| 28 | target: currFile | ||
| 29 | function onLoaded() { | ||
| 30 | const b = root.calcCurrBrightness(); | ||
| 31 | if (typeof b !== 'undefined') | ||
| 32 | root.currBrightness = b; | ||
| 33 | } | ||
| 34 | } | ||
| 35 | Connections { | ||
| 36 | target: maxFile | ||
| 37 | function onLoaded() { | ||
| 38 | const b = root.calcCurrBrightness(); | ||
| 39 | if (typeof b !== 'undefined') | ||
| 40 | root.currBrightness = b; | ||
| 41 | } | ||
| 42 | } | ||
| 43 | |||
| 44 | onCurrBrightnessChanged: { | ||
| 45 | root.currBrightness = Math.max(0, Math.min(1, root.currBrightness)); | ||
| 46 | |||
| 47 | const prev = root.calcCurrBrightness(); | ||
| 48 | if (typeof prev === 'undefined' || Math.abs(root.currBrightness - prev) < 0.01) | ||
| 49 | return; | ||
| 50 | |||
| 51 | const max = Number(maxFile.text()); | ||
| 52 | const actual = Number(currFile.text()); | ||
| 53 | let curr = Math.max(0, Math.min(max, Math.pow(root.currBrightness, root.exponent) * max)); | ||
| 54 | if (Math.round(curr) == actual && curr < actual) | ||
| 55 | curr = Math.max(0, actual - 1); | ||
| 56 | else if (Math.round(curr) == actual && curr > actual) | ||
| 57 | curr = Math.min(max, actual + 1); | ||
| 58 | // root.currBrightness = Math.pow(curr / max, 1 / root.exponent); | ||
| 59 | Custom.Systemd.setBrightness(root.subsystem, root.device, Math.round(curr)); | ||
| 60 | } | ||
| 61 | |||
| 62 | FileView { | ||
| 63 | id: currFile | ||
| 64 | path: `/sys/class/${root.subsystem}/${root.device}/brightness` | ||
| 65 | blockAllReads: true | ||
| 66 | watchChanges: true | ||
| 67 | onFileChanged: reload() | ||
| 68 | } | ||
| 69 | FileView { | ||
| 70 | id: maxFile | ||
| 71 | path: `/sys/class/${root.subsystem}/${root.device}/max_brightness` | ||
| 72 | blockAllReads: true | ||
| 73 | watchChanges: true | ||
| 74 | onFileChanged: reload() | ||
| 75 | } | ||
| 76 | |||
| 77 | |||
| 78 | Timer { | ||
| 79 | id: startupDelay | ||
| 80 | interval: 500 | ||
| 81 | running: true | ||
| 82 | repeat: false | ||
| 83 | } | ||
| 84 | property bool onlyInternal: true | ||
| 85 | Connections { | ||
| 86 | target: NiriService | ||
| 87 | function onOutputsChanged() { | ||
| 88 | root.onlyInternal = Object.keys(NiriService.outputs).every(oname => oname == "eDP-1"); | ||
| 89 | } | ||
| 90 | } | ||
| 91 | onOnlyInternalChanged: { | ||
| 92 | if (startupDelay.running) | ||
| 93 | return; | ||
| 94 | |||
| 95 | if (!root.onlyInternal) | ||
| 96 | root.currBrightness = 1 | ||
| 97 | } | ||
| 98 | |||
| 99 | |||
| 100 | IpcHandler { | ||
| 101 | target: "Brightness" | ||
| 102 | |||
| 103 | function set(brightness: real): void { | ||
| 104 | root.currBrightness = brightness; | ||
| 105 | } | ||
| 106 | } | ||
| 107 | } | ||
diff --git a/accounts/gkleen@skadhi/shell/quickshell/Services/GpgAgent.qml b/accounts/gkleen@skadhi/shell/quickshell/Services/GpgAgent.qml new file mode 100644 index 00000000..3de69535 --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell/Services/GpgAgent.qml | |||
| @@ -0,0 +1,18 @@ | |||
| 1 | pragma Singleton | ||
| 2 | |||
| 3 | import Quickshell | ||
| 4 | import Quickshell.Io | ||
| 5 | |||
| 6 | Singleton { | ||
| 7 | id: root | ||
| 8 | |||
| 9 | Socket { | ||
| 10 | id: agentSocket | ||
| 11 | connected: true | ||
| 12 | path: `${Quickshell.env("XDG_RUNTIME_DIR")}/gnupg/S.gpg-agent` | ||
| 13 | } | ||
| 14 | |||
| 15 | function reloadAgent() { | ||
| 16 | agentSocket.write("RELOADAGENT\n") | ||
| 17 | } | ||
| 18 | } | ||
diff --git a/accounts/gkleen@skadhi/shell/quickshell/Services/InhibitorState.qml b/accounts/gkleen@skadhi/shell/quickshell/Services/InhibitorState.qml new file mode 100644 index 00000000..60202a29 --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell/Services/InhibitorState.qml | |||
| @@ -0,0 +1,23 @@ | |||
| 1 | pragma Singleton | ||
| 2 | |||
| 3 | import Quickshell | ||
| 4 | import Custom as Custom | ||
| 5 | |||
| 6 | Singleton { | ||
| 7 | id: inhibitorState | ||
| 8 | |||
| 9 | property bool waylandIdleInhibited: false | ||
| 10 | property alias lidSwitchInhibited: lidSwitchInhibitor.enabled | ||
| 11 | property bool lockscreenInhibited: false | ||
| 12 | |||
| 13 | Custom.SystemdInhibitor { | ||
| 14 | id: lidSwitchInhibitor | ||
| 15 | |||
| 16 | enabled: false | ||
| 17 | |||
| 18 | what: Custom.SystemdInhibitorParams.HandleLidSwitch | ||
| 19 | who: "quickshell" | ||
| 20 | why: "User request" | ||
| 21 | mode: Custom.SystemdInhibitorParams.BlockWeak | ||
| 22 | } | ||
| 23 | } | ||
diff --git a/accounts/gkleen@skadhi/shell/quickshell/Services/MprisProxy.qml b/accounts/gkleen@skadhi/shell/quickshell/Services/MprisProxy.qml new file mode 100644 index 00000000..e3ab9755 --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell/Services/MprisProxy.qml | |||
| @@ -0,0 +1,8 @@ | |||
| 1 | pragma Singleton | ||
| 2 | |||
| 3 | import Quickshell | ||
| 4 | import Quickshell.Services.Mpris | ||
| 5 | |||
| 6 | Scope { | ||
| 7 | property list<var> players: Mpris.players.values | ||
| 8 | } | ||
diff --git a/accounts/gkleen@skadhi/shell/quickshell/Services/NiriService.qml b/accounts/gkleen@skadhi/shell/quickshell/Services/NiriService.qml new file mode 100644 index 00000000..e9e86f95 --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell/Services/NiriService.qml | |||
| @@ -0,0 +1,217 @@ | |||
| 1 | pragma Singleton | ||
| 2 | |||
| 3 | import Quickshell | ||
| 4 | import Quickshell.Io | ||
| 5 | import QtQuick | ||
| 6 | |||
| 7 | Singleton { | ||
| 8 | id: root | ||
| 9 | |||
| 10 | property var workspaces: [] | ||
| 11 | property var outputs: {} | ||
| 12 | property var keyboardLayouts: {} | ||
| 13 | property var windows: [] | ||
| 14 | property var casts: [] | ||
| 15 | readonly property string socketPath: Quickshell.env("NIRI_SOCKET") | ||
| 16 | |||
| 17 | function refreshOutputs() { | ||
| 18 | commandSocket.sendCommand("Outputs", data => { | ||
| 19 | outputs = data.Ok.Outputs; | ||
| 20 | }); | ||
| 21 | } | ||
| 22 | |||
| 23 | function sendCommand(command, callback) { | ||
| 24 | commandSocket.sendCommand(command, callback); | ||
| 25 | } | ||
| 26 | |||
| 27 | Socket { | ||
| 28 | id: eventStreamSocket | ||
| 29 | path: root.socketPath | ||
| 30 | connected: true | ||
| 31 | |||
| 32 | property bool acked: false | ||
| 33 | |||
| 34 | onConnectionStateChanged: { | ||
| 35 | if (connected) { | ||
| 36 | acked = false; | ||
| 37 | write('"EventStream"\n'); | ||
| 38 | } | ||
| 39 | } | ||
| 40 | |||
| 41 | parser: SplitParser { | ||
| 42 | onRead: line => { | ||
| 43 | try { | ||
| 44 | const event = JSON.parse(line) | ||
| 45 | |||
| 46 | // console.log(JSON.stringify(event)) | ||
| 47 | |||
| 48 | if (event.WorkspacesChanged) { | ||
| 49 | root.workspaces = event.WorkspacesChanged.workspaces | ||
| 50 | root.refreshOutputs(); | ||
| 51 | } else if (event.WorkspaceActivated) | ||
| 52 | eventWorkspaceActivated(event.WorkspaceActivated); | ||
| 53 | else if (event.WorkspaceUrgencyChanged) | ||
| 54 | eventWorkspaceUrgencyChanged(event.WorkspaceUrgencyChanged); | ||
| 55 | else if (event.WorkspaceActiveWindowChanged) | ||
| 56 | eventWorkspaceActiveWindowChanged(event.WorkspaceActiveWindowChanged); | ||
| 57 | else if (event.KeyboardLayoutsChanged) | ||
| 58 | root.keyboardLayouts = event.KeyboardLayoutsChanged.keyboard_layouts; | ||
| 59 | else if (event.KeyboardLayoutSwitched) | ||
| 60 | root.keyboardLayouts = Object.assign({}, root.keyboardLayouts, {"current_idx": event.KeyboardLayoutSwitched.idx }); | ||
| 61 | else if (event.WindowsChanged) | ||
| 62 | root.windows = event.WindowsChanged.windows | ||
| 63 | else if (event.WindowOpenedOrChanged) | ||
| 64 | eventWindowOpenedOrChanged(event.WindowOpenedOrChanged); | ||
| 65 | else if (event.WindowClosed) | ||
| 66 | eventWindowClosed(event.WindowClosed); | ||
| 67 | else if (event.WindowFocusChanged) | ||
| 68 | eventWindowFocusChanged(event.WindowFocusChanged); | ||
| 69 | else if (event.WindowUrgencyChanged) | ||
| 70 | eventWindowUrgencyChanged(event.WindowUrgencyChanged); | ||
| 71 | else if (event.WindowLayoutsChanged) | ||
| 72 | eventWindowLayoutsChanged(event.WindowLayoutsChanged); | ||
| 73 | else if (event.WindowFocusTimestampChanged) | ||
| 74 | eventWindowFocusTimestampChanged(event.WindowFocusTimestampChanged); | ||
| 75 | else if (event.CastsChanged) | ||
| 76 | root.casts = event.CastsChanged.casts | ||
| 77 | else if (event.CastStartedOrChanged) | ||
| 78 | eventCastStartedOrChanged(event.CastStartedOrChanged); | ||
| 79 | else if (event.CastStopped) | ||
| 80 | eventCastStopped(event.CastStopped); | ||
| 81 | else if (event.Ok && !eventStreamSocket.acked) { eventStreamSocket.acked = true; } | ||
| 82 | else if (event.OverviewOpenedOrClosed) {} | ||
| 83 | else if (event.ScreenshotCaptured) {} | ||
| 84 | else if (event.ConfigLoaded) {} | ||
| 85 | else | ||
| 86 | console.log(JSON.stringify(event)); | ||
| 87 | } catch (e) { | ||
| 88 | console.warn("NiriService: Failed to parse event:", line, e) | ||
| 89 | } | ||
| 90 | } | ||
| 91 | } | ||
| 92 | } | ||
| 93 | |||
| 94 | Socket { | ||
| 95 | id: commandSocket | ||
| 96 | path: root.socketPath | ||
| 97 | connected: true | ||
| 98 | |||
| 99 | property var awaitingAnswer: null | ||
| 100 | property var cmdQueue: [] | ||
| 101 | |||
| 102 | parser: SplitParser { | ||
| 103 | onRead: line => { | ||
| 104 | if (commandSocket.awaitingAnswer === null) | ||
| 105 | return; | ||
| 106 | |||
| 107 | try { | ||
| 108 | const response = JSON.parse(line); | ||
| 109 | commandSocket.awaitingAnswer.callback(response); | ||
| 110 | commandSocket.awaitingAnswer = null; | ||
| 111 | } catch (e) { | ||
| 112 | console.warn("NiriService: Failed to parse response:", line, e) | ||
| 113 | } | ||
| 114 | commandSocket._handleQueue(); | ||
| 115 | } | ||
| 116 | } | ||
| 117 | |||
| 118 | onCmdQueueChanged: { | ||
| 119 | _handleQueue(); | ||
| 120 | } | ||
| 121 | onAwaitingAnswerChanged: { | ||
| 122 | _handleQueue(); | ||
| 123 | } | ||
| 124 | |||
| 125 | function _handleQueue() { | ||
| 126 | if (cmdQueue.length <= 0 || awaitingAnswer !== null) | ||
| 127 | return; | ||
| 128 | |||
| 129 | let localQueue = Array.from(cmdQueue); | ||
| 130 | awaitingAnswer = localQueue.shift(); | ||
| 131 | cmdQueue = localQueue; | ||
| 132 | write(JSON.stringify(awaitingAnswer.command) + '\n'); | ||
| 133 | } | ||
| 134 | |||
| 135 | function sendCommand(command, callback) { | ||
| 136 | cmdQueue = Array.from(cmdQueue).concat([{ "command": command, "callback": callback }]) | ||
| 137 | } | ||
| 138 | } | ||
| 139 | |||
| 140 | function eventWorkspaceActivated(data) { | ||
| 141 | let relevant_output = null; | ||
| 142 | Array.from(root.workspaces).forEach(ws => { | ||
| 143 | if (data.id === ws.id) | ||
| 144 | relevant_output = ws.output; | ||
| 145 | }); | ||
| 146 | root.workspaces = Array.from(root.workspaces).map(ws => { | ||
| 147 | if (data.focused) | ||
| 148 | ws.is_focused = false; | ||
| 149 | if (ws.output === relevant_output) | ||
| 150 | ws.is_active = false; | ||
| 151 | if (data.id === ws.id) { | ||
| 152 | ws.is_active = true; | ||
| 153 | ws.is_focused = data.focused; | ||
| 154 | } | ||
| 155 | return ws; | ||
| 156 | }); | ||
| 157 | } | ||
| 158 | function eventWorkspaceUrgencyChanged(data) { | ||
| 159 | root.workspaces = Array.from(root.workspaces).map(ws => { | ||
| 160 | if (data.id == ws.id) | ||
| 161 | ws.is_urgent = data.urgent; | ||
| 162 | return ws; | ||
| 163 | }); | ||
| 164 | } | ||
| 165 | function eventWorkspaceActiveWindowChanged(data) { | ||
| 166 | root.workspaces = Array.from(root.workspaces).map(ws => { | ||
| 167 | if (data.workspace_id === ws.id) | ||
| 168 | ws.active_window_id = data.active_window_id; | ||
| 169 | return ws; | ||
| 170 | }); | ||
| 171 | } | ||
| 172 | function eventWindowOpenedOrChanged(data) { | ||
| 173 | root.windows = Array.from(root.windows).map(win => { | ||
| 174 | if (data.window.is_focused) | ||
| 175 | win.is_focused = false; | ||
| 176 | return win; | ||
| 177 | }).filter(win => win.id !== data.window.id).concat([data.window]); | ||
| 178 | } | ||
| 179 | function eventWindowClosed(data) { | ||
| 180 | root.windows = Array.from(root.windows).filter(win => win.id !== data.id); | ||
| 181 | } | ||
| 182 | function eventWindowFocusChanged(data) { | ||
| 183 | root.windows = Array.from(root.windows).map(win => { | ||
| 184 | win.is_focused = win.id === data.id; | ||
| 185 | return win; | ||
| 186 | }); | ||
| 187 | } | ||
| 188 | function eventWindowUrgencyChanged(data) { | ||
| 189 | root.windows = Array.from(root.windows).map(win => { | ||
| 190 | if (win.id === data.id) | ||
| 191 | win.is_urgent = data.urgent; | ||
| 192 | return win; | ||
| 193 | }); | ||
| 194 | } | ||
| 195 | function eventWindowLayoutsChanged(data) { | ||
| 196 | root.windows = Array.from(root.windows).map(win => { | ||
| 197 | Array.from(data.changes).forEach(change => { | ||
| 198 | if (win.id === change[0]) | ||
| 199 | win.layout = change[1]; | ||
| 200 | }); | ||
| 201 | return win; | ||
| 202 | }); | ||
| 203 | } | ||
| 204 | function eventWindowFocusTimestampChanged(data) { | ||
| 205 | root.windows = Array.from(root.windows).map(win => { | ||
| 206 | if (win.id === data.id) | ||
| 207 | win.focus_timestamp = data.focus_timestamp; | ||
| 208 | return win; | ||
| 209 | }); | ||
| 210 | } | ||
| 211 | function eventCastStartedOrChanged(data) { | ||
| 212 | root.casts = [...Array.from(root.casts).filter(cast => cast.stream_id !== data.cast.stream_id), data.cast]; | ||
| 213 | } | ||
| 214 | function eventCastStopped(data) { | ||
| 215 | root.casts = Array.from(root.casts).filter(cast => cast.stream_id !== data.stream_id); | ||
| 216 | } | ||
| 217 | } | ||
diff --git a/accounts/gkleen@skadhi/shell/quickshell/Services/NotificationManager.qml b/accounts/gkleen@skadhi/shell/quickshell/Services/NotificationManager.qml new file mode 100644 index 00000000..5f8ff419 --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell/Services/NotificationManager.qml | |||
| @@ -0,0 +1,162 @@ | |||
| 1 | pragma Singleton | ||
| 2 | |||
| 3 | import QtQml | ||
| 4 | import Quickshell | ||
| 5 | import Quickshell.Services.Notifications | ||
| 6 | |||
| 7 | Singleton { | ||
| 8 | id: root | ||
| 9 | |||
| 10 | readonly property bool active: !root.lockscreenActive && !root.displayInhibited | ||
| 11 | property bool lockscreenActive: false | ||
| 12 | property bool displayInhibited: false | ||
| 13 | property alias trackedNotifications: server.trackedNotifications | ||
| 14 | readonly property var groups: { | ||
| 15 | function matchesGroupKey(notif, groupKey) { | ||
| 16 | var matches = true; | ||
| 17 | for (const prop in groupKey.test) { | ||
| 18 | if (notif[prop] !== groupKey.test[prop]) { | ||
| 19 | matches = false; | ||
| 20 | break; | ||
| 21 | } | ||
| 22 | } | ||
| 23 | return matches; | ||
| 24 | } | ||
| 25 | |||
| 26 | var groups = new Map(); | ||
| 27 | var notifs = new Array(); | ||
| 28 | for (const [ix, notif] of server.trackedNotifications.values.entries()) { | ||
| 29 | var didGroup = false; | ||
| 30 | for (const groupKey of root.groupKeys) { | ||
| 31 | if (!matchesGroupKey(notif, groupKey)) | ||
| 32 | continue; | ||
| 33 | |||
| 34 | const key = JSON.stringify({ | ||
| 35 | "key": groupKey, | ||
| 36 | "values": Object.assign({}, ...(Array.from(groupKey["group-by"]).map(prop => { | ||
| 37 | var res = {}; | ||
| 38 | res[prop] = notif[prop]; | ||
| 39 | return res; | ||
| 40 | }))) | ||
| 41 | }); | ||
| 42 | if (!groups.has(key)) | ||
| 43 | groups.set(key, new Array()); | ||
| 44 | groups.get(key).push({ "ix": ix, "notif": notif }); | ||
| 45 | didGroup = true; | ||
| 46 | break; | ||
| 47 | } | ||
| 48 | |||
| 49 | if (!didGroup) | ||
| 50 | notifs.push([{ "ix": ix, "notif": notif }]); | ||
| 51 | } | ||
| 52 | notifs.push(...groups.values()); | ||
| 53 | notifs.sort((as, bs) => Math.min(...(as.map(o => o.ix))) - Math.min(...(bs.map(o => o.ix)))); | ||
| 54 | return notifs.map(ns => ns.map(n => n.notif)); | ||
| 55 | } | ||
| 56 | |||
| 57 | property var groupKeys: [ | ||
| 58 | { "test": { "appName": "Element" }, "group-by": [ "summary" ] } | ||
| 59 | ]; | ||
| 60 | |||
| 61 | property int historyLimit: 100 | ||
| 62 | property var history: [] | ||
| 63 | |||
| 64 | Component { | ||
| 65 | id: expirationTimer | ||
| 66 | |||
| 67 | QtObject { | ||
| 68 | id: timer | ||
| 69 | |||
| 70 | required property QtObject parent | ||
| 71 | required property int expirationTime | ||
| 72 | |||
| 73 | property list<QtObject> data: [ | ||
| 74 | Timer { | ||
| 75 | running: root.active && !timer.expired | ||
| 76 | interval: timer.expirationTime | ||
| 77 | onTriggered: { | ||
| 78 | timer.parent.expirationTimer.destroy(); | ||
| 79 | timer.parent.expirationTimer = null; | ||
| 80 | timer.parent.expire(); | ||
| 81 | } | ||
| 82 | } | ||
| 83 | ] | ||
| 84 | } | ||
| 85 | } | ||
| 86 | |||
| 87 | Component { | ||
| 88 | id: notificationLock | ||
| 89 | |||
| 90 | RetainableLock {} | ||
| 91 | } | ||
| 92 | |||
| 93 | readonly property SystemClock clock: SystemClock { | ||
| 94 | precision: SystemClock.Minutes | ||
| 95 | } | ||
| 96 | |||
| 97 | function formatTime(time) { | ||
| 98 | const now = root.clock.date; | ||
| 99 | const diff = now - time; | ||
| 100 | const minutes = Math.ceil(diff / 60000); | ||
| 101 | const hours = Math.floor(minutes / 60); | ||
| 102 | |||
| 103 | if (hours < 1) { | ||
| 104 | if (minutes < 1) | ||
| 105 | return "now"; | ||
| 106 | if (minutes == 1) | ||
| 107 | return "1 minute"; | ||
| 108 | return `${minutes} minutes`; | ||
| 109 | } | ||
| 110 | |||
| 111 | const nowDate = new Date(now.getFullYear(), now.getMonth(), now.getDate()) | ||
| 112 | const timeDate = new Date(time.getFullYear(), time.getMonth(), time.getDate()) | ||
| 113 | const days = Math.floor((nowDate - timeDate) / (1000 * 86400)) | ||
| 114 | |||
| 115 | const timeStr = time.toLocaleTimeString(Qt.locale(), "HH:mm"); | ||
| 116 | |||
| 117 | if (days === 0) | ||
| 118 | return timeStr; | ||
| 119 | if (days === 1) | ||
| 120 | return `yesterday ${timeStr}`; | ||
| 121 | |||
| 122 | const dateStr = time.toLocaleDateString(Qt.locale(), "YYYY-MM-DD"); | ||
| 123 | return `${dateStr} ${timeStr}`; | ||
| 124 | } | ||
| 125 | |||
| 126 | NotificationServer { | ||
| 127 | id: server | ||
| 128 | |||
| 129 | bodySupported: true | ||
| 130 | actionsSupported: true | ||
| 131 | actionIconsSupported: true | ||
| 132 | imageSupported: true | ||
| 133 | bodyMarkupSupported: true | ||
| 134 | bodyImagesSupported: true | ||
| 135 | |||
| 136 | onNotification: notification => { | ||
| 137 | var timeout = notification.expireTimeout * 1000; | ||
| 138 | if (notification.appName == "poweralertd") | ||
| 139 | timeout = 2000; | ||
| 140 | if (timeout > 0) { | ||
| 141 | Object.defineProperty(notification, "expirationTimer", { configurable: true, enumerable: true, writable: true }); | ||
| 142 | notification.expirationTimer = expirationTimer.createObject(notification, { parent: notification, expirationTime: timeout }); | ||
| 143 | } | ||
| 144 | Object.defineProperty(notification, "receivedTime", { configurable: true, enumerable: true, writable: true }); | ||
| 145 | notification.receivedTime = root.clock.date; | ||
| 146 | notification.closed.connect((reason) => server.onNotificationClosed(notification, reason)); | ||
| 147 | notification.tracked = true; | ||
| 148 | } | ||
| 149 | |||
| 150 | function onNotificationClosed(notification, reason) { | ||
| 151 | while (root.history.length >= root.historyLimit) { | ||
| 152 | root.history[0].lock.locked = false; | ||
| 153 | root.history.shift(); | ||
| 154 | } | ||
| 155 | |||
| 156 | root.history.push({ | ||
| 157 | lock: notificationLock.createObject(root, { locked: true, object: notification }), | ||
| 158 | notification: notification | ||
| 159 | }); | ||
| 160 | } | ||
| 161 | } | ||
| 162 | } | ||
diff --git a/accounts/gkleen@skadhi/shell/quickshell/Services/Privacy.qml b/accounts/gkleen@skadhi/shell/quickshell/Services/Privacy.qml new file mode 100644 index 00000000..9c813e49 --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell/Services/Privacy.qml | |||
| @@ -0,0 +1,63 @@ | |||
| 1 | pragma Singleton | ||
| 2 | |||
| 3 | import QtQml | ||
| 4 | import Quickshell | ||
| 5 | import Quickshell.Services.Pipewire | ||
| 6 | |||
| 7 | Singleton { | ||
| 8 | id: root | ||
| 9 | |||
| 10 | PwObjectTracker { | ||
| 11 | objects: Pipewire.nodes.values | ||
| 12 | } | ||
| 13 | |||
| 14 | enum Item { | ||
| 15 | Microphone, | ||
| 16 | Screensharing | ||
| 17 | } | ||
| 18 | |||
| 19 | readonly property list<var> activeItems: { | ||
| 20 | var items = []; | ||
| 21 | if (microphoneActive) | ||
| 22 | items.push(Privacy.Item.Microphone); | ||
| 23 | if (screensharingActive) | ||
| 24 | items.push(Privacy.Item.Screensharing); | ||
| 25 | return items; | ||
| 26 | } | ||
| 27 | |||
| 28 | readonly property bool microphoneActive: { | ||
| 29 | if (!Pipewire.ready || !Pipewire.nodes?.values) { | ||
| 30 | return false | ||
| 31 | } | ||
| 32 | |||
| 33 | for (const node of Pipewire.nodes.values) { | ||
| 34 | if (!node || (node.type & PwNodeType.AudioInStream) != PwNodeType.AudioInStream) | ||
| 35 | continue; | ||
| 36 | |||
| 37 | if (node.properties?.["stream.monitor"] === "true") | ||
| 38 | continue; | ||
| 39 | |||
| 40 | if (node.audio?.muted) | ||
| 41 | continue; | ||
| 42 | |||
| 43 | return true; | ||
| 44 | } | ||
| 45 | |||
| 46 | return false; | ||
| 47 | } | ||
| 48 | |||
| 49 | readonly property bool screensharingActive: { | ||
| 50 | if (!Pipewire.ready || !Pipewire.nodes?.values) { | ||
| 51 | return false | ||
| 52 | } | ||
| 53 | |||
| 54 | for (const node of Pipewire.nodes.values) { | ||
| 55 | if (!node || (node.type & PwNodeType.VideoInStream) != PwNodeType.VideoInStream) | ||
| 56 | continue; | ||
| 57 | |||
| 58 | return true; | ||
| 59 | } | ||
| 60 | |||
| 61 | return false; | ||
| 62 | } | ||
| 63 | } | ||
diff --git a/accounts/gkleen@skadhi/shell/quickshell/Services/ScreenRecord.qml b/accounts/gkleen@skadhi/shell/quickshell/Services/ScreenRecord.qml new file mode 100644 index 00000000..eb415452 --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell/Services/ScreenRecord.qml | |||
| @@ -0,0 +1,63 @@ | |||
| 1 | pragma Singleton | ||
| 2 | |||
| 3 | import Quickshell | ||
| 4 | import Quickshell.Io | ||
| 5 | |||
| 6 | Singleton { | ||
| 7 | id: root | ||
| 8 | property bool active: false | ||
| 9 | property bool slurpSuccess: false | ||
| 10 | |||
| 11 | onActiveChanged: { | ||
| 12 | if (!active) { | ||
| 13 | slurp.running = false; | ||
| 14 | screenRecorder.running = false; | ||
| 15 | } | ||
| 16 | if (active) | ||
| 17 | slurp.running = true; | ||
| 18 | } | ||
| 19 | |||
| 20 | Process { | ||
| 21 | id: screenRecorder | ||
| 22 | running: false | ||
| 23 | onRunningChanged: { | ||
| 24 | console.log("wf-recorder running: ", screenRecorder.running); | ||
| 25 | |||
| 26 | if (!screenRecorder.running && !slurp.running) | ||
| 27 | root.active = false; | ||
| 28 | } | ||
| 29 | stderr: SplitParser { | ||
| 30 | onRead: line => console.log("wf-recorder stderr: ", line) | ||
| 31 | } | ||
| 32 | stdout: SplitParser { | ||
| 33 | onRead: line => console.log("wf-recorder stdout: ", line) | ||
| 34 | } | ||
| 35 | } | ||
| 36 | |||
| 37 | Process { | ||
| 38 | id: slurp | ||
| 39 | running: false | ||
| 40 | command: [ @slurp@, "-o", "-d" ] | ||
| 41 | stdout: StdioCollector {} | ||
| 42 | stderr: SplitParser { | ||
| 43 | onRead: line => console.log("slurp stderr: ", line) | ||
| 44 | } | ||
| 45 | onExited: exitCode => { | ||
| 46 | if (exitCode !== 0) { | ||
| 47 | console.log("slurp failed: ", exitCode); | ||
| 48 | root.active = false; | ||
| 49 | return; | ||
| 50 | } | ||
| 51 | console.log("slurp succeeded: ", slurp.stdout.text); | ||
| 52 | |||
| 53 | const nowDate = new Date(); | ||
| 54 | |||
| 55 | screenRecorder.command = [ | ||
| 56 | @wf-recorder@, | ||
| 57 | "-g", slurp.stdout.text, | ||
| 58 | "-f", `${Quickshell.env("HOME")}/screenshots/${nowDate.toLocaleString(Qt.locale(), "yyyy-MM-ddThh:mm:ss")}.mkv`, | ||
| 59 | ]; | ||
| 60 | screenRecorder.running = true; | ||
| 61 | } | ||
| 62 | } | ||
| 63 | } | ||
diff --git a/accounts/gkleen@skadhi/shell/quickshell/Services/WallpaperSelector.qml b/accounts/gkleen@skadhi/shell/quickshell/Services/WallpaperSelector.qml new file mode 100644 index 00000000..c71a9cca --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell/Services/WallpaperSelector.qml | |||
| @@ -0,0 +1,8 @@ | |||
| 1 | import Custom as Custom | ||
| 2 | |||
| 3 | Custom.FileSelector { | ||
| 4 | id: root | ||
| 5 | |||
| 6 | directory: @wallpapers@ | ||
| 7 | epoch: 79200000 | ||
| 8 | } | ||
diff --git a/accounts/gkleen@skadhi/shell/quickshell/Services/Worktime.qml b/accounts/gkleen@skadhi/shell/quickshell/Services/Worktime.qml new file mode 100644 index 00000000..d98378f1 --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell/Services/Worktime.qml | |||
| @@ -0,0 +1,84 @@ | |||
| 1 | pragma Singleton | ||
| 2 | |||
| 3 | import QtQuick | ||
| 4 | import Quickshell | ||
| 5 | import Quickshell.Io | ||
| 6 | import QtQml | ||
| 7 | |||
| 8 | Singleton { | ||
| 9 | id: root | ||
| 10 | |||
| 11 | property alias time: timeState | ||
| 12 | property alias today: todayState | ||
| 13 | |||
| 14 | CommandState { | ||
| 15 | id: timeState | ||
| 16 | command: "time" | ||
| 17 | } | ||
| 18 | CommandState { | ||
| 19 | id: todayState | ||
| 20 | command: "today" | ||
| 21 | } | ||
| 22 | |||
| 23 | IpcHandler { | ||
| 24 | target: "Worktime" | ||
| 25 | |||
| 26 | function refresh(): void { | ||
| 27 | time.running = true; | ||
| 28 | today.running = true; | ||
| 29 | } | ||
| 30 | } | ||
| 31 | |||
| 32 | component CommandState : Scope { | ||
| 33 | id: commandState | ||
| 34 | |||
| 35 | required property string command | ||
| 36 | property var state: null | ||
| 37 | |||
| 38 | property bool strikeout: !strikeoutTimer.running | ||
| 39 | property alias running: process.running | ||
| 40 | property alias updating: updateTimer.running | ||
| 41 | |||
| 42 | Process { | ||
| 43 | id: process | ||
| 44 | running: true | ||
| 45 | command: [ @worktime@, commandState.command, "--waybar" ] | ||
| 46 | stdout: StdioCollector { | ||
| 47 | id: processCollector | ||
| 48 | onStreamFinished: { | ||
| 49 | try { | ||
| 50 | commandState.state = JSON.parse(processCollector.text); | ||
| 51 | strikeoutTimer.restart(); | ||
| 52 | } catch (e) { | ||
| 53 | console.warn("Worktime: Failed to parse output:", processCollector.text, e); | ||
| 54 | } | ||
| 55 | } | ||
| 56 | } | ||
| 57 | } | ||
| 58 | |||
| 59 | Timer { | ||
| 60 | id: updateTimer | ||
| 61 | running: commandState.state?.class == "running" || commandState.state?.class == "over" | ||
| 62 | interval: 60000 | ||
| 63 | repeat: true | ||
| 64 | onTriggered: process.running = true | ||
| 65 | } | ||
| 66 | |||
| 67 | Timer { | ||
| 68 | id: strikeoutTimer | ||
| 69 | running: false | ||
| 70 | interval: 5 * updateTimer.interval | ||
| 71 | repeat: false | ||
| 72 | } | ||
| 73 | } | ||
| 74 | |||
| 75 | Timer { | ||
| 76 | running: Boolean(timeState.state) && Boolean(todayState.state) && timeState.strikeout && todayState.strikeout | ||
| 77 | interval: 1000 | ||
| 78 | repeat: false | ||
| 79 | onTriggered: { | ||
| 80 | timeState.state = null; | ||
| 81 | todayState.state = null; | ||
| 82 | } | ||
| 83 | } | ||
| 84 | } | ||
diff --git a/accounts/gkleen@skadhi/shell/quickshell/SystemTray.qml b/accounts/gkleen@skadhi/shell/quickshell/SystemTray.qml new file mode 100644 index 00000000..f0c50632 --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell/SystemTray.qml | |||
| @@ -0,0 +1,201 @@ | |||
| 1 | import QtQuick | ||
| 2 | import QtQuick.Effects | ||
| 3 | import Quickshell | ||
| 4 | import Quickshell.Widgets | ||
| 5 | import Quickshell.Services.SystemTray | ||
| 6 | |||
| 7 | Item { | ||
| 8 | anchors.verticalCenter: parent.verticalCenter | ||
| 9 | width: systemTrayRow.childrenRect.width | ||
| 10 | height: parent.height | ||
| 11 | clip: true | ||
| 12 | |||
| 13 | Row { | ||
| 14 | id: systemTrayRow | ||
| 15 | anchors.centerIn: parent | ||
| 16 | width: childrenRect.width | ||
| 17 | height: parent.height | ||
| 18 | spacing: 0 | ||
| 19 | |||
| 20 | Repeater { | ||
| 21 | model: ScriptModel { | ||
| 22 | values: { | ||
| 23 | var trayItems = Array.from(SystemTray.items.values).filter(item => item.status !== Status.Passive && !(["Fcitx"].includes(item.id))); | ||
| 24 | trayItems.sort((a, b) => a.category !== b.category ? b.category - a.category : a.id.localeCompare(b.id)) | ||
| 25 | return trayItems; | ||
| 26 | } | ||
| 27 | } | ||
| 28 | |||
| 29 | delegate: Item { | ||
| 30 | id: trayItemWrapper | ||
| 31 | |||
| 32 | required property var modelData | ||
| 33 | required property int index | ||
| 34 | |||
| 35 | property var trayItem: modelData | ||
| 36 | property string iconSource: { | ||
| 37 | let icon = trayItem && trayItem.icon | ||
| 38 | if (typeof icon === 'string' || icon instanceof String) { | ||
| 39 | if (icon.includes("?path=")) { | ||
| 40 | const split = icon.split("?path=") | ||
| 41 | if (split.length !== 2) | ||
| 42 | return icon | ||
| 43 | const name = split[0] | ||
| 44 | const path = split[1] | ||
| 45 | const fileName = name.substring( | ||
| 46 | name.lastIndexOf("/") + 1) | ||
| 47 | return `file://${path}/${fileName}` | ||
| 48 | } | ||
| 49 | return icon | ||
| 50 | } | ||
| 51 | return "" | ||
| 52 | } | ||
| 53 | |||
| 54 | width: icon.width + 6 | ||
| 55 | height: parent.height | ||
| 56 | anchors.verticalCenter: parent.verticalCenter | ||
| 57 | |||
| 58 | WrapperMouseArea { | ||
| 59 | id: trayItemArea | ||
| 60 | |||
| 61 | anchors.fill: parent | ||
| 62 | acceptedButtons: Qt.LeftButton | Qt.RightButton | ||
| 63 | hoverEnabled: true | ||
| 64 | cursorShape: trayItem.onlyMenu ? Qt.ArrowCursor : Qt.PointingHandCursor | ||
| 65 | onClicked: mouse => { | ||
| 66 | if (!trayItem) | ||
| 67 | return | ||
| 68 | |||
| 69 | if (mouse.button === Qt.LeftButton | ||
| 70 | && !trayItem.onlyMenu) { | ||
| 71 | trayItem.activate() | ||
| 72 | return | ||
| 73 | } | ||
| 74 | |||
| 75 | if (trayItem.hasMenu) { | ||
| 76 | var globalPos = mapToGlobal(0, 0) | ||
| 77 | var currentScreen = screen || Screen | ||
| 78 | var screenX = currentScreen.x || 0 | ||
| 79 | var relativeX = globalPos.x - screenX | ||
| 80 | menuAnchor.menu = trayItem.menu | ||
| 81 | menuAnchor.anchor.window = bar | ||
| 82 | menuAnchor.anchor.rect = Qt.rect( | ||
| 83 | relativeX, | ||
| 84 | 21, | ||
| 85 | parent.width, 1) | ||
| 86 | menuAnchor.open() | ||
| 87 | } | ||
| 88 | } | ||
| 89 | |||
| 90 | Rectangle { | ||
| 91 | anchors.fill: parent | ||
| 92 | color: { | ||
| 93 | if (trayItemArea.containsMouse) | ||
| 94 | return "#33808080"; | ||
| 95 | return "transparent"; | ||
| 96 | } | ||
| 97 | |||
| 98 | Item { | ||
| 99 | anchors.fill: parent | ||
| 100 | |||
| 101 | layer.enabled: true | ||
| 102 | layer.effect: MultiEffect { | ||
| 103 | colorization: 1 | ||
| 104 | colorizationColor: "#555" | ||
| 105 | } | ||
| 106 | |||
| 107 | IconImage { | ||
| 108 | id: icon | ||
| 109 | |||
| 110 | anchors.centerIn: parent | ||
| 111 | implicitSize: 16 | ||
| 112 | source: trayItemWrapper.iconSource | ||
| 113 | asynchronous: true | ||
| 114 | smooth: true | ||
| 115 | mipmap: true | ||
| 116 | |||
| 117 | layer.enabled: true | ||
| 118 | layer.effect: MultiEffect { | ||
| 119 | id: effect | ||
| 120 | |||
| 121 | brightness: 1 | ||
| 122 | } | ||
| 123 | } | ||
| 124 | } | ||
| 125 | } | ||
| 126 | } | ||
| 127 | |||
| 128 | PopupWindow { | ||
| 129 | id: tooltip | ||
| 130 | |||
| 131 | property bool nextVisible: (trayItem.tooltipTitle || trayItem.tooltipDescription) && (trayItemArea.containsMouse || tooltipMouseArea.containsMouse) && !menuAnchor.visible | ||
| 132 | |||
| 133 | anchor { | ||
| 134 | item: trayItemArea | ||
| 135 | edges: Edges.Bottom | ||
| 136 | } | ||
| 137 | |||
| 138 | visible: false | ||
| 139 | onNextVisibleChanged: hangTimer.restart() | ||
| 140 | |||
| 141 | Timer { | ||
| 142 | id: hangTimer | ||
| 143 | interval: 100 | ||
| 144 | onTriggered: tooltip.visible = tooltip.nextVisible | ||
| 145 | } | ||
| 146 | |||
| 147 | color: "black" | ||
| 148 | |||
| 149 | implicitWidth: Math.max(tooltipTitle.contentWidth, tooltipDescription.contentWidth) + 16 | ||
| 150 | implicitHeight: (trayItem.tooltipTitle ? tooltipTitle.contentHeight : 0) + (trayItem.tooltipDescription ? tooltipDescription.contentHeight : 0) + 16 | ||
| 151 | |||
| 152 | WrapperMouseArea { | ||
| 153 | id: tooltipMouseArea | ||
| 154 | |||
| 155 | hoverEnabled: true | ||
| 156 | enabled: true | ||
| 157 | |||
| 158 | margin: 4 | ||
| 159 | |||
| 160 | anchors.fill: parent | ||
| 161 | |||
| 162 | Item { | ||
| 163 | anchors.fill: parent | ||
| 164 | |||
| 165 | Column { | ||
| 166 | anchors.centerIn: parent | ||
| 167 | Text { | ||
| 168 | id: tooltipTitle | ||
| 169 | |||
| 170 | enabled: trayItem.tooltipTitle | ||
| 171 | |||
| 172 | font.pointSize: 10 | ||
| 173 | font.family: "Fira Sans" | ||
| 174 | font.bold: true | ||
| 175 | color: "white" | ||
| 176 | |||
| 177 | text: trayItem.tooltipTitle | ||
| 178 | } | ||
| 179 | |||
| 180 | Text { | ||
| 181 | id: tooltipDescription | ||
| 182 | |||
| 183 | enabled: trayItem.tooltipDescription | ||
| 184 | |||
| 185 | font.pointSize: 10 | ||
| 186 | font.family: "Fira Sans" | ||
| 187 | color: "white" | ||
| 188 | |||
| 189 | text: trayItem.tooltipDescription | ||
| 190 | } | ||
| 191 | } | ||
| 192 | } | ||
| 193 | } | ||
| 194 | } | ||
| 195 | } | ||
| 196 | } | ||
| 197 | } | ||
| 198 | QsMenuAnchor { | ||
| 199 | id: menuAnchor | ||
| 200 | } | ||
| 201 | } | ||
diff --git a/accounts/gkleen@skadhi/shell/quickshell/UnixIPC.qml b/accounts/gkleen@skadhi/shell/quickshell/UnixIPC.qml new file mode 100644 index 00000000..483a60c6 --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell/UnixIPC.qml | |||
| @@ -0,0 +1,108 @@ | |||
| 1 | import Quickshell | ||
| 2 | import Quickshell.Io | ||
| 3 | import Quickshell.Services.Pipewire | ||
| 4 | import Quickshell.Services.Mpris | ||
| 5 | import qs.Services | ||
| 6 | import Custom as Custom | ||
| 7 | import QtQml | ||
| 8 | |||
| 9 | Scope { | ||
| 10 | id: root | ||
| 11 | |||
| 12 | SocketServer { | ||
| 13 | active: true | ||
| 14 | path: `${Quickshell.env("XDG_RUNTIME_DIR")}/shell.sock` | ||
| 15 | handler: Socket { | ||
| 16 | parser: SplitParser { | ||
| 17 | onRead: line => { | ||
| 18 | const command = (() => { | ||
| 19 | try { | ||
| 20 | return JSON.parse(line); | ||
| 21 | } catch (e) { | ||
| 22 | console.warn("UnixIPC: Failed to parse command:", line, e); | ||
| 23 | } | ||
| 24 | })(); | ||
| 25 | if (!command) | ||
| 26 | return; | ||
| 27 | |||
| 28 | if (command.Volume) | ||
| 29 | root.onCommandVolume(command.Volume); | ||
| 30 | else if (command.Brightness) | ||
| 31 | root.onCommandBrightness(command.Brightness); | ||
| 32 | else if (command.LockSession) | ||
| 33 | Custom.Systemd.lockSession(); | ||
| 34 | else if (command.Sleep) | ||
| 35 | Custom.Systemd.sleep(); | ||
| 36 | else if (command.Suspend) | ||
| 37 | Custom.Systemd.suspend(); | ||
| 38 | else if (command.Hibernate) | ||
| 39 | Custom.Systemd.hibernate(); | ||
| 40 | else if (command.Mpris) | ||
| 41 | root.onCommandMpris(command.Mpris); | ||
| 42 | else if (command.Notifications) | ||
| 43 | root.onCommandNotifications(command.Notifications); | ||
| 44 | else if (command.ScreenRecord) | ||
| 45 | root.onCommandScreenRecord(command.ScreenRecord); | ||
| 46 | else | ||
| 47 | console.warn("UnixIPC: Command not handled:", JSON.stringify(command)); | ||
| 48 | } | ||
| 49 | } | ||
| 50 | |||
| 51 | onError: e => { | ||
| 52 | if (e == 1) | ||
| 53 | return; | ||
| 54 | console.warn("QLocalSocket::LocalSocketError", e); | ||
| 55 | } | ||
| 56 | } | ||
| 57 | } | ||
| 58 | |||
| 59 | PwObjectTracker { | ||
| 60 | objects: [ Pipewire.defaultAudioSink, Pipewire.defaultAudioSource ] | ||
| 61 | } | ||
| 62 | function onCommandVolume(command) { | ||
| 63 | if (command.muted === "toggle") | ||
| 64 | Pipewire.defaultAudioSink.audio.muted = !Pipewire.defaultAudioSink.audio.muted; | ||
| 65 | if (command.volume === "up") | ||
| 66 | Pipewire.defaultAudioSink.audio.volume += 0.02; | ||
| 67 | if (command.volume === "down") | ||
| 68 | Pipewire.defaultAudioSink.audio.volume -= 0.02; | ||
| 69 | |||
| 70 | if (command["mic-muted"] === "toggle") | ||
| 71 | Pipewire.defaultAudioSource.audio.muted = !Pipewire.defaultAudioSource.audio.muted; | ||
| 72 | } | ||
| 73 | |||
| 74 | function onCommandBrightness(command) { | ||
| 75 | if (command === "up") | ||
| 76 | Brightness.currBrightness += 0.02 | ||
| 77 | if (command === "down") | ||
| 78 | Brightness.currBrightness -= 0.02 | ||
| 79 | } | ||
| 80 | |||
| 81 | function onCommandMpris(command) { | ||
| 82 | if (command.PauseAll) | ||
| 83 | Array.from(MprisProxy.players).forEach(player => { | ||
| 84 | if (player.canPause && player.isPlaying) | ||
| 85 | player.pause(); | ||
| 86 | }); | ||
| 87 | } | ||
| 88 | Component.onCompleted: { (_ => {})(MprisProxy.players); } | ||
| 89 | |||
| 90 | function onCommandNotifications(command) { | ||
| 91 | if (command.DismissGroup && NotificationManager.active) { | ||
| 92 | if (NotificationManager.groups.length > 0) | ||
| 93 | for (const notif of [...NotificationManager.groups[0]]) | ||
| 94 | notif.dismiss(); | ||
| 95 | } | ||
| 96 | if (command.DismissAll && NotificationManager.active) { | ||
| 97 | for (const notif of [...NotificationManager.trackedNotifications.values]) | ||
| 98 | notif.dismiss(); | ||
| 99 | } | ||
| 100 | } | ||
| 101 | |||
| 102 | function onCommandScreenRecord(command) { | ||
| 103 | if (command.Toggle) | ||
| 104 | ScreenRecord.active = !ScreenRecord.active; | ||
| 105 | else | ||
| 106 | console.warn("UnixIPC.ScreenRecord: Command not handled:", JSON.stringify(command)); | ||
| 107 | } | ||
| 108 | } | ||
diff --git a/accounts/gkleen@skadhi/shell/quickshell/VolumeOSD.qml b/accounts/gkleen@skadhi/shell/quickshell/VolumeOSD.qml new file mode 100644 index 00000000..91dc9591 --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell/VolumeOSD.qml | |||
| @@ -0,0 +1,163 @@ | |||
| 1 | import QtQuick | ||
| 2 | import QtQuick.Layouts | ||
| 3 | import Quickshell | ||
| 4 | import Quickshell.Services.Pipewire | ||
| 5 | import Quickshell.Widgets | ||
| 6 | |||
| 7 | Scope { | ||
| 8 | id: root | ||
| 9 | |||
| 10 | property string show: "" | ||
| 11 | property bool inhibited: true | ||
| 12 | |||
| 13 | PwObjectTracker { | ||
| 14 | objects: [ Pipewire.defaultAudioSink, Pipewire.defaultAudioSource ] | ||
| 15 | } | ||
| 16 | |||
| 17 | Connections { | ||
| 18 | enabled: Pipewire.defaultAudioSink | ||
| 19 | target: Pipewire.defaultAudioSink?.audio || null | ||
| 20 | |||
| 21 | function onVolumeChanged() { | ||
| 22 | root.show = "sink"; | ||
| 23 | hideTimer.restart(); | ||
| 24 | } | ||
| 25 | function onMutedChanged() { | ||
| 26 | root.show = "sink"; | ||
| 27 | hideTimer.restart(); | ||
| 28 | } | ||
| 29 | } | ||
| 30 | |||
| 31 | Connections { | ||
| 32 | enabled: Pipewire.defaultAudioSource | ||
| 33 | target: Pipewire.defaultAudioSource?.audio || null | ||
| 34 | |||
| 35 | function onVolumeChanged() { | ||
| 36 | root.show = "source"; | ||
| 37 | hideTimer.restart(); | ||
| 38 | } | ||
| 39 | function onMutedChanged() { | ||
| 40 | root.show = "source"; | ||
| 41 | hideTimer.restart(); | ||
| 42 | } | ||
| 43 | } | ||
| 44 | |||
| 45 | onShowChanged: { | ||
| 46 | if (show) | ||
| 47 | hideTimer.restart(); | ||
| 48 | } | ||
| 49 | |||
| 50 | Timer { | ||
| 51 | id: hideTimer | ||
| 52 | interval: 1000 | ||
| 53 | onTriggered: root.show = "" | ||
| 54 | } | ||
| 55 | |||
| 56 | Timer { | ||
| 57 | id: startInhibit | ||
| 58 | interval: 100 | ||
| 59 | running: true | ||
| 60 | onTriggered: { | ||
| 61 | root.show = ""; | ||
| 62 | root.inhibited = false; | ||
| 63 | } | ||
| 64 | } | ||
| 65 | |||
| 66 | LazyLoader { | ||
| 67 | active: root.show && !root.inhibited | ||
| 68 | |||
| 69 | Variants { | ||
| 70 | model: Quickshell.screens | ||
| 71 | |||
| 72 | delegate: Scope { | ||
| 73 | id: screenScope | ||
| 74 | |||
| 75 | required property var modelData | ||
| 76 | |||
| 77 | PanelWindow { | ||
| 78 | id: window | ||
| 79 | |||
| 80 | screen: screenScope.modelData | ||
| 81 | |||
| 82 | anchors.top: true | ||
| 83 | margins.top: screen.height / 2 - 50 + 3.5 | ||
| 84 | exclusiveZone: 0 | ||
| 85 | exclusionMode: ExclusionMode.Ignore | ||
| 86 | |||
| 87 | implicitWidth: 400 | ||
| 88 | implicitHeight: 50 | ||
| 89 | |||
| 90 | mask: Region {} | ||
| 91 | |||
| 92 | color: "transparent" | ||
| 93 | |||
| 94 | Rectangle { | ||
| 95 | anchors.fill: parent | ||
| 96 | color: Qt.rgba(0, 0, 0, 0.75) | ||
| 97 | } | ||
| 98 | |||
| 99 | RowLayout { | ||
| 100 | id: layout | ||
| 101 | |||
| 102 | anchors.centerIn: parent | ||
| 103 | |||
| 104 | height: 50 - 8*2 | ||
| 105 | width: 400 - 8*2 | ||
| 106 | |||
| 107 | MaterialDesignIcon { | ||
| 108 | id: volumeIcon | ||
| 109 | |||
| 110 | implicitWidth: parent.height | ||
| 111 | implicitHeight: parent.height | ||
| 112 | |||
| 113 | icon: { | ||
| 114 | if (root.show == "sink") { | ||
| 115 | if (!Pipewire.defaultAudioSink || Pipewire.defaultAudioSink.audio.muted) | ||
| 116 | return "volume-off"; | ||
| 117 | if (Pipewire.defaultAudioSink.audio.volume <= 0.33) | ||
| 118 | return "volume-low"; | ||
| 119 | if (Pipewire.defaultAudioSink.audio.volume <= 0.67) | ||
| 120 | return "volume-medium"; | ||
| 121 | return "volume-high"; | ||
| 122 | } else if (root.show == "source") { | ||
| 123 | if (!Pipewire.defaultAudioSource || Pipewire.defaultAudioSource.audio.muted) | ||
| 124 | return "microphone-off"; | ||
| 125 | if (Pipewire.defaultAudioSource.audio.volume > 1) | ||
| 126 | return "microphone-plus"; | ||
| 127 | return "microphone"; | ||
| 128 | } | ||
| 129 | return "volume-high"; | ||
| 130 | } | ||
| 131 | } | ||
| 132 | |||
| 133 | Rectangle { | ||
| 134 | Layout.fillWidth: true | ||
| 135 | |||
| 136 | implicitHeight: 10 | ||
| 137 | |||
| 138 | color: "#50ffffff" | ||
| 139 | |||
| 140 | Rectangle { | ||
| 141 | anchors { | ||
| 142 | left: parent.left | ||
| 143 | top: parent.top | ||
| 144 | bottom: parent.bottom | ||
| 145 | } | ||
| 146 | |||
| 147 | color: Pipewire.defaultAudioSink?.audio.muted ? "#70ffffff" : "white" | ||
| 148 | |||
| 149 | implicitWidth: { | ||
| 150 | if (root.show == "sink") | ||
| 151 | return parent.width * (Pipewire.defaultAudioSink?.audio.volume ?? 0); | ||
| 152 | else if (root.show == "source") | ||
| 153 | return parent.width * Math.min(1, (Pipewire.defaultAudioSource?.audio.volume ?? 0)); | ||
| 154 | return 0; | ||
| 155 | } | ||
| 156 | } | ||
| 157 | } | ||
| 158 | } | ||
| 159 | } | ||
| 160 | } | ||
| 161 | } | ||
| 162 | } | ||
| 163 | } | ||
diff --git a/accounts/gkleen@skadhi/shell/quickshell/WallpaperBackground.qml b/accounts/gkleen@skadhi/shell/quickshell/WallpaperBackground.qml new file mode 100644 index 00000000..4f85a900 --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell/WallpaperBackground.qml | |||
| @@ -0,0 +1,89 @@ | |||
| 1 | import QtQuick | ||
| 2 | import Quickshell | ||
| 3 | import qs.Services | ||
| 4 | |||
| 5 | Item { | ||
| 6 | id: root | ||
| 7 | |||
| 8 | anchors.fill: parent | ||
| 9 | |||
| 10 | required property string screen | ||
| 11 | |||
| 12 | property Img current: one | ||
| 13 | property string source: selector.selected | ||
| 14 | |||
| 15 | WallpaperSelector { | ||
| 16 | id: selector | ||
| 17 | seed: screen | ||
| 18 | } | ||
| 19 | |||
| 20 | onSourceChanged: { | ||
| 21 | if (!source) | ||
| 22 | current = null; | ||
| 23 | else if (current === one) | ||
| 24 | two.update() | ||
| 25 | else | ||
| 26 | one.update() | ||
| 27 | } | ||
| 28 | |||
| 29 | Img { id: one } | ||
| 30 | Img { id: two } | ||
| 31 | |||
| 32 | component Img: Image { | ||
| 33 | id: img | ||
| 34 | |||
| 35 | function update() { | ||
| 36 | source = root.source || "" | ||
| 37 | } | ||
| 38 | |||
| 39 | anchors.fill: parent | ||
| 40 | fillMode: Image.PreserveAspectCrop | ||
| 41 | smooth: true | ||
| 42 | asynchronous: true | ||
| 43 | cache: false | ||
| 44 | |||
| 45 | opacity: 0 | ||
| 46 | |||
| 47 | onStatusChanged: { | ||
| 48 | if (status === Image.Ready) { | ||
| 49 | root.current = this | ||
| 50 | } | ||
| 51 | } | ||
| 52 | |||
| 53 | states: State { | ||
| 54 | name: "visible" | ||
| 55 | when: root.current === img | ||
| 56 | |||
| 57 | PropertyChanges { | ||
| 58 | img.opacity: 1 | ||
| 59 | } | ||
| 60 | StateChangeScript { | ||
| 61 | name: "unloadOther" | ||
| 62 | script: { | ||
| 63 | if (img === one) | ||
| 64 | two.source = "" | ||
| 65 | if (img === two) | ||
| 66 | one.source = "" | ||
| 67 | } | ||
| 68 | } | ||
| 69 | } | ||
| 70 | |||
| 71 | transitions: Transition { | ||
| 72 | SequentialAnimation { | ||
| 73 | NumberAnimation { | ||
| 74 | target: img | ||
| 75 | properties: "opacity" | ||
| 76 | duration: { | ||
| 77 | if (img === one && two.source == "" || img === two && one.source == "") | ||
| 78 | return 0; | ||
| 79 | return 5000; | ||
| 80 | } | ||
| 81 | easing.type: Easing.OutCubic | ||
| 82 | } | ||
| 83 | ScriptAction { | ||
| 84 | scriptName: "unloadOther" | ||
| 85 | } | ||
| 86 | } | ||
| 87 | } | ||
| 88 | } | ||
| 89 | } | ||
diff --git a/accounts/gkleen@skadhi/shell/quickshell/WaylandInhibitorWidget.qml b/accounts/gkleen@skadhi/shell/quickshell/WaylandInhibitorWidget.qml new file mode 100644 index 00000000..0512ff51 --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell/WaylandInhibitorWidget.qml | |||
| @@ -0,0 +1,56 @@ | |||
| 1 | import Quickshell | ||
| 2 | import QtQuick | ||
| 3 | import Quickshell.Widgets | ||
| 4 | import Quickshell.Wayland | ||
| 5 | import qs.Services | ||
| 6 | |||
| 7 | Item { | ||
| 8 | id: root | ||
| 9 | |||
| 10 | required property var window | ||
| 11 | |||
| 12 | width: icon.width + 8 | ||
| 13 | height: parent.height | ||
| 14 | anchors.verticalCenter: parent.verticalCenter | ||
| 15 | |||
| 16 | IdleInhibitor { | ||
| 17 | id: inhibitor | ||
| 18 | enabled: InhibitorState.waylandIdleInhibited | ||
| 19 | window: root.window | ||
| 20 | } | ||
| 21 | |||
| 22 | WrapperMouseArea { | ||
| 23 | id: widgetMouseArea | ||
| 24 | |||
| 25 | anchors.fill: parent | ||
| 26 | |||
| 27 | hoverEnabled: true | ||
| 28 | cursorShape: Qt.PointingHandCursor | ||
| 29 | |||
| 30 | onClicked: InhibitorState.waylandIdleInhibited = !InhibitorState.waylandIdleInhibited | ||
| 31 | |||
| 32 | Rectangle { | ||
| 33 | anchors.fill: parent | ||
| 34 | color: { | ||
| 35 | if (widgetMouseArea.containsMouse) { | ||
| 36 | return "#33808080"; | ||
| 37 | } | ||
| 38 | return "transparent"; | ||
| 39 | } | ||
| 40 | |||
| 41 | Item { | ||
| 42 | anchors.fill: parent | ||
| 43 | |||
| 44 | MaterialDesignIcon { | ||
| 45 | id: icon | ||
| 46 | |||
| 47 | implicitSize: 14 | ||
| 48 | anchors.centerIn: parent | ||
| 49 | |||
| 50 | icon: inhibitor.enabled ? "eye" : "eye-off" | ||
| 51 | color: inhibitor.enabled ? "white" : "#555" | ||
| 52 | } | ||
| 53 | } | ||
| 54 | } | ||
| 55 | } | ||
| 56 | } | ||
diff --git a/accounts/gkleen@skadhi/shell/quickshell/WorkspaceSwitcher.qml b/accounts/gkleen@skadhi/shell/quickshell/WorkspaceSwitcher.qml new file mode 100644 index 00000000..a893937a --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell/WorkspaceSwitcher.qml | |||
| @@ -0,0 +1,204 @@ | |||
| 1 | import Quickshell | ||
| 2 | import QtQuick | ||
| 3 | import qs.Services | ||
| 4 | import Quickshell.Widgets | ||
| 5 | import QtQuick.Layouts | ||
| 6 | |||
| 7 | Row { | ||
| 8 | id: workspaces | ||
| 9 | |||
| 10 | required property var screen | ||
| 11 | |||
| 12 | property var ignoreWorkspaces: @ignore_workspaces@ | ||
| 13 | |||
| 14 | height: parent.height | ||
| 15 | anchors.verticalCenter: parent.verticalCenter | ||
| 16 | spacing: 0 | ||
| 17 | |||
| 18 | Repeater { | ||
| 19 | model: ScriptModel { | ||
| 20 | values: { | ||
| 21 | let currWorkspaces = NiriService.workspaces; | ||
| 22 | const ignoreWorkspaces = Array.from(workspaces.ignoreWorkspaces); | ||
| 23 | currWorkspaces = currWorkspaces.filter(ws => ws.output == workspaces.screen?.name).filter(ws => ws.is_active || ignoreWorkspaces.every(iws => iws !== ws.name)); | ||
| 24 | currWorkspaces.sort((a, b) => { | ||
| 25 | if (NiriService.outputs?.[a.output]?.logical?.x !== NiriService.outputs?.[b.output]?.logical?.x) | ||
| 26 | return NiriService.outputs?.[a.output]?.logical?.x - NiriService.outputs?.[b.output]?.logical?.x | ||
| 27 | if (NiriService.outputs?.[a.output]?.logical?.y !== NiriService.outputs?.[b.output]?.logical?.y) | ||
| 28 | return NiriService.outputs?.[a.output]?.logical?.y - NiriService.outputs?.[b.output]?.logical?.y | ||
| 29 | return a.idx - b.idx; | ||
| 30 | }); | ||
| 31 | return currWorkspaces.map(o => Object.assign({}, o)); | ||
| 32 | } | ||
| 33 | } | ||
| 34 | |||
| 35 | Item { | ||
| 36 | id: wsItem | ||
| 37 | |||
| 38 | property var workspaceData: modelData | ||
| 39 | |||
| 40 | width: wsLabel.contentWidth + 8 | ||
| 41 | height: parent.height | ||
| 42 | anchors.verticalCenter: parent.verticalCenter | ||
| 43 | |||
| 44 | WrapperMouseArea { | ||
| 45 | id: mouseArea | ||
| 46 | |||
| 47 | anchors.fill: parent | ||
| 48 | |||
| 49 | hoverEnabled: true | ||
| 50 | cursorShape: Qt.PointingHandCursor | ||
| 51 | enabled: true | ||
| 52 | onClicked: { | ||
| 53 | NiriService.sendCommand({ "Action": { "FocusWorkspace": { "reference": { "Id": workspaceData.id } } } }, _ => {}); | ||
| 54 | } | ||
| 55 | |||
| 56 | Rectangle { | ||
| 57 | anchors.fill: parent | ||
| 58 | |||
| 59 | color: { | ||
| 60 | if (mouseArea.containsMouse) { | ||
| 61 | return "#33808080"; | ||
| 62 | } | ||
| 63 | return "transparent"; | ||
| 64 | } | ||
| 65 | |||
| 66 | Text { | ||
| 67 | id: wsLabel | ||
| 68 | |||
| 69 | anchors.centerIn: parent | ||
| 70 | |||
| 71 | font.pointSize: 10 | ||
| 72 | font.family: "Fira Sans" | ||
| 73 | color: { | ||
| 74 | if (workspaceData.is_active) | ||
| 75 | return "#23fd00"; | ||
| 76 | if (workspaceData.active_window_id === null) | ||
| 77 | return "#555"; | ||
| 78 | return "white"; | ||
| 79 | } | ||
| 80 | |||
| 81 | text: workspaceData.name ? workspaceData.name : workspaceData.idx | ||
| 82 | } | ||
| 83 | } | ||
| 84 | } | ||
| 85 | |||
| 86 | PopupWindow { | ||
| 87 | id: tooltip | ||
| 88 | |||
| 89 | property bool nextVisible: (mouseArea.containsMouse || tooltipMouseArea.containsMouse) && [...windowsModel.values].length > 0 | ||
| 90 | |||
| 91 | anchor { | ||
| 92 | item: mouseArea | ||
| 93 | edges: Edges.Bottom | Edges.Left | ||
| 94 | } | ||
| 95 | visible: false | ||
| 96 | |||
| 97 | onNextVisibleChanged: hangTimer.restart() | ||
| 98 | |||
| 99 | Timer { | ||
| 100 | id: hangTimer | ||
| 101 | interval: 100 | ||
| 102 | onTriggered: tooltip.visible = tooltip.nextVisible | ||
| 103 | } | ||
| 104 | |||
| 105 | implicitWidth: tooltipContent.implicitWidth | ||
| 106 | implicitHeight: tooltipContent.implicitHeight | ||
| 107 | color: "black" | ||
| 108 | |||
| 109 | WrapperMouseArea { | ||
| 110 | id: tooltipMouseArea | ||
| 111 | |||
| 112 | hoverEnabled: true | ||
| 113 | enabled: true | ||
| 114 | |||
| 115 | anchors.fill: parent | ||
| 116 | |||
| 117 | WrapperItem { | ||
| 118 | id: tooltipContent | ||
| 119 | |||
| 120 | margin: 0 | ||
| 121 | |||
| 122 | ColumnLayout { | ||
| 123 | spacing: 0 | ||
| 124 | |||
| 125 | Repeater { | ||
| 126 | model: ScriptModel { | ||
| 127 | id: windowsModel | ||
| 128 | |||
| 129 | values: { | ||
| 130 | let currWindows = NiriService.windows.filter(win => win.workspace_id == wsItem.workspaceData.id); | ||
| 131 | currWindows.sort((a, b) => { | ||
| 132 | if (a.is_floating !== b.is_floating) | ||
| 133 | return b.is_floating - a.is_floating; | ||
| 134 | if (a.layout.tile_pos_in_workspace_view?.[0] !== b.layout.tile_pos_in_workspace_view?.[0]) | ||
| 135 | return a.layout.tile_pos_in_workspace_view?.[0] - b.layout.tile_pos_in_workspace_view?.[0] | ||
| 136 | if (a.layout.tile_pos_in_workspace_view?.[1] !== b.layout.tile_pos_in_workspace_view?.[1]) | ||
| 137 | return a.layout.tile_pos_in_workspace_view?.[1] - b.layout.tile_pos_in_workspace_view?.[1] | ||
| 138 | if (a.layout.pos_in_scrolling_layout?.[0] !== b.layout.pos_in_scrolling_layout?.[0]) | ||
| 139 | return a.layout.pos_in_scrolling_layout?.[0] - b.layout.pos_in_scrolling_layout?.[0] | ||
| 140 | if (a.layout.pos_in_scrolling_layout?.[1] !== b.layout.pos_in_scrolling_layout?.[1]) | ||
| 141 | return a.layout.pos_in_scrolling_layout?.[1] - b.layout.pos_in_scrolling_layout?.[1] | ||
| 142 | if (a.app_id !== b.app_id) | ||
| 143 | return a.app_id?.localeCompare(b.app_id); | ||
| 144 | |||
| 145 | return a.title.localeCompare(b.title); | ||
| 146 | }); | ||
| 147 | return currWindows.map(o => Object.assign({}, o)); | ||
| 148 | } | ||
| 149 | } | ||
| 150 | |||
| 151 | WrapperMouseArea { | ||
| 152 | id: windowMouseArea | ||
| 153 | |||
| 154 | required property int index | ||
| 155 | required property var modelData | ||
| 156 | property var windowData: modelData | ||
| 157 | |||
| 158 | hoverEnabled: true | ||
| 159 | cursorShape: Qt.PointingHandCursor | ||
| 160 | enabled: true | ||
| 161 | |||
| 162 | Layout.fillWidth: true | ||
| 163 | |||
| 164 | onClicked: { | ||
| 165 | NiriService.sendCommand({ "Action": { "FocusWindow": { "id": windowData.id } } }, _ => {}) | ||
| 166 | } | ||
| 167 | |||
| 168 | WrapperRectangle { | ||
| 169 | color: windowMouseArea.containsMouse ? "#33808080" : "transparent"; | ||
| 170 | |||
| 171 | WrapperItem { | ||
| 172 | rightMargin: 8 | ||
| 173 | leftMargin: 8 | ||
| 174 | topMargin: windowMouseArea.index == 0 ? 8 : 4 | ||
| 175 | bottomMargin: windowMouseArea.index == windowsModel.values.length - 1 ? 8 : 4 | ||
| 176 | |||
| 177 | Text { | ||
| 178 | id: windowLabel | ||
| 179 | |||
| 180 | font.pointSize: 10 | ||
| 181 | font.family: "Fira Sans" | ||
| 182 | color: { | ||
| 183 | if (windowData.is_focused) | ||
| 184 | return "#23fd00"; | ||
| 185 | if (NiriService.workspaces.find(ws => ws.id == windowData.workspace_id)?.active_window_id == windowData.id) | ||
| 186 | return "white"; | ||
| 187 | return "#555"; | ||
| 188 | } | ||
| 189 | |||
| 190 | text: windowData.title | ||
| 191 | |||
| 192 | horizontalAlignment: Text.AlignLeft | ||
| 193 | } | ||
| 194 | } | ||
| 195 | } | ||
| 196 | } | ||
| 197 | } | ||
| 198 | } | ||
| 199 | } | ||
| 200 | } | ||
| 201 | } | ||
| 202 | } | ||
| 203 | } | ||
| 204 | } | ||
diff --git a/accounts/gkleen@skadhi/shell/quickshell/WorktimeWidget.qml b/accounts/gkleen@skadhi/shell/quickshell/WorktimeWidget.qml new file mode 100644 index 00000000..b7baee34 --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell/WorktimeWidget.qml | |||
| @@ -0,0 +1,212 @@ | |||
| 1 | import QtQml | ||
| 2 | import Quickshell | ||
| 3 | import QtQuick | ||
| 4 | import Quickshell.Widgets | ||
| 5 | import qs.Services | ||
| 6 | |||
| 7 | Item { | ||
| 8 | id: root | ||
| 9 | |||
| 10 | height: parent.height | ||
| 11 | width: (timeWidget.visible ? timeWidget.label.contentWidth + 8 : 0) + (todayWidget.visible ? todayWidget.label.contentWidth + 8 : 0) + (icon.visible ? icon.implicitWidth + 8 : 0) | ||
| 12 | anchors.verticalCenter: parent.verticalCenter | ||
| 13 | |||
| 14 | component TextWidget : Item { | ||
| 15 | id: textWidget | ||
| 16 | |||
| 17 | visible: textWidget.state.state?.text ?? false | ||
| 18 | |||
| 19 | required property var state | ||
| 20 | property alias label: label | ||
| 21 | property alias mouseArea: mouseArea | ||
| 22 | |||
| 23 | anchors.verticalCenter: parent.verticalCenter | ||
| 24 | implicitWidth: label.contentWidth + 8 | ||
| 25 | height: parent.height | ||
| 26 | |||
| 27 | WrapperMouseArea { | ||
| 28 | id: mouseArea | ||
| 29 | |||
| 30 | anchors.fill: parent | ||
| 31 | |||
| 32 | enabled: true | ||
| 33 | hoverEnabled: true | ||
| 34 | acceptedButtons: Qt.NoButton | ||
| 35 | cursorShape: Qt.PointingHandCursor | ||
| 36 | |||
| 37 | Item { | ||
| 38 | anchors.fill: parent | ||
| 39 | |||
| 40 | Text { | ||
| 41 | id: label | ||
| 42 | |||
| 43 | anchors.centerIn: parent | ||
| 44 | |||
| 45 | text: textWidget.state.state?.text ?? "" | ||
| 46 | |||
| 47 | font.pointSize: 10 | ||
| 48 | font.family: "Fira Sans" | ||
| 49 | font.strikeout: textWidget.state.strikeout | ||
| 50 | color: { | ||
| 51 | if (textWidget.state.state?.class == "running") | ||
| 52 | return "white"; | ||
| 53 | if (textWidget.state.state?.class == "over") | ||
| 54 | return "#f28a21"; | ||
| 55 | return "#555"; | ||
| 56 | } | ||
| 57 | } | ||
| 58 | } | ||
| 59 | } | ||
| 60 | } | ||
| 61 | |||
| 62 | WrapperMouseArea { | ||
| 63 | id: mouseArea | ||
| 64 | |||
| 65 | anchors.fill: parent | ||
| 66 | hoverEnabled: true | ||
| 67 | |||
| 68 | cursorShape: Qt.PointingHandCursor | ||
| 69 | onClicked: { | ||
| 70 | Worktime.time.running = true; | ||
| 71 | Worktime.today.running = true; | ||
| 72 | } | ||
| 73 | |||
| 74 | Rectangle { | ||
| 75 | anchors.fill: parent | ||
| 76 | color: { | ||
| 77 | if (mouseArea.containsMouse) | ||
| 78 | return "#33808080"; | ||
| 79 | return "transparent"; | ||
| 80 | } | ||
| 81 | |||
| 82 | Row { | ||
| 83 | height: parent.height | ||
| 84 | anchors.centerIn: parent | ||
| 85 | spacing: 0 | ||
| 86 | |||
| 87 | TextWidget { | ||
| 88 | id: timeWidget | ||
| 89 | state: Worktime.time | ||
| 90 | } | ||
| 91 | |||
| 92 | TextWidget { | ||
| 93 | id: todayWidget | ||
| 94 | state: Worktime.today | ||
| 95 | } | ||
| 96 | |||
| 97 | MaterialDesignIcon { | ||
| 98 | id: icon | ||
| 99 | |||
| 100 | anchors.verticalCenter: parent.verticalCenter | ||
| 101 | |||
| 102 | implicitSize: 14 | ||
| 103 | |||
| 104 | visible: !timeWidget.visible && !todayWidget.visible | ||
| 105 | |||
| 106 | icon: (Worktime.time.running || Worktime.today.running) ? "update" : "timer-off" | ||
| 107 | color: "#555" | ||
| 108 | } | ||
| 109 | } | ||
| 110 | } | ||
| 111 | } | ||
| 112 | |||
| 113 | component WorktimePopup : PopupWindow { | ||
| 114 | id: tooltip | ||
| 115 | |||
| 116 | required property var state | ||
| 117 | required property var mouseArea | ||
| 118 | |||
| 119 | property bool iconVisible: tooltip.state.running || !tooltip.state.updating | ||
| 120 | property bool tooltipVisible: tooltip.state.state?.tooltip ?? false | ||
| 121 | |||
| 122 | property bool nextVisible: (tooltip.tooltipVisible || tooltip.iconVisible) && (tooltip.mouseArea.containsMouse || tooltipMouseArea.containsMouse) | ||
| 123 | |||
| 124 | anchor { | ||
| 125 | item: tooltip.mouseArea | ||
| 126 | edges: Edges.Bottom | Edges.Left | ||
| 127 | } | ||
| 128 | visible: false | ||
| 129 | |||
| 130 | onNextVisibleChanged: hangTimer.restart() | ||
| 131 | |||
| 132 | Timer { | ||
| 133 | id: hangTimer | ||
| 134 | interval: 100 | ||
| 135 | onTriggered: tooltip.visible = tooltip.nextVisible | ||
| 136 | } | ||
| 137 | |||
| 138 | implicitWidth: (tooltipIcon.visible ? tooltipIcon.implicitWidth : 0) + (tooltipIcon.visible && tooltipText.visible ? 8 : 0) + (tooltipText.visible ? tooltipText.implicitWidth : 0) + 16 | ||
| 139 | implicitHeight: tooltipText.implicitHeight + 16 | ||
| 140 | color: "black" | ||
| 141 | |||
| 142 | WrapperMouseArea { | ||
| 143 | id: tooltipMouseArea | ||
| 144 | |||
| 145 | enabled: true | ||
| 146 | hoverEnabled: true | ||
| 147 | |||
| 148 | anchors.fill: parent | ||
| 149 | |||
| 150 | Item { | ||
| 151 | anchors.fill: parent | ||
| 152 | |||
| 153 | Row { | ||
| 154 | id: tooltipLayout | ||
| 155 | |||
| 156 | anchors { | ||
| 157 | left: parent.left | ||
| 158 | top: parent.top | ||
| 159 | leftMargin: 8 | ||
| 160 | topMargin: 8 | ||
| 161 | verticalCenter: parent.verticalCenter | ||
| 162 | } | ||
| 163 | |||
| 164 | height: parent.height | ||
| 165 | width: childrenRect.width | ||
| 166 | |||
| 167 | spacing: 0 | ||
| 168 | |||
| 169 | MaterialDesignIcon { | ||
| 170 | id: tooltipIcon | ||
| 171 | |||
| 172 | implicitSize: 14 | ||
| 173 | anchors.verticalCenter: parent.verticalCenter | ||
| 174 | |||
| 175 | visible: tooltip.iconVisible | ||
| 176 | |||
| 177 | icon: tooltip.state.running ? "update" : "timer-off" | ||
| 178 | } | ||
| 179 | |||
| 180 | Item { | ||
| 181 | visible: tooltipIcon.visible && tooltipText.visible | ||
| 182 | height: parent.height | ||
| 183 | width: 8 | ||
| 184 | } | ||
| 185 | |||
| 186 | Text { | ||
| 187 | id: tooltipText | ||
| 188 | |||
| 189 | visible: tooltip.tooltipVisible | ||
| 190 | |||
| 191 | anchors.verticalCenter: parent.verticalCenter | ||
| 192 | |||
| 193 | font.pointSize: 10 | ||
| 194 | font.family: "Fira Sans" | ||
| 195 | color: "white" | ||
| 196 | |||
| 197 | text: tooltip.state.state?.tooltip ?? "" | ||
| 198 | } | ||
| 199 | } | ||
| 200 | } | ||
| 201 | } | ||
| 202 | } | ||
| 203 | |||
| 204 | WorktimePopup { | ||
| 205 | state: Worktime.time | ||
| 206 | mouseArea: timeWidget.mouseArea | ||
| 207 | } | ||
| 208 | WorktimePopup { | ||
| 209 | state: Worktime.today | ||
| 210 | mouseArea: todayWidget.mouseArea | ||
| 211 | } | ||
| 212 | } | ||
diff --git a/accounts/gkleen@skadhi/shell/quickshell/YtDlpWidget.qml b/accounts/gkleen@skadhi/shell/quickshell/YtDlpWidget.qml new file mode 100644 index 00000000..ff338d49 --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell/YtDlpWidget.qml | |||
| @@ -0,0 +1,190 @@ | |||
| 1 | import QtQml.Models | ||
| 2 | import QtQuick | ||
| 3 | import QtQuick.Layouts | ||
| 4 | import QtQuick.Controls.Material | ||
| 5 | import Quickshell | ||
| 6 | import Quickshell.Io | ||
| 7 | import Quickshell.Widgets | ||
| 8 | import Custom as Custom | ||
| 9 | |||
| 10 | Item { | ||
| 11 | id: root | ||
| 12 | |||
| 13 | height: parent.height | ||
| 14 | width: icon.width | ||
| 15 | anchors.verticalCenter: parent.verticalCenter | ||
| 16 | |||
| 17 | visible: Boolean(unitsModel.values.length) | ||
| 18 | |||
| 19 | WrapperMouseArea { | ||
| 20 | id: widgetMouseArea | ||
| 21 | |||
| 22 | anchors.fill: parent | ||
| 23 | hoverEnabled: true | ||
| 24 | |||
| 25 | Item { | ||
| 26 | anchors.fill: parent | ||
| 27 | |||
| 28 | MaterialDesignIcon { | ||
| 29 | id: icon | ||
| 30 | |||
| 31 | implicitSize: 14 | ||
| 32 | anchors.centerIn: parent | ||
| 33 | |||
| 34 | icon: "tray-arrow-down" | ||
| 35 | color: "white" | ||
| 36 | } | ||
| 37 | } | ||
| 38 | } | ||
| 39 | |||
| 40 | PopupWindow { | ||
| 41 | id: tooltip | ||
| 42 | |||
| 43 | property bool openPopup: false | ||
| 44 | property bool nextVisible: widgetMouseArea.containsMouse || tooltipMouseArea.containsMouse || openPopup | ||
| 45 | |||
| 46 | anchor { | ||
| 47 | item: widgetMouseArea | ||
| 48 | edges: Edges.Bottom | Edges.Left | ||
| 49 | } | ||
| 50 | visible: false | ||
| 51 | |||
| 52 | onNextVisibleChanged: hangTimer.restart() | ||
| 53 | |||
| 54 | Timer { | ||
| 55 | id: hangTimer | ||
| 56 | interval: 100 | ||
| 57 | onTriggered: tooltip.visible = tooltip.nextVisible | ||
| 58 | } | ||
| 59 | |||
| 60 | implicitWidth: tooltipContent.width | ||
| 61 | implicitHeight: tooltipContent.height | ||
| 62 | color: "transparent" | ||
| 63 | |||
| 64 | Rectangle { | ||
| 65 | width: tooltip.width | ||
| 66 | height: tooltipLayout.childrenRect.height + 16 | ||
| 67 | color: "black" | ||
| 68 | } | ||
| 69 | |||
| 70 | WrapperItem { | ||
| 71 | id: tooltipContent | ||
| 72 | |||
| 73 | WrapperMouseArea { | ||
| 74 | id: tooltipMouseArea | ||
| 75 | |||
| 76 | hoverEnabled: true | ||
| 77 | enabled: true | ||
| 78 | |||
| 79 | WrapperItem { | ||
| 80 | margin: 8 | ||
| 81 | |||
| 82 | child: GridLayout { | ||
| 83 | id: tooltipLayout | ||
| 84 | |||
| 85 | columns: 2 | ||
| 86 | } | ||
| 87 | |||
| 88 | Repeater { | ||
| 89 | model: ScriptModel { | ||
| 90 | id: unitsModel | ||
| 91 | |||
| 92 | values: [...Custom.Systemd.userUnits.values].filter(unit => unit.id.match(/^yt-dlp@.+\.service$/) && unit.activeState === "active" && unit.runtimeDirectory) | ||
| 93 | } | ||
| 94 | |||
| 95 | Item { | ||
| 96 | id: unitDelegate | ||
| 97 | |||
| 98 | Component.onCompleted: { | ||
| 99 | while (children.length) { children[0].parent = tooltipLayout; } | ||
| 100 | } | ||
| 101 | |||
| 102 | required property var modelData | ||
| 103 | required property int index | ||
| 104 | |||
| 105 | property var state: null | ||
| 106 | |||
| 107 | Socket { | ||
| 108 | id: socket | ||
| 109 | |||
| 110 | path: Quickshell.env("XDG_RUNTIME_DIR") + "/" + unitDelegate.modelData.runtimeDirectory[0] + "/status.sock" | ||
| 111 | connected: true | ||
| 112 | onError: e => { | ||
| 113 | console.warn("YtDlpWidget: Error in Socket:", socket.path, e); | ||
| 114 | } | ||
| 115 | parser: SplitParser { | ||
| 116 | onRead: line => { | ||
| 117 | try { | ||
| 118 | unitDelegate.state = JSON.parse(line) | ||
| 119 | } catch (e) { | ||
| 120 | console.warn("YtDlpWidget: Failed to parse state:", line, e) | ||
| 121 | } | ||
| 122 | } | ||
| 123 | } | ||
| 124 | } | ||
| 125 | |||
| 126 | WrapperItem { | ||
| 127 | Layout.column: 0 | ||
| 128 | Layout.row: unitDelegate.index | ||
| 129 | |||
| 130 | implicitWidth: descText.contentWidth | ||
| 131 | implicitHeight: descText.contentHeight | ||
| 132 | |||
| 133 | Text { | ||
| 134 | id: descText | ||
| 135 | |||
| 136 | color: "white" | ||
| 137 | font.pointSize: 10 | ||
| 138 | font.family: "Fira Sans" | ||
| 139 | |||
| 140 | text: unitDelegate.state?.title || unitDelegate.modelData.id | ||
| 141 | } | ||
| 142 | } | ||
| 143 | |||
| 144 | /* | ||
| 145 | WrapperItem { | ||
| 146 | Layout.column: 1 | ||
| 147 | Layout.row: unitDelegate.index | ||
| 148 | |||
| 149 | implicitWidth: fragText.contentWidth | ||
| 150 | implicitHeight: fragText.contentHeight | ||
| 151 | |||
| 152 | visible: Boolean(unitDelegate.state) | ||
| 153 | |||
| 154 | Text { | ||
| 155 | id: fragText | ||
| 156 | |||
| 157 | color: "white" | ||
| 158 | font.pointSize: 10 | ||
| 159 | font.family: "Fira Sans" | ||
| 160 | |||
| 161 | text: `${unitDelegate.state?.fragment_index}/${unitDelegate.state?.fragment_count}` | ||
| 162 | } | ||
| 163 | } | ||
| 164 | */ | ||
| 165 | |||
| 166 | WrapperItem { | ||
| 167 | Layout.column: 1 | ||
| 168 | Layout.row: unitDelegate.index | ||
| 169 | |||
| 170 | visible: Boolean(unitDelegate.state) | ||
| 171 | |||
| 172 | ProgressBar { | ||
| 173 | id: progress | ||
| 174 | |||
| 175 | Material.background: "black" | ||
| 176 | Material.accent: "white" | ||
| 177 | |||
| 178 | from: 0 | ||
| 179 | to: unitDelegate.state?.total_bytes || unitDelegate.state?.total_bytes_estimate || 0 | ||
| 180 | value: unitDelegate.state?.downloaded_bytes || 0 | ||
| 181 | indeterminate: !Boolean(unitDelegate.state?.total_bytes || unitDelegate.state?.total_bytes_estimate) || unitDelegate.state?.status !== "downloading" | ||
| 182 | } | ||
| 183 | } | ||
| 184 | } | ||
| 185 | } | ||
| 186 | } | ||
| 187 | } | ||
| 188 | } | ||
| 189 | } | ||
| 190 | } | ||
diff --git a/accounts/gkleen@skadhi/shell/quickshell/displaymanager.qml b/accounts/gkleen@skadhi/shell/quickshell/displaymanager.qml new file mode 100644 index 00000000..b452c03d --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell/displaymanager.qml | |||
| @@ -0,0 +1,115 @@ | |||
| 1 | //@ pragma UseQApplication | ||
| 2 | |||
| 3 | import Quickshell | ||
| 4 | import Quickshell.Wayland | ||
| 5 | import Quickshell.Io | ||
| 6 | import Quickshell.Services.Greetd | ||
| 7 | import QtQml | ||
| 8 | |||
| 9 | |||
| 10 | ShellRoot { | ||
| 11 | id: displaymanager | ||
| 12 | |||
| 13 | settings.watchFiles: false | ||
| 14 | |||
| 15 | property string currentText: "" | ||
| 16 | property string username: @username@ | ||
| 17 | property list<string> command: @niri_session@ | ||
| 18 | property list<var> messages: [] | ||
| 19 | property bool responseRequired: false | ||
| 20 | property bool responseVisible: false | ||
| 21 | |||
| 22 | signal startAuth() | ||
| 23 | |||
| 24 | onStartAuth: { | ||
| 25 | if (Greetd.state !== GreetdState.Inactive) | ||
| 26 | Greetd.cancelSession(); | ||
| 27 | displaymanager.messages = []; | ||
| 28 | Greetd.createSession(displaymanager.username); | ||
| 29 | } | ||
| 30 | |||
| 31 | Connections { | ||
| 32 | target: Greetd | ||
| 33 | function onStateChanged() { | ||
| 34 | console.log("greetd state: ", GreetdState.toString(Greetd.state)); | ||
| 35 | if (Greetd.state === GreetdState.ReadyToLaunch) | ||
| 36 | Greetd.launch(displaymanager.command); | ||
| 37 | } | ||
| 38 | function onAuthMessage(message: string, error: bool, responseRequired: bool, echoResponse: bool) { | ||
| 39 | displaymanager.responseVisible = echoResponse; | ||
| 40 | displaymanager.responseRequired = responseRequired; | ||
| 41 | displaymanager.messages = Array.from(displaymanager.messages).concat([{ "text": message, "error": error }]); | ||
| 42 | } | ||
| 43 | function onAuthFailure(message: string) { | ||
| 44 | displaymanager.responseRequired = false; | ||
| 45 | displaymanager.messages = Array.from(displaymanager.messages).concat([{ "text": message, "error": true }]); | ||
| 46 | } | ||
| 47 | } | ||
| 48 | |||
| 49 | Component.onCompleted: { | ||
| 50 | if (Greetd.state !== GreetdState.Inactive) | ||
| 51 | Greetd.cancelSession(); | ||
| 52 | } | ||
| 53 | |||
| 54 | Variants { | ||
| 55 | model: Quickshell.screens | ||
| 56 | |||
| 57 | delegate: Scope { | ||
| 58 | id: screenScope | ||
| 59 | |||
| 60 | required property var modelData | ||
| 61 | |||
| 62 | PanelWindow { | ||
| 63 | color: "black" | ||
| 64 | |||
| 65 | screen: screenScope.modelData | ||
| 66 | |||
| 67 | WlrLayershell.keyboardFocus: WlrKeyboardFocus.Exclusive | ||
| 68 | |||
| 69 | anchors.top: true | ||
| 70 | anchors.bottom: true | ||
| 71 | anchors.left: true | ||
| 72 | anchors.right: true | ||
| 73 | |||
| 74 | LockSurface { | ||
| 75 | id: surfaceContent | ||
| 76 | |||
| 77 | screen: screenScope.modelData | ||
| 78 | |||
| 79 | onCurrentTextChanged: displaymanager.currentText = currentText | ||
| 80 | Connections { | ||
| 81 | target: displaymanager | ||
| 82 | function onCurrentTextChanged() { surfaceContent.currentText = displaymanager.currentText; } | ||
| 83 | function onMessagesChanged() { surfaceContent.messages = Array.from(displaymanager.messages); } | ||
| 84 | function onResponseRequiredChanged() { surfaceContent.responseRequired = displaymanager.responseRequired; } | ||
| 85 | function onResponseVisibleChanged() { surfaceContent.responseVisible = displaymanager.responseVisible; } | ||
| 86 | } | ||
| 87 | |||
| 88 | onResponse: responseText => Greetd.respond(responseText); | ||
| 89 | Connections { | ||
| 90 | target: Greetd | ||
| 91 | function onStateChanged() { | ||
| 92 | if (Greetd.state === GreetdState.Authenticating) { | ||
| 93 | surfaceContent.authRunning = true; | ||
| 94 | } else { | ||
| 95 | surfaceContent.authRunning = false; | ||
| 96 | } | ||
| 97 | } | ||
| 98 | } | ||
| 99 | |||
| 100 | onAuthRunningChanged: { | ||
| 101 | if (surfaceContent.authRunning && Greetd.state !== GreetdState.Authenticating) | ||
| 102 | displaymanager.startAuth(); | ||
| 103 | } | ||
| 104 | Component.onCompleted: { | ||
| 105 | surfaceContent.authRunning = Greetd.state === GreetdState.Authenticating | ||
| 106 | surfaceContent.messages = Array.from(displaymanager.messages); | ||
| 107 | surfaceContent.responseVisible = displaymanager.responseVisible; | ||
| 108 | surfaceContent.responseRequired = displaymanager.responseRequired; | ||
| 109 | surfaceContent.currentText = displaymanager.currentText; | ||
| 110 | } | ||
| 111 | } | ||
| 112 | } | ||
| 113 | } | ||
| 114 | } | ||
| 115 | } | ||
diff --git a/accounts/gkleen@skadhi/shell/quickshell/shell.qml b/accounts/gkleen@skadhi/shell/quickshell/shell.qml new file mode 100644 index 00000000..1a5875f0 --- /dev/null +++ b/accounts/gkleen@skadhi/shell/quickshell/shell.qml | |||
| @@ -0,0 +1,53 @@ | |||
| 1 | //@ pragma UseQApplication | ||
| 2 | |||
| 3 | import Quickshell | ||
| 4 | import Quickshell.Wayland | ||
| 5 | |||
| 6 | ShellRoot { | ||
| 7 | settings.watchFiles: false | ||
| 8 | |||
| 9 | Variants { | ||
| 10 | model: Quickshell.screens | ||
| 11 | |||
| 12 | delegate: Scope { | ||
| 13 | id: screenScope | ||
| 14 | |||
| 15 | required property var modelData | ||
| 16 | |||
| 17 | PanelWindow { | ||
| 18 | id: bgWindow | ||
| 19 | |||
| 20 | screen: screenScope.modelData | ||
| 21 | |||
| 22 | WlrLayershell.layer: WlrLayer.Background | ||
| 23 | WlrLayershell.namespace: "background" | ||
| 24 | exclusionMode: ExclusionMode.Ignore | ||
| 25 | |||
| 26 | anchors.top: true | ||
| 27 | anchors.bottom: true | ||
| 28 | anchors.left: true | ||
| 29 | anchors.right: true | ||
| 30 | |||
| 31 | color: "black" | ||
| 32 | |||
| 33 | WallpaperBackground { | ||
| 34 | screen: bgWindow.screen.name | ||
| 35 | } | ||
| 36 | } | ||
| 37 | |||
| 38 | Bar { | ||
| 39 | screen: screenScope.modelData | ||
| 40 | } | ||
| 41 | } | ||
| 42 | } | ||
| 43 | |||
| 44 | Lockscreen {} | ||
| 45 | NiriIdle {} | ||
| 46 | |||
| 47 | VolumeOSD {} | ||
| 48 | BrightnessOSD {} | ||
| 49 | |||
| 50 | NotificationDisplay {} | ||
| 51 | |||
| 52 | UnixIPC {} | ||
| 53 | } | ||
diff --git a/accounts/gkleen@skadhi/ssh/default.nix b/accounts/gkleen@skadhi/ssh/default.nix new file mode 100644 index 00000000..ab0e8990 --- /dev/null +++ b/accounts/gkleen@skadhi/ssh/default.nix | |||
| @@ -0,0 +1,44 @@ | |||
| 1 | { lib, ... }: | ||
| 2 | { | ||
| 3 | config = { | ||
| 4 | home.persistence."/persistent".directories = [ | ||
| 5 | ".ssh" | ||
| 6 | ]; | ||
| 7 | |||
| 8 | programs.ssh.settings = { | ||
| 9 | "surtr" = { | ||
| 10 | Hostname = "surtr.yggdrasil"; | ||
| 11 | IdentityFile = "~/.ssh/gkleen@skadhi.yggdrasil"; | ||
| 12 | }; | ||
| 13 | "surtr.yggdrasil.li" = { | ||
| 14 | IdentityFile = "~/.ssh/gkleen@skadhi.yggdrasil"; | ||
| 15 | }; | ||
| 16 | "sif" = { | ||
| 17 | Hostname = "sif.yggdrasil"; | ||
| 18 | IdentityFile = "~/.ssh/gkleen@skadhi.yggdrasil"; | ||
| 19 | }; | ||
| 20 | "vidhar" = { | ||
| 21 | Hostname = "vidhar.yggdrasil"; | ||
| 22 | IdentityFile = "~/.ssh/gkleen@skadhi.yggdrasil"; | ||
| 23 | }; | ||
| 24 | "ymir" = { | ||
| 25 | Hostname = "ymir.yggdrasil.li"; | ||
| 26 | IdentityFile = "~/.ssh/gkleen@skadhi.yggdrasil"; | ||
| 27 | }; | ||
| 28 | "localhost" = { | ||
| 29 | header = "Host " + lib.concatStringsSep " " [".host" "skadhi" "skadhi.yggdrasil" "localhost" "::1" "127.0.0.0/8"]; | ||
| 30 | IdentityFile = "~/.ssh/gkleen@skadhi.yggdrasil"; | ||
| 31 | }; | ||
| 32 | "git.yggdrasil.li" = { | ||
| 33 | User = "gitolite"; | ||
| 34 | IdentityFile = "~/.ssh/gkleen@skadhi.yggdrasil"; | ||
| 35 | }; | ||
| 36 | "github.com" = { | ||
| 37 | User = "git"; | ||
| 38 | IdentityFile = "~/.ssh/gkleen@github.com"; | ||
| 39 | }; | ||
| 40 | }; | ||
| 41 | |||
| 42 | programs.ssh.autosshProxies.vidhar.port = 8121; | ||
| 43 | }; | ||
| 44 | } | ||
diff --git a/accounts/gkleen@skadhi/utils/async-yt-dlp.nix b/accounts/gkleen@skadhi/utils/async-yt-dlp.nix new file mode 100644 index 00000000..c3b82ec5 --- /dev/null +++ b/accounts/gkleen@skadhi/utils/async-yt-dlp.nix | |||
| @@ -0,0 +1,57 @@ | |||
| 1 | { writers, python3Packages, ... }: | ||
| 2 | |||
| 3 | writers.writePython3Bin "async-yt-dlp" { | ||
| 4 | libraries = with python3Packages; [ yt-dlp ]; | ||
| 5 | flakeIgnore = ["E501"]; | ||
| 6 | } '' | ||
| 7 | import sys | ||
| 8 | import os | ||
| 9 | |||
| 10 | import yt_dlp | ||
| 11 | import yt_dlp.options | ||
| 12 | from collections import namedtuple | ||
| 13 | import socket | ||
| 14 | from pathlib import Path | ||
| 15 | import json | ||
| 16 | |||
| 17 | create_parser = yt_dlp.options.create_parser | ||
| 18 | |||
| 19 | |||
| 20 | def parse_patched_options(opts): | ||
| 21 | patched_parser = create_parser() | ||
| 22 | patched_parser.defaults.update({ | ||
| 23 | 'ignoreerrors': False, | ||
| 24 | 'retries': 0, | ||
| 25 | 'fragment_retries': 0, | ||
| 26 | 'extract_flat': False, | ||
| 27 | 'concat_playlist': 'never', | ||
| 28 | }) | ||
| 29 | yt_dlp.options.create_parser = lambda: patched_parser | ||
| 30 | try: | ||
| 31 | return yt_dlp.parse_options(opts) | ||
| 32 | finally: | ||
| 33 | yt_dlp.options.create_parser = create_parser | ||
| 34 | |||
| 35 | |||
| 36 | default_opts = parse_patched_options([]).ydl_opts | ||
| 37 | |||
| 38 | |||
| 39 | def cli_to_api(opts): | ||
| 40 | opts = parse_patched_options(opts) | ||
| 41 | urls = opts.urls | ||
| 42 | opts = opts.ydl_opts | ||
| 43 | |||
| 44 | diff = {k: v for k, v in opts.items() if default_opts[k] != v} | ||
| 45 | if 'postprocessors' in diff: | ||
| 46 | diff['postprocessors'] = [pp for pp in diff['postprocessors'] | ||
| 47 | if pp not in default_opts['postprocessors']] | ||
| 48 | return namedtuple('Options', ('params', 'urls'))(diff, urls) | ||
| 49 | |||
| 50 | |||
| 51 | if __name__ == '__main__': | ||
| 52 | opts = cli_to_api(sys.argv[1:]) | ||
| 53 | with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as sock: | ||
| 54 | sock.connect(str(Path(os.environ["XDG_RUNTIME_DIR"]) / "yt-dlp.sock").encode('utf-8')) | ||
| 55 | with sock.makefile(mode='w', buffering=1, encoding='utf-8') as fh: | ||
| 56 | json.dump(opts._asdict(), fh) | ||
| 57 | '' | ||
diff --git a/accounts/gkleen@skadhi/utils/ldif2json/conf.patch b/accounts/gkleen@skadhi/utils/ldif2json/conf.patch new file mode 100644 index 00000000..e253e5f7 --- /dev/null +++ b/accounts/gkleen@skadhi/utils/ldif2json/conf.patch | |||
| @@ -0,0 +1,12 @@ | |||
| 1 | diff --git i/src/conf.cr w/src/conf.cr | ||
| 2 | index b29ca84..eb7e0b4 100644 | ||
| 3 | --- i/src/conf.cr | ||
| 4 | +++ w/src/conf.cr | ||
| 5 | @@ -89,7 +89,6 @@ module Ldif2json | ||
| 6 | |||
| 7 | end.parse | ||
| 8 | |||
| 9 | - puts "@coercions #{@coercions.inspect} @can_be_coerced #{@can_be_coerced.inspect} @can_be_coerced[\"foobar\"] #{@can_be_coerced["foobar"].inspect} @can_be_flattened #{@can_be_flattened.inspect} @can_be_flattened[\"foobar\"] #{@can_be_flattened["foobar"].inspect}" | ||
| 10 | raise NormalError.new("cannot set types in join mode") if @mode == Mode::Join && @coercions.size > 0 | ||
| 11 | |||
| 12 | end | ||
diff --git a/accounts/gkleen@skadhi/utils/ldif2json/default.nix b/accounts/gkleen@skadhi/utils/ldif2json/default.nix new file mode 100644 index 00000000..548ae9b1 --- /dev/null +++ b/accounts/gkleen@skadhi/utils/ldif2json/default.nix | |||
| @@ -0,0 +1,20 @@ | |||
| 1 | { crystal, sources, ... }: | ||
| 2 | crystal.buildCrystalPackage { | ||
| 3 | inherit (sources.ldif2json) pname version src; | ||
| 4 | |||
| 5 | patches = [ | ||
| 6 | ./conf.patch | ||
| 7 | ]; | ||
| 8 | |||
| 9 | buildPhase = '' | ||
| 10 | make bin/ldif2json | ||
| 11 | ''; | ||
| 12 | |||
| 13 | installPhase = '' | ||
| 14 | mkdir -p $out/bin $out/share/man/man1 | ||
| 15 | install -m 0555 -t $out/bin bin/ldif2json | ||
| 16 | install -m 0444 -t $out/share/man/man1 doc/ldif2json.1.gz | ||
| 17 | ''; | ||
| 18 | |||
| 19 | doCheck = false; | ||
| 20 | } | ||
diff --git a/accounts/gkleen@skadhi/utils/nixpkgs-pr-watch/.envrc b/accounts/gkleen@skadhi/utils/nixpkgs-pr-watch/.envrc new file mode 100644 index 00000000..2c909235 --- /dev/null +++ b/accounts/gkleen@skadhi/utils/nixpkgs-pr-watch/.envrc | |||
| @@ -0,0 +1,4 @@ | |||
| 1 | use flake | ||
| 2 | |||
| 3 | [[ -d ".venv" ]] || ( uv venv && uv sync ) | ||
| 4 | . .venv/bin/activate | ||
diff --git a/accounts/gkleen@skadhi/utils/nixpkgs-pr-watch/.gitignore b/accounts/gkleen@skadhi/utils/nixpkgs-pr-watch/.gitignore new file mode 100644 index 00000000..4ccfae70 --- /dev/null +++ b/accounts/gkleen@skadhi/utils/nixpkgs-pr-watch/.gitignore | |||
| @@ -0,0 +1,2 @@ | |||
| 1 | .venv | ||
| 2 | **/__pycache__ | ||
diff --git a/accounts/gkleen@skadhi/utils/nixpkgs-pr-watch/default.nix b/accounts/gkleen@skadhi/utils/nixpkgs-pr-watch/default.nix new file mode 100644 index 00000000..64ee4623 --- /dev/null +++ b/accounts/gkleen@skadhi/utils/nixpkgs-pr-watch/default.nix | |||
| @@ -0,0 +1,22 @@ | |||
| 1 | { pkgs, flake, flakeInputs, ... }: | ||
| 2 | |||
| 3 | let | ||
| 4 | workspace = flakeInputs.uv2nix.lib.workspace.loadWorkspace { workspaceRoot = ./.; }; | ||
| 5 | pythonSet = flake.lib.pythonSet { | ||
| 6 | inherit pkgs; | ||
| 7 | python = pkgs.python3; | ||
| 8 | overlay = workspace.mkPyprojectOverlay { | ||
| 9 | sourcePreference = "wheel"; | ||
| 10 | }; | ||
| 11 | }; | ||
| 12 | package = "nixpkgs-pr-watch"; | ||
| 13 | venv = pythonSet.mkVirtualEnv package workspace.deps.default; | ||
| 14 | inherit (pkgs.callPackages flakeInputs.pyproject-nix.build.util {}) mkApplication; | ||
| 15 | in (mkApplication { | ||
| 16 | inherit venv; | ||
| 17 | package = pythonSet.${package}; | ||
| 18 | }).overrideAttrs (oldAttrs: { | ||
| 19 | meta = (oldAttrs.meta or {}) // { | ||
| 20 | mainProgram = "nixpkgs-pr-watch"; | ||
| 21 | }; | ||
| 22 | }) | ||
diff --git a/accounts/gkleen@skadhi/utils/nixpkgs-pr-watch/nixpkgs_pr_watch/__init__.py b/accounts/gkleen@skadhi/utils/nixpkgs-pr-watch/nixpkgs_pr_watch/__init__.py new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/accounts/gkleen@skadhi/utils/nixpkgs-pr-watch/nixpkgs_pr_watch/__init__.py | |||
diff --git a/accounts/gkleen@skadhi/utils/nixpkgs-pr-watch/nixpkgs_pr_watch/__main__.py b/accounts/gkleen@skadhi/utils/nixpkgs-pr-watch/nixpkgs_pr_watch/__main__.py new file mode 100644 index 00000000..09bb8651 --- /dev/null +++ b/accounts/gkleen@skadhi/utils/nixpkgs-pr-watch/nixpkgs_pr_watch/__main__.py | |||
| @@ -0,0 +1,73 @@ | |||
| 1 | import argparse | ||
| 2 | import re | ||
| 3 | import requests | ||
| 4 | from urllib.parse import urljoin | ||
| 5 | from xdg_base_dirs import xdg_config_home, xdg_config_dirs | ||
| 6 | import toml | ||
| 7 | import sys | ||
| 8 | |||
| 9 | from github import Github | ||
| 10 | |||
| 11 | class ApiKeyAuth(requests.auth.AuthBase): | ||
| 12 | def __init__(self, token): | ||
| 13 | self.token = token | ||
| 14 | def __call__(self, r): | ||
| 15 | r.headers["x-api-key"] = self.token | ||
| 16 | return r | ||
| 17 | |||
| 18 | class ChangeDetectionSession(requests.Session): | ||
| 19 | def __init__(self, base_url: str, api_token: str): | ||
| 20 | super().__init__() | ||
| 21 | self.base_url = base_url | ||
| 22 | self.auth = ApiKeyAuth(api_token) | ||
| 23 | |||
| 24 | def request(self, method, url, *args, **kwargs): | ||
| 25 | joined_url = urljoin(urljoin(self.base_url, '/api/v1/'), url) | ||
| 26 | return super().request(method, joined_url, *args, **kwargs) | ||
| 27 | |||
| 28 | def main(): | ||
| 29 | def pr_number(s): | ||
| 30 | if m := re.fullmatch(r'(?:https?://github\.com/NixOS/nixpkgs/pull/)?(?P<pr>[0-9]+)(?:[^0-9].*)?', s, flags=re.I): | ||
| 31 | return int(m.group('pr')) | ||
| 32 | else: | ||
| 33 | raise ValueError | ||
| 34 | |||
| 35 | parser = argparse.ArgumentParser(prog = "nixpkgs-pr-watch") | ||
| 36 | parser.add_argument('prs', metavar = 'PR', type = pr_number, nargs = '+') | ||
| 37 | |||
| 38 | args = parser.parse_args() | ||
| 39 | |||
| 40 | config = None | ||
| 41 | for d in [xdg_config_home(), *xdg_config_dirs()]: | ||
| 42 | try: | ||
| 43 | config = toml.load(d / 'nixpkgs-pr-watch.toml') | ||
| 44 | break | ||
| 45 | except FileNotFoundError: | ||
| 46 | pass | ||
| 47 | |||
| 48 | for pr in args.prs: | ||
| 49 | pr_title = None | ||
| 50 | with Github() as g: | ||
| 51 | pr_title = g.get_repo('NixOS/nixpkgs').get_pull(pr).title | ||
| 52 | |||
| 53 | api = ChangeDetectionSession( | ||
| 54 | base_url = config.get("BaseUrl"), | ||
| 55 | api_token = config.get("ApiToken"), | ||
| 56 | ) | ||
| 57 | try: | ||
| 58 | api.post( | ||
| 59 | "watch", | ||
| 60 | headers = { | ||
| 61 | 'Content-Type': 'application/json', | ||
| 62 | }, | ||
| 63 | json = { | ||
| 64 | "url": urljoin("https://nixpkgs.molybdenum.software/api/v2/landings/", str(pr)), | ||
| 65 | **({ "title": pr_title } if pr_title else {}), | ||
| 66 | "time_between_check_use_default": False, | ||
| 67 | "time_between_check": { "hours": 1 }, | ||
| 68 | "fetch_backend": "html_requests", | ||
| 69 | }, | ||
| 70 | ).raise_for_status() | ||
| 71 | except requests.HTTPError as e: | ||
| 72 | print(e.response.text, file=sys.stderr) | ||
| 73 | raise e | ||
diff --git a/accounts/gkleen@skadhi/utils/nixpkgs-pr-watch/pyproject.toml b/accounts/gkleen@skadhi/utils/nixpkgs-pr-watch/pyproject.toml new file mode 100644 index 00000000..593c1dc7 --- /dev/null +++ b/accounts/gkleen@skadhi/utils/nixpkgs-pr-watch/pyproject.toml | |||
| @@ -0,0 +1,17 @@ | |||
| 1 | [project] | ||
| 2 | name = "nixpkgs-pr-watch" | ||
| 3 | version = "0.1.0" | ||
| 4 | requires-python = ">=3.13" | ||
| 5 | dependencies = [ | ||
| 6 | "pygithub>=2.8.1", | ||
| 7 | "requests>=2.32.5", | ||
| 8 | "toml>=0.10.2", | ||
| 9 | "xdg-base-dirs>=6.0.2", | ||
| 10 | ] | ||
| 11 | |||
| 12 | [project.scripts] | ||
| 13 | nixpkgs-pr-watch = "nixpkgs_pr_watch.__main__:main" | ||
| 14 | |||
| 15 | [build-system] | ||
| 16 | requires = ["hatchling"] | ||
| 17 | build-backend = "hatchling.build" | ||
diff --git a/accounts/gkleen@skadhi/utils/nixpkgs-pr-watch/uv.lock b/accounts/gkleen@skadhi/utils/nixpkgs-pr-watch/uv.lock new file mode 100644 index 00000000..65537049 --- /dev/null +++ b/accounts/gkleen@skadhi/utils/nixpkgs-pr-watch/uv.lock | |||
| @@ -0,0 +1,309 @@ | |||
| 1 | version = 1 | ||
| 2 | revision = 3 | ||
| 3 | requires-python = ">=3.13" | ||
| 4 | |||
| 5 | [[package]] | ||
| 6 | name = "certifi" | ||
| 7 | version = "2025.11.12" | ||
| 8 | source = { registry = "https://pypi.org/simple" } | ||
| 9 | sdist = { url = "https://files.pythonhosted.org/packages/a2/8c/58f469717fa48465e4a50c014a0400602d3c437d7c0c468e17ada824da3a/certifi-2025.11.12.tar.gz", hash = "sha256:d8ab5478f2ecd78af242878415affce761ca6bc54a22a27e026d7c25357c3316", size = 160538, upload-time = "2025-11-12T02:54:51.517Z" } | ||
| 10 | wheels = [ | ||
| 11 | { url = "https://files.pythonhosted.org/packages/70/7d/9bc192684cea499815ff478dfcdc13835ddf401365057044fb721ec6bddb/certifi-2025.11.12-py3-none-any.whl", hash = "sha256:97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b", size = 159438, upload-time = "2025-11-12T02:54:49.735Z" }, | ||
| 12 | ] | ||
| 13 | |||
| 14 | [[package]] | ||
| 15 | name = "cffi" | ||
| 16 | version = "2.0.0" | ||
| 17 | source = { registry = "https://pypi.org/simple" } | ||
| 18 | dependencies = [ | ||
| 19 | { name = "pycparser", marker = "implementation_name != 'PyPy'" }, | ||
| 20 | ] | ||
| 21 | sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } | ||
| 22 | wheels = [ | ||
| 23 | { url = "https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb", size = 185230, upload-time = "2025-09-08T23:23:00.879Z" }, | ||
| 24 | { url = "https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca", size = 181043, upload-time = "2025-09-08T23:23:02.231Z" }, | ||
| 25 | { url = "https://files.pythonhosted.org/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", size = 212446, upload-time = "2025-09-08T23:23:03.472Z" }, | ||
| 26 | { url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101, upload-time = "2025-09-08T23:23:04.792Z" }, | ||
| 27 | { url = "https://files.pythonhosted.org/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", size = 207948, upload-time = "2025-09-08T23:23:06.127Z" }, | ||
| 28 | { url = "https://files.pythonhosted.org/packages/cb/1e/a5a1bd6f1fb30f22573f76533de12a00bf274abcdc55c8edab639078abb6/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", size = 206422, upload-time = "2025-09-08T23:23:07.753Z" }, | ||
| 29 | { url = "https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499, upload-time = "2025-09-08T23:23:09.648Z" }, | ||
| 30 | { url = "https://files.pythonhosted.org/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928, upload-time = "2025-09-08T23:23:10.928Z" }, | ||
| 31 | { url = "https://files.pythonhosted.org/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302, upload-time = "2025-09-08T23:23:12.42Z" }, | ||
| 32 | { url = "https://files.pythonhosted.org/packages/eb/6d/bf9bda840d5f1dfdbf0feca87fbdb64a918a69bca42cfa0ba7b137c48cb8/cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27", size = 172909, upload-time = "2025-09-08T23:23:14.32Z" }, | ||
| 33 | { url = "https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75", size = 183402, upload-time = "2025-09-08T23:23:15.535Z" }, | ||
| 34 | { url = "https://files.pythonhosted.org/packages/cb/0e/02ceeec9a7d6ee63bb596121c2c8e9b3a9e150936f4fbef6ca1943e6137c/cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91", size = 177780, upload-time = "2025-09-08T23:23:16.761Z" }, | ||
| 35 | { url = "https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5", size = 185320, upload-time = "2025-09-08T23:23:18.087Z" }, | ||
| 36 | { url = "https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13", size = 181487, upload-time = "2025-09-08T23:23:19.622Z" }, | ||
| 37 | { url = "https://files.pythonhosted.org/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", size = 220049, upload-time = "2025-09-08T23:23:20.853Z" }, | ||
| 38 | { url = "https://files.pythonhosted.org/packages/b4/89/76799151d9c2d2d1ead63c2429da9ea9d7aac304603de0c6e8764e6e8e70/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c", size = 207793, upload-time = "2025-09-08T23:23:22.08Z" }, | ||
| 39 | { url = "https://files.pythonhosted.org/packages/bb/dd/3465b14bb9e24ee24cb88c9e3730f6de63111fffe513492bf8c808a3547e/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef", size = 206300, upload-time = "2025-09-08T23:23:23.314Z" }, | ||
| 40 | { url = "https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", size = 219244, upload-time = "2025-09-08T23:23:24.541Z" }, | ||
| 41 | { url = "https://files.pythonhosted.org/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", size = 222828, upload-time = "2025-09-08T23:23:26.143Z" }, | ||
| 42 | { url = "https://files.pythonhosted.org/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", size = 220926, upload-time = "2025-09-08T23:23:27.873Z" }, | ||
| 43 | { url = "https://files.pythonhosted.org/packages/3e/aa/df335faa45b395396fcbc03de2dfcab242cd61a9900e914fe682a59170b1/cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f", size = 175328, upload-time = "2025-09-08T23:23:44.61Z" }, | ||
| 44 | { url = "https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25", size = 185650, upload-time = "2025-09-08T23:23:45.848Z" }, | ||
| 45 | { url = "https://files.pythonhosted.org/packages/9f/2c/98ece204b9d35a7366b5b2c6539c350313ca13932143e79dc133ba757104/cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad", size = 180687, upload-time = "2025-09-08T23:23:47.105Z" }, | ||
| 46 | { url = "https://files.pythonhosted.org/packages/3e/61/c768e4d548bfa607abcda77423448df8c471f25dbe64fb2ef6d555eae006/cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9", size = 188773, upload-time = "2025-09-08T23:23:29.347Z" }, | ||
| 47 | { url = "https://files.pythonhosted.org/packages/2c/ea/5f76bce7cf6fcd0ab1a1058b5af899bfbef198bea4d5686da88471ea0336/cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d", size = 185013, upload-time = "2025-09-08T23:23:30.63Z" }, | ||
| 48 | { url = "https://files.pythonhosted.org/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", size = 221593, upload-time = "2025-09-08T23:23:31.91Z" }, | ||
| 49 | { url = "https://files.pythonhosted.org/packages/e0/0d/eb704606dfe8033e7128df5e90fee946bbcb64a04fcdaa97321309004000/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8", size = 209354, upload-time = "2025-09-08T23:23:33.214Z" }, | ||
| 50 | { url = "https://files.pythonhosted.org/packages/d8/19/3c435d727b368ca475fb8742ab97c9cb13a0de600ce86f62eab7fa3eea60/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc", size = 208480, upload-time = "2025-09-08T23:23:34.495Z" }, | ||
| 51 | { url = "https://files.pythonhosted.org/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", size = 221584, upload-time = "2025-09-08T23:23:36.096Z" }, | ||
| 52 | { url = "https://files.pythonhosted.org/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", size = 224443, upload-time = "2025-09-08T23:23:37.328Z" }, | ||
| 53 | { url = "https://files.pythonhosted.org/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437, upload-time = "2025-09-08T23:23:38.945Z" }, | ||
| 54 | { url = "https://files.pythonhosted.org/packages/a0/1d/ec1a60bd1a10daa292d3cd6bb0b359a81607154fb8165f3ec95fe003b85c/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e", size = 180487, upload-time = "2025-09-08T23:23:40.423Z" }, | ||
| 55 | { url = "https://files.pythonhosted.org/packages/bf/41/4c1168c74fac325c0c8156f04b6749c8b6a8f405bbf91413ba088359f60d/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6", size = 191726, upload-time = "2025-09-08T23:23:41.742Z" }, | ||
| 56 | { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload-time = "2025-09-08T23:23:43.004Z" }, | ||
| 57 | ] | ||
| 58 | |||
| 59 | [[package]] | ||
| 60 | name = "charset-normalizer" | ||
| 61 | version = "3.4.4" | ||
| 62 | source = { registry = "https://pypi.org/simple" } | ||
| 63 | sdist = { url = "https://files.pythonhosted.org/packages/13/69/33ddede1939fdd074bce5434295f38fae7136463422fe4fd3e0e89b98062/charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a", size = 129418, upload-time = "2025-10-14T04:42:32.879Z" } | ||
| 64 | wheels = [ | ||
| 65 | { url = "https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794", size = 208091, upload-time = "2025-10-14T04:41:13.346Z" }, | ||
| 66 | { url = "https://files.pythonhosted.org/packages/7d/62/73a6d7450829655a35bb88a88fca7d736f9882a27eacdca2c6d505b57e2e/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed", size = 147936, upload-time = "2025-10-14T04:41:14.461Z" }, | ||
| 67 | { url = "https://files.pythonhosted.org/packages/89/c5/adb8c8b3d6625bef6d88b251bbb0d95f8205831b987631ab0c8bb5d937c2/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72", size = 144180, upload-time = "2025-10-14T04:41:15.588Z" }, | ||
| 68 | { url = "https://files.pythonhosted.org/packages/91/ed/9706e4070682d1cc219050b6048bfd293ccf67b3d4f5a4f39207453d4b99/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328", size = 161346, upload-time = "2025-10-14T04:41:16.738Z" }, | ||
| 69 | { url = "https://files.pythonhosted.org/packages/d5/0d/031f0d95e4972901a2f6f09ef055751805ff541511dc1252ba3ca1f80cf5/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede", size = 158874, upload-time = "2025-10-14T04:41:17.923Z" }, | ||
| 70 | { url = "https://files.pythonhosted.org/packages/f5/83/6ab5883f57c9c801ce5e5677242328aa45592be8a00644310a008d04f922/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894", size = 153076, upload-time = "2025-10-14T04:41:19.106Z" }, | ||
| 71 | { url = "https://files.pythonhosted.org/packages/75/1e/5ff781ddf5260e387d6419959ee89ef13878229732732ee73cdae01800f2/charset_normalizer-3.4.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1", size = 150601, upload-time = "2025-10-14T04:41:20.245Z" }, | ||
| 72 | { url = "https://files.pythonhosted.org/packages/d7/57/71be810965493d3510a6ca79b90c19e48696fb1ff964da319334b12677f0/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490", size = 150376, upload-time = "2025-10-14T04:41:21.398Z" }, | ||
| 73 | { url = "https://files.pythonhosted.org/packages/e5/d5/c3d057a78c181d007014feb7e9f2e65905a6c4ef182c0ddf0de2924edd65/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44", size = 144825, upload-time = "2025-10-14T04:41:22.583Z" }, | ||
| 74 | { url = "https://files.pythonhosted.org/packages/e6/8c/d0406294828d4976f275ffbe66f00266c4b3136b7506941d87c00cab5272/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133", size = 162583, upload-time = "2025-10-14T04:41:23.754Z" }, | ||
| 75 | { url = "https://files.pythonhosted.org/packages/d7/24/e2aa1f18c8f15c4c0e932d9287b8609dd30ad56dbe41d926bd846e22fb8d/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3", size = 150366, upload-time = "2025-10-14T04:41:25.27Z" }, | ||
| 76 | { url = "https://files.pythonhosted.org/packages/e4/5b/1e6160c7739aad1e2df054300cc618b06bf784a7a164b0f238360721ab86/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e", size = 160300, upload-time = "2025-10-14T04:41:26.725Z" }, | ||
| 77 | { url = "https://files.pythonhosted.org/packages/7a/10/f882167cd207fbdd743e55534d5d9620e095089d176d55cb22d5322f2afd/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc", size = 154465, upload-time = "2025-10-14T04:41:28.322Z" }, | ||
| 78 | { url = "https://files.pythonhosted.org/packages/89/66/c7a9e1b7429be72123441bfdbaf2bc13faab3f90b933f664db506dea5915/charset_normalizer-3.4.4-cp313-cp313-win32.whl", hash = "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac", size = 99404, upload-time = "2025-10-14T04:41:29.95Z" }, | ||
| 79 | { url = "https://files.pythonhosted.org/packages/c4/26/b9924fa27db384bdcd97ab83b4f0a8058d96ad9626ead570674d5e737d90/charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14", size = 107092, upload-time = "2025-10-14T04:41:31.188Z" }, | ||
| 80 | { url = "https://files.pythonhosted.org/packages/af/8f/3ed4bfa0c0c72a7ca17f0380cd9e4dd842b09f664e780c13cff1dcf2ef1b/charset_normalizer-3.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2", size = 100408, upload-time = "2025-10-14T04:41:32.624Z" }, | ||
| 81 | { url = "https://files.pythonhosted.org/packages/2a/35/7051599bd493e62411d6ede36fd5af83a38f37c4767b92884df7301db25d/charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd", size = 207746, upload-time = "2025-10-14T04:41:33.773Z" }, | ||
| 82 | { url = "https://files.pythonhosted.org/packages/10/9a/97c8d48ef10d6cd4fcead2415523221624bf58bcf68a802721a6bc807c8f/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb", size = 147889, upload-time = "2025-10-14T04:41:34.897Z" }, | ||
| 83 | { url = "https://files.pythonhosted.org/packages/10/bf/979224a919a1b606c82bd2c5fa49b5c6d5727aa47b4312bb27b1734f53cd/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e", size = 143641, upload-time = "2025-10-14T04:41:36.116Z" }, | ||
| 84 | { url = "https://files.pythonhosted.org/packages/ba/33/0ad65587441fc730dc7bd90e9716b30b4702dc7b617e6ba4997dc8651495/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14", size = 160779, upload-time = "2025-10-14T04:41:37.229Z" }, | ||
| 85 | { url = "https://files.pythonhosted.org/packages/67/ed/331d6b249259ee71ddea93f6f2f0a56cfebd46938bde6fcc6f7b9a3d0e09/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191", size = 159035, upload-time = "2025-10-14T04:41:38.368Z" }, | ||
| 86 | { url = "https://files.pythonhosted.org/packages/67/ff/f6b948ca32e4f2a4576aa129d8bed61f2e0543bf9f5f2b7fc3758ed005c9/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838", size = 152542, upload-time = "2025-10-14T04:41:39.862Z" }, | ||
| 87 | { url = "https://files.pythonhosted.org/packages/16/85/276033dcbcc369eb176594de22728541a925b2632f9716428c851b149e83/charset_normalizer-3.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6", size = 149524, upload-time = "2025-10-14T04:41:41.319Z" }, | ||
| 88 | { url = "https://files.pythonhosted.org/packages/9e/f2/6a2a1f722b6aba37050e626530a46a68f74e63683947a8acff92569f979a/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e", size = 150395, upload-time = "2025-10-14T04:41:42.539Z" }, | ||
| 89 | { url = "https://files.pythonhosted.org/packages/60/bb/2186cb2f2bbaea6338cad15ce23a67f9b0672929744381e28b0592676824/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c", size = 143680, upload-time = "2025-10-14T04:41:43.661Z" }, | ||
| 90 | { url = "https://files.pythonhosted.org/packages/7d/a5/bf6f13b772fbb2a90360eb620d52ed8f796f3c5caee8398c3b2eb7b1c60d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090", size = 162045, upload-time = "2025-10-14T04:41:44.821Z" }, | ||
| 91 | { url = "https://files.pythonhosted.org/packages/df/c5/d1be898bf0dc3ef9030c3825e5d3b83f2c528d207d246cbabe245966808d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152", size = 149687, upload-time = "2025-10-14T04:41:46.442Z" }, | ||
| 92 | { url = "https://files.pythonhosted.org/packages/a5/42/90c1f7b9341eef50c8a1cb3f098ac43b0508413f33affd762855f67a410e/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828", size = 160014, upload-time = "2025-10-14T04:41:47.631Z" }, | ||
| 93 | { url = "https://files.pythonhosted.org/packages/76/be/4d3ee471e8145d12795ab655ece37baed0929462a86e72372fd25859047c/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec", size = 154044, upload-time = "2025-10-14T04:41:48.81Z" }, | ||
| 94 | { url = "https://files.pythonhosted.org/packages/b0/6f/8f7af07237c34a1defe7defc565a9bc1807762f672c0fde711a4b22bf9c0/charset_normalizer-3.4.4-cp314-cp314-win32.whl", hash = "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9", size = 99940, upload-time = "2025-10-14T04:41:49.946Z" }, | ||
| 95 | { url = "https://files.pythonhosted.org/packages/4b/51/8ade005e5ca5b0d80fb4aff72a3775b325bdc3d27408c8113811a7cbe640/charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c", size = 107104, upload-time = "2025-10-14T04:41:51.051Z" }, | ||
| 96 | { url = "https://files.pythonhosted.org/packages/da/5f/6b8f83a55bb8278772c5ae54a577f3099025f9ade59d0136ac24a0df4bde/charset_normalizer-3.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2", size = 100743, upload-time = "2025-10-14T04:41:52.122Z" }, | ||
| 97 | { url = "https://files.pythonhosted.org/packages/0a/4c/925909008ed5a988ccbb72dcc897407e5d6d3bd72410d69e051fc0c14647/charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f", size = 53402, upload-time = "2025-10-14T04:42:31.76Z" }, | ||
| 98 | ] | ||
| 99 | |||
| 100 | [[package]] | ||
| 101 | name = "cryptography" | ||
| 102 | version = "46.0.3" | ||
| 103 | source = { registry = "https://pypi.org/simple" } | ||
| 104 | dependencies = [ | ||
| 105 | { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, | ||
| 106 | ] | ||
| 107 | sdist = { url = "https://files.pythonhosted.org/packages/9f/33/c00162f49c0e2fe8064a62cb92b93e50c74a72bc370ab92f86112b33ff62/cryptography-46.0.3.tar.gz", hash = "sha256:a8b17438104fed022ce745b362294d9ce35b4c2e45c1d958ad4a4b019285f4a1", size = 749258, upload-time = "2025-10-15T23:18:31.74Z" } | ||
| 108 | wheels = [ | ||
| 109 | { url = "https://files.pythonhosted.org/packages/1d/42/9c391dd801d6cf0d561b5890549d4b27bafcc53b39c31a817e69d87c625b/cryptography-46.0.3-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:109d4ddfadf17e8e7779c39f9b18111a09efb969a301a31e987416a0191ed93a", size = 7225004, upload-time = "2025-10-15T23:16:52.239Z" }, | ||
| 110 | { url = "https://files.pythonhosted.org/packages/1c/67/38769ca6b65f07461eb200e85fc1639b438bdc667be02cf7f2cd6a64601c/cryptography-46.0.3-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:09859af8466b69bc3c27bdf4f5d84a665e0f7ab5088412e9e2ec49758eca5cbc", size = 4296667, upload-time = "2025-10-15T23:16:54.369Z" }, | ||
| 111 | { url = "https://files.pythonhosted.org/packages/5c/49/498c86566a1d80e978b42f0d702795f69887005548c041636df6ae1ca64c/cryptography-46.0.3-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:01ca9ff2885f3acc98c29f1860552e37f6d7c7d013d7334ff2a9de43a449315d", size = 4450807, upload-time = "2025-10-15T23:16:56.414Z" }, | ||
| 112 | { url = "https://files.pythonhosted.org/packages/4b/0a/863a3604112174c8624a2ac3c038662d9e59970c7f926acdcfaed8d61142/cryptography-46.0.3-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:6eae65d4c3d33da080cff9c4ab1f711b15c1d9760809dad6ea763f3812d254cb", size = 4299615, upload-time = "2025-10-15T23:16:58.442Z" }, | ||
| 113 | { url = "https://files.pythonhosted.org/packages/64/02/b73a533f6b64a69f3cd3872acb6ebc12aef924d8d103133bb3ea750dc703/cryptography-46.0.3-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5bf0ed4490068a2e72ac03d786693adeb909981cc596425d09032d372bcc849", size = 4016800, upload-time = "2025-10-15T23:17:00.378Z" }, | ||
| 114 | { url = "https://files.pythonhosted.org/packages/25/d5/16e41afbfa450cde85a3b7ec599bebefaef16b5c6ba4ec49a3532336ed72/cryptography-46.0.3-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:5ecfccd2329e37e9b7112a888e76d9feca2347f12f37918facbb893d7bb88ee8", size = 4984707, upload-time = "2025-10-15T23:17:01.98Z" }, | ||
| 115 | { url = "https://files.pythonhosted.org/packages/c9/56/e7e69b427c3878352c2fb9b450bd0e19ed552753491d39d7d0a2f5226d41/cryptography-46.0.3-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a2c0cd47381a3229c403062f764160d57d4d175e022c1df84e168c6251a22eec", size = 4482541, upload-time = "2025-10-15T23:17:04.078Z" }, | ||
| 116 | { url = "https://files.pythonhosted.org/packages/78/f6/50736d40d97e8483172f1bb6e698895b92a223dba513b0ca6f06b2365339/cryptography-46.0.3-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:549e234ff32571b1f4076ac269fcce7a808d3bf98b76c8dd560e42dbc66d7d91", size = 4299464, upload-time = "2025-10-15T23:17:05.483Z" }, | ||
| 117 | { url = "https://files.pythonhosted.org/packages/00/de/d8e26b1a855f19d9994a19c702fa2e93b0456beccbcfe437eda00e0701f2/cryptography-46.0.3-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:c0a7bb1a68a5d3471880e264621346c48665b3bf1c3759d682fc0864c540bd9e", size = 4950838, upload-time = "2025-10-15T23:17:07.425Z" }, | ||
| 118 | { url = "https://files.pythonhosted.org/packages/8f/29/798fc4ec461a1c9e9f735f2fc58741b0daae30688f41b2497dcbc9ed1355/cryptography-46.0.3-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:10b01676fc208c3e6feeb25a8b83d81767e8059e1fe86e1dc62d10a3018fa926", size = 4481596, upload-time = "2025-10-15T23:17:09.343Z" }, | ||
| 119 | { url = "https://files.pythonhosted.org/packages/15/8d/03cd48b20a573adfff7652b76271078e3045b9f49387920e7f1f631d125e/cryptography-46.0.3-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0abf1ffd6e57c67e92af68330d05760b7b7efb243aab8377e583284dbab72c71", size = 4426782, upload-time = "2025-10-15T23:17:11.22Z" }, | ||
| 120 | { url = "https://files.pythonhosted.org/packages/fa/b1/ebacbfe53317d55cf33165bda24c86523497a6881f339f9aae5c2e13e57b/cryptography-46.0.3-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a04bee9ab6a4da801eb9b51f1b708a1b5b5c9eb48c03f74198464c66f0d344ac", size = 4698381, upload-time = "2025-10-15T23:17:12.829Z" }, | ||
| 121 | { url = "https://files.pythonhosted.org/packages/96/92/8a6a9525893325fc057a01f654d7efc2c64b9de90413adcf605a85744ff4/cryptography-46.0.3-cp311-abi3-win32.whl", hash = "sha256:f260d0d41e9b4da1ed1e0f1ce571f97fe370b152ab18778e9e8f67d6af432018", size = 3055988, upload-time = "2025-10-15T23:17:14.65Z" }, | ||
| 122 | { url = "https://files.pythonhosted.org/packages/7e/bf/80fbf45253ea585a1e492a6a17efcb93467701fa79e71550a430c5e60df0/cryptography-46.0.3-cp311-abi3-win_amd64.whl", hash = "sha256:a9a3008438615669153eb86b26b61e09993921ebdd75385ddd748702c5adfddb", size = 3514451, upload-time = "2025-10-15T23:17:16.142Z" }, | ||
| 123 | { url = "https://files.pythonhosted.org/packages/2e/af/9b302da4c87b0beb9db4e756386a7c6c5b8003cd0e742277888d352ae91d/cryptography-46.0.3-cp311-abi3-win_arm64.whl", hash = "sha256:5d7f93296ee28f68447397bf5198428c9aeeab45705a55d53a6343455dcb2c3c", size = 2928007, upload-time = "2025-10-15T23:17:18.04Z" }, | ||
| 124 | { url = "https://files.pythonhosted.org/packages/f5/e2/a510aa736755bffa9d2f75029c229111a1d02f8ecd5de03078f4c18d91a3/cryptography-46.0.3-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:00a5e7e87938e5ff9ff5447ab086a5706a957137e6e433841e9d24f38a065217", size = 7158012, upload-time = "2025-10-15T23:17:19.982Z" }, | ||
| 125 | { url = "https://files.pythonhosted.org/packages/73/dc/9aa866fbdbb95b02e7f9d086f1fccfeebf8953509b87e3f28fff927ff8a0/cryptography-46.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c8daeb2d2174beb4575b77482320303f3d39b8e81153da4f0fb08eb5fe86a6c5", size = 4288728, upload-time = "2025-10-15T23:17:21.527Z" }, | ||
| 126 | { url = "https://files.pythonhosted.org/packages/c5/fd/bc1daf8230eaa075184cbbf5f8cd00ba9db4fd32d63fb83da4671b72ed8a/cryptography-46.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:39b6755623145ad5eff1dab323f4eae2a32a77a7abef2c5089a04a3d04366715", size = 4435078, upload-time = "2025-10-15T23:17:23.042Z" }, | ||
| 127 | { url = "https://files.pythonhosted.org/packages/82/98/d3bd5407ce4c60017f8ff9e63ffee4200ab3e23fe05b765cab805a7db008/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:db391fa7c66df6762ee3f00c95a89e6d428f4d60e7abc8328f4fe155b5ac6e54", size = 4293460, upload-time = "2025-10-15T23:17:24.885Z" }, | ||
| 128 | { url = "https://files.pythonhosted.org/packages/26/e9/e23e7900983c2b8af7a08098db406cf989d7f09caea7897e347598d4cd5b/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:78a97cf6a8839a48c49271cdcbd5cf37ca2c1d6b7fdd86cc864f302b5e9bf459", size = 3995237, upload-time = "2025-10-15T23:17:26.449Z" }, | ||
| 129 | { url = "https://files.pythonhosted.org/packages/91/15/af68c509d4a138cfe299d0d7ddb14afba15233223ebd933b4bbdbc7155d3/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:dfb781ff7eaa91a6f7fd41776ec37c5853c795d3b358d4896fdbb5df168af422", size = 4967344, upload-time = "2025-10-15T23:17:28.06Z" }, | ||
| 130 | { url = "https://files.pythonhosted.org/packages/ca/e3/8643d077c53868b681af077edf6b3cb58288b5423610f21c62aadcbe99f4/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:6f61efb26e76c45c4a227835ddeae96d83624fb0d29eb5df5b96e14ed1a0afb7", size = 4466564, upload-time = "2025-10-15T23:17:29.665Z" }, | ||
| 131 | { url = "https://files.pythonhosted.org/packages/0e/43/c1e8726fa59c236ff477ff2b5dc071e54b21e5a1e51aa2cee1676f1c986f/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:23b1a8f26e43f47ceb6d6a43115f33a5a37d57df4ea0ca295b780ae8546e8044", size = 4292415, upload-time = "2025-10-15T23:17:31.686Z" }, | ||
| 132 | { url = "https://files.pythonhosted.org/packages/42/f9/2f8fefdb1aee8a8e3256a0568cffc4e6d517b256a2fe97a029b3f1b9fe7e/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:b419ae593c86b87014b9be7396b385491ad7f320bde96826d0dd174459e54665", size = 4931457, upload-time = "2025-10-15T23:17:33.478Z" }, | ||
| 133 | { url = "https://files.pythonhosted.org/packages/79/30/9b54127a9a778ccd6d27c3da7563e9f2d341826075ceab89ae3b41bf5be2/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:50fc3343ac490c6b08c0cf0d704e881d0d660be923fd3076db3e932007e726e3", size = 4466074, upload-time = "2025-10-15T23:17:35.158Z" }, | ||
| 134 | { url = "https://files.pythonhosted.org/packages/ac/68/b4f4a10928e26c941b1b6a179143af9f4d27d88fe84a6a3c53592d2e76bf/cryptography-46.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:22d7e97932f511d6b0b04f2bfd818d73dcd5928db509460aaf48384778eb6d20", size = 4420569, upload-time = "2025-10-15T23:17:37.188Z" }, | ||
| 135 | { url = "https://files.pythonhosted.org/packages/a3/49/3746dab4c0d1979888f125226357d3262a6dd40e114ac29e3d2abdf1ec55/cryptography-46.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d55f3dffadd674514ad19451161118fd010988540cee43d8bc20675e775925de", size = 4681941, upload-time = "2025-10-15T23:17:39.236Z" }, | ||
| 136 | { url = "https://files.pythonhosted.org/packages/fd/30/27654c1dbaf7e4a3531fa1fc77986d04aefa4d6d78259a62c9dc13d7ad36/cryptography-46.0.3-cp314-cp314t-win32.whl", hash = "sha256:8a6e050cb6164d3f830453754094c086ff2d0b2f3a897a1d9820f6139a1f0914", size = 3022339, upload-time = "2025-10-15T23:17:40.888Z" }, | ||
| 137 | { url = "https://files.pythonhosted.org/packages/f6/30/640f34ccd4d2a1bc88367b54b926b781b5a018d65f404d409aba76a84b1c/cryptography-46.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:760f83faa07f8b64e9c33fc963d790a2edb24efb479e3520c14a45741cd9b2db", size = 3494315, upload-time = "2025-10-15T23:17:42.769Z" }, | ||
| 138 | { url = "https://files.pythonhosted.org/packages/ba/8b/88cc7e3bd0a8e7b861f26981f7b820e1f46aa9d26cc482d0feba0ecb4919/cryptography-46.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:516ea134e703e9fe26bcd1277a4b59ad30586ea90c365a87781d7887a646fe21", size = 2919331, upload-time = "2025-10-15T23:17:44.468Z" }, | ||
| 139 | { url = "https://files.pythonhosted.org/packages/fd/23/45fe7f376a7df8daf6da3556603b36f53475a99ce4faacb6ba2cf3d82021/cryptography-46.0.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:cb3d760a6117f621261d662bccc8ef5bc32ca673e037c83fbe565324f5c46936", size = 7218248, upload-time = "2025-10-15T23:17:46.294Z" }, | ||
| 140 | { url = "https://files.pythonhosted.org/packages/27/32/b68d27471372737054cbd34c84981f9edbc24fe67ca225d389799614e27f/cryptography-46.0.3-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4b7387121ac7d15e550f5cb4a43aef2559ed759c35df7336c402bb8275ac9683", size = 4294089, upload-time = "2025-10-15T23:17:48.269Z" }, | ||
| 141 | { url = "https://files.pythonhosted.org/packages/26/42/fa8389d4478368743e24e61eea78846a0006caffaf72ea24a15159215a14/cryptography-46.0.3-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:15ab9b093e8f09daab0f2159bb7e47532596075139dd74365da52ecc9cb46c5d", size = 4440029, upload-time = "2025-10-15T23:17:49.837Z" }, | ||
| 142 | { url = "https://files.pythonhosted.org/packages/5f/eb/f483db0ec5ac040824f269e93dd2bd8a21ecd1027e77ad7bdf6914f2fd80/cryptography-46.0.3-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:46acf53b40ea38f9c6c229599a4a13f0d46a6c3fa9ef19fc1a124d62e338dfa0", size = 4297222, upload-time = "2025-10-15T23:17:51.357Z" }, | ||
| 143 | { url = "https://files.pythonhosted.org/packages/fd/cf/da9502c4e1912cb1da3807ea3618a6829bee8207456fbbeebc361ec38ba3/cryptography-46.0.3-cp38-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:10ca84c4668d066a9878890047f03546f3ae0a6b8b39b697457b7757aaf18dbc", size = 4012280, upload-time = "2025-10-15T23:17:52.964Z" }, | ||
| 144 | { url = "https://files.pythonhosted.org/packages/6b/8f/9adb86b93330e0df8b3dcf03eae67c33ba89958fc2e03862ef1ac2b42465/cryptography-46.0.3-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:36e627112085bb3b81b19fed209c05ce2a52ee8b15d161b7c643a7d5a88491f3", size = 4978958, upload-time = "2025-10-15T23:17:54.965Z" }, | ||
| 145 | { url = "https://files.pythonhosted.org/packages/d1/a0/5fa77988289c34bdb9f913f5606ecc9ada1adb5ae870bd0d1054a7021cc4/cryptography-46.0.3-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:1000713389b75c449a6e979ffc7dcc8ac90b437048766cef052d4d30b8220971", size = 4473714, upload-time = "2025-10-15T23:17:56.754Z" }, | ||
| 146 | { url = "https://files.pythonhosted.org/packages/14/e5/fc82d72a58d41c393697aa18c9abe5ae1214ff6f2a5c18ac470f92777895/cryptography-46.0.3-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:b02cf04496f6576afffef5ddd04a0cb7d49cf6be16a9059d793a30b035f6b6ac", size = 4296970, upload-time = "2025-10-15T23:17:58.588Z" }, | ||
| 147 | { url = "https://files.pythonhosted.org/packages/78/06/5663ed35438d0b09056973994f1aec467492b33bd31da36e468b01ec1097/cryptography-46.0.3-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:71e842ec9bc7abf543b47cf86b9a743baa95f4677d22baa4c7d5c69e49e9bc04", size = 4940236, upload-time = "2025-10-15T23:18:00.897Z" }, | ||
| 148 | { url = "https://files.pythonhosted.org/packages/fc/59/873633f3f2dcd8a053b8dd1d38f783043b5fce589c0f6988bf55ef57e43e/cryptography-46.0.3-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:402b58fc32614f00980b66d6e56a5b4118e6cb362ae8f3fda141ba4689bd4506", size = 4472642, upload-time = "2025-10-15T23:18:02.749Z" }, | ||
| 149 | { url = "https://files.pythonhosted.org/packages/3d/39/8e71f3930e40f6877737d6f69248cf74d4e34b886a3967d32f919cc50d3b/cryptography-46.0.3-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ef639cb3372f69ec44915fafcd6698b6cc78fbe0c2ea41be867f6ed612811963", size = 4423126, upload-time = "2025-10-15T23:18:04.85Z" }, | ||
| 150 | { url = "https://files.pythonhosted.org/packages/cd/c7/f65027c2810e14c3e7268353b1681932b87e5a48e65505d8cc17c99e36ae/cryptography-46.0.3-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3b51b8ca4f1c6453d8829e1eb7299499ca7f313900dd4d89a24b8b87c0a780d4", size = 4686573, upload-time = "2025-10-15T23:18:06.908Z" }, | ||
| 151 | { url = "https://files.pythonhosted.org/packages/0a/6e/1c8331ddf91ca4730ab3086a0f1be19c65510a33b5a441cb334e7a2d2560/cryptography-46.0.3-cp38-abi3-win32.whl", hash = "sha256:6276eb85ef938dc035d59b87c8a7dc559a232f954962520137529d77b18ff1df", size = 3036695, upload-time = "2025-10-15T23:18:08.672Z" }, | ||
| 152 | { url = "https://files.pythonhosted.org/packages/90/45/b0d691df20633eff80955a0fc7695ff9051ffce8b69741444bd9ed7bd0db/cryptography-46.0.3-cp38-abi3-win_amd64.whl", hash = "sha256:416260257577718c05135c55958b674000baef9a1c7d9e8f306ec60d71db850f", size = 3501720, upload-time = "2025-10-15T23:18:10.632Z" }, | ||
| 153 | { url = "https://files.pythonhosted.org/packages/e8/cb/2da4cc83f5edb9c3257d09e1e7ab7b23f049c7962cae8d842bbef0a9cec9/cryptography-46.0.3-cp38-abi3-win_arm64.whl", hash = "sha256:d89c3468de4cdc4f08a57e214384d0471911a3830fcdaf7a8cc587e42a866372", size = 2918740, upload-time = "2025-10-15T23:18:12.277Z" }, | ||
| 154 | ] | ||
| 155 | |||
| 156 | [[package]] | ||
| 157 | name = "idna" | ||
| 158 | version = "3.11" | ||
| 159 | source = { registry = "https://pypi.org/simple" } | ||
| 160 | sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" } | ||
| 161 | wheels = [ | ||
| 162 | { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" }, | ||
| 163 | ] | ||
| 164 | |||
| 165 | [[package]] | ||
| 166 | name = "nixpkgs-pr-watch" | ||
| 167 | version = "0.1.0" | ||
| 168 | source = { editable = "." } | ||
| 169 | dependencies = [ | ||
| 170 | { name = "pygithub" }, | ||
| 171 | { name = "requests" }, | ||
| 172 | { name = "toml" }, | ||
| 173 | { name = "xdg-base-dirs" }, | ||
| 174 | ] | ||
| 175 | |||
| 176 | [package.metadata] | ||
| 177 | requires-dist = [ | ||
| 178 | { name = "pygithub", specifier = ">=2.8.1" }, | ||
| 179 | { name = "requests", specifier = ">=2.32.5" }, | ||
| 180 | { name = "toml", specifier = ">=0.10.2" }, | ||
| 181 | { name = "xdg-base-dirs", specifier = ">=6.0.2" }, | ||
| 182 | ] | ||
| 183 | |||
| 184 | [[package]] | ||
| 185 | name = "pycparser" | ||
| 186 | version = "2.23" | ||
| 187 | source = { registry = "https://pypi.org/simple" } | ||
| 188 | sdist = { url = "https://files.pythonhosted.org/packages/fe/cf/d2d3b9f5699fb1e4615c8e32ff220203e43b248e1dfcc6736ad9057731ca/pycparser-2.23.tar.gz", hash = "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2", size = 173734, upload-time = "2025-09-09T13:23:47.91Z" } | ||
| 189 | wheels = [ | ||
| 190 | { url = "https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934", size = 118140, upload-time = "2025-09-09T13:23:46.651Z" }, | ||
| 191 | ] | ||
| 192 | |||
| 193 | [[package]] | ||
| 194 | name = "pygithub" | ||
| 195 | version = "2.8.1" | ||
| 196 | source = { registry = "https://pypi.org/simple" } | ||
| 197 | dependencies = [ | ||
| 198 | { name = "pyjwt", extra = ["crypto"] }, | ||
| 199 | { name = "pynacl" }, | ||
| 200 | { name = "requests" }, | ||
| 201 | { name = "typing-extensions" }, | ||
| 202 | { name = "urllib3" }, | ||
| 203 | ] | ||
| 204 | sdist = { url = "https://files.pythonhosted.org/packages/c1/74/e560bdeffea72ecb26cff27f0fad548bbff5ecc51d6a155311ea7f9e4c4c/pygithub-2.8.1.tar.gz", hash = "sha256:341b7c78521cb07324ff670afd1baa2bf5c286f8d9fd302c1798ba594a5400c9", size = 2246994, upload-time = "2025-09-02T17:41:54.674Z" } | ||
| 205 | wheels = [ | ||
| 206 | { url = "https://files.pythonhosted.org/packages/07/ba/7049ce39f653f6140aac4beb53a5aaf08b4407b6a3019aae394c1c5244ff/pygithub-2.8.1-py3-none-any.whl", hash = "sha256:23a0a5bca93baef082e03411bf0ce27204c32be8bfa7abc92fe4a3e132936df0", size = 432709, upload-time = "2025-09-02T17:41:52.947Z" }, | ||
| 207 | ] | ||
| 208 | |||
| 209 | [[package]] | ||
| 210 | name = "pyjwt" | ||
| 211 | version = "2.10.1" | ||
| 212 | source = { registry = "https://pypi.org/simple" } | ||
| 213 | sdist = { url = "https://files.pythonhosted.org/packages/e7/46/bd74733ff231675599650d3e47f361794b22ef3e3770998dda30d3b63726/pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953", size = 87785, upload-time = "2024-11-28T03:43:29.933Z" } | ||
| 214 | wheels = [ | ||
| 215 | { url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb", size = 22997, upload-time = "2024-11-28T03:43:27.893Z" }, | ||
| 216 | ] | ||
| 217 | |||
| 218 | [package.optional-dependencies] | ||
| 219 | crypto = [ | ||
| 220 | { name = "cryptography" }, | ||
| 221 | ] | ||
| 222 | |||
| 223 | [[package]] | ||
| 224 | name = "pynacl" | ||
| 225 | version = "1.6.1" | ||
| 226 | source = { registry = "https://pypi.org/simple" } | ||
| 227 | dependencies = [ | ||
| 228 | { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, | ||
| 229 | ] | ||
| 230 | sdist = { url = "https://files.pythonhosted.org/packages/b2/46/aeca065d227e2265125aea590c9c47fbf5786128c9400ee0eb7c88931f06/pynacl-1.6.1.tar.gz", hash = "sha256:8d361dac0309f2b6ad33b349a56cd163c98430d409fa503b10b70b3ad66eaa1d", size = 3506616, upload-time = "2025-11-10T16:02:13.195Z" } | ||
| 231 | wheels = [ | ||
| 232 | { url = "https://files.pythonhosted.org/packages/75/d6/4b2dca33ed512de8f54e5c6074aa06eaeb225bfbcd9b16f33a414389d6bd/pynacl-1.6.1-cp314-cp314t-macosx_10_10_universal2.whl", hash = "sha256:7d7c09749450c385301a3c20dca967a525152ae4608c0a096fe8464bfc3df93d", size = 389109, upload-time = "2025-11-10T16:01:28.79Z" }, | ||
| 233 | { url = "https://files.pythonhosted.org/packages/3c/30/e8dbb8ff4fa2559bbbb2187ba0d0d7faf728d17cb8396ecf4a898b22d3da/pynacl-1.6.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fc734c1696ffd49b40f7c1779c89ba908157c57345cf626be2e0719488a076d3", size = 808254, upload-time = "2025-11-10T16:01:37.839Z" }, | ||
| 234 | { url = "https://files.pythonhosted.org/packages/44/f9/f5449c652f31da00249638dbab065ad4969c635119094b79b17c3a4da2ab/pynacl-1.6.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3cd787ec1f5c155dc8ecf39b1333cfef41415dc96d392f1ce288b4fe970df489", size = 1407365, upload-time = "2025-11-10T16:01:40.454Z" }, | ||
| 235 | { url = "https://files.pythonhosted.org/packages/eb/2f/9aa5605f473b712065c0a193ebf4ad4725d7a245533f0cd7e5dcdbc78f35/pynacl-1.6.1-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b35d93ab2df03ecb3aa506be0d3c73609a51449ae0855c2e89c7ed44abde40b", size = 843842, upload-time = "2025-11-10T16:01:30.524Z" }, | ||
| 236 | { url = "https://files.pythonhosted.org/packages/32/8d/748f0f6956e207453da8f5f21a70885fbbb2e060d5c9d78e0a4a06781451/pynacl-1.6.1-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dece79aecbb8f4640a1adbb81e4aa3bfb0e98e99834884a80eb3f33c7c30e708", size = 1445559, upload-time = "2025-11-10T16:01:33.663Z" }, | ||
| 237 | { url = "https://files.pythonhosted.org/packages/78/d0/2387f0dcb0e9816f38373999e48db4728ed724d31accdd4e737473319d35/pynacl-1.6.1-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:c2228054f04bf32d558fb89bb99f163a8197d5a9bf4efa13069a7fa8d4b93fc3", size = 825791, upload-time = "2025-11-10T16:01:34.823Z" }, | ||
| 238 | { url = "https://files.pythonhosted.org/packages/18/3d/ef6fb7eb072aaf15f280bc66f26ab97e7fc9efa50fb1927683013ef47473/pynacl-1.6.1-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:2b12f1b97346f177affcdfdc78875ff42637cb40dcf79484a97dae3448083a78", size = 1410843, upload-time = "2025-11-10T16:01:36.401Z" }, | ||
| 239 | { url = "https://files.pythonhosted.org/packages/e3/fb/23824a017526850ee7d8a1cc4cd1e3e5082800522c10832edbbca8619537/pynacl-1.6.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e735c3a1bdfde3834503baf1a6d74d4a143920281cb724ba29fb84c9f49b9c48", size = 801140, upload-time = "2025-11-10T16:01:42.013Z" }, | ||
| 240 | { url = "https://files.pythonhosted.org/packages/5d/d1/ebc6b182cb98603a35635b727d62f094bc201bf610f97a3bb6357fe688d2/pynacl-1.6.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3384a454adf5d716a9fadcb5eb2e3e72cd49302d1374a60edc531c9957a9b014", size = 1371966, upload-time = "2025-11-10T16:01:43.297Z" }, | ||
| 241 | { url = "https://files.pythonhosted.org/packages/64/f4/c9d7b6f02924b1f31db546c7bd2a83a2421c6b4a8e6a2e53425c9f2802e0/pynacl-1.6.1-cp314-cp314t-win32.whl", hash = "sha256:d8615ee34d01c8e0ab3f302dcdd7b32e2bcf698ba5f4809e7cc407c8cdea7717", size = 230482, upload-time = "2025-11-10T16:01:47.688Z" }, | ||
| 242 | { url = "https://files.pythonhosted.org/packages/c4/2c/942477957fba22da7bf99131850e5ebdff66623418ab48964e78a7a8293e/pynacl-1.6.1-cp314-cp314t-win_amd64.whl", hash = "sha256:5f5b35c1a266f8a9ad22525049280a600b19edd1f785bccd01ae838437dcf935", size = 243232, upload-time = "2025-11-10T16:01:45.208Z" }, | ||
| 243 | { url = "https://files.pythonhosted.org/packages/7a/0c/bdbc0d04a53b96a765ab03aa2cf9a76ad8653d70bf1665459b9a0dedaa1c/pynacl-1.6.1-cp314-cp314t-win_arm64.whl", hash = "sha256:d984c91fe3494793b2a1fb1e91429539c6c28e9ec8209d26d25041ec599ccf63", size = 187907, upload-time = "2025-11-10T16:01:46.328Z" }, | ||
| 244 | { url = "https://files.pythonhosted.org/packages/49/41/3cfb3b4f3519f6ff62bf71bf1722547644bcfb1b05b8fdbdc300249ba113/pynacl-1.6.1-cp38-abi3-macosx_10_10_universal2.whl", hash = "sha256:a6f9fd6d6639b1e81115c7f8ff16b8dedba1e8098d2756275d63d208b0e32021", size = 387591, upload-time = "2025-11-10T16:01:49.1Z" }, | ||
| 245 | { url = "https://files.pythonhosted.org/packages/18/21/b8a6563637799f617a3960f659513eccb3fcc655d5fc2be6e9dc6416826f/pynacl-1.6.1-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e49a3f3d0da9f79c1bec2aa013261ab9fa651c7da045d376bd306cf7c1792993", size = 798866, upload-time = "2025-11-10T16:01:55.688Z" }, | ||
| 246 | { url = "https://files.pythonhosted.org/packages/e8/6c/dc38033bc3ea461e05ae8f15a81e0e67ab9a01861d352ae971c99de23e7c/pynacl-1.6.1-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7713f8977b5d25f54a811ec9efa2738ac592e846dd6e8a4d3f7578346a841078", size = 1398001, upload-time = "2025-11-10T16:01:57.101Z" }, | ||
| 247 | { url = "https://files.pythonhosted.org/packages/9f/05/3ec0796a9917100a62c5073b20c4bce7bf0fea49e99b7906d1699cc7b61b/pynacl-1.6.1-cp38-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5a3becafc1ee2e5ea7f9abc642f56b82dcf5be69b961e782a96ea52b55d8a9fc", size = 834024, upload-time = "2025-11-10T16:01:50.228Z" }, | ||
| 248 | { url = "https://files.pythonhosted.org/packages/f0/b7/ae9982be0f344f58d9c64a1c25d1f0125c79201634efe3c87305ac7cb3e3/pynacl-1.6.1-cp38-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4ce50d19f1566c391fedc8dc2f2f5be265ae214112ebe55315e41d1f36a7f0a9", size = 1436766, upload-time = "2025-11-10T16:01:51.886Z" }, | ||
| 249 | { url = "https://files.pythonhosted.org/packages/b4/51/b2ccbf89cf3025a02e044dd68a365cad593ebf70f532299f2c047d2b7714/pynacl-1.6.1-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:543f869140f67d42b9b8d47f922552d7a967e6c116aad028c9bfc5f3f3b3a7b7", size = 817275, upload-time = "2025-11-10T16:01:53.351Z" }, | ||
| 250 | { url = "https://files.pythonhosted.org/packages/a8/6c/dd9ee8214edf63ac563b08a9b30f98d116942b621d39a751ac3256694536/pynacl-1.6.1-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:a2bb472458c7ca959aeeff8401b8efef329b0fc44a89d3775cffe8fad3398ad8", size = 1401891, upload-time = "2025-11-10T16:01:54.587Z" }, | ||
| 251 | { url = "https://files.pythonhosted.org/packages/0f/c1/97d3e1c83772d78ee1db3053fd674bc6c524afbace2bfe8d419fd55d7ed1/pynacl-1.6.1-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:3206fa98737fdc66d59b8782cecc3d37d30aeec4593d1c8c145825a345bba0f0", size = 772291, upload-time = "2025-11-10T16:01:58.111Z" }, | ||
| 252 | { url = "https://files.pythonhosted.org/packages/4d/ca/691ff2fe12f3bb3e43e8e8df4b806f6384593d427f635104d337b8e00291/pynacl-1.6.1-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:53543b4f3d8acb344f75fd4d49f75e6572fce139f4bfb4815a9282296ff9f4c0", size = 1370839, upload-time = "2025-11-10T16:01:59.252Z" }, | ||
| 253 | { url = "https://files.pythonhosted.org/packages/30/27/06fe5389d30391fce006442246062cc35773c84fbcad0209fbbf5e173734/pynacl-1.6.1-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:319de653ef84c4f04e045eb250e6101d23132372b0a61a7acf91bac0fda8e58c", size = 791371, upload-time = "2025-11-10T16:02:01.075Z" }, | ||
| 254 | { url = "https://files.pythonhosted.org/packages/2c/7a/e2bde8c9d39074a5aa046c7d7953401608d1f16f71e237f4bef3fb9d7e49/pynacl-1.6.1-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:262a8de6bba4aee8a66f5edf62c214b06647461c9b6b641f8cd0cb1e3b3196fe", size = 1363031, upload-time = "2025-11-10T16:02:02.656Z" }, | ||
| 255 | { url = "https://files.pythonhosted.org/packages/dd/b6/63fd77264dae1087770a1bb414bc604470f58fbc21d83822fc9c76248076/pynacl-1.6.1-cp38-abi3-win32.whl", hash = "sha256:9fd1a4eb03caf8a2fe27b515a998d26923adb9ddb68db78e35ca2875a3830dde", size = 226585, upload-time = "2025-11-10T16:02:07.116Z" }, | ||
| 256 | { url = "https://files.pythonhosted.org/packages/12/c8/b419180f3fdb72ab4d45e1d88580761c267c7ca6eda9a20dcbcba254efe6/pynacl-1.6.1-cp38-abi3-win_amd64.whl", hash = "sha256:a569a4069a7855f963940040f35e87d8bc084cb2d6347428d5ad20550a0a1a21", size = 238923, upload-time = "2025-11-10T16:02:04.401Z" }, | ||
| 257 | { url = "https://files.pythonhosted.org/packages/35/76/c34426d532e4dce7ff36e4d92cb20f4cbbd94b619964b93d24e8f5b5510f/pynacl-1.6.1-cp38-abi3-win_arm64.whl", hash = "sha256:5953e8b8cfadb10889a6e7bd0f53041a745d1b3d30111386a1bb37af171e6daf", size = 183970, upload-time = "2025-11-10T16:02:05.786Z" }, | ||
| 258 | ] | ||
| 259 | |||
| 260 | [[package]] | ||
| 261 | name = "requests" | ||
| 262 | version = "2.32.5" | ||
| 263 | source = { registry = "https://pypi.org/simple" } | ||
| 264 | dependencies = [ | ||
| 265 | { name = "certifi" }, | ||
| 266 | { name = "charset-normalizer" }, | ||
| 267 | { name = "idna" }, | ||
| 268 | { name = "urllib3" }, | ||
| 269 | ] | ||
| 270 | sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" } | ||
| 271 | wheels = [ | ||
| 272 | { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, | ||
| 273 | ] | ||
| 274 | |||
| 275 | [[package]] | ||
| 276 | name = "toml" | ||
| 277 | version = "0.10.2" | ||
| 278 | source = { registry = "https://pypi.org/simple" } | ||
| 279 | sdist = { url = "https://files.pythonhosted.org/packages/be/ba/1f744cdc819428fc6b5084ec34d9b30660f6f9daaf70eead706e3203ec3c/toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f", size = 22253, upload-time = "2020-11-01T01:40:22.204Z" } | ||
| 280 | wheels = [ | ||
| 281 | { url = "https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", size = 16588, upload-time = "2020-11-01T01:40:20.672Z" }, | ||
| 282 | ] | ||
| 283 | |||
| 284 | [[package]] | ||
| 285 | name = "typing-extensions" | ||
| 286 | version = "4.15.0" | ||
| 287 | source = { registry = "https://pypi.org/simple" } | ||
| 288 | sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } | ||
| 289 | wheels = [ | ||
| 290 | { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, | ||
| 291 | ] | ||
| 292 | |||
| 293 | [[package]] | ||
| 294 | name = "urllib3" | ||
| 295 | version = "2.6.2" | ||
| 296 | source = { registry = "https://pypi.org/simple" } | ||
| 297 | sdist = { url = "https://files.pythonhosted.org/packages/1e/24/a2a2ed9addd907787d7aa0355ba36a6cadf1768b934c652ea78acbd59dcd/urllib3-2.6.2.tar.gz", hash = "sha256:016f9c98bb7e98085cb2b4b17b87d2c702975664e4f060c6532e64d1c1a5e797", size = 432930, upload-time = "2025-12-11T15:56:40.252Z" } | ||
| 298 | wheels = [ | ||
| 299 | { url = "https://files.pythonhosted.org/packages/6d/b9/4095b668ea3678bf6a0af005527f39de12fb026516fb3df17495a733b7f8/urllib3-2.6.2-py3-none-any.whl", hash = "sha256:ec21cddfe7724fc7cb4ba4bea7aa8e2ef36f607a4bab81aa6ce42a13dc3f03dd", size = 131182, upload-time = "2025-12-11T15:56:38.584Z" }, | ||
| 300 | ] | ||
| 301 | |||
| 302 | [[package]] | ||
| 303 | name = "xdg-base-dirs" | ||
| 304 | version = "6.0.2" | ||
| 305 | source = { registry = "https://pypi.org/simple" } | ||
| 306 | sdist = { url = "https://files.pythonhosted.org/packages/bf/d0/bbe05a15347538aaf9fa5b51ac3b97075dfb834931fcb77d81fbdb69e8f6/xdg_base_dirs-6.0.2.tar.gz", hash = "sha256:950504e14d27cf3c9cb37744680a43bf0ac42efefc4ef4acf98dc736cab2bced", size = 4085, upload-time = "2024-10-19T14:35:08.114Z" } | ||
| 307 | wheels = [ | ||
| 308 | { url = "https://files.pythonhosted.org/packages/fc/03/030b47fd46b60fc87af548e57ff59c2ca84b2a1dadbe721bb0ce33896b2e/xdg_base_dirs-6.0.2-py3-none-any.whl", hash = "sha256:3c01d1b758ed4ace150ac960ac0bd13ce4542b9e2cdf01312dcda5012cfebabe", size = 4747, upload-time = "2024-10-19T14:35:05.931Z" }, | ||
| 309 | ] | ||
diff --git a/accounts/gkleen@skadhi/utils/pdf2pdf.nix b/accounts/gkleen@skadhi/utils/pdf2pdf.nix new file mode 100644 index 00000000..7305a201 --- /dev/null +++ b/accounts/gkleen@skadhi/utils/pdf2pdf.nix | |||
| @@ -0,0 +1,8 @@ | |||
| 1 | pkgs@{ lib, resholve, zsh, ghostscript_headless, ... }: | ||
| 2 | |||
| 3 | resholve.writeScriptBin "pdf2pdf" { | ||
| 4 | inputs = with pkgs; [ghostscript_headless]; | ||
| 5 | interpreter = lib.getExe zsh; | ||
| 6 | } '' | ||
| 7 | exec gs -dPDFSETTINGS=/prepress -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dSAFER -dPreserveAnnots=false "-sOutputFile=''${2:-''${1:r}_pdf2pdf.pdf}" "''${1}" | ||
| 8 | '' | ||
diff --git a/accounts/gkleen@skadhi/utils/sieve-edit.nix b/accounts/gkleen@skadhi/utils/sieve-edit.nix new file mode 100644 index 00000000..f985a3f6 --- /dev/null +++ b/accounts/gkleen@skadhi/utils/sieve-edit.nix | |||
| @@ -0,0 +1,24 @@ | |||
| 1 | pkgs@{ lib, resholve, zsh, sieve-connect, sops, ... }: | ||
| 2 | |||
| 3 | resholve.writeScriptBin "sieve-edit" { | ||
| 4 | inputs = with pkgs; [sieve-connect sops]; | ||
| 5 | interpreter = lib.getExe zsh; | ||
| 6 | execer = with pkgs; [ | ||
| 7 | "cannot:${lib.getExe sieve-connect}" | ||
| 8 | "cannot:${lib.getExe sops}" | ||
| 9 | ]; | ||
| 10 | } '' | ||
| 11 | host=$1; shift | ||
| 12 | case "$host" in | ||
| 13 | surtr) | ||
| 14 | sieve-connect -s surtr.yggdrasil.li -m EXTERNAL --clientkey <(sops decrypt $HOME/projects/machines/hosts/surtr/email/ca/gkleen@sif.key) --clientcert $HOME/projects/machines/hosts/surtr/email/ca/gkleen@sif.crt --edit --remotesieve sieve | ||
| 15 | ;; | ||
| 16 | ymir) | ||
| 17 | sieve-connect -s ymir.yggdrasil.li -u gkleen --edit --remotesieve sieve | ||
| 18 | ;; | ||
| 19 | *) | ||
| 20 | echo "Unknown host: ‘$host’" >&2 | ||
| 21 | return 2 | ||
| 22 | ;; | ||
| 23 | esac | ||
| 24 | '' | ||
diff --git a/accounts/gkleen@skadhi/zsh/default.nix b/accounts/gkleen@skadhi/zsh/default.nix new file mode 100644 index 00000000..1e11d639 --- /dev/null +++ b/accounts/gkleen@skadhi/zsh/default.nix | |||
| @@ -0,0 +1,111 @@ | |||
| 1 | { pkgs, lib, config, sysConfig, flakeInputs, ... }: | ||
| 2 | let | ||
| 3 | zshrc = pkgs.resholve.mkDerivation { | ||
| 4 | pname = "zshrc"; | ||
| 5 | version = "0.0.0"; | ||
| 6 | |||
| 7 | src = ./zshrc; | ||
| 8 | |||
| 9 | dontUnpack = true; | ||
| 10 | dontConfigure = true; | ||
| 11 | dontBuild = true; | ||
| 12 | |||
| 13 | installPhase = '' | ||
| 14 | mkdir -p $out/share | ||
| 15 | install "$src" $out/share/zshrc | ||
| 16 | ''; | ||
| 17 | |||
| 18 | solutions = { | ||
| 19 | default = { | ||
| 20 | scripts = [ "share/zshrc" ]; | ||
| 21 | interpreter = "none"; | ||
| 22 | inputs = with pkgs; [ | ||
| 23 | coreutils | ||
| 24 | rpm | ||
| 25 | binutils | ||
| 26 | squashfsTools | ||
| 27 | unzip | ||
| 28 | config.programs.git.package | ||
| 29 | magickWrapped | ||
| 30 | curl | ||
| 31 | file | ||
| 32 | gnutar | ||
| 33 | cpio | ||
| 34 | magic-wormhole | ||
| 35 | config.programs.zsh.package | ||
| 36 | util-linux | ||
| 37 | findutils | ||
| 38 | qrencode | ||
| 39 | tty-clock | ||
| 40 | config.programs.jq.package | ||
| 41 | eza | ||
| 42 | less | ||
| 43 | sysConfig.systemd.package | ||
| 44 | sysConfig.programs.ssh.package | ||
| 45 | gnused | ||
| 46 | miniserve | ||
| 47 | p7zip | ||
| 48 | ]; | ||
| 49 | execer = with pkgs; [ | ||
| 50 | "cannot:${lib.getExe' rpm "rpm2cpio"}" | ||
| 51 | "cannot:${lib.getExe' squashfsTools "unsquashfs"}" | ||
| 52 | "cannot:${lib.getExe' unzip "unzip"}" | ||
| 53 | "cannot:${lib.getExe config.programs.git.package}" | ||
| 54 | "cannot:${lib.getExe cpio}" | ||
| 55 | "cannot:${lib.getExe' magic-wormhole "wormhole"}" | ||
| 56 | "cannot:${lib.getExe' fuse "fusermount"}" | ||
| 57 | "cannot:${lib.getExe less}" | ||
| 58 | "cannot:${lib.getExe' sysConfig.systemd.package "systemctl"}" | ||
| 59 | "cannot:${lib.getExe sysConfig.programs.ssh.package}" | ||
| 60 | "cannot:${lib.getExe' p7zip "7z"}" | ||
| 61 | ]; | ||
| 62 | wrapper = with pkgs; [ | ||
| 63 | "${lib.getExe' magickWrapped "magick"}:${lib.getExe' imagemagick "magick"}" | ||
| 64 | ]; | ||
| 65 | fake = { | ||
| 66 | builtin = ["print"]; | ||
| 67 | external = lib.mapAttrsToList (_: cfg: cfg.program) sysConfig.security.wrappers; | ||
| 68 | }; | ||
| 69 | }; | ||
| 70 | }; | ||
| 71 | }; | ||
| 72 | magickWrapped = pkgs.symlinkJoin { | ||
| 73 | inherit (pkgs.imagemagick) name; | ||
| 74 | paths = [ pkgs.imagemagick ]; | ||
| 75 | |||
| 76 | buildInputs = with pkgs; [ makeWrapper ]; | ||
| 77 | postBuild = '' | ||
| 78 | wrapProgram $out/bin/magick \ | ||
| 79 | --prefix PATH : ${lib.makeBinPath (with pkgs; [ ghostscript ])} | ||
| 80 | ''; | ||
| 81 | }; | ||
| 82 | in { | ||
| 83 | config = { | ||
| 84 | home.persistence."/persistent".files = [ | ||
| 85 | (lib.removePrefix (config.home.homeDirectory + "/") config.programs.zsh.history.path) | ||
| 86 | ]; | ||
| 87 | programs.zsh.history.path = "${config.xdg.stateHome}/zsh/history"; | ||
| 88 | programs.zsh.initContent = '' | ||
| 89 | source ${zshrc}/share/zshrc | ||
| 90 | ''; | ||
| 91 | programs.zsh.dirHashes = let | ||
| 92 | flakeHashes = lib.mapAttrs' (n: v: lib.nameValuePair (inputNames.${n} or n) (toString v)) flakeInputs; | ||
| 93 | inputNames = { | ||
| 94 | self = "nixos"; | ||
| 95 | }; | ||
| 96 | in flakeHashes // { | ||
| 97 | docs = "$HOME/documents"; | ||
| 98 | dl = "$HOME/Downloads"; | ||
| 99 | scrot = "$HOME/screenshots"; | ||
| 100 | media = "$HOME/media"; | ||
| 101 | flk = "$HOME/projects/machines"; | ||
| 102 | }; | ||
| 103 | programs.starship.settings = { | ||
| 104 | directory.substitutions = lib.mapAttrs' (name: value: let | ||
| 105 | value' = builtins.unsafeDiscardStringContext value; | ||
| 106 | value'' = if lib.hasPrefix "$HOME/" value' then "~" + lib.removePrefix "$HOME" value' else value'; | ||
| 107 | in lib.nameValuePair value'' "~${name}" | ||
| 108 | ) config.programs.zsh.dirHashes; | ||
| 109 | }; | ||
| 110 | }; | ||
| 111 | } | ||
diff --git a/accounts/gkleen@skadhi/zsh/zshrc b/accounts/gkleen@skadhi/zsh/zshrc new file mode 100644 index 00000000..c532b308 --- /dev/null +++ b/accounts/gkleen@skadhi/zsh/zshrc | |||
| @@ -0,0 +1,298 @@ | |||
| 1 | dir() { | ||
| 2 | curlArchive=false | ||
| 3 | templateArchive="" | ||
| 4 | repoUrl="" | ||
| 5 | dir="" | ||
| 6 | forceShell=false | ||
| 7 | wormhole=false | ||
| 8 | gitWorktree="" | ||
| 9 | modifyPDF="" | ||
| 10 | miniserve=false | ||
| 11 | |||
| 12 | while getopts ':t:a:d:ir:wg:p:m' arg; do | ||
| 13 | case $arg in | ||
| 14 | "t") ;; | ||
| 15 | "a") | ||
| 16 | if [[ ${OPTARG} =~ "://" ]]; then | ||
| 17 | templateArchive=${OPTARG} | ||
| 18 | curlArchive=true | ||
| 19 | else | ||
| 20 | templateArchive=${OPTARG:a} | ||
| 21 | fi | ||
| 22 | ;; | ||
| 23 | "d") dir=${OPTARG} ;; | ||
| 24 | "i") forceShell=true ;; | ||
| 25 | "r") repoUrl=${OPTARG} ;; | ||
| 26 | "w") wormhole=true ;; | ||
| 27 | "g") gitWorktree=${OPTARG} ;; | ||
| 28 | "p") modifyPDF=${OPTARG:a} ;; | ||
| 29 | "m") miniserve=true ;; | ||
| 30 | *) printf "Invalid option: %s\n" $arg >&2; exit 2 ;; | ||
| 31 | esac | ||
| 32 | done | ||
| 33 | |||
| 34 | shift $((OPTIND - 1)) | ||
| 35 | |||
| 36 | if [[ -z ${dir} && ${#@} -ge 1 ]]; then | ||
| 37 | dir=${1} | ||
| 38 | shift | ||
| 39 | fi | ||
| 40 | |||
| 41 | [[ -n ${dir} ]] || return 2; | ||
| 42 | |||
| 43 | if [[ ! -e ${dir} ]]; then | ||
| 44 | if [[ -z "${gitWorktree}" ]]; then | ||
| 45 | mkdir -vp ${dir} | ||
| 46 | else | ||
| 47 | git -C ${gitWorktree} worktree add ${dir} | ||
| 48 | fi | ||
| 49 | else | ||
| 50 | gitWorktree="" | ||
| 51 | fi | ||
| 52 | |||
| 53 | miniservePIDFile="" | ||
| 54 | if [[ ${miniserve} = "true" ]]; then | ||
| 55 | miniservePIDFile=$(mktemp --tmpdir --suffix=.pid) | ||
| 56 | fi | ||
| 57 | |||
| 58 | cleanup() | ||
| 59 | { | ||
| 60 | if [[ -n ${modifyPDF} ]]; then | ||
| 61 | cd ${modifyPDF:h} | ||
| 62 | typeset -a pages | ||
| 63 | eval 'pages=(${dir}/${modifyPDF:t:r}_*.png(on))' | ||
| 64 | magick -verbose "${pages[@]}" $(mktemp --tmpdir=${modifyPDF:h} ${modifyPDF:t:r}_XXXXXXXXXX.${modifyPDF:e}) | ||
| 65 | modifyPDF="" | ||
| 66 | fi | ||
| 67 | if [[ -n ${miniservePIDFile} ]]; then | ||
| 68 | command kill --verbose -- $(cat ${miniservePIDFile}) && wait $(cat ${miniservePIDFile}) | ||
| 69 | miniservePIDFile="" | ||
| 70 | fi | ||
| 71 | } | ||
| 72 | |||
| 73 | ( | ||
| 74 | set -o localoptions -o localtraps | ||
| 75 | trap 'return 1' INT TERM | ||
| 76 | trap cleanup EXIT | ||
| 77 | |||
| 78 | cd ${dir} | ||
| 79 | export dir; | ||
| 80 | |||
| 81 | [[ -n ${repoUrl} ]] && git clone -- ${repoUrl} . | ||
| 82 | |||
| 83 | [[ -n ${modifyPDF} ]] && templateArchive=${modifyPDF} | ||
| 84 | |||
| 85 | if [[ -n ${templateArchive} ]]; then | ||
| 86 | ( | ||
| 87 | archiveFile="" | ||
| 88 | cleanup() { | ||
| 89 | [[ -n "${archiveFile}" ]] && rm -fv ${archiveFile} | ||
| 90 | } | ||
| 91 | trap cleanup EXIT | ||
| 92 | |||
| 93 | if [[ $curlArchive = "true" ]]; then | ||
| 94 | archiveFile=$(mktemp -t "archive.XXXXXXXXXX.${templateArchive:t}") | ||
| 95 | |||
| 96 | curl -SfL -o ${archiveFile} ${templateArchive} | ||
| 97 | |||
| 98 | templateArchive=${archiveFile} | ||
| 99 | fi | ||
| 100 | |||
| 101 | unpack=true | ||
| 102 | while [[ $unpack = "true" ]]; do | ||
| 103 | case $(file --brief --mime-type --dereference ${templateArchive}) in | ||
| 104 | application/zip) | ||
| 105 | unzip ${templateArchive} | ||
| 106 | unpack=false | ||
| 107 | ;; | ||
| 108 | application/vnd.debian.binary-package) | ||
| 109 | ar x ${templateArchive} | ||
| 110 | mkdir control data | ||
| 111 | tar -C control -xvaf control.* | ||
| 112 | tar -C data -xvaf data.* | ||
| 113 | unpack=false | ||
| 114 | ;; | ||
| 115 | application/x-rpm) | ||
| 116 | cpioArchive=$(mktemp -t "archive.XXXXXXXXXX.${templateArchive:t:r}.cpio") | ||
| 117 | rpm2cpio ${templateArchive} > ${cpioArchive} | ||
| 118 | templateArchive=${cpioArchive} | ||
| 119 | unpack=true | ||
| 120 | ;; | ||
| 121 | application/x-cpio) | ||
| 122 | cpio --extract --make-directories --no-absolute-filenames -F ${templateArchive} | ||
| 123 | unpack=false | ||
| 124 | ;; | ||
| 125 | application/pdf) | ||
| 126 | magick -verbose -density 400 ${templateArchive} ${modifyPDF:t:r}_%0d.png | ||
| 127 | unpack=false | ||
| 128 | ;; | ||
| 129 | application/octet-stream) | ||
| 130 | if [[ $(file --brief --dereference ${templateArchive}) =~ Squashfs ]]; then | ||
| 131 | unsquashfs -d . ${templateArchive} | ||
| 132 | unpack=false | ||
| 133 | fi | ||
| 134 | ;; | ||
| 135 | application/x-iso9660-image) | ||
| 136 | 7z x ${templateArchive} | ||
| 137 | unpack=false | ||
| 138 | ;; | ||
| 139 | *) | ||
| 140 | tar -xvaf ${templateArchive} | ||
| 141 | unpack=false | ||
| 142 | ;; | ||
| 143 | esac | ||
| 144 | done | ||
| 145 | ) | ||
| 146 | fi | ||
| 147 | |||
| 148 | |||
| 149 | [[ $wormhole = "true" ]] && wormhole receive --accept-file | ||
| 150 | |||
| 151 | |||
| 152 | if [[ ${#@} -gt 0 ]]; then | ||
| 153 | ${@} | ||
| 154 | fi | ||
| 155 | |||
| 156 | cd $(pwd) # Needed for mounting to work | ||
| 157 | |||
| 158 | if [[ ${miniserve} = "true" ]]; then | ||
| 159 | miniserve --random-route --hidden --enable-tar-gz --enable-zip . & | ||
| 160 | echo $! > "${miniservePIDFile}" | ||
| 161 | fi | ||
| 162 | |||
| 163 | if [[ ${#@} -eq 0 ]] && [[ ${miniserve} != "true" ]] || [[ $forceShell = "true" ]]; then | ||
| 164 | isSingleDir() { | ||
| 165 | typeset -a contents | ||
| 166 | contents=(*(N) .*(N)) | ||
| 167 | |||
| 168 | if [[ ${#contents} -eq 1 && -d ${contents[1]} ]]; then | ||
| 169 | print ${contents[1]} | ||
| 170 | return 0 | ||
| 171 | else | ||
| 172 | return 1 | ||
| 173 | fi | ||
| 174 | } | ||
| 175 | while d=$(isSingleDir); do cd ${d}; done | ||
| 176 | |||
| 177 | zsh | ||
| 178 | elif [[ ${miniserve} == "true" ]]; then | ||
| 179 | wait $(cat "${miniservePIDFile}") | ||
| 180 | fi | ||
| 181 | ) | ||
| 182 | } | ||
| 183 | |||
| 184 | tmpdir() { | ||
| 185 | cleanup() | ||
| 186 | { | ||
| 187 | cd / | ||
| 188 | unmount() { | ||
| 189 | printf "Unmounting %s\n" ${1} >&2 | ||
| 190 | fusermount3 -u ${1} || umount ${1} || sudo umount ${1} | ||
| 191 | } | ||
| 192 | |||
| 193 | if [[ -n ${dir} ]]; then | ||
| 194 | if mountpoint -q -- ${dir}; then | ||
| 195 | unmount ${dir} || return $? | ||
| 196 | else | ||
| 197 | while read -d $'\0' subDir; do | ||
| 198 | mountpoint -q -- ${subDir} || continue | ||
| 199 | unmount ${subDir} || return $? | ||
| 200 | done <<<$(find ${dir} -xdev -type d -print0 | sort -zr) | ||
| 201 | fi | ||
| 202 | |||
| 203 | rm -rfv --one-file-system -- ${dir} | ||
| 204 | dir="" | ||
| 205 | fi | ||
| 206 | } | ||
| 207 | |||
| 208 | local tmpdir="" | ||
| 209 | |||
| 210 | while getopts ':t:a:d:ir:wg:p:m' arg; do | ||
| 211 | case $arg in | ||
| 212 | "t") tmpdir="=${OPTARG}" ;; | ||
| 213 | "?"|":") printf "Invalid option: %s\n" $arg >&2; exit 2 ;; | ||
| 214 | esac | ||
| 215 | done | ||
| 216 | |||
| 217 | ( | ||
| 218 | set -o localoptions -o localtraps | ||
| 219 | trap 'return 1' INT TERM | ||
| 220 | trap cleanup EXIT | ||
| 221 | |||
| 222 | |||
| 223 | local dir=$(mktemp -ud --tmpdir${tmpdir} ${0}.XXXXXXXXXX || return $?) | ||
| 224 | |||
| 225 | ( dir -d ${dir} ${@} ) | ||
| 226 | ) | ||
| 227 | } | ||
| 228 | |||
| 229 | qr() { | ||
| 230 | qrencode -l M -o - -t ANSIUTF8 $@ | ||
| 231 | } | ||
| 232 | |||
| 233 | clock() { | ||
| 234 | tty-clock -sSbc -C 7 -d 0 -a 100000000 | ||
| 235 | } | ||
| 236 | |||
| 237 | public-ip() { | ||
| 238 | curl -sSf -H 'Accept: application/json' $@ ifconfig.co | jq -r '.ip' | ||
| 239 | } | ||
| 240 | |||
| 241 | swap() { | ||
| 242 | f1=${1} | ||
| 243 | f2=${2} | ||
| 244 | |||
| 245 | if [[ -z "${f1}" || ! -e "${f1}" ]]; then | ||
| 246 | printf "‘%s’ does not exist\n" "${f1}" >&2 | ||
| 247 | return 2 | ||
| 248 | fi | ||
| 249 | if [[ -z "${f2}" || ! -e "${f2}" ]]; then | ||
| 250 | printf "‘%s’ does not exist\n" "${f2}" >&2 | ||
| 251 | return 2 | ||
| 252 | fi | ||
| 253 | |||
| 254 | tmpfile=$(mktemp --dry-run --tmpdir=${f1:h} .swap.XXXXXXXXXX) | ||
| 255 | mv -v ${f1} ${tmpfile} | ||
| 256 | mv -v ${f2} ${f1} | ||
| 257 | mv -v ${tmpfile} ${f2} | ||
| 258 | } | ||
| 259 | |||
| 260 | ls() { | ||
| 261 | eza --all --group-directories-first --colour=always --sort=modified --smart-group $@ | less --mouse -FR | ||
| 262 | } | ||
| 263 | |||
| 264 | l() { | ||
| 265 | ls --long --binary --git --time-style=iso --header $@ | ||
| 266 | } | ||
| 267 | |||
| 268 | ssh-installer() { | ||
| 269 | ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o IdentityFile=~/.ssh/gkleen@sif.midgard.yggdrasil $@ | ||
| 270 | } | ||
| 271 | |||
| 272 | dichotomic_search() { | ||
| 273 | min=$1; shift | ||
| 274 | max=$1; shift | ||
| 275 | |||
| 276 | while [[ $min -lt $max ]]; do | ||
| 277 | # Compute the mean between min and max, rounded up to the superior unit | ||
| 278 | current=$(( (min + max + 1 ) / 2 )) | ||
| 279 | if $@ $current; then | ||
| 280 | min=$current | ||
| 281 | else | ||
| 282 | max=$((current - 1)) | ||
| 283 | fi | ||
| 284 | done | ||
| 285 | |||
| 286 | echo $min | ||
| 287 | } | ||
| 288 | |||
| 289 | while read -r -d $'\0' d _ s; do | ||
| 290 | hash -d ${s}=${d} | ||
| 291 | done < <(find ~/projects ~/uni -regextype posix-extended -maxdepth 2 -type d -regex '\S+/[0-9]{2}[ws]/\S+' -print0 2>/dev/null | \ | ||
| 292 | sed -zr 's|(.*/([0-9]{2}[ws])/(.+))|\1 \2 \3|' | \ | ||
| 293 | sort -z -r -k2 | sort -z -s -k3 | uniq -z -f 2) | ||
| 294 | |||
| 295 | alias rzadm=$'tmpdir -i sh -c \'mkdir adm; sshfs gkleen@mgmt01:/adm adm\'' | ||
| 296 | alias mathcloud=$'tmpdir -i rclone mount --daemon mathcloud:// .' | ||
| 297 | |||
| 298 | export DEFAULT_USER=gkleen | ||
diff --git a/accounts/gkleen@vidhar.nix b/accounts/gkleen@vidhar.nix index 3a37c4bd..aecba7d5 100644 --- a/accounts/gkleen@vidhar.nix +++ b/accounts/gkleen@vidhar.nix | |||
| @@ -11,7 +11,7 @@ | |||
| 11 | ]; | 11 | ]; |
| 12 | }; | 12 | }; |
| 13 | 13 | ||
| 14 | home-manager.users.${userName} = { | 14 | home-manager.users.${userName} = { sysConfig, config, ... }: { |
| 15 | home.stateVersion = "20.09"; | 15 | home.stateVersion = "20.09"; |
| 16 | 16 | ||
| 17 | programs.ssh.matchBlocks = { | 17 | programs.ssh.matchBlocks = { |
| @@ -36,9 +36,13 @@ | |||
| 36 | }; | 36 | }; |
| 37 | home.file = { | 37 | home.file = { |
| 38 | ".config/user-tmpfiles.d/gnupg.conf".text = '' | 38 | ".config/user-tmpfiles.d/gnupg.conf".text = '' |
| 39 | d /run/user/${toString config.users.users.${userName}.uid}/gnupg 0700 ${userName} ${config.users.users.${userName}.group} - | 39 | d /run/user/${toString sysConfig.users.users.${userName}.uid}/gnupg 0700 ${userName} ${sysConfig.users.users.${userName}.group} - |
| 40 | ''; | 40 | ''; |
| 41 | }; | 41 | }; |
| 42 | |||
| 43 | home.packages = [ | ||
| 44 | flake.nixosConfigurations.skadhi.config.home-manager.users.gkleen.services.unison.package | ||
| 45 | ]; | ||
| 42 | }; | 46 | }; |
| 43 | }; | 47 | }; |
| 44 | } | 48 | } |
diff --git a/accounts/root@skadhi.nix b/accounts/root@skadhi.nix new file mode 100644 index 00000000..425d9a04 --- /dev/null +++ b/accounts/root@skadhi.nix | |||
| @@ -0,0 +1,10 @@ | |||
| 1 | { flake, userName, ... }: | ||
| 2 | { | ||
| 3 | imports = with flake.nixosModules.userProfiles.${userName}; [ | ||
| 4 | zsh | ||
| 5 | ]; | ||
| 6 | |||
| 7 | config.home-manager.users.${userName} = { | ||
| 8 | home.stateVersion = "26.05"; | ||
| 9 | }; | ||
| 10 | } | ||
| @@ -49,16 +49,16 @@ | |||
| 49 | ] | 49 | ] |
| 50 | }, | 50 | }, |
| 51 | "locked": { | 51 | "locked": { |
| 52 | "lastModified": 1750599403, | 52 | "lastModified": 1790252275, |
| 53 | "narHash": "sha256-MLQ7CISl00w1xq88TL2wukNq3ukzID4u7BVT4okbUik=", | 53 | "narHash": "sha256-ihMIFtcDdYzciAWJgJGlP20UN2XX1EUNasDlHkx1W84=", |
| 54 | "owner": "gkleen", | 54 | "owner": "gkleen", |
| 55 | "repo": "ca", | 55 | "repo": "ca", |
| 56 | "rev": "505a29233ada969b2eca76d616b0d7a8767dfb71", | 56 | "rev": "b38a9464e9540f0b3800a028ab5de7d9b59b7769", |
| 57 | "type": "gitlab" | 57 | "type": "gitlab" |
| 58 | }, | 58 | }, |
| 59 | "original": { | 59 | "original": { |
| 60 | "owner": "gkleen", | 60 | "owner": "gkleen", |
| 61 | "ref": "v3.1.5", | 61 | "ref": "v3.1.6", |
| 62 | "repo": "ca", | 62 | "repo": "ca", |
| 63 | "type": "gitlab" | 63 | "type": "gitlab" |
| 64 | } | 64 | } |
| @@ -91,11 +91,11 @@ | |||
| 91 | ] | 91 | ] |
| 92 | }, | 92 | }, |
| 93 | "locked": { | 93 | "locked": { |
| 94 | "lastModified": 1786361680, | 94 | "lastModified": 1789404474, |
| 95 | "narHash": "sha256-IxaZkb9rCGEZ+yGndxKXONeIEcKMzoFUsvLTB5G/caw=", | 95 | "narHash": "sha256-UXFQ7tFiwn8sPz0EV4CBB2PCf/ZiGIHWn/6MXk81Lxs=", |
| 96 | "owner": "serokell", | 96 | "owner": "serokell", |
| 97 | "repo": "deploy-rs", | 97 | "repo": "deploy-rs", |
| 98 | "rev": "16901271e5b30b591e56f7a84f25f186fb20f3e1", | 98 | "rev": "e760371d631165e7d8de5b0dcf148e21ec4c16f0", |
| 99 | "type": "github" | 99 | "type": "github" |
| 100 | }, | 100 | }, |
| 101 | "original": { | 101 | "original": { |
| @@ -105,6 +105,27 @@ | |||
| 105 | "type": "github" | 105 | "type": "github" |
| 106 | } | 106 | } |
| 107 | }, | 107 | }, |
| 108 | "disko": { | ||
| 109 | "inputs": { | ||
| 110 | "nixpkgs": [ | ||
| 111 | "nixpkgs" | ||
| 112 | ] | ||
| 113 | }, | ||
| 114 | "locked": { | ||
| 115 | "lastModified": 1768920986, | ||
| 116 | "narHash": "sha256-CNzzBsRhq7gg4BMBuTDObiWDH/rFYHEuDRVOwCcwXw4=", | ||
| 117 | "owner": "nix-community", | ||
| 118 | "repo": "disko", | ||
| 119 | "rev": "de5708739256238fb912c62f03988815db89ec9a", | ||
| 120 | "type": "github" | ||
| 121 | }, | ||
| 122 | "original": { | ||
| 123 | "owner": "nix-community", | ||
| 124 | "ref": "latest", | ||
| 125 | "repo": "disko", | ||
| 126 | "type": "github" | ||
| 127 | } | ||
| 128 | }, | ||
| 108 | "flake-compat": { | 129 | "flake-compat": { |
| 109 | "flake": false, | 130 | "flake": false, |
| 110 | "locked": { | 131 | "locked": { |
| @@ -275,11 +296,11 @@ | |||
| 275 | "flake-registry": { | 296 | "flake-registry": { |
| 276 | "flake": false, | 297 | "flake": false, |
| 277 | "locked": { | 298 | "locked": { |
| 278 | "lastModified": 1782548455, | 299 | "lastModified": 1789428769, |
| 279 | "narHash": "sha256-Jjp/ZivVqZCLptwlSuwU8n0a8b8PXJqabxpSG7KRNuI=", | 300 | "narHash": "sha256-qhIiRTjzwr65WpepkXWGmA4Wwl/PD/gfr3mQqeYORBY=", |
| 280 | "owner": "NixOS", | 301 | "owner": "NixOS", |
| 281 | "repo": "flake-registry", | 302 | "repo": "flake-registry", |
| 282 | "rev": "10bd3d9e8eefb4725e346eddd3a505aa0aacf01b", | 303 | "rev": "46ea0f17cf6777e156a2be6ae802d9f95d93dd5e", |
| 283 | "type": "github" | 304 | "type": "github" |
| 284 | }, | 305 | }, |
| 285 | "original": { | 306 | "original": { |
| @@ -331,11 +352,11 @@ | |||
| 331 | ] | 352 | ] |
| 332 | }, | 353 | }, |
| 333 | "locked": { | 354 | "locked": { |
| 334 | "lastModified": 1784288435, | 355 | "lastModified": 1789514889, |
| 335 | "narHash": "sha256-ReRHaLgr/uVqdD8afFSn+myXIfpHeOhP0yYe0TJqAA8=", | 356 | "narHash": "sha256-PFD1nxptCXJyJoiYO1gf/5Vv43yqGpHtMC6LUhl9/pQ=", |
| 336 | "owner": "cachix", | 357 | "owner": "cachix", |
| 337 | "repo": "git-hooks.nix", | 358 | "repo": "git-hooks.nix", |
| 338 | "rev": "43b3c1ab9d40fb1dbb008f451988a91e375825e9", | 359 | "rev": "59f4ca0d063a1a3ec722c88b51a33004862e5379", |
| 339 | "type": "github" | 360 | "type": "github" |
| 340 | }, | 361 | }, |
| 341 | "original": { | 362 | "original": { |
| @@ -481,16 +502,16 @@ | |||
| 481 | ] | 502 | ] |
| 482 | }, | 503 | }, |
| 483 | "locked": { | 504 | "locked": { |
| 484 | "lastModified": 1765177068, | 505 | "lastModified": 1790365885, |
| 485 | "narHash": "sha256-sY0Se9MMC+94kQYJysp036+M6dHV/Rv8t4rOGJrFy5I=", | 506 | "narHash": "sha256-iQ0ebhiVo64NktTnwft9hNxlFu4j5cvljVxyJaEVIP4=", |
| 486 | "owner": "gkleen", | 507 | "owner": "nix-community", |
| 487 | "repo": "home-manager", | 508 | "repo": "home-manager", |
| 488 | "rev": "40a8c69f8502bf546e429efa18857b8b14fd467b", | 509 | "rev": "7b4c5ec4bedaf1e062bbc1bcaeddbc6bd242aa1b", |
| 489 | "type": "github" | 510 | "type": "github" |
| 490 | }, | 511 | }, |
| 491 | "original": { | 512 | "original": { |
| 492 | "owner": "gkleen", | 513 | "owner": "nix-community", |
| 493 | "ref": "nixos-late-start", | 514 | "ref": "master", |
| 494 | "repo": "home-manager", | 515 | "repo": "home-manager", |
| 495 | "type": "github" | 516 | "type": "github" |
| 496 | } | 517 | } |
| @@ -584,7 +605,7 @@ | |||
| 584 | "leapseconds": { | 605 | "leapseconds": { |
| 585 | "flake": false, | 606 | "flake": false, |
| 586 | "locked": { | 607 | "locked": { |
| 587 | "narHash": "sha256-FJgbafPB48+5sT+7ZB8pajSsfJoISEOoaJ0d/2Ya7o8=", | 608 | "narHash": "sha256-kl6aoY4y+lSqJR0AzNICA/oPUErOyHfZ7u5KweYpwF0=", |
| 588 | "type": "file", | 609 | "type": "file", |
| 589 | "url": "https://data.iana.org/time-zones/tzdb/leap-seconds.list" | 610 | "url": "https://data.iana.org/time-zones/tzdb/leap-seconds.list" |
| 590 | }, | 611 | }, |
| @@ -626,11 +647,11 @@ | |||
| 626 | "xwayland-satellite-unstable": "xwayland-satellite-unstable" | 647 | "xwayland-satellite-unstable": "xwayland-satellite-unstable" |
| 627 | }, | 648 | }, |
| 628 | "locked": { | 649 | "locked": { |
| 629 | "lastModified": 1787129251, | 650 | "lastModified": 1790070480, |
| 630 | "narHash": "sha256-MauCXoXwhSGLMJiddBrUSHvPie8lUtCaohjKJgIReQE=", | 651 | "narHash": "sha256-gLB/L3ggRwng88W3t4KygVBkIjB84zW1xQSIWiuRGWg=", |
| 631 | "owner": "epireyn", | 652 | "owner": "epireyn", |
| 632 | "repo": "niri-flake", | 653 | "repo": "niri-flake", |
| 633 | "rev": "f9e02cd4674abefa210674cd28a993e5cfb33bfc", | 654 | "rev": "4edede7d2e876544cc1c1128e47d0e51278b1b9a", |
| 634 | "type": "github" | 655 | "type": "github" |
| 635 | }, | 656 | }, |
| 636 | "original": { | 657 | "original": { |
| @@ -702,11 +723,11 @@ | |||
| 702 | ] | 723 | ] |
| 703 | }, | 724 | }, |
| 704 | "locked": { | 725 | "locked": { |
| 705 | "lastModified": 1786852476, | 726 | "lastModified": 1789892076, |
| 706 | "narHash": "sha256-IM5CYtf86W4w8eUPpKcY/LpdHElmVBtJhaKnoTKxZEA=", | 727 | "narHash": "sha256-Dkg4VKPmDPqTwaiw2WH5br73tXoL1qrOO0xJnR4TlcA=", |
| 707 | "owner": "nix-community", | 728 | "owner": "nix-community", |
| 708 | "repo": "nix-index-database", | 729 | "repo": "nix-index-database", |
| 709 | "rev": "c7962dc97b45129df8d751bedaf37beb5a17706e", | 730 | "rev": "9ad722673ab3b3f91f02135e53775825b240b869", |
| 710 | "type": "github" | 731 | "type": "github" |
| 711 | }, | 732 | }, |
| 712 | "original": { | 733 | "original": { |
| @@ -748,11 +769,11 @@ | |||
| 748 | ] | 769 | ] |
| 749 | }, | 770 | }, |
| 750 | "locked": { | 771 | "locked": { |
| 751 | "lastModified": 1786680260, | 772 | "lastModified": 1789705005, |
| 752 | "narHash": "sha256-t/OKt1G1UnHTRRtNuJ/yC1oOV4Fn39HkNsKzyd3DlYQ=", | 773 | "narHash": "sha256-kWGA2zNVrHZpKgeXA0urHvw7FWCTEp5rjyUAhCikXuc=", |
| 753 | "ref": "refs/heads/main", | 774 | "ref": "refs/heads/main", |
| 754 | "rev": "b568a2584ed3619a6ebe41a2910e2bfc674bf836", | 775 | "rev": "bcecf42740627e01376caea1edc3194f39857890", |
| 755 | "revCount": 801, | 776 | "revCount": 814, |
| 756 | "type": "git", | 777 | "type": "git", |
| 757 | "url": "https://code.maralorn.de/maralorn/nix-output-monitor.git" | 778 | "url": "https://code.maralorn.de/maralorn/nix-output-monitor.git" |
| 758 | }, | 779 | }, |
| @@ -786,11 +807,11 @@ | |||
| 786 | "nixpkgs": "nixpkgs_4" | 807 | "nixpkgs": "nixpkgs_4" |
| 787 | }, | 808 | }, |
| 788 | "locked": { | 809 | "locked": { |
| 789 | "lastModified": 1786867632, | 810 | "lastModified": 1789978172, |
| 790 | "narHash": "sha256-ez+ubZlA1RtdjCB18a6zJ9M4u8qoPDy08EcnsW5M3Xw=", | 811 | "narHash": "sha256-FIRXajv1pPZ+l6On6ekkmcQ6le0Zi0ncRUoR3nB0vKA=", |
| 791 | "owner": "NixOS", | 812 | "owner": "NixOS", |
| 792 | "repo": "nixos-hardware", | 813 | "repo": "nixos-hardware", |
| 793 | "rev": "ff17823245ab9ff7bcae6acf950bd89cba82c38c", | 814 | "rev": "9ebcb7766700d7e006d9505247bd7ce0426f4232", |
| 794 | "type": "github" | 815 | "type": "github" |
| 795 | }, | 816 | }, |
| 796 | "original": { | 817 | "original": { |
| @@ -911,11 +932,11 @@ | |||
| 911 | }, | 932 | }, |
| 912 | "nixpkgs-stable_2": { | 933 | "nixpkgs-stable_2": { |
| 913 | "locked": { | 934 | "locked": { |
| 914 | "lastModified": 1787042014, | 935 | "lastModified": 1789998861, |
| 915 | "narHash": "sha256-lgnV/xeEatfEnPZG0RrXS0fhcr63p3tsVvL1GdaVkJQ=", | 936 | "narHash": "sha256-62XMQD4WLdMAfdT0/8gJmPH2dKeTw908ryNloAplTr8=", |
| 916 | "owner": "NixOS", | 937 | "owner": "NixOS", |
| 917 | "repo": "nixpkgs", | 938 | "repo": "nixpkgs", |
| 918 | "rev": "c69ae8fb8faeb3472fd11234ba55a70ac3601f9b", | 939 | "rev": "1e8bc658fc985ef27ccd66d107d767b32bb7ef98", |
| 919 | "type": "github" | 940 | "type": "github" |
| 920 | }, | 941 | }, |
| 921 | "original": { | 942 | "original": { |
| @@ -991,11 +1012,11 @@ | |||
| 991 | }, | 1012 | }, |
| 992 | "nixpkgs_4": { | 1013 | "nixpkgs_4": { |
| 993 | "locked": { | 1014 | "locked": { |
| 994 | "lastModified": 1767892417, | 1015 | "lastModified": 1789546076, |
| 995 | "narHash": "sha256-8bW3q88CEg2u4hSP66Vf4lpbLonHz7hqDNBMcCY7E9U=", | 1016 | "narHash": "sha256-vWkSk5bbfTqdtMoSgD9FshACO8JCvXTFi+3cqEp0mH0=", |
| 996 | "rev": "3497aa5c9457a9d88d71fa93a4a8368816fbeeba", | 1017 | "rev": "b1b875982b17dabde9b4a37f3e229e74913e6db3", |
| 997 | "type": "tarball", | 1018 | "type": "tarball", |
| 998 | "url": "https://releases.nixos.org/nixos/unstable/nixos-26.05pre924538.3497aa5c9457/nixexprs.tar.xz" | 1019 | "url": "https://releases.nixos.org/nixos/unstable/nixos-26.11pre1074753.b1b875982b17/nixexprs.tar.xz" |
| 999 | }, | 1020 | }, |
| 1000 | "original": { | 1021 | "original": { |
| 1001 | "type": "tarball", | 1022 | "type": "tarball", |
| @@ -1004,11 +1025,11 @@ | |||
| 1004 | }, | 1025 | }, |
| 1005 | "nixpkgs_5": { | 1026 | "nixpkgs_5": { |
| 1006 | "locked": { | 1027 | "locked": { |
| 1007 | "lastModified": 1787001381, | 1028 | "lastModified": 1789921291, |
| 1008 | "narHash": "sha256-Ue1Yo8gfHdD4TMtNewhA4tkSYeFqXThju0nCyJc3ALo=", | 1029 | "narHash": "sha256-Ft/BRnIqw1MywFoXydKobjjWmDFgDdYtSpJliE8+yUw=", |
| 1009 | "owner": "NixOS", | 1030 | "owner": "NixOS", |
| 1010 | "repo": "nixpkgs", | 1031 | "repo": "nixpkgs", |
| 1011 | "rev": "ec2d622de0773551768cf98f3fc50cbcc003b9c5", | 1032 | "rev": "44a91898084f46797b5fac650c7e8c9ac38c43d4", |
| 1012 | "type": "github" | 1033 | "type": "github" |
| 1013 | }, | 1034 | }, |
| 1014 | "original": { | 1035 | "original": { |
| @@ -1274,11 +1295,11 @@ | |||
| 1274 | ] | 1295 | ] |
| 1275 | }, | 1296 | }, |
| 1276 | "locked": { | 1297 | "locked": { |
| 1277 | "lastModified": 1786936886, | 1298 | "lastModified": 1789963190, |
| 1278 | "narHash": "sha256-8SFyOdmcG6Nsh/JzlH812lTI/v+ur06fpQhj/acNn8k=", | 1299 | "narHash": "sha256-mj5BLUKECIHv3rwkBXL6xQp45gIBJV7ZOYgT46LXwho=", |
| 1279 | "owner": "pyproject-nix", | 1300 | "owner": "pyproject-nix", |
| 1280 | "repo": "build-system-pkgs", | 1301 | "repo": "build-system-pkgs", |
| 1281 | "rev": "90ffdeee1a4929b231913df067448cd9803d3e07", | 1302 | "rev": "14b45373ea9a14ed2fcd0abf3ed35c8e3c430020", |
| 1282 | "type": "github" | 1303 | "type": "github" |
| 1283 | }, | 1304 | }, |
| 1284 | "original": { | 1305 | "original": { |
| @@ -1294,11 +1315,11 @@ | |||
| 1294 | ] | 1315 | ] |
| 1295 | }, | 1316 | }, |
| 1296 | "locked": { | 1317 | "locked": { |
| 1297 | "lastModified": 1786031528, | 1318 | "lastModified": 1788394333, |
| 1298 | "narHash": "sha256-cROiHKO3UbIKqF5FG5NikvydzlfIj4EcR1Cty9qOVt4=", | 1319 | "narHash": "sha256-xYOP0Xym1eVGUaHFx+eJEaycFGoiCbst3fZf0xFHP78=", |
| 1299 | "owner": "pyproject-nix", | 1320 | "owner": "pyproject-nix", |
| 1300 | "repo": "pyproject.nix", | 1321 | "repo": "pyproject.nix", |
| 1301 | "rev": "1b1485546d85f6f6c7aadb10c4923dbc09633263", | 1322 | "rev": "6a8a7881d75b6f98967e7b8069f4ead331384301", |
| 1302 | "type": "github" | 1323 | "type": "github" |
| 1303 | }, | 1324 | }, |
| 1304 | "original": { | 1325 | "original": { |
| @@ -1312,6 +1333,7 @@ | |||
| 1312 | "backup-utils": "backup-utils", | 1333 | "backup-utils": "backup-utils", |
| 1313 | "ca-util": "ca-util", | 1334 | "ca-util": "ca-util", |
| 1314 | "deploy-rs": "deploy-rs", | 1335 | "deploy-rs": "deploy-rs", |
| 1336 | "disko": "disko", | ||
| 1315 | "flake-compat": "flake-compat_3", | 1337 | "flake-compat": "flake-compat_3", |
| 1316 | "flake-registry": "flake-registry", | 1338 | "flake-registry": "flake-registry", |
| 1317 | "flake-utils": "flake-utils", | 1339 | "flake-utils": "flake-utils", |
| @@ -1368,11 +1390,11 @@ | |||
| 1368 | ] | 1390 | ] |
| 1369 | }, | 1391 | }, |
| 1370 | "locked": { | 1392 | "locked": { |
| 1371 | "lastModified": 1786629091, | 1393 | "lastModified": 1789890976, |
| 1372 | "narHash": "sha256-gkig4nPi1CWc4Z50GBsjE4ygSE7hMpl/TwID2an2Cck=", | 1394 | "narHash": "sha256-GKwH3zpy7tartuJMG0Rv/xUsdetG1QLmTVv8UKgJLmA=", |
| 1373 | "owner": "Mic92", | 1395 | "owner": "Mic92", |
| 1374 | "repo": "sops-nix", | 1396 | "repo": "sops-nix", |
| 1375 | "rev": "a8627b21b9107c5711c96b84f32a9a4b3d45295f", | 1397 | "rev": "7214124c20c1542c90deb54af50e2f53ae02711f", |
| 1376 | "type": "github" | 1398 | "type": "github" |
| 1377 | }, | 1399 | }, |
| 1378 | "original": { | 1400 | "original": { |
| @@ -1443,11 +1465,11 @@ | |||
| 1443 | ] | 1465 | ] |
| 1444 | }, | 1466 | }, |
| 1445 | "locked": { | 1467 | "locked": { |
| 1446 | "lastModified": 1786615403, | 1468 | "lastModified": 1789383061, |
| 1447 | "narHash": "sha256-U++y7nM/6xiEcWI7q4fQoPZjPvRaTwkSqzBOVoEBjUE=", | 1469 | "narHash": "sha256-+DkygIVr/+RtXnsjd07BzFFB0ihwmjjLuYh1fyc/bCg=", |
| 1448 | "owner": "pyproject-nix", | 1470 | "owner": "pyproject-nix", |
| 1449 | "repo": "uv2nix", | 1471 | "repo": "uv2nix", |
| 1450 | "rev": "4b59abb2ae1896d2a0e1abfc47fbc9bf985ea730", | 1472 | "rev": "079be4e68c529c4cbc44dbf1afc692e4b30695b3", |
| 1451 | "type": "github" | 1473 | "type": "github" |
| 1452 | }, | 1474 | }, |
| 1453 | "original": { | 1475 | "original": { |
| @@ -1459,16 +1481,16 @@ | |||
| 1459 | "xwayland-satellite-stable": { | 1481 | "xwayland-satellite-stable": { |
| 1460 | "flake": false, | 1482 | "flake": false, |
| 1461 | "locked": { | 1483 | "locked": { |
| 1462 | "lastModified": 1771195969, | 1484 | "lastModified": 1784679892, |
| 1463 | "narHash": "sha256-BUE41HjLIGPjq3U8VXPjf8asH8GaMI7FYdgrIHKFMXA=", | 1485 | "narHash": "sha256-Mb7jpqnrcYCfNSItIkkHpuR3YxWFxPuIBfcwNKlRBkk=", |
| 1464 | "owner": "Supreeeme", | 1486 | "owner": "Supreeeme", |
| 1465 | "repo": "xwayland-satellite", | 1487 | "repo": "xwayland-satellite", |
| 1466 | "rev": "536bd32efc935bf876d6de385ec18a1b715c9358", | 1488 | "rev": "8d135d3b2854b30fd01ea6cd6c27e523dd50a839", |
| 1467 | "type": "github" | 1489 | "type": "github" |
| 1468 | }, | 1490 | }, |
| 1469 | "original": { | 1491 | "original": { |
| 1470 | "owner": "Supreeeme", | 1492 | "owner": "Supreeeme", |
| 1471 | "ref": "v0.8.1", | 1493 | "ref": "v0.8.2", |
| 1472 | "repo": "xwayland-satellite", | 1494 | "repo": "xwayland-satellite", |
| 1473 | "type": "github" | 1495 | "type": "github" |
| 1474 | } | 1496 | } |
| @@ -1476,11 +1498,11 @@ | |||
| 1476 | "xwayland-satellite-unstable": { | 1498 | "xwayland-satellite-unstable": { |
| 1477 | "flake": false, | 1499 | "flake": false, |
| 1478 | "locked": { | 1500 | "locked": { |
| 1479 | "lastModified": 1786221058, | 1501 | "lastModified": 1788991189, |
| 1480 | "narHash": "sha256-hF2atQzapHBLX5NFqJMcKZAWHfGkKQeNu1eQr46+AGg=", | 1502 | "narHash": "sha256-0TxfMgqW0/BLD4M942c5DCKYrtPvzsPJwvdcco4LQUM=", |
| 1481 | "owner": "Supreeeme", | 1503 | "owner": "Supreeeme", |
| 1482 | "repo": "xwayland-satellite", | 1504 | "repo": "xwayland-satellite", |
| 1483 | "rev": "3bc915f09dd62bb2651a715114f9d140344bc6c1", | 1505 | "rev": "add2795134593faafce60e404a0a75df68e9ee0c", |
| 1484 | "type": "github" | 1506 | "type": "github" |
| 1485 | }, | 1507 | }, |
| 1486 | "original": { | 1508 | "original": { |
| @@ -39,12 +39,9 @@ | |||
| 39 | }; | 39 | }; |
| 40 | home-manager = { | 40 | home-manager = { |
| 41 | type = "github"; | 41 | type = "github"; |
| 42 | # owner = "nix-community"; | 42 | owner = "nix-community"; |
| 43 | # repo = "home-manager"; | ||
| 44 | # ref = "master"; | ||
| 45 | owner = "gkleen"; | ||
| 46 | repo = "home-manager"; | 43 | repo = "home-manager"; |
| 47 | ref = "nixos-late-start"; | 44 | ref = "master"; |
| 48 | inputs = { | 45 | inputs = { |
| 49 | nixpkgs.follows = "nixpkgs"; | 46 | nixpkgs.follows = "nixpkgs"; |
| 50 | }; | 47 | }; |
| @@ -151,7 +148,7 @@ | |||
| 151 | type = "gitlab"; | 148 | type = "gitlab"; |
| 152 | owner = "gkleen"; | 149 | owner = "gkleen"; |
| 153 | repo = "ca"; | 150 | repo = "ca"; |
| 154 | ref = "v3.1.5"; | 151 | ref = "v3.1.6"; |
| 155 | inputs = { | 152 | inputs = { |
| 156 | pyproject-nix.follows = "pyproject-nix"; | 153 | pyproject-nix.follows = "pyproject-nix"; |
| 157 | uv2nix.follows = "uv2nix"; | 154 | uv2nix.follows = "uv2nix"; |
| @@ -246,6 +243,10 @@ | |||
| 246 | flake-utils.follows = "flake-utils"; | 243 | flake-utils.follows = "flake-utils"; |
| 247 | }; | 244 | }; |
| 248 | }; | 245 | }; |
| 246 | disko = { | ||
| 247 | url = "github:nix-community/disko/latest"; | ||
| 248 | inputs.nixpkgs.follows = "nixpkgs"; | ||
| 249 | }; | ||
| 249 | }; | 250 | }; |
| 250 | 251 | ||
| 251 | outputs = { self, nixpkgs, home-manager, sops-nix, deploy-rs, nvfetcher, niri-flake, ... }@inputs: | 252 | outputs = { self, nixpkgs, home-manager, sops-nix, deploy-rs, nvfetcher, niri-flake, ... }@inputs: |
| @@ -313,7 +314,7 @@ | |||
| 313 | (inputs: inputs // { inherit userName; }) | 314 | (inputs: inputs // { inherit userName; }) |
| 314 | (outputs: { _file = dir + "/${path}"; } | 315 | (outputs: { _file = dir + "/${path}"; } |
| 315 | // outputs | 316 | // outputs |
| 316 | // { imports = defaultUserProfiles userName ++ (outputs.imports or []); }); | 317 | // { imports = defaultUserProfiles userName ++ (outputs.imports or []); }); |
| 317 | 318 | ||
| 318 | mkUserProfile = userName: dir: path: profileName: | 319 | mkUserProfile = userName: dir: path: profileName: |
| 319 | let | 320 | let |
| @@ -337,7 +338,7 @@ | |||
| 337 | (inputs: inputs // { inherit userName hostName; }) | 338 | (inputs: inputs // { inherit userName hostName; }) |
| 338 | (outputs: { _file = dir + "/${path}"; } | 339 | (outputs: { _file = dir + "/${path}"; } |
| 339 | // outputs | 340 | // outputs |
| 340 | // { imports = [self.nixosModules.users.${userName} or ({...}: { imports = defaultUserProfiles userName; })] ++ (outputs.imports or []); }); | 341 | // { imports = [self.nixosModules.users.${userName} or ({...}: { imports = defaultUserProfiles userName; })] ++ (outputs.imports or []); }); |
| 341 | 342 | ||
| 342 | systemsSelector = "x86_64-linux"; | 343 | systemsSelector = "x86_64-linux"; |
| 343 | systems = filter (system: !(isNull (builtins.match systemsSelector system))) nixpkgs.lib.systems.flakeExposed; | 344 | systems = filter (system: !(isNull (builtins.match systemsSelector system))) nixpkgs.lib.systems.flakeExposed; |
diff --git a/home-modules/autossh-proxy.nix b/home-modules/autossh-proxy.nix new file mode 100644 index 00000000..46cf1838 --- /dev/null +++ b/home-modules/autossh-proxy.nix | |||
| @@ -0,0 +1,120 @@ | |||
| 1 | { lib, sysConfig, config, pkgs, ... }: | ||
| 2 | |||
| 3 | let | ||
| 4 | cfg = config.programs.ssh.autosshProxies; | ||
| 5 | in { | ||
| 6 | options = { | ||
| 7 | programs.ssh.autosshProxies = lib.mkOption { | ||
| 8 | type = lib.types.attrsOf (lib.types.submodule ({ name, config, ... }: { | ||
| 9 | options = { | ||
| 10 | port = lib.mkOption { | ||
| 11 | type = lib.types.port; | ||
| 12 | }; | ||
| 13 | |||
| 14 | socksPort = lib.mkOption { | ||
| 15 | type = lib.types.port; | ||
| 16 | default = config.port - 1; | ||
| 17 | }; | ||
| 18 | |||
| 19 | host = lib.mkOption { | ||
| 20 | type = lib.types.str; | ||
| 21 | default = name; | ||
| 22 | }; | ||
| 23 | |||
| 24 | sshpassSecret = lib.mkOption { | ||
| 25 | type = lib.types.nullOr lib.types.str; | ||
| 26 | }; | ||
| 27 | |||
| 28 | ProxyCommand = lib.mkOption { | ||
| 29 | type = lib.types.str; | ||
| 30 | readOnly = true; | ||
| 31 | default = "${lib.getExe pkgs.socat} - SOCKS4A:127.0.0.1:%h:%p,socksport=${toString config.port}"; | ||
| 32 | }; | ||
| 33 | }; | ||
| 34 | })); | ||
| 35 | }; | ||
| 36 | }; | ||
| 37 | |||
| 38 | config = { | ||
| 39 | assertions = [ | ||
| 40 | { | ||
| 41 | assertion = builtins.length (lib.unique (lib.concatMap (cfg: [cfg.port cfg.socksPort]) (builtins.attrValues cfg))) == builtins.length (builtins.attrValues cfg) * 2; | ||
| 42 | message = "autosshProxy ports are not unique"; | ||
| 43 | } | ||
| 44 | ]; | ||
| 45 | |||
| 46 | systemd.user.services = lib.mkMerge (map (cfg: { | ||
| 47 | "autossh-socks@${cfg.host}:${toString cfg.socksPort}" = { | ||
| 48 | Service = { | ||
| 49 | Type = "notify"; | ||
| 50 | NotifyAccess = "all"; | ||
| 51 | WorkingDirectory = "~"; | ||
| 52 | Restart = "always"; | ||
| 53 | RestartSec = "23s"; | ||
| 54 | ExecStart = "${pkgs.writeScript "autossh" '' | ||
| 55 | #!${lib.getExe config.programs.zsh.package} -xe | ||
| 56 | |||
| 57 | host="''${1%:*}" | ||
| 58 | port="''${1#*:}" | ||
| 59 | |||
| 60 | typeset -a cmd | ||
| 61 | cmd=() | ||
| 62 | |||
| 63 | if [[ -n "''${SSHPASS_SECRET}" ]]; then | ||
| 64 | cmd+=(${lib.getExe' pkgs.sshpassSecret "sshpass-secret"}) | ||
| 65 | cmd+=("''${(@s/:/)SSHPASS_SECRET}") | ||
| 66 | cmd+=(--) | ||
| 67 | fi | ||
| 68 | |||
| 69 | cmd+=(${lib.getExe' pkgs.openssh "ssh"} -vN -D 127.0.0.1:''${port} -o ControlPath=none -o ExitOnForwardFailure=yes -o ServerAliveCountMax=15 -o ServerAliveInterval=2 "''${host}") | ||
| 70 | |||
| 71 | ( exec -a "''${cmd[1]}" -- ''${cmd} ) & | ||
| 72 | pid=$! | ||
| 73 | |||
| 74 | newpid="" | ||
| 75 | i=200 | ||
| 76 | while ! { newpid=$(${lib.getExe' pkgs.iproute2 "ss"} -HO -pln "src localhost sport ''${port}" | ${lib.getExe pkgs.gnused} -r 's/^.*pid=([0-9]+).*$/\1/'); [[ -n $newpid ]] }; do | ||
| 77 | if ! kill -0 "''${pid}"; then | ||
| 78 | wait "''${pid}" | ||
| 79 | exit $? | ||
| 80 | fi | ||
| 81 | [[ "''${i}" -gt 0 ]] || exit 1 | ||
| 82 | i=$((''${i} - 1)) | ||
| 83 | ${lib.getExe' pkgs.coreutils "sleep"} 0.1 | ||
| 84 | done | ||
| 85 | |||
| 86 | ${lib.getExe' sysConfig.systemd.package "systemd-notify"} --pid=''${newpid} --ready | ||
| 87 | ''} \"%I\""; | ||
| 88 | Environment = lib.optional (cfg.sshpassSecret != null) "SSHPASS_SECRET=${cfg.sshpassSecret}"; | ||
| 89 | }; | ||
| 90 | Unit = { | ||
| 91 | StopWhenUnneeded = true; | ||
| 92 | StartLimitInterval = "180s"; | ||
| 93 | StartLimitBurst = 7; | ||
| 94 | }; | ||
| 95 | }; | ||
| 96 | "proxy-to-autossh-socks@${toString cfg.port}" = { | ||
| 97 | Unit = { | ||
| 98 | BindsTo = ["autossh-socks@${cfg.host}:${toString cfg.socksPort}.service" "proxy-to-autossh-socks@${toString cfg.port}.socket"]; | ||
| 99 | After = ["autossh-socks@${cfg.host}:${toString cfg.socksPort}.service" "proxy-to-autossh-socks@${toString cfg.port}.socket"]; | ||
| 100 | }; | ||
| 101 | Service = { | ||
| 102 | ExecStart = "${sysConfig.systemd.package}/lib/systemd/systemd-socket-proxyd --exit-idle-time=60s 127.0.0.1:${toString cfg.socksPort}"; | ||
| 103 | Restart = "always"; | ||
| 104 | RestartSec = "23s"; | ||
| 105 | }; | ||
| 106 | }; | ||
| 107 | }) (builtins.attrValues cfg)); | ||
| 108 | systemd.user.sockets = builtins.listToAttrs (map (cfg: lib.nameValuePair "proxy-to-autossh-socks@${toString cfg.port}" { | ||
| 109 | Socket = { | ||
| 110 | ListenStream = "%I"; | ||
| 111 | TriggerLimitIntervalSec = 0; | ||
| 112 | PollLimitIntervalSec = "180s"; | ||
| 113 | PollLimitBurst = 6; | ||
| 114 | }; | ||
| 115 | Install = { | ||
| 116 | WantedBy = ["sockets.target"]; | ||
| 117 | }; | ||
| 118 | }) (builtins.attrValues cfg)); | ||
| 119 | }; | ||
| 120 | } | ||
diff --git a/hosts/sif/default.nix b/hosts/sif/default.nix index 6e5571b5..ee37d22e 100644 --- a/hosts/sif/default.nix +++ b/hosts/sif/default.nix | |||
| @@ -122,12 +122,6 @@ in { | |||
| 122 | useNetworkd = true; | 122 | useNetworkd = true; |
| 123 | }; | 123 | }; |
| 124 | 124 | ||
| 125 | environment.etc."NetworkManager/dnsmasq.d/dnssec.conf" = { | ||
| 126 | text = '' | ||
| 127 | conf-file=${pkgs.dnsmasq}/share/dnsmasq/trust-anchors.conf | ||
| 128 | dnssec | ||
| 129 | ''; | ||
| 130 | }; | ||
| 131 | environment.etc."NetworkManager/dnsmasq.d/libvirt_dnsmasq.conf" = { | 125 | environment.etc."NetworkManager/dnsmasq.d/libvirt_dnsmasq.conf" = { |
| 132 | text = '' | 126 | text = '' |
| 133 | except-interface=virbr0 | 127 | except-interface=virbr0 |
| @@ -595,13 +589,12 @@ in { | |||
| 595 | MemoryMax = "75%"; | 589 | MemoryMax = "75%"; |
| 596 | }; | 590 | }; |
| 597 | 591 | ||
| 598 | services.journald.extraConfig = '' | 592 | services.journald.settings.Journal.SystemMaxUse = "100M"; |
| 599 | SystemMaxUse=100M | ||
| 600 | ''; | ||
| 601 | 593 | ||
| 602 | services.dbus.packages = with pkgs; | 594 | services.dbus.packages = with pkgs; |
| 603 | [ dbus dconf | 595 | [ dbus dconf |
| 604 | xdg-desktop-portal-gtk | 596 | xdg-desktop-portal-gtk |
| 597 | gcr_4 | ||
| 605 | ]; | 598 | ]; |
| 606 | 599 | ||
| 607 | services.udisks2.enable = true; | 600 | services.udisks2.enable = true; |
diff --git a/hosts/skadhi/default.nix b/hosts/skadhi/default.nix new file mode 100644 index 00000000..cf25777b --- /dev/null +++ b/hosts/skadhi/default.nix | |||
| @@ -0,0 +1,118 @@ | |||
| 1 | { flake, flakeInputs, pkgs, config, lib, ... }: | ||
| 2 | { | ||
| 3 | imports = with flake.nixosModules.systemProfiles; [ | ||
| 4 | ./hw.nix ./fs.nix ./networking | ||
| 5 | tmpfs-root default-locale openssh lanzaboote zswap initrd-all-crypto-modules | ||
| 6 | ]; | ||
| 7 | |||
| 8 | config = { | ||
| 9 | system.stateVersion = "26.05"; | ||
| 10 | |||
| 11 | boot = { | ||
| 12 | initrd = { | ||
| 13 | systemd = { | ||
| 14 | emergencyAccess = config.users.users.root.hashedPassword; | ||
| 15 | extraBin = { | ||
| 16 | "vim" = lib.getExe pkgs.vim; | ||
| 17 | "grep" = lib.getExe pkgs.gnugrep; | ||
| 18 | }; | ||
| 19 | }; | ||
| 20 | |||
| 21 | kernelModules = [ "dm-integrity" ]; | ||
| 22 | }; | ||
| 23 | |||
| 24 | lanzaboote.configurationLimit = 15; | ||
| 25 | loader = { | ||
| 26 | efi.canTouchEfiVariables = true; | ||
| 27 | timeout = null; | ||
| 28 | }; | ||
| 29 | |||
| 30 | plymouth.enable = true; | ||
| 31 | |||
| 32 | kernelPackages = pkgs.linuxPackages_7_2; | ||
| 33 | consoleLogLevel = 3; | ||
| 34 | kernelParams = [ | ||
| 35 | "quiet" | ||
| 36 | "boot.shell_on_fail" | ||
| 37 | "udev.log_priority=3" | ||
| 38 | "rd.systemd.show_status=auto" | ||
| 39 | "plymouth.use-simpledrm" | ||
| 40 | ]; | ||
| 41 | |||
| 42 | tmp.useTmpfs = true; | ||
| 43 | }; | ||
| 44 | |||
| 45 | services.timesyncd.enable = false; | ||
| 46 | services.chrony = { | ||
| 47 | enable = true; | ||
| 48 | enableNTS = true; | ||
| 49 | servers = []; | ||
| 50 | extraConfig = '' | ||
| 51 | pool time.cloudflare.com iburst nts | ||
| 52 | pool nts.netnod.se prefer iburst nts | ||
| 53 | server ptbtime1.ptb.de prefer iburst nts | ||
| 54 | server ptbtime2.ptb.de prefer iburst nts | ||
| 55 | server ptbtime3.ptb.de prefer iburst nts | ||
| 56 | server ptbtime4.ptb.de prefer iburst nts | ||
| 57 | pool ntppool1.time.nl prefer iburst nts | ||
| 58 | pool ntppool2.time.nl prefer iburst nts | ||
| 59 | |||
| 60 | authselectmode require | ||
| 61 | minsources 3 | ||
| 62 | |||
| 63 | nocerttimecheck 1 | ||
| 64 | |||
| 65 | leapsectz right/UTC | ||
| 66 | |||
| 67 | makestep 0.1 3 | ||
| 68 | |||
| 69 | cmdport 0 | ||
| 70 | ''; | ||
| 71 | }; | ||
| 72 | |||
| 73 | services.userborn.importLegacyState = false; | ||
| 74 | |||
| 75 | services.kmscon = { | ||
| 76 | enable = true; | ||
| 77 | config.hwaccel = true; | ||
| 78 | }; | ||
| 79 | |||
| 80 | environment.persistence."/persistent".timezone = true; | ||
| 81 | time.timeZone = null; | ||
| 82 | systemd.tmpfiles.settings = { | ||
| 83 | "10-localtime"."/etc/localtime".L.argument = "/persistent/etc/localtime"; | ||
| 84 | }; | ||
| 85 | |||
| 86 | services.openssh.enable = true; | ||
| 87 | |||
| 88 | services.logind.settings.Login = { | ||
| 89 | HandleLidSwitch = "sleep"; | ||
| 90 | HandleLidSwitchExternalPower = "ignore"; | ||
| 91 | }; | ||
| 92 | |||
| 93 | systemd.timers.nix-gc = lib.mkForce { | ||
| 94 | timerConfig = { | ||
| 95 | RandomizedDelaySec = "12h"; | ||
| 96 | Persistent = true; | ||
| 97 | OnCalendar = "*-*-* 18:00:00 Europe/Berlin"; | ||
| 98 | }; | ||
| 99 | wantedBy = [ "timers.target" ]; | ||
| 100 | }; | ||
| 101 | systemd.services.nix-gc = lib.mkForce { | ||
| 102 | description = "Nix Garbage Collector"; | ||
| 103 | serviceConfig = { | ||
| 104 | Type = "oneshot"; | ||
| 105 | ExecStart = pkgs.resholve.writeScript "nix-gc" { | ||
| 106 | interpreter = lib.getExe pkgs.zsh; | ||
| 107 | inputs = [ pkgs.coreutils config.nix.package ]; | ||
| 108 | execer = [ "cannot:${lib.getExe' config.nix.package "nix-collect-garbage"}" ]; | ||
| 109 | } '' | ||
| 110 | max_size=$(($(du -bs /nix/store | cut -f 1) - 1024**4)) | ||
| 111 | [[ $max_size -gt 0 ]] || exit 0 | ||
| 112 | exec nix-collect-garbage -vv --max-freed $max_size --delete-older-than 30d | ||
| 113 | ''; | ||
| 114 | }; | ||
| 115 | restartIfChanged = false; | ||
| 116 | }; | ||
| 117 | }; | ||
| 118 | } | ||
diff --git a/hosts/skadhi/fs.nix b/hosts/skadhi/fs.nix new file mode 100644 index 00000000..41ef24f6 --- /dev/null +++ b/hosts/skadhi/fs.nix | |||
| @@ -0,0 +1,86 @@ | |||
| 1 | { flake, flakeInputs, pkgs, config, lib, ... }: | ||
| 2 | { | ||
| 3 | imports = with flake.nixosModules.systemProfiles; [ | ||
| 4 | disko | ||
| 5 | ]; | ||
| 6 | |||
| 7 | config = { | ||
| 8 | fileSystems."/persistent".neededForBoot = true; | ||
| 9 | environment.persistence."/persistent" = { | ||
| 10 | hideMounts = true; | ||
| 11 | directories = [ | ||
| 12 | "/nix" | ||
| 13 | "/root" | ||
| 14 | "/var/log" | ||
| 15 | "/var/lib/nixos" | ||
| 16 | "/var/lib/sops-nix" | ||
| 17 | "/var/lib/systemd" | ||
| 18 | "/var/lib/fprint" | ||
| 19 | "/var/lib/chrony" | ||
| 20 | "/var/lib/postfix" | ||
| 21 | config.boot.lanzaboote.pkiBundle | ||
| 22 | ]; | ||
| 23 | }; | ||
| 24 | |||
| 25 | disko.devices = { | ||
| 26 | disk.nvm = { | ||
| 27 | type = "disk"; | ||
| 28 | device = "/dev/nvme0n1"; | ||
| 29 | content = { | ||
| 30 | type = "gpt"; | ||
| 31 | partitions = { | ||
| 32 | ESP = { | ||
| 33 | size = "512M"; | ||
| 34 | type = "EF00"; | ||
| 35 | content = { | ||
| 36 | type = "filesystem"; | ||
| 37 | format = "vfat"; | ||
| 38 | mountpoint = "/boot"; | ||
| 39 | mountOptions = [ | ||
| 40 | "fmask=0033" "dmask=0022" | ||
| 41 | ]; | ||
| 42 | }; | ||
| 43 | }; | ||
| 44 | luks = { | ||
| 45 | size = "100%"; | ||
| 46 | content = { | ||
| 47 | type = "luks"; | ||
| 48 | name = "nvm"; | ||
| 49 | extraFormatArgs = [ | ||
| 50 | "--cipher" "aegis128-random" | ||
| 51 | "--key-size" "128" | ||
| 52 | "--integrity" "aead" | ||
| 53 | ]; | ||
| 54 | content = { | ||
| 55 | type = "btrfs"; | ||
| 56 | extraArgs = let | ||
| 57 | dirs = map (p: "/persistent/${p}") ["/etc"]; | ||
| 58 | subvols = ["/persistent"] ++ map (p: "/persistent/${p}") ["/nix" "/var/log"]; | ||
| 59 | restricted = map (p: "/persistent/${p}") ["/root"]; | ||
| 60 | in [ | ||
| 61 | "--csum" "blake2" | ||
| 62 | "--compress" "zstd:15" | ||
| 63 | "--rootdir" (toString (pkgs.runCommand "rootdir" { | ||
| 64 | } '' | ||
| 65 | mkdir $out | ||
| 66 | install -d ${lib.concatMapStringsSep " " (p: "$out/${p}") (dirs ++ subvols)} | ||
| 67 | install -m 0700 -d ${lib.concatMapStringsSep " " (p: "$out/${p}") restricted} | ||
| 68 | ln -s /etc/zoneinfo/UTC /persistent/etc/localtime | ||
| 69 | '')) | ||
| 70 | ] ++ lib.concatMap (p: ["--subvol" p]) (subvols ++ restricted); | ||
| 71 | subvolumes = { | ||
| 72 | "/persistent".mountpoint = "/persistent"; | ||
| 73 | "/swap" = { | ||
| 74 | mountpoint = "/.swap"; | ||
| 75 | swap.swapfile.size = "96G"; | ||
| 76 | }; | ||
| 77 | }; | ||
| 78 | }; | ||
| 79 | }; | ||
| 80 | }; | ||
| 81 | }; | ||
| 82 | }; | ||
| 83 | }; | ||
| 84 | }; | ||
| 85 | }; | ||
| 86 | } | ||
diff --git a/hosts/skadhi/hw.nix b/hosts/skadhi/hw.nix new file mode 100644 index 00000000..687f04d8 --- /dev/null +++ b/hosts/skadhi/hw.nix | |||
| @@ -0,0 +1,20 @@ | |||
| 1 | { flake, flakeInputs, pkgs, config, lib, ... }: | ||
| 2 | { | ||
| 3 | imports = [ | ||
| 4 | flakeInputs.nixos-hardware.nixosModules.framework-13-7040-amd | ||
| 5 | ]; | ||
| 6 | |||
| 7 | config = { | ||
| 8 | hardware.framework.laptop13.audioEnhancement.enable = false; | ||
| 9 | hardware.enableRedistributableFirmware = true; | ||
| 10 | services.fstrim.enable = false; | ||
| 11 | |||
| 12 | services.udev.extraRules = '' | ||
| 13 | ACTION=="add", SUBSYSTEM=="platform", DRIVER=="acpi-button", KERNEL=="PNP0C0D:00", ATTR{power/wakeup}="disabled" | ||
| 14 | ACTION=="add", SUBSYSTEM=="serio", DRIVERS=="atkbd", ATTR{power/wakeup}="disabled" | ||
| 15 | ACTION=="add", SUBSYSTEM=="i2c", DRIVERS=="i2c_hid_acpi", ATTRS{name}=="PIXA3854:00", ATTR{power/wakeup}="disabled" | ||
| 16 | ''; | ||
| 17 | |||
| 18 | nixpkgs.system = "x86_64-linux"; | ||
| 19 | }; | ||
| 20 | } | ||
diff --git a/hosts/skadhi/networking/default.nix b/hosts/skadhi/networking/default.nix new file mode 100644 index 00000000..4d6edd97 --- /dev/null +++ b/hosts/skadhi/networking/default.nix | |||
| @@ -0,0 +1,38 @@ | |||
| 1 | { flake, config, ... }: | ||
| 2 | { | ||
| 3 | imports = with flake.nixosModules.systemProfiles; [ | ||
| 4 | networkmanager | ||
| 5 | ]; | ||
| 6 | |||
| 7 | config = { | ||
| 8 | environment.persistence."/persistent".directories = [ | ||
| 9 | "/etc/NetworkManager/system-connections" | ||
| 10 | ]; | ||
| 11 | |||
| 12 | networking = { | ||
| 13 | domain = "yggdrasil"; | ||
| 14 | search = [ "yggdrasil" ]; | ||
| 15 | hosts = { | ||
| 16 | "127.0.0.1" = [ "${config.networking.hostName}.yggdrasil" config.networking.hostName ]; | ||
| 17 | "::1" = [ "${config.networking.hostName}.yggdrasil" config.networking.hostName ]; | ||
| 18 | }; | ||
| 19 | |||
| 20 | firewall.enable = false; | ||
| 21 | nftables = { | ||
| 22 | enable = true; | ||
| 23 | rulesetFile = ./ruleset.nft; | ||
| 24 | }; | ||
| 25 | |||
| 26 | useDHCP = false; | ||
| 27 | useNetworkd = true; | ||
| 28 | }; | ||
| 29 | |||
| 30 | environment.etc."NetworkManager/dnsmasq.d/yggdrasil.conf" = { | ||
| 31 | text = '' | ||
| 32 | server=/yggdrasil/2a03:4000:52:ada:1:1::@yggdrasil | ||
| 33 | server=/141.10.in-addr.arpa/2a03:4000:52:ada:1:1::@yggdrasil | ||
| 34 | server=/1.0.0.0.a.d.a.0.2.5.0.0.0.0.0.4.3.0.a.2.ip6.arpa/2a03:4000:52:ada:1:1::@yggdrasil | ||
| 35 | ''; | ||
| 36 | }; | ||
| 37 | }; | ||
| 38 | } | ||
diff --git a/hosts/skadhi/networking/ruleset.nft b/hosts/skadhi/networking/ruleset.nft new file mode 100644 index 00000000..94e21b10 --- /dev/null +++ b/hosts/skadhi/networking/ruleset.nft | |||
| @@ -0,0 +1,237 @@ | |||
| 1 | define icmp_protos = { ipv6-icmp, icmp, igmp } | ||
| 2 | |||
| 3 | table arp filter { | ||
| 4 | limit lim_arp { | ||
| 5 | rate over 50 mbytes/second burst 50 mbytes | ||
| 6 | } | ||
| 7 | |||
| 8 | counter arp-rx {} | ||
| 9 | counter arp-tx {} | ||
| 10 | |||
| 11 | counter arp-ratelimit-rx {} | ||
| 12 | counter arp-ratelimit-tx {} | ||
| 13 | |||
| 14 | chain input { | ||
| 15 | type filter hook input priority filter | ||
| 16 | policy accept | ||
| 17 | |||
| 18 | limit name lim_arp counter name arp-ratelimit-rx drop | ||
| 19 | |||
| 20 | counter name arp-rx | ||
| 21 | } | ||
| 22 | |||
| 23 | chain output { | ||
| 24 | type filter hook output priority filter | ||
| 25 | policy accept | ||
| 26 | |||
| 27 | limit name lim_arp counter name arp-ratelimit-tx drop | ||
| 28 | |||
| 29 | counter name arp-tx | ||
| 30 | } | ||
| 31 | } | ||
| 32 | |||
| 33 | table inet filter { | ||
| 34 | limit lim_reject { | ||
| 35 | rate over 1000/second burst 1000 packets | ||
| 36 | } | ||
| 37 | |||
| 38 | limit lim_icmp { | ||
| 39 | rate over 50 mbytes/second burst 50 mbytes | ||
| 40 | } | ||
| 41 | |||
| 42 | counter invalid-fw {} | ||
| 43 | |||
| 44 | counter fw-lo {} | ||
| 45 | |||
| 46 | counter reject-ratelimit-fw {} | ||
| 47 | counter reject-fw {} | ||
| 48 | counter reject-tcp-fw {} | ||
| 49 | counter reject-icmp-fw {} | ||
| 50 | |||
| 51 | |||
| 52 | counter invalid-rx {} | ||
| 53 | counter rx-lo {} | ||
| 54 | counter invalid-local4-rx {} | ||
| 55 | counter invalid-local6-rx {} | ||
| 56 | |||
| 57 | counter icmp-ratelimit-rx {} | ||
| 58 | counter icmp-rx {} | ||
| 59 | |||
| 60 | counter ssh-rx {} | ||
| 61 | counter mosh-rx {} | ||
| 62 | counter wg-rx {} | ||
| 63 | counter yggdrasil-gre-rx {} | ||
| 64 | counter miniserve-rx {} | ||
| 65 | counter ausweisapp2-rx {} | ||
| 66 | |||
| 67 | counter established-rx {} | ||
| 68 | |||
| 69 | counter reject-ratelimit-rx {} | ||
| 70 | counter reject-rx {} | ||
| 71 | counter reject-tcp-rx {} | ||
| 72 | counter reject-icmp-rx {} | ||
| 73 | |||
| 74 | |||
| 75 | counter tx-lo {} | ||
| 76 | |||
| 77 | counter icmp-ratelimit-tx {} | ||
| 78 | counter icmp-tx {} | ||
| 79 | |||
| 80 | counter ssh-tx {} | ||
| 81 | counter mosh-tx {} | ||
| 82 | counter wg-tx {} | ||
| 83 | counter yggdrasil-gre-tx {} | ||
| 84 | counter miniserve-tx {} | ||
| 85 | |||
| 86 | counter tx {} | ||
| 87 | |||
| 88 | counter fw-libvirt {} | ||
| 89 | counter libvirt-dhcp {} | ||
| 90 | counter libvirt-dns {} | ||
| 91 | |||
| 92 | |||
| 93 | chain forward_tmp {} | ||
| 94 | chain forward { | ||
| 95 | type filter hook forward priority filter | ||
| 96 | policy drop | ||
| 97 | |||
| 98 | |||
| 99 | ct state invalid log level debug prefix "drop invalid forward: " counter name invalid-fw drop | ||
| 100 | |||
| 101 | |||
| 102 | iifname lo counter name fw-lo accept | ||
| 103 | |||
| 104 | jump forward_tmp | ||
| 105 | |||
| 106 | iifname virbr0 oifname != {lo, wgrz, yggdrasil-wg-4, yggdrasil-wg-6, yggdrasil, ip6tnl, ip6gre, yggre-surtr-6, yggre-surtr-4, yggre-vidhar-4} counter name fw-libvirt accept | ||
| 107 | oifname virbr0 ct state {established, related} counter name fw-libvirt accept | ||
| 108 | |||
| 109 | |||
| 110 | limit name lim_reject log level debug prefix "drop forward: " counter name reject-ratelimit-fw drop | ||
| 111 | log level debug prefix "reject forward: " counter name reject-fw | ||
| 112 | meta l4proto tcp ct state new counter name reject-tcp-fw reject with tcp reset | ||
| 113 | ct state new counter name reject-icmp-fw reject | ||
| 114 | } | ||
| 115 | |||
| 116 | ct helper ftp-standard { | ||
| 117 | type "ftp" protocol tcp | ||
| 118 | } | ||
| 119 | chain input_pr_tmp { | ||
| 120 | # tcp dport 2121 ct helper set "ftp-standard" | ||
| 121 | } | ||
| 122 | chain input_pr { | ||
| 123 | type filter hook prerouting priority 0 | ||
| 124 | |||
| 125 | jump input_pr_tmp | ||
| 126 | } | ||
| 127 | |||
| 128 | chain input_tmp { | ||
| 129 | # tcp dport 2121 accept | ||
| 130 | } | ||
| 131 | chain input { | ||
| 132 | type filter hook input priority filter | ||
| 133 | policy drop | ||
| 134 | |||
| 135 | |||
| 136 | ct state invalid log level debug prefix "drop invalid input: " counter name invalid-rx drop | ||
| 137 | |||
| 138 | |||
| 139 | iifname lo counter name rx-lo accept | ||
| 140 | iif != lo ip daddr 127.0.0.1/8 counter name invalid-local4-rx reject | ||
| 141 | iif != lo ip6 daddr ::1/128 counter name invalid-local6-rx reject | ||
| 142 | |||
| 143 | meta l4proto $icmp_protos limit name lim_icmp counter name icmp-ratelimit-rx drop | ||
| 144 | meta l4proto $icmp_protos counter name icmp-rx accept | ||
| 145 | |||
| 146 | jump input_tmp | ||
| 147 | |||
| 148 | tcp dport 22 counter name ssh-rx accept | ||
| 149 | udp dport 60000-61000 counter name mosh-rx accept | ||
| 150 | |||
| 151 | tcp dport 8080 counter name miniserve-rx accept | ||
| 152 | udp dport 24727 counter name ausweisapp2-rx accept | ||
| 153 | |||
| 154 | udp dport 51820-51822 counter name wg-rx accept | ||
| 155 | iifname "yggdrasil-wg-*" meta l4proto gre counter name yggdrasil-gre-rx accept | ||
| 156 | |||
| 157 | iifname virbr0 udp dport 67 counter name libvirt-dhcp accept | ||
| 158 | iifname virbr0 udp dport 547 counter name libvirt-dhcp accept | ||
| 159 | iifname virbr0 udp dport 53 counter name libvirt-dns accept | ||
| 160 | iifname virbr0 tcp dport 53 counter name libvirt-dns accept | ||
| 161 | |||
| 162 | iifname wgrz ip saddr 10.200.116.1 meta l4proto gre counter accept | ||
| 163 | |||
| 164 | ct state {established, related} counter name established-rx accept | ||
| 165 | |||
| 166 | |||
| 167 | limit name lim_reject log level debug prefix "drop input: " counter name reject-ratelimit-rx drop | ||
| 168 | log level debug prefix "reject input: " counter name reject-rx | ||
| 169 | meta l4proto tcp ct state new counter name reject-tcp-rx reject with tcp reset | ||
| 170 | ct state new counter name reject-icmp-rx reject | ||
| 171 | } | ||
| 172 | |||
| 173 | chain output { | ||
| 174 | type filter hook output priority filter | ||
| 175 | policy accept | ||
| 176 | |||
| 177 | |||
| 178 | oifname lo counter name tx-lo accept | ||
| 179 | |||
| 180 | meta l4proto $icmp_protos limit name lim_icmp counter name icmp-ratelimit-tx drop | ||
| 181 | meta l4proto $icmp_protos counter name icmp-tx accept | ||
| 182 | |||
| 183 | |||
| 184 | tcp sport 22 counter name ssh-tx | ||
| 185 | udp sport 60000-61000 counter name mosh-tx | ||
| 186 | |||
| 187 | udp sport 51820-51822 counter name wg-tx | ||
| 188 | iifname "yggdrasil-wg-*" meta l4proto gre counter name yggdrasil-gre-tx | ||
| 189 | |||
| 190 | tcp sport 8080 counter name miniserve-tx accept | ||
| 191 | |||
| 192 | oifname virbr0 udp sport 67 counter name libvirt-dhcp accept | ||
| 193 | oifname virbr0 udp sport 547 counter name libvirt-dhcp accept | ||
| 194 | oifname virbr0 udp sport 53 counter name libvirt-dns accept | ||
| 195 | oifname virbr0 tcp sport 53 counter name libvirt-dns accept | ||
| 196 | |||
| 197 | |||
| 198 | counter name tx | ||
| 199 | } | ||
| 200 | } | ||
| 201 | |||
| 202 | table ip nat { | ||
| 203 | counter libvirt-nat {} | ||
| 204 | |||
| 205 | chain postrouting_tmp {} | ||
| 206 | chain postrouting { | ||
| 207 | type nat hook postrouting priority srcnat | ||
| 208 | policy accept | ||
| 209 | |||
| 210 | iifname virbr0 oifname != virbr0 counter name libvirt-nat masquerade | ||
| 211 | jump postrouting_tmp | ||
| 212 | } | ||
| 213 | } | ||
| 214 | |||
| 215 | table ip6 nat { | ||
| 216 | counter libvirt-nat {} | ||
| 217 | |||
| 218 | chain postrouting { | ||
| 219 | type nat hook postrouting priority srcnat | ||
| 220 | policy accept | ||
| 221 | |||
| 222 | iifname virbr0 oifname != virbr0 counter name libvirt-nat masquerade | ||
| 223 | } | ||
| 224 | } | ||
| 225 | |||
| 226 | table ip mss_clamp { | ||
| 227 | counter libvirt-mss-clamp {} | ||
| 228 | |||
| 229 | chain postrouting_tmp {} | ||
| 230 | chain postrouting { | ||
| 231 | type filter hook postrouting priority mangle | ||
| 232 | policy accept | ||
| 233 | |||
| 234 | iifname virbr0 oifname != virbr0 tcp flags & (syn|rst) == syn counter name libvirt-mss-clamp tcp option maxseg size set rt mtu | ||
| 235 | jump postrouting_tmp | ||
| 236 | } | ||
| 237 | } | ||
diff --git a/hosts/vidhar/dns/zones/arpa.ip6.2.a.0.3.4.0.0.0.0.0.5.2.0.a.d.a.0.0.0.1.soa b/hosts/vidhar/dns/zones/arpa.ip6.2.a.0.3.4.0.0.0.0.0.5.2.0.a.d.a.0.0.0.1.soa index 2d94b1e1..2613bbb7 100644 --- a/hosts/vidhar/dns/zones/arpa.ip6.2.a.0.3.4.0.0.0.0.0.5.2.0.a.d.a.0.0.0.1.soa +++ b/hosts/vidhar/dns/zones/arpa.ip6.2.a.0.3.4.0.0.0.0.0.5.2.0.a.d.a.0.0.0.1.soa | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | $ORIGIN 1.0.0.0.a.d.a.0.2.5.0.0.0.0.0.4.3.0.a.2.ip6.arpa. | 1 | $ORIGIN 1.0.0.0.a.d.a.0.2.5.0.0.0.0.0.4.3.0.a.2.ip6.arpa. |
| 2 | $TTL 300 | 2 | $TTL 300 |
| 3 | @ IN SOA vidhar.lan.yggdrasil. hostmaster.yggdrasil.li ( | 3 | @ IN SOA vidhar.lan.yggdrasil. hostmaster.yggdrasil.li ( |
| 4 | 2023030501 ; serial | 4 | 2026092400 ; serial |
| 5 | 300 ; refresh | 5 | 300 ; refresh |
| 6 | 300 ; retry | 6 | 300 ; retry |
| 7 | 300 ; expire | 7 | 300 ; expire |
| @@ -13,3 +13,4 @@ $TTL 300 | |||
| 13 | 0.0.0.0.0.0.0.0.0.0.0.0 IN PTR surtr.yggdrasil. | 13 | 0.0.0.0.0.0.0.0.0.0.0.0 IN PTR surtr.yggdrasil. |
| 14 | 0.0.0.0.0.0.0.0.0.0.0.1 IN PTR vidhar.yggdrasil. | 14 | 0.0.0.0.0.0.0.0.0.0.0.1 IN PTR vidhar.yggdrasil. |
| 15 | 0.0.0.0.0.0.0.0.0.0.0.2 IN PTR sif.yggdrasil. | 15 | 0.0.0.0.0.0.0.0.0.0.0.2 IN PTR sif.yggdrasil. |
| 16 | 0.0.0.0.0.0.0.0.0.0.0.3 IN PTR skadhi.yggdrasil. | ||
diff --git a/hosts/vidhar/dns/zones/yggdrasil.soa b/hosts/vidhar/dns/zones/yggdrasil.soa index dede06ac..1cb6b75c 100644 --- a/hosts/vidhar/dns/zones/yggdrasil.soa +++ b/hosts/vidhar/dns/zones/yggdrasil.soa | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | $ORIGIN yggdrasil. | 1 | $ORIGIN yggdrasil. |
| 2 | $TTL 300 | 2 | $TTL 300 |
| 3 | @ IN SOA vidhar.yggdrasil. hostmaster.yggdrasil.li ( | 3 | @ IN SOA vidhar.yggdrasil. hostmaster.yggdrasil.li ( |
| 4 | 2024070901 ; serial | 4 | 2026092400 ; serial |
| 5 | 300 ; refresh | 5 | 300 ; refresh |
| 6 | 300 ; retry | 6 | 300 ; retry |
| 7 | 300 ; expire | 7 | 300 ; expire |
| @@ -13,6 +13,7 @@ $TTL 300 | |||
| 13 | surtr IN AAAA 2a03:4000:52:ada:1:: | 13 | surtr IN AAAA 2a03:4000:52:ada:1:: |
| 14 | vidhar IN AAAA 2a03:4000:52:ada:1:1:: | 14 | vidhar IN AAAA 2a03:4000:52:ada:1:1:: |
| 15 | sif IN AAAA 2a03:4000:52:ada:1:2:: | 15 | sif IN AAAA 2a03:4000:52:ada:1:2:: |
| 16 | skadhi IN AAAA 2a03:4000:52:ada:1:3:: | ||
| 16 | 17 | ||
| 17 | grafana.vidhar IN CNAME vidhar.yggdrasil. | 18 | grafana.vidhar IN CNAME vidhar.yggdrasil. |
| 18 | prometheus.vidhar IN CNAME vidhar.yggdrasil. | 19 | prometheus.vidhar IN CNAME vidhar.yggdrasil. |
diff --git a/hosts/vidhar/network/pppoe/default.nix b/hosts/vidhar/network/pppoe/default.nix index 85ea992d..309e1734 100644 --- a/hosts/vidhar/network/pppoe/default.nix +++ b/hosts/vidhar/network/pppoe/default.nix | |||
| @@ -123,8 +123,8 @@ in { | |||
| 123 | 123 | ||
| 124 | tc qdisc add dev "$1" handle ffff: ingress | 124 | tc qdisc add dev "$1" handle ffff: ingress |
| 125 | tc filter add dev "$1" parent ffff: basic action ctinfo dscp 0x0000003f 0x00000040 action mirred egress redirect dev "ifb4$1" | 125 | tc filter add dev "$1" parent ffff: basic action ctinfo dscp 0x0000003f 0x00000040 action mirred egress redirect dev "ifb4$1" |
| 126 | tc qdisc replace dev "ifb4$1" root cake memlimit 128Mb pppoe-ptm nat diffserv4 ingress rtt 15ms unlimited | 126 | tc qdisc replace dev "ifb4$1" root cake memlimit 128Mb pppoe-ptm nat diffserv4 ingress rtt 15ms bandwidth 140mbit |
| 127 | tc qdisc replace dev "$1" root cake memlimit 128Mb pppoe-ptm nat diffserv4 wash rtt 15ms unlimited | 127 | tc qdisc replace dev "$1" root cake memlimit 128Mb pppoe-ptm nat diffserv4 wash rtt 15ms bandwidth 32.5mbit |
| 128 | ''; | 128 | ''; |
| 129 | "ppp/ip-up".source = pkgs.resholve.writeScript "ip-up" { | 129 | "ppp/ip-up".source = pkgs.resholve.writeScript "ip-up" { |
| 130 | interpreter = pkgs.runtimeShell; | 130 | interpreter = pkgs.runtimeShell; |
diff --git a/hosts/vidhar/zfs.nix b/hosts/vidhar/zfs.nix index 4b009c0d..62bf1fd1 100644 --- a/hosts/vidhar/zfs.nix +++ b/hosts/vidhar/zfs.nix | |||
| @@ -128,7 +128,7 @@ with lib; | |||
| 128 | users.users.gkleen.createHome = lib.mkForce false; | 128 | users.users.gkleen.createHome = lib.mkForce false; |
| 129 | users.users.mherold.createHome = lib.mkForce false; | 129 | users.users.mherold.createHome = lib.mkForce false; |
| 130 | 130 | ||
| 131 | systemd.generators."zfs-mount-generator" = "${config.boot.zfs.package}/lib/systemd/system-generator/zfs-mount-generator"; | 131 | # systemd.generators."zfs-mount-generator" = "${config.boot.zfs.package}/lib/systemd/system-generator/zfs-mount-generator"; |
| 132 | environment.etc."zfs/zed.d/history_event-zfs-list-cacher.sh".source = "${config.boot.zfs.package}/etc/zfs/zed.d/history_event-zfs-list-cacher.sh"; | 132 | environment.etc."zfs/zed.d/history_event-zfs-list-cacher.sh".source = "${config.boot.zfs.package}/etc/zfs/zed.d/history_event-zfs-list-cacher.sh"; |
| 133 | systemd.services.zfs-mount.enable = false; | 133 | systemd.services.zfs-mount.enable = false; |
| 134 | 134 | ||
diff --git a/modules/nix-access-tokens/default.nix b/modules/nix-access-tokens/default.nix index a3b7abfa..fbfb31fc 100644 --- a/modules/nix-access-tokens/default.nix +++ b/modules/nix-access-tokens/default.nix | |||
| @@ -4,7 +4,7 @@ let | |||
| 4 | cfg = config.nix.includeAccessTokens; | 4 | cfg = config.nix.includeAccessTokens; |
| 5 | in { | 5 | in { |
| 6 | options = { | 6 | options = { |
| 7 | nix.includeAccessTokens.enable = lib.mkEnableOption "including access tokens in nix.conf" // { default = lib.elem hostName ["sif" "surtr" "vidhar"]; }; | 7 | nix.includeAccessTokens.enable = lib.mkEnableOption "including access tokens in nix.conf" // { default = lib.elem hostName ["sif" "skadhi" "surtr" "vidhar"]; }; |
| 8 | }; | 8 | }; |
| 9 | 9 | ||
| 10 | config = lib.mkIf cfg.enable { | 10 | config = lib.mkIf cfg.enable { |
diff --git a/modules/nix-access-tokens/nix.conf b/modules/nix-access-tokens/nix.conf index 80d5641c..4d933eaa 100644 --- a/modules/nix-access-tokens/nix.conf +++ b/modules/nix-access-tokens/nix.conf | |||
| @@ -3,20 +3,24 @@ | |||
| 3 | "sops": { | 3 | "sops": { |
| 4 | "age": [ | 4 | "age": [ |
| 5 | { | 5 | { |
| 6 | "recipient": "age1rmmhetcmllq0ahl5qznlr0eya2zdxwl9h6y5wnl97d2wtyx5t99sm2u866", | 6 | "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBiWDlPazhId0RvZHZKbU9C\nQmR4S293KytMOXI0MmYrc2xxcVBtY0NxL2xjClpJMmdUNE41SVIyeFA3czkwek0r\nckRwVGdWYkJkVWRtRVlxcDFkMmRDSGsKLS0tIGtyOHhMRUR5aVlBQzkrYkh4dVhE\nWHNCUnZCN0NhZ0trQmJaTUJDb3ROMlUKvH5z4Fj1P5zMcwD6UlLT531Ggrd4vEmo\ne2uOmolQ/jcStDd4IMniPEfjqcxfSEtkb7fpB1Rhby0mT6Gx68GtHw==\n-----END AGE ENCRYPTED FILE-----\n", |
| 7 | "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB5NkZUUGI3M2pQYWVXeFV6\na2h2czRTeUJFekJCS012YlBkL1FDdTd3ekZ3ClJsTVh0R2JQM0Jua1JjL285RVA1\nRHhlbjlLdmNBUXVLelFGY2NGYWpLejQKLS0tIDBUWUhJNm8zWGoyQ0pBYnV1ZjBh\ndktNRkNPS1lpWXFITC81aEZJbXlONk0Km2c1xVKwSankaVs7O/utGJwRRX395upz\ndPbsOElTnbGmkb0esGtvGSPboTvK+gjn9w/GhaPyTnNDoos7GaIfyg==\n-----END AGE ENCRYPTED FILE-----\n" | 7 | "recipient": "age1rmmhetcmllq0ahl5qznlr0eya2zdxwl9h6y5wnl97d2wtyx5t99sm2u866" |
| 8 | }, | 8 | }, |
| 9 | { | 9 | { |
| 10 | "recipient": "age1fj65apkhfkrwyv5tx6zcs9nkjg8267fy733qph30sc7zfn7vapjqkd5kne", | 10 | "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBPNmowYmNTWVNwYk9UNzhI\neXllbWNCWEl4QXk1SUxLcjY5Vm5HdjBCdVRzClh2ZkY0bGUrNE9rUnhNTVdDT2tl\nTjFBYURMdGNWSjZZSDQzVXRBL2xRNXcKLS0tIEk0U05jSWQrUGoraVdxTU5QdEZ6\nQlprZlN5SjRTQzhycERsSVhiZDJmekUKUVzegV7zpd3woOeyDw+Ezpyd3D3xH0SV\nyt/UspleE/+sDRPuJTQKx6wA/k7e+hPJjGdjgMgzGnuCh+dfwNw2lw==\n-----END AGE ENCRYPTED FILE-----\n", |
| 11 | "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB6bS9iY2lua3U4U3lJa1pK\nSlZNMmFZMEU5M1V2bWRjaXIwajZJVDJPMlM4Cmd3TTNFWjVuSGdtbC9iODltTS91\nOE5XOEVEQkh0SFpVVW5jc3IzbzNpTmMKLS0tIEtrSU54QUVPa2tBZDhLYlRFWitR\nc2x6MFlxL0tobDJTek42dEcyZXpoWDgKXzQfU+o6FkbJBwmm6oaHu4sDPi822uUR\n5VY6gY/h3g2kM4cuS03Q4NJmeRxuh7cx0UqGU3j5Mf8muE1LHpYEPw==\n-----END AGE ENCRYPTED FILE-----\n" | 11 | "recipient": "age1fj65apkhfkrwyv5tx6zcs9nkjg8267fy733qph30sc7zfn7vapjqkd5kne" |
| 12 | }, | 12 | }, |
| 13 | { | 13 | { |
| 14 | "recipient": "age19a7j77w267z04zls7m28a8hj4a0g5af6ltye2d5wypg33c3l89csd4r9zq", | 14 | "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBwZW51Q0RWdmtyZmdmNy9H\nMWJGSkxlbXRSc0U1eVhFSm1kZWlhaEl3UUVRCnNWWTVPWGJPaVJET1YrTXFHeGZk\na2ZYVWNQL1FwRStiSlE3ZDJmOVVHcFEKLS0tIEE1WHRsdEJPcWdiQ1lNenN2WDBE\nYW1FR0gyeENHWEpxWFB2a25RZjBOUW8KW2n77OFZXNZLH/HMWhUrwLZM4epFxheZ\nbeOSASmLVkmT4rJOOHoP1g9GxmC8UxSrM1q6uV80n69grExRfgYCig==\n-----END AGE ENCRYPTED FILE-----\n", |
| 15 | "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBaOVpNZ2lVT0VwbHVZNzFl\nenJsMGpnbkRvU0xOSU5obk5yT2p5ZVNzdXhNCnVlQzZtRjZNVmJLSUpKc3UwVXZs\nWi9EZ3kxZkJNeFJDSjl1L1IweTFNMXcKLS0tIDJUOTBwTldCUmlnU0tWVkZkNzJL\nejM4ajJVbVhvSm1YM2Vxa2JldllYN0UKAzxy2wkzRvCSiTy417AulpCu41z668HG\nto92eGF2ZRFfEG5LGlCKWeDcP3gM8QwKiVlm6wndbOkhMMfc4Sp3wA==\n-----END AGE ENCRYPTED FILE-----\n" | 15 | "recipient": "age1u6xegt79rarmyz8qy4pl7jh9lh90vx8fg0frmh4u2mzam7zydq4s4agz4e" |
| 16 | }, | 16 | }, |
| 17 | { | 17 | { |
| 18 | "recipient": "age1qffdqvy9arld9zd5a5cylt0n98xhcns5shxhrhwjq5g4qa844ejselaa4l", | 18 | "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBBSUFhNWxNd3ZXMlkyU1pC\nUlNsdENaWU9WMGxJbHRqaHM0SEFVdnJ5ZHlrCkF5a0xBWXJpWGxDMEcveVhEVzJh\naFFOVmJtQkh1WlZxcUZVaWxJS1ZBUVEKLS0tIC90bTBUa09yNkhBVDRBa25STzZD\nSnNYa3JqWTBlcjZBMlhIOUdGOFVseEUKZ3El/3f+YWMZBl4Qhhz5qTB/V/zq+e/W\nCPJ7uOJ/2L6YNGx6jlh5EIE3BSHicAQktgi0ekGD4+PLSkGC7Egzlw==\n-----END AGE ENCRYPTED FILE-----\n", |
| 19 | "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB2ejRHcGttNUxYZnFzTU5J\nMTFvY3daQ1VMM2xxYTgvLzZwT1owazVNenhzCktaWFF6K2s5UjI2b20rSHFNSS9E\nMVlJSmZhQm15eUs3U0hGTGpSRndmSDgKLS0tIDVrcjl4eDhwak1pRithbnRWWEZy\nVE9EOEpKdEJoRTFrTXpQVDc1cmsrU1kK/goTdUmpZPeMRbY1QzLXAa6Qpg4YYYYo\n3v3GK1bzdey8szfgIr1dHTtQEzqE2WX1swzZizDXj/RiUWx01Ky3GA==\n-----END AGE ENCRYPTED FILE-----\n" | 19 | "recipient": "age19a7j77w267z04zls7m28a8hj4a0g5af6ltye2d5wypg33c3l89csd4r9zq" |
| 20 | }, | ||
| 21 | { | ||
| 22 | "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBWUWM3c0R1cEV5LzBsb3pV\nM2NEU0ZFRWhoOE9IZlgyU0hsVUtZM2JCcm1NClBlVXFVVUNZUXJVbElGWm5BQkJy\nWHY2Sm1GUWl2L0NOSXZiNlFjNGFCT28KLS0tIDVCSGREN2tjQmhYbGRINVF4WTA0\nSWVzL3EyVzJZSzlCdjJ0cG1mYmZ0cHcKnMs0Sl76ZYPKeUwgiX5FT9uFEOK4F1H1\n/ieM9hQwhEZqHpslLWWdNYbGShwEhC4cs22SUNutBWrYfD/MsKv0qA==\n-----END AGE ENCRYPTED FILE-----\n", | ||
| 23 | "recipient": "age1qffdqvy9arld9zd5a5cylt0n98xhcns5shxhrhwjq5g4qa844ejselaa4l" | ||
| 20 | } | 24 | } |
| 21 | ], | 25 | ], |
| 22 | "lastmodified": "2026-01-07T09:18:20Z", | 26 | "lastmodified": "2026-01-07T09:18:20Z", |
diff --git a/modules/yggdrasil-wg/default.nix b/modules/yggdrasil-wg/default.nix index 8b190651..c17c8f08 100644 --- a/modules/yggdrasil-wg/default.nix +++ b/modules/yggdrasil-wg/default.nix | |||
| @@ -48,33 +48,56 @@ let | |||
| 48 | PersistentKeepalive = 25; | 48 | PersistentKeepalive = 25; |
| 49 | family = "4"; | 49 | family = "4"; |
| 50 | } | 50 | } |
| 51 | { from = "skadhi"; | ||
| 52 | to = "surtr"; | ||
| 53 | endpointHost = "202.61.241.61"; | ||
| 54 | PersistentKeepalive = 25; | ||
| 55 | family = "4"; | ||
| 56 | } | ||
| 57 | { from = "skadhi"; | ||
| 58 | to = "surtr"; | ||
| 59 | endpointHost = "2a03:4000:52:ada::"; | ||
| 60 | PersistentKeepalive = 25; | ||
| 61 | family = "6"; | ||
| 62 | } | ||
| 63 | { from = "skadhi"; | ||
| 64 | to = "vidhar"; | ||
| 65 | endpointHost = "10.141.0.1"; | ||
| 66 | PersistentKeepalive = 25; | ||
| 67 | family = "4"; | ||
| 68 | } | ||
| 51 | ]; | 69 | ]; |
| 52 | wgHostIPs = mapAttrs (_family: wgSubnet: { | 70 | wgHostIPs = mapAttrs (_family: wgSubnet: { |
| 53 | surtr = "${wgSubnet}::/${toString wgHostLength}"; | 71 | surtr = "${wgSubnet}::/${toString wgHostLength}"; |
| 54 | vidhar = "${wgSubnet}:1::/${toString wgHostLength}"; | 72 | vidhar = "${wgSubnet}:1::/${toString wgHostLength}"; |
| 55 | sif = "${wgSubnet}:2::/${toString wgHostLength}"; | 73 | sif = "${wgSubnet}:2::/${toString wgHostLength}"; |
| 74 | skadhi = "${wgSubnet}:3::/${toString wgHostLength}"; | ||
| 56 | }) wgSubnet; | 75 | }) wgSubnet; |
| 57 | greHostMACPrefixes = { | 76 | greHostMACPrefixes = { |
| 58 | "4" = { | 77 | "4" = { |
| 59 | surtr = "02:00:01:00:00"; | 78 | surtr = "02:00:01:00:00"; |
| 60 | vidhar = "02:00:01:00:01"; | 79 | vidhar = "02:00:01:00:01"; |
| 61 | sif = "02:00:01:00:02"; | 80 | sif = "02:00:01:00:02"; |
| 81 | skadhi = "02:00:01:00:03"; | ||
| 62 | }; | 82 | }; |
| 63 | "6" = { | 83 | "6" = { |
| 64 | surtr = "02:00:02:00:00"; | 84 | surtr = "02:00:02:00:00"; |
| 65 | vidhar = "02:00:02:00:01"; | 85 | vidhar = "02:00:02:00:01"; |
| 66 | sif = "02:00:02:00:02"; | 86 | sif = "02:00:02:00:02"; |
| 87 | skadhi = "02:00:02:00:03"; | ||
| 67 | }; | 88 | }; |
| 68 | }; | 89 | }; |
| 69 | batHostMACs = { | 90 | batHostMACs = { |
| 70 | surtr = "02:00:00:00:00:00"; | 91 | surtr = "02:00:00:00:00:00"; |
| 71 | vidhar = "02:00:00:01:00:00"; | 92 | vidhar = "02:00:00:01:00:00"; |
| 72 | sif = "02:00:00:02:00:00"; | 93 | sif = "02:00:00:02:00:00"; |
| 94 | skadhi = "02:00:00:03:00:00"; | ||
| 73 | }; | 95 | }; |
| 74 | batHostIPs = { | 96 | batHostIPs = { |
| 75 | surtr = ["${batSubnet}::/${toString batHostLength}"]; | 97 | surtr = ["${batSubnet}::/${toString batHostLength}"]; |
| 76 | vidhar = ["${batSubnet}:1::/${toString batHostLength}"]; | 98 | vidhar = ["${batSubnet}:1::/${toString batHostLength}"]; |
| 77 | sif = ["${batSubnet}:2::/${toString batHostLength}"]; | 99 | sif = ["${batSubnet}:2::/${toString batHostLength}"]; |
| 100 | skadhi = ["${batSubnet}:3::/${toString batHostLength}"]; | ||
| 78 | }; | 101 | }; |
| 79 | routers = [ "surtr" ]; | 102 | routers = [ "surtr" ]; |
| 80 | 103 | ||
diff --git a/modules/yggdrasil-wg/hosts/4/skadhi.priv b/modules/yggdrasil-wg/hosts/4/skadhi.priv new file mode 100644 index 00000000..dd66633f --- /dev/null +++ b/modules/yggdrasil-wg/hosts/4/skadhi.priv | |||
| @@ -0,0 +1,18 @@ | |||
| 1 | { | ||
| 2 | "data": "ENC[AES256_GCM,data:fXF8DV6vgpbJJWQvjIS3sFZ+yUEPtWwAZQrDLT8jueqDdn/IVaZGlq+DEnT0,iv:FU0ofu31RZlq2qMcMHlzYoRB61g+vwaG2JjPrKUgxYI=,tag:+dLvtiKmYdtk9NCXV8Yn9w==,type:str]", | ||
| 3 | "sops": { | ||
| 4 | "age": [ | ||
| 5 | { | ||
| 6 | "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBQR25od0g4MGhLY2d0Y1Fx\nS3RGVE1UbTFEc1Qzakx0VFdDbWNTdnU1MXowCkxNMXJycGlEVFEvV1dtQ3B3WXVX\nRm12ZmZTUTd6WGtvQkNJQzlsTVF1RHcKLS0tIE9tMzIzWFlWNHdINTkrSmcwYVNT\nVEVzSWFjMWJLSmRPRmZlQ1ZVMktLQ28KAUOrlZCuSZwF7QkOSz1dQ4Uj2f8gvjtM\n3c4sXQ3P77Rqluijsxo9KQx7Q0lRGBaRPMY4IrnHNPogd8iOHPeZuA==\n-----END AGE ENCRYPTED FILE-----\n", | ||
| 7 | "recipient": "age1rmmhetcmllq0ahl5qznlr0eya2zdxwl9h6y5wnl97d2wtyx5t99sm2u866" | ||
| 8 | }, | ||
| 9 | { | ||
| 10 | "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSArWmlPTWUrZ1QvYVBSckFL\nelZtcGdEMDBHeE5ROVdVdEJvWHpISzN3OVhjCkpSSTg2dDNqZjZYY0RyRlpuTi96\nS1l1dzJPV0NKbEJVdWpkTnZNZXJ0Qk0KLS0tIElBMmxJcmlxekVxRm1VdkgrSkNm\nZXhaMlhNdi9hVlNKaXU5MGVnK2NZWnMKjavFZczePCyYb2X4UsFNOaB5g+g1KZ52\npl+NTzRsUIXqPZnRDcCkGDjlQgLnZ+A22Enhbpj21ThiPV7bTyFh2g==\n-----END AGE ENCRYPTED FILE-----\n", | ||
| 11 | "recipient": "age1u6xegt79rarmyz8qy4pl7jh9lh90vx8fg0frmh4u2mzam7zydq4s4agz4e" | ||
| 12 | } | ||
| 13 | ], | ||
| 14 | "lastmodified": "2026-09-24T04:46:17Z", | ||
| 15 | "mac": "ENC[AES256_GCM,data:cubfKvUaDE6XNb9Y/1dbXpwayRXoZjiM9T3dN+YVeS6/5WX+hMC7We6mdge5VBnZ9CjA3XXNy+ZP1DEaPSg1OsBq1ubnFuVbaRKZlFl1B4I+6e4xpsZdQiyZT3SFZoM/LI1oM6kxD8e1n7KjFWNRx3yqAMaK3z1Ko1AlAmkmDx8=,iv:ME5EYC/MvuFxY7es250VcW0z2x1tCInCPrZnr4mBjrw=,tag:Jfd3uEVibe6Iw/3uNc+UTQ==,type:str]", | ||
| 16 | "version": "3.13.3" | ||
| 17 | } | ||
| 18 | } | ||
diff --git a/modules/yggdrasil-wg/hosts/4/skadhi.pub b/modules/yggdrasil-wg/hosts/4/skadhi.pub new file mode 100644 index 00000000..a722609e --- /dev/null +++ b/modules/yggdrasil-wg/hosts/4/skadhi.pub | |||
| @@ -0,0 +1 @@ | |||
| x5c5441ah63QZRbj+IV711Xv3JZOQYQON8Zo7rzU6i4= | |||
diff --git a/modules/yggdrasil-wg/hosts/6/skadhi.priv b/modules/yggdrasil-wg/hosts/6/skadhi.priv new file mode 100644 index 00000000..848cd299 --- /dev/null +++ b/modules/yggdrasil-wg/hosts/6/skadhi.priv | |||
| @@ -0,0 +1,18 @@ | |||
| 1 | { | ||
| 2 | "data": "ENC[AES256_GCM,data:lOitSuIg4Xjr5xycgaXBWkA79zySQOy+ZPXUxRjbU3F3/YHbcyrKYatVygdf,iv:8QcEXehosL/zUYxbNE284GfQHjz6HzBIyscigtNiDw8=,tag:eRINZKIv4UwprovUq7016Q==,type:str]", | ||
| 3 | "sops": { | ||
| 4 | "age": [ | ||
| 5 | { | ||
| 6 | "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBLY2U0S2tUZHpXSjVoTk1m\nSWlXK0UyWm5SMGxBbUtHTFp1U3NadUliemlNCjArMHdJVk5BYzVSK0F5RGdMQU1E\nMEZuUkt3R29sdHZsRnFPaVhlUzVpaWcKLS0tIDFXOEpFOC94NlEzZnZqY2F6VERt\nc3lvZEt2b0tVU3pvMU5VR1dqYUtFbUEKcRVTIkz5bz47rAkihOTJLJPvA0mqabUM\nUr+zZjdrWTKqnWuEcJ93xsCKyo4kC1k/SkaXia65krhi9z4BVe5kgQ==\n-----END AGE ENCRYPTED FILE-----\n", | ||
| 7 | "recipient": "age1rmmhetcmllq0ahl5qznlr0eya2zdxwl9h6y5wnl97d2wtyx5t99sm2u866" | ||
| 8 | }, | ||
| 9 | { | ||
| 10 | "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBRWUxYNXNXODAzb2daTC9Y\nSmtHRHUwZmRoaXhpTmpDbXZSMkkwMjI0Q2pnCi92RFgrK2pSTFdIL29wT09lVGZM\nTWxXamlSOVpOdXoxcSttSDNkUDJ1K0UKLS0tIC9rVnNXZWxhd2J3NGd2NkdUOUVO\nbE9ha1RyS3dOczNXa3pjVkh3bm5RS1kK4APdzi4AKkI7z5S2zpFkipkldVzeYO0Q\nGck0KtHhM8ZRTqJ9Q7WID2JwbAV5og3924SAYFbQvYdSd2zGqkD+Aw==\n-----END AGE ENCRYPTED FILE-----\n", | ||
| 11 | "recipient": "age1u6xegt79rarmyz8qy4pl7jh9lh90vx8fg0frmh4u2mzam7zydq4s4agz4e" | ||
| 12 | } | ||
| 13 | ], | ||
| 14 | "lastmodified": "2026-09-24T04:46:30Z", | ||
| 15 | "mac": "ENC[AES256_GCM,data:5mgUxl7FQCgmCWL2SRtf7FOi5z64scb9Qt/rUwPMdenAuTG0ED3NVGOATTVoco7l0MBbs/D7OBKDMMvJ/Odgo0I9srRDyhXdrVbVKMphD1uXAwxPaK2iUeK3xz93Kzvr17UXzd7SwXTReokv/lIcFyDqUvlBXGWxZdYsc/rf4Us=,iv:50ByoxaHrl6qQbKoEEAgUIpYyhVhp47AYnagbH8n5kA=,tag:5KjE/A7EwiG/sSGpkkQBcg==,type:str]", | ||
| 16 | "version": "3.13.3" | ||
| 17 | } | ||
| 18 | } | ||
diff --git a/modules/yggdrasil-wg/hosts/6/skadhi.pub b/modules/yggdrasil-wg/hosts/6/skadhi.pub new file mode 100644 index 00000000..7a51045a --- /dev/null +++ b/modules/yggdrasil-wg/hosts/6/skadhi.pub | |||
| @@ -0,0 +1 @@ | |||
| BtEGTPfLbtQJAAHfG/7jBissxcR/IfIRqeqhZG2dr0k= | |||
diff --git a/overlays/etebase-server/collection_uid.patch b/overlays/etebase-server/collection_uid.patch new file mode 100644 index 00000000..cff550ba --- /dev/null +++ b/overlays/etebase-server/collection_uid.patch | |||
| @@ -0,0 +1,35 @@ | |||
| 1 | diff --git i/etebase_server/fastapi/routers/collection.py w/etebase_server/fastapi/routers/collection.py | ||
| 2 | index bb01474..35c1f4b 100644 | ||
| 3 | --- i/etebase_server/fastapi/routers/collection.py | ||
| 4 | +++ w/etebase_server/fastapi/routers/collection.py | ||
| 5 | @@ -5,7 +5,7 @@ from django.core import exceptions as django_exceptions | ||
| 6 | from django.core.files.base import ContentFile | ||
| 7 | from django.db import IntegrityError, transaction | ||
| 8 | from django.db.models import Q, QuerySet | ||
| 9 | -from fastapi import APIRouter, BackgroundTasks, Depends, Request, status | ||
| 10 | +from fastapi import APIRouter, BackgroundTasks, Depends, Request, Path, status | ||
| 11 | |||
| 12 | from etebase_server.django import models | ||
| 13 | from etebase_server.myauth.models import UserType | ||
| 14 | @@ -576,9 +576,9 @@ def fetch_updates( | ||
| 15 | |||
| 16 | @item_router.post("/item/transaction/", dependencies=[Depends(has_write_access), *PERMISSIONS_READWRITE]) | ||
| 17 | def item_transaction( | ||
| 18 | - collection_uid: str, | ||
| 19 | data: ItemBatchIn, | ||
| 20 | background_tasks: BackgroundTasks, | ||
| 21 | + collection_uid: str = Path(...), | ||
| 22 | stoken: t.Optional[str] = None, | ||
| 23 | user: UserType = Depends(get_authenticated_user), | ||
| 24 | ): | ||
| 25 | @@ -589,9 +589,9 @@ def item_transaction( | ||
| 26 | |||
| 27 | @item_router.post("/item/batch/", dependencies=[Depends(has_write_access), *PERMISSIONS_READWRITE]) | ||
| 28 | def item_batch( | ||
| 29 | - collection_uid: str, | ||
| 30 | data: ItemBatchIn, | ||
| 31 | background_tasks: BackgroundTasks, | ||
| 32 | + collection_uid: str = Path(...), | ||
| 33 | stoken: t.Optional[str] = None, | ||
| 34 | user: UserType = Depends(get_authenticated_user), | ||
| 35 | ): | ||
diff --git a/overlays/etebase-server/default.nix b/overlays/etebase-server/default.nix new file mode 100644 index 00000000..22a2d324 --- /dev/null +++ b/overlays/etebase-server/default.nix | |||
| @@ -0,0 +1,14 @@ | |||
| 1 | { final, prev, ... }: { | ||
| 2 | etebase-server = prev.etebase-server.overrideAttrs (oldAttrs: { | ||
| 3 | src = final.fetchFromGitHub { | ||
| 4 | owner = "PrivateBasicsApp"; | ||
| 5 | repo = "EteSyncServer"; | ||
| 6 | rev = "master"; | ||
| 7 | hash = "sha256-zHpQwIwPHi007cx8VwVqWoZXG8dgeJaxWY5XYn3a5/0="; | ||
| 8 | }; | ||
| 9 | |||
| 10 | patches = (oldAttrs.patches or []) ++ [ | ||
| 11 | ./collection_uid.patch | ||
| 12 | ]; | ||
| 13 | }); | ||
| 14 | } | ||
diff --git a/overlays/keepassxc/default.nix b/overlays/keepassxc/default.nix index 46b3a459..325f1aa4 100644 --- a/overlays/keepassxc/default.nix +++ b/overlays/keepassxc/default.nix | |||
| @@ -1,8 +1,113 @@ | |||
| 1 | { final, prev, ... }: | 1 | { final, prev, flakeInputs, ... }: |
| 2 | { | 2 | { |
| 3 | keepassxc = prev.keepassxc.overrideAttrs (oldAttrs: { | 3 | keepassxc = final.stdenv.mkDerivation (finalAttrs: { |
| 4 | patches = (oldAttrs.patches or []) ++ prev.lib.optional (prev.lib.versionAtLeast oldAttrs.version "2.7.9") [ | 4 | pname = "keepassxc"; |
| 5 | ./database-open-dialog.patch | 5 | version = "2.8.0-beta1"; |
| 6 | |||
| 7 | src = final.fetchFromGitHub { | ||
| 8 | owner = "keepassxreboot"; | ||
| 9 | repo = "keepassxc"; | ||
| 10 | tag = finalAttrs.version; | ||
| 11 | hash = "sha256-fksThYmGZed66zxGDxlS2SHQzJYRf+T9AuZPbaNZV5Y="; | ||
| 12 | }; | ||
| 13 | |||
| 14 | env = | ||
| 15 | final.lib.optionalAttrs final.stdenv.cc.isClang { | ||
| 16 | NIX_CFLAGS_COMPILE = toString [ | ||
| 17 | "-Wno-old-style-cast" | ||
| 18 | "-Wno-error" | ||
| 19 | "-D__BIG_ENDIAN__=${if final.stdenv.hostPlatform.isBigEndian then "1" else "0"}" | ||
| 20 | ]; | ||
| 21 | }; | ||
| 22 | |||
| 23 | # Upstream develops against a build of PCSC from Xcode. | ||
| 24 | # The types are incompatible with nixpkgs pcsclite. | ||
| 25 | # https://github.com/NixOS/nixpkgs/issues/520227 | ||
| 26 | postPatch = '' | ||
| 27 | substituteInPlace src/keys/drivers/YubiKeyInterfacePCSC.cpp \ | ||
| 28 | --replace-fail "typedef uint32_t RETVAL;" "typedef int32_t RETVAL;" | ||
| 29 | ''; | ||
| 30 | |||
| 31 | cmakeFlags = [ | ||
| 32 | (final.lib.cmakeFeature "KEEPASSXC_BUILD_TYPE" "Release") | ||
| 33 | (final.lib.cmakeBool "WITH_GUI_TESTS" true) | ||
| 34 | (final.lib.cmakeBool "WITH_XC_UPDATECHECK" false) | ||
| 35 | (final.lib.cmakeBool "WITH_XC_X11" false) | ||
| 36 | (final.lib.cmakeBool "WITH_XC_BROWSER" true) | ||
| 37 | (final.lib.cmakeBool "WITH_XC_BROWSER_PASSKEYS" true) | ||
| 38 | (final.lib.cmakeBool "WITH_XC_KEESHARE" true) | ||
| 39 | (final.lib.cmakeBool "WITH_XC_NETWORKING" true) | ||
| 40 | (final.lib.cmakeBool "WITH_XC_SSHAGENT" true) | ||
| 41 | (final.lib.cmakeBool "WITH_XC_FDOSECRETS" true) | ||
| 42 | (final.lib.cmakeBool "WITH_XC_YUBIKEY" true) | ||
| 6 | ]; | 43 | ]; |
| 44 | |||
| 45 | doCheck = true; | ||
| 46 | checkPhase = | ||
| 47 | let | ||
| 48 | disabledTests = final.lib.concatStringsSep "|" ( | ||
| 49 | [ | ||
| 50 | # flaky | ||
| 51 | "testcli" | ||
| 52 | "testgui" | ||
| 53 | ] | ||
| 54 | ); | ||
| 55 | in | ||
| 56 | '' | ||
| 57 | runHook preCheck | ||
| 58 | |||
| 59 | export LC_ALL="en_US.UTF-8" | ||
| 60 | export QT_QPA_PLATFORM=offscreen | ||
| 61 | export QT_PLUGIN_PATH="${final.qt6.qtbase}/${final.qt6.qtbase.qtPluginPrefix}" | ||
| 62 | |||
| 63 | make test ARGS+="-E '${disabledTests}' --output-on-failure" | ||
| 64 | |||
| 65 | runHook postCheck | ||
| 66 | ''; | ||
| 67 | |||
| 68 | nativeBuildInputs = with final; [ | ||
| 69 | asciidoctor | ||
| 70 | cmake | ||
| 71 | qt6.wrapQtAppsHook | ||
| 72 | qt6.qttools | ||
| 73 | pkg-config | ||
| 74 | wrapGAppsHook3 | ||
| 75 | ]; | ||
| 76 | |||
| 77 | dontWrapGApps = true; | ||
| 78 | preFixup = '' | ||
| 79 | qtWrapperArgs+=("''${gappsWrapperArgs[@]}") | ||
| 80 | ''; | ||
| 81 | |||
| 82 | postInstall = final.lib.concatLines [ | ||
| 83 | # See https://github.com/keepassxreboot/keepassxc/blob/cd7a53abbbb81e468efb33eb56eefc12739969b8/src/browser/NativeMessageInstaller.cpp#L317 | ||
| 84 | # See https://github.com/keepassxreboot/keepassxc/blob/cd7a53abbbb81e468efb33eb56eefc12739969b8/utils/keepassxc-snap-helper.sh#L48-L58 | ||
| 85 | '' | ||
| 86 | mkdir -p "$out/lib/mozilla/native-messaging-hosts" | ||
| 87 | substituteAll "${toString (flakeInputs.nixpkgs) + "/pkgs/by-name/ke/keepassxc/firefox-native-messaging-host.json"}" "$out/lib/mozilla/native-messaging-hosts/org.keepassxc.keepassxc_browser.json" | ||
| 88 | |||
| 89 | mkdir -p "$out/etc/chromium/native-messaging-hosts" | ||
| 90 | substituteAll "${toString (flakeInputs.nixpkgs) + "/pkgs/by-name/ke/keepassxc/chromium-native-messaging-host.json"}" "$out/etc/chromium/native-messaging-hosts/org.keepassxc.keepassxc_browser.json" | ||
| 91 | '' | ||
| 92 | ]; | ||
| 93 | |||
| 94 | buildInputs = with final; [ | ||
| 95 | botan3 | ||
| 96 | curl | ||
| 97 | libxi | ||
| 98 | libxtst | ||
| 99 | libargon2 | ||
| 100 | qt6.qtbase | ||
| 101 | qt6.qtsvg | ||
| 102 | minizip | ||
| 103 | pcsclite | ||
| 104 | qrencode | ||
| 105 | readline | ||
| 106 | zlib | ||
| 107 | libusb1 | ||
| 108 | keyutils | ||
| 109 | ]; | ||
| 110 | |||
| 111 | meta.mainProgram = "keepassxc"; | ||
| 7 | }); | 112 | }); |
| 8 | } | 113 | } |
diff --git a/overlays/quickshell/default.nix b/overlays/quickshell/default.nix index 9aefeeb4..47aee5ac 100644 --- a/overlays/quickshell/default.nix +++ b/overlays/quickshell/default.nix | |||
| @@ -16,7 +16,8 @@ | |||
| 16 | ]; | 16 | ]; |
| 17 | 17 | ||
| 18 | patches = (oldAttrs.patches or []) ++ [ | 18 | patches = (oldAttrs.patches or []) ++ [ |
| 19 | ./lock-state-changed.patch | 19 | # ./lock-state-changed.patch |
| 20 | ./notify-session-unlock.patch | ||
| 20 | ./pipewire.patch | 21 | ./pipewire.patch |
| 21 | ./io.patch | 22 | ./io.patch |
| 22 | ./close-stdin.patch | 23 | ./close-stdin.patch |
diff --git a/overlays/quickshell/notify-session-unlock.patch b/overlays/quickshell/notify-session-unlock.patch new file mode 100644 index 00000000..d0b835eb --- /dev/null +++ b/overlays/quickshell/notify-session-unlock.patch | |||
| @@ -0,0 +1,15 @@ | |||
| 1 | diff --git i/src/wayland/session_lock.cpp w/src/wayland/session_lock.cpp | ||
| 2 | index 43d80e2..742d683 100644 | ||
| 3 | --- i/src/wayland/session_lock.cpp | ||
| 4 | +++ w/src/wayland/session_lock.cpp | ||
| 5 | @@ -179,8 +179,9 @@ void WlSessionLock::unlock() { | ||
| 6 | |||
| 7 | this->surfaces.clear(); | ||
| 8 | |||
| 9 | + auto wasLocked = this->isLocked(); | ||
| 10 | if (this->manager) this->manager->unlock(); | ||
| 11 | - if (this->isLocked()) emit this->lockStateChanged(); | ||
| 12 | + if (wasLocked != this->isLocked()) emit this->lockStateChanged(); | ||
| 13 | } | ||
| 14 | |||
| 15 | void WlSessionLock::onScreensChanged() { | ||
diff --git a/system-profiles/core/default.nix b/system-profiles/core/default.nix index 43369f50..710b57e0 100644 --- a/system-profiles/core/default.nix +++ b/system-profiles/core/default.nix | |||
| @@ -154,7 +154,7 @@ in { | |||
| 154 | home-manager = { | 154 | home-manager = { |
| 155 | useGlobalPkgs = true; # Otherwise home-manager would only work impurely | 155 | useGlobalPkgs = true; # Otherwise home-manager would only work impurely |
| 156 | useUserPackages = false; | 156 | useUserPackages = false; |
| 157 | useUserService = true; | 157 | startAsUserService = true; |
| 158 | backupFileExtension = "bak"; | 158 | backupFileExtension = "bak"; |
| 159 | sharedModules = lib.attrValues flake.homeModules ++ [ | 159 | sharedModules = lib.attrValues flake.homeModules ++ [ |
| 160 | { | 160 | { |
diff --git a/system-profiles/default-locale.nix b/system-profiles/default-locale.nix index de2db1d7..cc103c9e 100644 --- a/system-profiles/default-locale.nix +++ b/system-profiles/default-locale.nix | |||
| @@ -6,6 +6,7 @@ | |||
| 6 | i18n.defaultLocale = "en_DK.UTF-8"; | 6 | i18n.defaultLocale = "en_DK.UTF-8"; |
| 7 | console.keyMap = lib.mkDefault "dvorak-programmer"; | 7 | console.keyMap = lib.mkDefault "dvorak-programmer"; |
| 8 | time.timeZone = lib.mkDefault "Europe/Berlin"; | 8 | time.timeZone = lib.mkDefault "Europe/Berlin"; |
| 9 | services.kmscon.extraOptions = "--xkb-layout=us --xkb-variant=dvp --no-mouse"; | ||
| 9 | } | 10 | } |
| 10 | ] ++ (lib.optional (options ? i18n.extraLocales) { | 11 | ] ++ (lib.optional (options ? i18n.extraLocales) { |
| 11 | i18n.extraLocales = [ "C.UTF-8/UTF-8" "en_US.UTF-8/UTF-8" ]; | 12 | i18n.extraLocales = [ "C.UTF-8/UTF-8" "en_US.UTF-8/UTF-8" ]; |
diff --git a/system-profiles/disko.nix b/system-profiles/disko.nix new file mode 100644 index 00000000..52e1f003 --- /dev/null +++ b/system-profiles/disko.nix | |||
| @@ -0,0 +1,5 @@ | |||
| 1 | { flakeInputs, ... }: { | ||
| 2 | imports = [ | ||
| 3 | flakeInputs.disko.nixosModules.disko | ||
| 4 | ]; | ||
| 5 | } | ||
diff --git a/system-profiles/initrd-all-crypto-modules.nix b/system-profiles/initrd-all-crypto-modules.nix index da6c781e..84f2129a 100644 --- a/system-profiles/initrd-all-crypto-modules.nix +++ b/system-profiles/initrd-all-crypto-modules.nix | |||
| @@ -14,11 +14,11 @@ in { | |||
| 14 | boot.initrd.luks.cryptoModules = moduleList ++ [ | 14 | boot.initrd.luks.cryptoModules = moduleList ++ [ |
| 15 | "encrypted_keys" "trusted" "rng" | 15 | "encrypted_keys" "trusted" "rng" |
| 16 | ]; | 16 | ]; |
| 17 | boot.kernelPatches = [ | 17 | # boot.kernelPatches = [ |
| 18 | { | 18 | # { |
| 19 | name = "encrypted_key"; | 19 | # name = "encrypted_keys"; |
| 20 | patch = null; | 20 | # patch = null; |
| 21 | structuredExtraConfig.ENCRYPTED_KEYS = lib.kernel.yes; | 21 | # structuredExtraConfig.ENCRYPTED_KEYS = lib.kernel.yes; |
| 22 | } | 22 | # } |
| 23 | ]; | 23 | # ]; |
| 24 | } | 24 | } |
diff --git a/system-profiles/networkmanager.nix b/system-profiles/networkmanager.nix index 7ffd688a..9e844bb4 100644 --- a/system-profiles/networkmanager.nix +++ b/system-profiles/networkmanager.nix | |||
| @@ -1,21 +1,23 @@ | |||
| 1 | { config, lib, ... }: | 1 | { config, pkgs, lib, ... }: |
| 2 | |||
| 3 | with lib; | ||
| 4 | |||
| 5 | { | 2 | { |
| 6 | config = { | 3 | config = { |
| 7 | networking = { | 4 | networking = { |
| 8 | networkmanager = { | 5 | networkmanager = { |
| 9 | enable = true; | 6 | enable = true; |
| 10 | dhcp = "internal"; | 7 | dhcp = "internal"; |
| 11 | dns = mkForce "dnsmasq"; | 8 | dns = lib.mkForce "dnsmasq"; |
| 12 | logLevel = "INFO"; | 9 | logLevel = "INFO"; |
| 13 | settings.connectivity.uri = "https://online.yggdrasil.li"; | 10 | settings.connectivity.uri = "https://online.yggdrasil.li"; |
| 14 | }; | 11 | }; |
| 15 | }; | 12 | }; |
| 16 | 13 | ||
| 14 | # environment.etc."NetworkManager/dnsmasq.d/dnssec.conf".text = '' | ||
| 15 | # conf-file=${pkgs.dnsmasq}/share/dnsmasq/trust-anchors.conf | ||
| 16 | # dnssec | ||
| 17 | # ''; | ||
| 18 | |||
| 17 | systemd.services."NetworkManager-wait-online".enable = false; | 19 | systemd.services."NetworkManager-wait-online".enable = false; |
| 18 | systemd.services."systemd-networkd-wait-online".enable = mkForce false; | 20 | systemd.services."systemd-networkd-wait-online".enable = lib.mkForce false; |
| 19 | 21 | ||
| 20 | services.resolved.enable = false; | 22 | services.resolved.enable = false; |
| 21 | }; | 23 | }; |
diff --git a/system-profiles/openssh/default.nix b/system-profiles/openssh/default.nix index e60e72d9..774c2f20 100644 --- a/system-profiles/openssh/default.nix +++ b/system-profiles/openssh/default.nix | |||
| @@ -66,11 +66,15 @@ in { | |||
| 66 | services.openssh = mkIf cfg.enable { | 66 | services.openssh = mkIf cfg.enable { |
| 67 | startWhenNeeded = true; | 67 | startWhenNeeded = true; |
| 68 | hostKeys = mkIf cfg.staticHostKeys (mkForce []); # done manually | 68 | hostKeys = mkIf cfg.staticHostKeys (mkForce []); # done manually |
| 69 | authorizedKeysInHomedir = mkDefault false; | ||
| 69 | settings = { | 70 | settings = { |
| 70 | inherit Ciphers Macs KexAlgorithms; | 71 | inherit Ciphers Macs KexAlgorithms; |
| 71 | HostKeyAlgorithms = concatStringsSep "," HostKeyAlgorithms; | 72 | HostKeyAlgorithms = concatStringsSep "," HostKeyAlgorithms; |
| 72 | PubkeyAcceptedAlgorithms = concatStringsSep "," PubkeyAcceptedAlgorithms; | 73 | PubkeyAcceptedAlgorithms = concatStringsSep "," PubkeyAcceptedAlgorithms; |
| 73 | CASignatureAlgorithms = concatStringsSep "," CASignatureAlgorithms; | 74 | CASignatureAlgorithms = concatStringsSep "," CASignatureAlgorithms; |
| 75 | TrustedUserCAKeys = toString (pkgs.writeText "trusted_user_ca_keys" '' | ||
| 76 | ${builtins.readFile ./ca/ca.pub} | ||
| 77 | ''); | ||
| 74 | 78 | ||
| 75 | LogLevel = "VERBOSE"; | 79 | LogLevel = "VERBOSE"; |
| 76 | RevokedKeys = toString ./ca/krl.bin; | 80 | RevokedKeys = toString ./ca/krl.bin; |
diff --git a/system-profiles/openssh/host-keys/skadhi.yaml b/system-profiles/openssh/host-keys/skadhi.yaml new file mode 100644 index 00000000..923a50c5 --- /dev/null +++ b/system-profiles/openssh/host-keys/skadhi.yaml | |||
| @@ -0,0 +1,26 @@ | |||
| 1 | rsa: ENC[AES256_GCM,data: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,iv:6AXBuNYLGjteurpIZtYyuonm5ufuf9FtLVKzhB9OfP4=,tag:YQ1Afk2DU9bknOvA+PzOKQ==,type:str] | ||
| 2 | ed25519: ENC[AES256_GCM,data:Pnks0nRPFfRKXkuDp1vjrTc1QPwGwRLglhDzPhCeUUBj7eNNySHs77FJRLiiq4yvSkBdnM8mb/aIUfhMYG40oJJskZU1uEaEERGxaMiqkGx73apredpdTK/TGrMSIUxcTrXtZQTgTxKDP3/f9qKPlW3TmRPokk9Xhhj6ibpSMTPBfoTbIETbYdVKn/47WGFdeSZaoPny3jMWPo3cWhA2QprCoefsj/PhbHsKSejaJ8FjIiPu/anPNdB/USNeNBF/5x4IsyAnkmpEus0y5HJFsP4m8JwL6NH4x5bdp36mA+LWxm2u8Gm0xFhVbCjW/8Kth35BBDVwbXW2m02awu86TF7sP0iPzXSelPTsCi/NCm4OaylytnLWaflu8bydCZNMPLejoCQO45w6Dub4f9MM7aL7myiDR8KZJGhuhO/Qud3dkbDie9PamkM+fSIi5QY62lrUWw0+Nuap6l/8+CTauuFI5Z9ytOtXR1wW9grYPo07dN+HqT5/NQqfJZqIZHLHFxV093hAgRhChB4fBPTb,iv:KqpeNM4NPOG+QQl1AhW1bkii3D42HwR8z69WJVk8lFk=,tag:Ynbap7SNBeMnL7FyvCMbYQ==,type:str] | ||
| 3 | sops: | ||
| 4 | age: | ||
| 5 | - enc: | | ||
| 6 | -----BEGIN AGE ENCRYPTED FILE----- | ||
| 7 | YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBkbzB4TVN2WlV1WTdGTUdJ | ||
| 8 | QzJ4eXUwQ2pxZ0d3WENyNjVoQ0EzbHk4VkZBCitrY3loenhHbFZpWmdwcmgwSVU2 | ||
| 9 | Q3VvTUNCZWliVUxGa2hjWDBMVXYxcTAKLS0tIEVqUnRMaCtGcnNFbHNvOTk5OU9x | ||
| 10 | RzJpNVBhU3RvSndJT1dwcGQzNkVacncK5fStVHuf5Mg0aEkxLGW4YnPG1bAvR/zS | ||
| 11 | Z0k1w1fJxns9ue/+eJhSBaXTv7+6puEZoiUiAGyproOL9aDs4rNBHw== | ||
| 12 | -----END AGE ENCRYPTED FILE----- | ||
| 13 | recipient: age1rmmhetcmllq0ahl5qznlr0eya2zdxwl9h6y5wnl97d2wtyx5t99sm2u866 | ||
| 14 | - enc: | | ||
| 15 | -----BEGIN AGE ENCRYPTED FILE----- | ||
| 16 | YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBVbno1ZEllWW5LRlFOQkZK | ||
| 17 | MUFKRHpNcTNGZ0RjRHRLd2YyZWpCdGdhOUY4CjJ0SG9sT00wZmxjck0vL1I0bXlL | ||
| 18 | cjQzcGFGbk1VL2hpZ0ZBS3BRVXNRS0kKLS0tIG5tbUxrQUdCKzVZU1Ezb3l2OUx4 | ||
| 19 | dm4xdmM0NDlEVmVsNVA0NEpkN0lYZUkKVqPMAnWtuSfLyJRVhqVlsAijAshk8yy1 | ||
| 20 | cZO3yrtOqKkjFJWYFK0rH2A9eQL5MT0KAgr90HHnIFJoSeFwnsg7aQ== | ||
| 21 | -----END AGE ENCRYPTED FILE----- | ||
| 22 | recipient: age1u6xegt79rarmyz8qy4pl7jh9lh90vx8fg0frmh4u2mzam7zydq4s4agz4e | ||
| 23 | lastmodified: "2026-09-24T12:10:19Z" | ||
| 24 | mac: ENC[AES256_GCM,data:dh5VxC0HBPLiV6Lamg3nuMlELL8aH4/hmXDsn8NE41Ru8hHo1NsPrSt3/FQzhcK0qiJTCd38Q1yig12w1LGJb1zPzF4zE25Ux1M+0M1cm/XGEO7imdzK5/xXryqbl7gBH/FJtsbL0shM2B3AjzsspK4S47pmlK8/FaBh3OWXdp0=,iv:V+Dz9I8Ah/P0vtU2p6PWI1bv4lcbaleh1L87HpTf8lA=,tag:ouVPZvCkUFvhzoL9w6smdA==,type:str] | ||
| 25 | unencrypted_suffix: _unencrypted | ||
| 26 | version: 3.13.3 | ||
diff --git a/system-profiles/openssh/host-moduli/skadhi b/system-profiles/openssh/host-moduli/skadhi new file mode 100644 index 00000000..31bb9670 --- /dev/null +++ b/system-profiles/openssh/host-moduli/skadhi | |||
| @@ -0,0 +1,18 @@ | |||
| 1 | { | ||
| 2 | "data": "ENC[AES256_GCM,data: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,iv:6B+Sln/h6hsB4bKJLmmIhgIDFI4ces3q9U8RTR37OgE=,tag:X+7T/+UREGts4cojwGtgVw==,type:str]", | ||
| 3 | "sops": { | ||
| 4 | "age": [ | ||
| 5 | { | ||
| 6 | "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBGU3VPZEtwWmtKUWZrOXZR\nVzA1OERFa21rSGM0b0Z0bFpRTmFOc24zVUE0CjFOcTZjOUNTbmZLMlMxcHkxQk8w\nVDhON3Y4ME1TZGE4Sy9WS2k5WXNTTVkKLS0tIDUzVXQvSzlyeng0RFBIeFVQWXMr\nK21vMHBWUSttTkJvQ2RUN013WXplUnMKxut6DiAS6mE4MxSJqDznlTJvjU0maLg+\nQTWyFXn9pCb2kooeoiIKkL/dpffNG9mAS9iUOBY+I1FjHWZhdIpipQ==\n-----END AGE ENCRYPTED FILE-----\n", | ||
| 7 | "recipient": "age1rmmhetcmllq0ahl5qznlr0eya2zdxwl9h6y5wnl97d2wtyx5t99sm2u866" | ||
| 8 | }, | ||
| 9 | { | ||
| 10 | "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBuaE5RaVhvNDJ1OXZRNHky\nbW5ibEprbWRWYjl2V1RlZk5hTXNKOGRWYzJnCnkxUjBpWjg2ditQN00yZUh4R1hl\nelErNlkwNkJSQnhRNy9yNTBkbk1TakUKLS0tIEtjV1gyVXpLQ1YvdDZ6T0FPOVRW\nSm0vR2w0OUJreVk1aFJDOVFiUDNRUEkKLsRuQd81SUb3ANi2zJxeBtJWO8r/MPLN\nKslTu5zaX3H1asngb8HJcXE8UTVJEIRz3rUSFp0w8Nc8CkAblRVByg==\n-----END AGE ENCRYPTED FILE-----\n", | ||
| 11 | "recipient": "age1u6xegt79rarmyz8qy4pl7jh9lh90vx8fg0frmh4u2mzam7zydq4s4agz4e" | ||
| 12 | } | ||
| 13 | ], | ||
| 14 | "lastmodified": "2026-09-24T12:07:39Z", | ||
| 15 | "mac": "ENC[AES256_GCM,data:W4qlwOIfRZ8bhc+Aqi5LuvkgfpMsYADd04sOPSe00Bg+65EHXuTjQjpzmltRLh5I1h/LAPyByXa+XSzG/85qCWUakOvFcMytvEUnOAr1t2TUcF5kZpFzmuZfdLFPQOD6FxAMef+Lrd7BEz2SQtj7ZZWNilYc1lpK/3fzL0x86dE=,iv:vS8uSpbobiKHI64sLX0ViJhBDQLzdymtPk+oeDKptLM=,tag:YoDpYmhDPzUti1VP37JlXg==,type:str]", | ||
| 16 | "version": "3.13.3" | ||
| 17 | } | ||
| 18 | } | ||
diff --git a/system-profiles/openssh/known-hosts/skadhi/ed25519-cert.pub b/system-profiles/openssh/known-hosts/skadhi/ed25519-cert.pub new file mode 100644 index 00000000..bc8ec2ad --- /dev/null +++ b/system-profiles/openssh/known-hosts/skadhi/ed25519-cert.pub | |||
| @@ -0,0 +1 @@ | |||
| ssh-ed25519-cert-v01@openssh.com AAAAIHNzaC1lZDI1NTE5LWNlcnQtdjAxQG9wZW5zc2guY29tAAAAINIxBJhSG//Uc5HmzPXG2NhJllmMb6LjFT1yTSh2GrdeAAAAIMCNZcC1UuTeb2bKcydTKaOSSrZ5hwGDmiw9UXyBlrCGQAAAAGq1KTYAAAACAAAAJDRhYzkxMTU1LWU0ODQtNGQzYy1iMTFhLTMxMjcxMTA2YjdkMAAAACwAAAAQc2thZGhpLnlnZ2RyYXNpbAAAABRza2FkaGkubGFuLnlnZ2RyYXNpbAAAAABqs9eRAAAAAG0YIAAAAAAAAAAAAAAAAAAAAAAzAAAAC3NzaC1lZDI1NTE5AAAAIC1t7HamptQ49VXtSZyRsaOuja5In1N0U9Ybdiu6ztziAAAAUwAAAAtzc2gtZWQyNTUxOQAAAEDVR42B8b7XZHR/UCM1D6bjZd8hDKTGLke0Ve0YFOaeyAhn9Ih3GqeHGUKbcEB2x2DaLiT9oP6jDZT6aZC4l1QA gkleen@sif | |||
diff --git a/system-profiles/openssh/known-hosts/skadhi/ed25519.pub b/system-profiles/openssh/known-hosts/skadhi/ed25519.pub new file mode 100644 index 00000000..ee0aca76 --- /dev/null +++ b/system-profiles/openssh/known-hosts/skadhi/ed25519.pub | |||
| @@ -0,0 +1 @@ | |||
| ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMCNZcC1UuTeb2bKcydTKaOSSrZ5hwGDmiw9UXyBlrCG gkleen@sif | |||
diff --git a/system-profiles/openssh/known-hosts/skadhi/host-principals b/system-profiles/openssh/known-hosts/skadhi/host-principals new file mode 100644 index 00000000..59685ff9 --- /dev/null +++ b/system-profiles/openssh/known-hosts/skadhi/host-principals | |||
| @@ -0,0 +1 @@ | |||
| skadhi.yggdrasil,skadhi.lan.yggdrasil | |||
diff --git a/system-profiles/openssh/known-hosts/skadhi/rsa-cert.pub b/system-profiles/openssh/known-hosts/skadhi/rsa-cert.pub new file mode 100644 index 00000000..d2e88f0a --- /dev/null +++ b/system-profiles/openssh/known-hosts/skadhi/rsa-cert.pub | |||
| @@ -0,0 +1 @@ | |||
| ssh-rsa-cert-v01@openssh.com AAAAHHNzaC1yc2EtY2VydC12MDFAb3BlbnNzaC5jb20AAAAgwC84VWWQVh5lMbfHuucbD4FfaaNgLiVU2JvXct2cWREAAAADAQABAAACAQDydZ74CIwLqiIyU8TjzC+ABh3venJ0SD4YTTh5YBYPYVJCv69IPOHcXx3uyw3rtqIKEr6X8stZ8ju7ia5ZteKKRebwQFXBYGl/jCnsLjR3hbuHc50MRyMxvpY76UMAZZNkF5dfIPG7uLDM+1MWkIrra401W0gZtFSIL0lUgEB2y0E3gUtT78h8PwHFbXYnC68wbu2ooDxGFQZrQoZTYrzQxB+Wr6RtDW0WTWwjQ7+XOo5Gwqxq8guCldFRzpKYj3LPcdSWhc9ZC8alSpfBZbAEXZKOtPiykA0grzLzIW34tgWBpmDGKkmQl+MHLatyAuaBv4cFUfxTJ7hvsvhLdK/iqUefVjM3oHDHtmFyFHwIhEaLaBTDjPsRYTdexdztcRi1LRZjhFEq+TTbWcU90F3XYH1+y8mCYRaVbT0aC1b6uhCysCNNNCKB5Q45tXOC+KniUyRxv2SxCjARJFtoF4vtosehBQATQEkF/TqMzywWwnsKLeuPkqPCc6cOTHFTZgXh5lev0hNgHChwUNU29k1DbYIu/v66tGbsemses/eZKBup89XrXFMx8SjgIs7r9HyI9JsnJ6DcYyWTq82Ej9WHkXD11ERgziLeVme+WsFsxTp5i2dpVIDFCJzBQKOABEZPZPNdzK+fcwyoT2eBeKjAGos4K3Wz49LJ8cwG599oM0AAAABqtSlBAAAAAgAAACRkZDQ3OGQyZi1lODI1LTRjNDItODgzYi02MjBiMTliZGIzMjQAAAAsAAAAEHNrYWRoaS55Z2dkcmFzaWwAAAAUc2thZGhpLmxhbi55Z2dkcmFzaWwAAAAAarPXnAAAAABtGCAAAAAAAAAAAAAAAAAAAAAAMwAAAAtzc2gtZWQyNTUxOQAAACAtbex2pqbUOPVV7UmckbGjro2uSJ9TdFPWG3Yrus7c4gAAAFMAAAALc3NoLWVkMjU1MTkAAABArpK0u8gpEQ+WBbq19/wg/NLKtdFK3qO+HQdzwm7ivc4VFLDruNkIPRbSkztEd0Frrox7bgWj2vK2EfflIPVUDw== gkleen@sif | |||
diff --git a/system-profiles/openssh/known-hosts/skadhi/rsa.pub b/system-profiles/openssh/known-hosts/skadhi/rsa.pub new file mode 100644 index 00000000..8d94985f --- /dev/null +++ b/system-profiles/openssh/known-hosts/skadhi/rsa.pub | |||
| @@ -0,0 +1 @@ | |||
| ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDydZ74CIwLqiIyU8TjzC+ABh3venJ0SD4YTTh5YBYPYVJCv69IPOHcXx3uyw3rtqIKEr6X8stZ8ju7ia5ZteKKRebwQFXBYGl/jCnsLjR3hbuHc50MRyMxvpY76UMAZZNkF5dfIPG7uLDM+1MWkIrra401W0gZtFSIL0lUgEB2y0E3gUtT78h8PwHFbXYnC68wbu2ooDxGFQZrQoZTYrzQxB+Wr6RtDW0WTWwjQ7+XOo5Gwqxq8guCldFRzpKYj3LPcdSWhc9ZC8alSpfBZbAEXZKOtPiykA0grzLzIW34tgWBpmDGKkmQl+MHLatyAuaBv4cFUfxTJ7hvsvhLdK/iqUefVjM3oHDHtmFyFHwIhEaLaBTDjPsRYTdexdztcRi1LRZjhFEq+TTbWcU90F3XYH1+y8mCYRaVbT0aC1b6uhCysCNNNCKB5Q45tXOC+KniUyRxv2SxCjARJFtoF4vtosehBQATQEkF/TqMzywWwnsKLeuPkqPCc6cOTHFTZgXh5lev0hNgHChwUNU29k1DbYIu/v66tGbsemses/eZKBup89XrXFMx8SjgIs7r9HyI9JsnJ6DcYyWTq82Ej9WHkXD11ERgziLeVme+WsFsxTp5i2dpVIDFCJzBQKOABEZPZPNdzK+fcwyoT2eBeKjAGos4K3Wz49LJ8cwG599oMw== gkleen@sif | |||
diff --git a/system-profiles/rebuild-machines/default.nix b/system-profiles/rebuild-machines/default.nix index de86cd74..c95602a4 100644 --- a/system-profiles/rebuild-machines/default.nix +++ b/system-profiles/rebuild-machines/default.nix | |||
| @@ -158,7 +158,7 @@ in { | |||
| 158 | }; | 158 | }; |
| 159 | 159 | ||
| 160 | nix.registry = mkIf (cfg.flake != null) { | 160 | nix.registry = mkIf (cfg.flake != null) { |
| 161 | ${cfg.flake.name} = { | 161 | ${cfg.flake.name} = lib.mkForce { |
| 162 | exact = false; | 162 | exact = false; |
| 163 | to = cfg.flake.flake; | 163 | to = cfg.flake.flake; |
| 164 | }; | 164 | }; |
diff --git a/system-profiles/tmpfs-root.nix b/system-profiles/tmpfs-root.nix index 23939c2e..5a04a166 100644 --- a/system-profiles/tmpfs-root.nix +++ b/system-profiles/tmpfs-root.nix | |||
| @@ -1,14 +1,25 @@ | |||
| 1 | { ... }: { | 1 | { options, lib, ... }: { |
| 2 | config = { | 2 | config = lib.foldr lib.recursiveUpdate {} ([ |
| 3 | # system.etc.overlay.enable = true; | 3 | { |
| 4 | 4 | security.sudo.extraConfig = '' | |
| 5 | Defaults lecture = never | ||
| 6 | ''; | ||
| 7 | } | ||
| 8 | ] | ||
| 9 | ++ (lib.optional (options ? disko) { | ||
| 10 | disko.devices.nodev = { | ||
| 11 | "/" = { | ||
| 12 | fsType = "tmpfs"; | ||
| 13 | mountOptions = [ | ||
| 14 | "mode=0755" | ||
| 15 | ]; | ||
| 16 | }; | ||
| 17 | }; | ||
| 18 | }) | ||
| 19 | ++ (lib.optional (!(options ? disko)) { | ||
| 5 | fileSystems."/" = { | 20 | fileSystems."/" = { |
| 6 | fsType = "tmpfs"; | 21 | fsType = "tmpfs"; |
| 7 | options = [ "mode=0755" ]; | 22 | options = [ "mode=0755" ]; |
| 8 | }; | 23 | }; |
| 9 | 24 | })); | |
| 10 | security.sudo.extraConfig = '' | ||
| 11 | Defaults lecture = never | ||
| 12 | ''; | ||
| 13 | }; | ||
| 14 | } | 25 | } |
diff --git a/user-profiles/core.nix b/user-profiles/core.nix index 57fb7628..8b8da681 100644 --- a/user-profiles/core.nix +++ b/user-profiles/core.nix | |||
| @@ -1,11 +1,19 @@ | |||
| 1 | { flake, flakeInputs, path, userName, config, lib, utils, ... }: | 1 | { flake, flakeInputs, sources, path, userName, hostName, config, lib, utils, ... }: |
| 2 | 2 | ||
| 3 | with lib; | 3 | with lib; |
| 4 | 4 | ||
| 5 | { | 5 | { |
| 6 | config = { | 6 | config = { |
| 7 | users.users.${userName} = {}; # Just make sure the user is created | 7 | users.users.${userName} = { # Make sure the user is created |
| 8 | openssh.authorizedPrincipals = [ | ||
| 9 | "${userName}@${hostName}" | ||
| 10 | "${userName}@*" | ||
| 11 | ]; | ||
| 12 | }; | ||
| 8 | home-manager.users.${userName} = let sysConfig = config; in { config, ... }: { | 13 | home-manager.users.${userName} = let sysConfig = config; in { config, ... }: { |
| 14 | config._module.args = { | ||
| 15 | inherit sysConfig flake flakeInputs sources; | ||
| 16 | }; | ||
| 9 | config.nix.settings = { | 17 | config.nix.settings = { |
| 10 | inherit (sysConfig.nix.settings) use-xdg-base-directories; | 18 | inherit (sysConfig.nix.settings) use-xdg-base-directories; |
| 11 | }; | 19 | }; |
diff --git a/user-profiles/yt-dlp.nix b/user-profiles/yt-dlp.nix index d611e5a4..cdb36c6d 100644 --- a/user-profiles/yt-dlp.nix +++ b/user-profiles/yt-dlp.nix | |||
| @@ -7,16 +7,16 @@ | |||
| 7 | cookies-from-browser = "firefox::none"; | 7 | cookies-from-browser = "firefox::none"; |
| 8 | mark-watched = true; | 8 | mark-watched = true; |
| 9 | format = lib.concatStringsSep "/" [ | 9 | format = lib.concatStringsSep "/" [ |
| 10 | "bestvideo*[width<=2560][height<=1440][fps<=60][vcodec!*=av01][width>=1920]+bestaudio" | 10 | "bestvideo*[width<=2880][height<=1920][fps<=120][width>=1920]+bestaudio" |
| 11 | "best[width<=2560][height<=1440][fps<=60][vcodec!*=av01][width>=1920]" | 11 | "best[width<=2880][height<=1920][fps<=120][width>=1920]" |
| 12 | "bestvideo*[vcodec!*=av01][width>=1920]+bestaudio" | 12 | "bestvideo*[width>=1920]+bestaudio" |
| 13 | "best[vcodec!*=av01][width>=1920]" | 13 | "best[width>=1920]" |
| 14 | "bestvideo*[width<=2560][height<=1440][fps<=60][vcodec!*=av01][height>=1080]+bestaudio" | 14 | "bestvideo*[width<=2880][height<=1920][fps<=120][height>=1080]+bestaudio" |
| 15 | "best[width<=2560][height<=1440][fps<=60][vcodec!*=av01][height>=1080]" | 15 | "best[width<=2880][height<=1920][fps<=120][height>=1080]" |
| 16 | "bestvideo*[vcodec!*=av01][height>=1080]+bestaudio" | 16 | "bestvideo*[height>=1080]+bestaudio" |
| 17 | "best[vcodec!*=av01][height>=1080]" | 17 | "best[height>=1080]" |
| 18 | "bestvideo*[width<=2560][height<=1440][fps<=60]+bestaudio" | 18 | "bestvideo*[width<=2880][height<=1920][fps<=120]+bestaudio" |
| 19 | "best[width<=2560][height<=1440][fps<=60]" | 19 | "best[width<=2880][height<=1920][fps<=120]" |
| 20 | "bestvideo*+bestaudio" | 20 | "bestvideo*+bestaudio" |
| 21 | "best" | 21 | "best" |
| 22 | ]; | 22 | ]; |
diff --git a/user-profiles/zsh/default.nix b/user-profiles/zsh/default.nix index 7821d99a..a89da267 100644 --- a/user-profiles/zsh/default.nix +++ b/user-profiles/zsh/default.nix | |||
| @@ -1,11 +1,11 @@ | |||
| 1 | { userName, pkgs, customUtils, lib, config, ... }: | 1 | { userName, pkgs, customUtils, lib, ... }: |
| 2 | { | 2 | { |
| 3 | config = { | 3 | config = { |
| 4 | nixpkgs.externalConfig.allowUnfreePackages = [ | 4 | nixpkgs.externalConfig.allowUnfreePackages = [ |
| 5 | "zsh-abbr" | 5 | "zsh-abbr" |
| 6 | ]; | 6 | ]; |
| 7 | 7 | ||
| 8 | home-manager.users.${userName} = let sysConfig = config; in { config, ... }: { | 8 | home-manager.users.${userName} = { sysConfig, config, ... }: { |
| 9 | config = { | 9 | config = { |
| 10 | programs.zsh = { | 10 | programs.zsh = { |
| 11 | dotDir = "${config.xdg.configHome}/zsh"; | 11 | dotDir = "${config.xdg.configHome}/zsh"; |
diff --git a/users/gkleen/default.nix b/users/gkleen/default.nix index 9f606ea4..66930d4e 100644 --- a/users/gkleen/default.nix +++ b/users/gkleen/default.nix | |||
| @@ -8,7 +8,7 @@ in { | |||
| 8 | 8 | ||
| 9 | users.users.${userName} = { | 9 | users.users.${userName} = { |
| 10 | description = "Gregor Kleen"; | 10 | description = "Gregor Kleen"; |
| 11 | extraGroups = [ "wheel" "networkmanager" "lp" "dialout" "audio" "video" "xmpp" "mail" "ssh" "vboxusers" "libvirtd" "wireshark" "games" "webdav"]; | 11 | extraGroups = [ "users" "wheel" "networkmanager" "lp" "dialout" "audio" "video" "xmpp" "mail" "ssh" "vboxusers" "libvirtd" "wireshark" "games" "webdav"]; |
| 12 | createHome = true; | 12 | createHome = true; |
| 13 | home = "/home/${userName}"; | 13 | home = "/home/${userName}"; |
| 14 | shell = "${pkgs.zsh}/bin/zsh"; | 14 | shell = "${pkgs.zsh}/bin/zsh"; |
| @@ -80,20 +80,20 @@ in { | |||
| 80 | }; | 80 | }; |
| 81 | ssh = { | 81 | ssh = { |
| 82 | enableDefaultConfig = false; | 82 | enableDefaultConfig = false; |
| 83 | matchBlocks."*" = { | 83 | settings."*" = { |
| 84 | forwardAgent = false; | 84 | ForwardAgent = false; |
| 85 | addKeysToAgent = "no"; | 85 | AddKeysToAgent = "no"; |
| 86 | compression = false; | 86 | Compression = false; |
| 87 | userKnownHostsFile = "~/.ssh/known_hosts"; | 87 | UserKnownHostsFile = "~/.ssh/known_hosts"; |
| 88 | 88 | ||
| 89 | # controlMaster = "auto"; | 89 | # ControlMaster = "auto"; |
| 90 | # controlPersist = "30m"; | 90 | # ControlPersist = "30m"; |
| 91 | # controlPath = "~/.ssh/master-%r@%n:%p"; | 91 | # ControlPath = "~/.ssh/master-%r@%n:%p"; |
| 92 | 92 | ||
| 93 | serverAliveInterval = 6; | 93 | ServerAliveInterval = 6; |
| 94 | serverAliveCountMax = 10; | 94 | ServerAliveCountMax = 10; |
| 95 | hashKnownHosts = true; | 95 | HashKnownHosts = true; |
| 96 | identitiesOnly = true; | 96 | IdentitiesOnly = true; |
| 97 | }; | 97 | }; |
| 98 | }; | 98 | }; |
| 99 | }; | 99 | }; |
diff --git a/users/root.nix b/users/root.nix index a56c3c51..15dcd687 100644 --- a/users/root.nix +++ b/users/root.nix | |||
| @@ -80,20 +80,20 @@ in { | |||
| 80 | }; | 80 | }; |
| 81 | ssh = { | 81 | ssh = { |
| 82 | enableDefaultConfig = false; | 82 | enableDefaultConfig = false; |
| 83 | matchBlocks."*" = { | 83 | settings."*" = { |
| 84 | forwardAgent = false; | 84 | ForwardAgent = false; |
| 85 | addKeysToAgent = "no"; | 85 | AddKeysToAgent = "no"; |
| 86 | compression = false; | 86 | Compression = false; |
| 87 | userKnownHostsFile = "~/.ssh/known_hosts"; | 87 | UserKnownHostsFile = "~/.ssh/known_hosts"; |
| 88 | 88 | ||
| 89 | # controlMaster = "auto"; | 89 | # ControlMaster = "auto"; |
| 90 | # controlPersist = "30m"; | 90 | # ControlPersist = "30m"; |
| 91 | # controlPath = "~/.ssh/master-%r@%n:%p"; | 91 | # ControlPath = "~/.ssh/master-%r@%n:%p"; |
| 92 | 92 | ||
| 93 | serverAliveInterval = 6; | 93 | ServerAliveInterval = 6; |
| 94 | serverAliveCountMax = 10; | 94 | ServerAliveCountMax = 10; |
| 95 | hashKnownHosts = true; | 95 | HashKnownHosts = true; |
| 96 | identitiesOnly = true; | 96 | IdentitiesOnly = true; |
| 97 | }; | 97 | }; |
| 98 | }; | 98 | }; |
| 99 | }; | 99 | }; |
