Compare commits
32 Commits
d80266e89a
...
noctilia-e
| Author | SHA1 | Date | |
|---|---|---|---|
| 80d7fc08cc | |||
| 8ccb9205bf | |||
| 51ad90dc9c | |||
| 248b2f1dbb | |||
| c258681d10 | |||
| 5314aba270 | |||
| 0f00938787 | |||
| 6cbbd0110d | |||
| 01cc53fff1 | |||
| 7501159100 | |||
| 727462ffd3 | |||
| 7446d8c239 | |||
| 085e02f539 | |||
| 9d9ed0f04b | |||
| 28daa28c6b | |||
| b8a7ead4be | |||
| 2881d84c16 | |||
| 591e42fe61 | |||
| f21640749a | |||
| 0b9623241a | |||
| 7a6e3916f5 | |||
| 43c657523e | |||
| 594accfe8d | |||
| 86c5e8ad5b | |||
| f7fe35b3be | |||
| 629e7b6a9e | |||
| 29c62adbd1 | |||
| 5747e449b2 | |||
| 087ffd4194 | |||
| 7a2382cb3c | |||
| be74b351e8 | |||
| 8d3fd7dbe2 |
@@ -192,6 +192,9 @@ git add .
|
||||
- `animChoice` - system animation style.
|
||||
|
||||
### 5. Review module activation options
|
||||
|
||||
Also check my new project - [GarandOS TUI](https://gitea.garandplg.com/GarandPLG/garandos-tui)! It's an automated way of tweaking this settings. You can use it later *(simply type `tui` into the terminal)*, after the setup, or use it right now by cloning the repo.
|
||||
|
||||
Open the module files for your host and adjust the `enable` options for the services you need:
|
||||
|
||||
```bash
|
||||
|
||||
282
flake.lock
generated
282
flake.lock
generated
@@ -15,11 +15,11 @@
|
||||
"treefmt-nix": "treefmt-nix"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1764195413,
|
||||
"narHash": "sha256-YNehE1Vq7Gntrpl6FYwfHU+8U/5v5OaS/KtiB35AWfE=",
|
||||
"lastModified": 1767916874,
|
||||
"narHash": "sha256-IcvLwoF1CIOd7yELc0Xwqskilw2FxHHRm5ZnmNdBuKc=",
|
||||
"owner": "mrshmllow",
|
||||
"repo": "affinity-nix",
|
||||
"rev": "5312de0bb4808e256a346c58ab3607bd7ffc924b",
|
||||
"rev": "0c110a15fb5605490f7de451073db1c775745fee",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -35,11 +35,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1763546214,
|
||||
"narHash": "sha256-vc9seqvw2ElF8jPetsCoCQ5lo9P3fmgiTle3HlOMezk=",
|
||||
"lastModified": 1769608722,
|
||||
"narHash": "sha256-yWUG0Emd9EuqIZ8jQ6fxqf7USw7Gtcqb4+sBhn+S+Wg=",
|
||||
"owner": "AdnanHodzic",
|
||||
"repo": "auto-cpufreq",
|
||||
"rev": "76ccb66f8e4875671fd746fb6b50931454ab8cd8",
|
||||
"rev": "a11a98c46bf6a77d0c2e0ea8d87acef78507cae5",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -69,28 +69,28 @@
|
||||
"base16-fish": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1754405784,
|
||||
"narHash": "sha256-l9xHIy+85FN+bEo6yquq2IjD1rSg9fjfjpyGP1W8YXo=",
|
||||
"lastModified": 1765809053,
|
||||
"narHash": "sha256-XCUQLoLfBJ8saWms2HCIj4NEN+xNsWBlU1NrEPcQG4s=",
|
||||
"owner": "tomyun",
|
||||
"repo": "base16-fish",
|
||||
"rev": "23ae20a0093dca0d7b39d76ba2401af0ccf9c561",
|
||||
"rev": "86cbea4dca62e08fb7fd83a70e96472f92574782",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "tomyun",
|
||||
"repo": "base16-fish",
|
||||
"rev": "23ae20a0093dca0d7b39d76ba2401af0ccf9c561",
|
||||
"rev": "86cbea4dca62e08fb7fd83a70e96472f92574782",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"base16-helix": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1752979451,
|
||||
"narHash": "sha256-0CQM+FkYy0fOO/sMGhOoNL80ftsAzYCg9VhIrodqusM=",
|
||||
"lastModified": 1760703920,
|
||||
"narHash": "sha256-m82fGUYns4uHd+ZTdoLX2vlHikzwzdu2s2rYM2bNwzw=",
|
||||
"owner": "tinted-theming",
|
||||
"repo": "base16-helix",
|
||||
"rev": "27cf1e66e50abc622fb76a3019012dc07c678fac",
|
||||
"rev": "d646af9b7d14bff08824538164af99d0c521b185",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -135,6 +135,28 @@
|
||||
"type": "gitlab"
|
||||
}
|
||||
},
|
||||
"fenix": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"garandos-tui",
|
||||
"nixpkgs"
|
||||
],
|
||||
"rust-analyzer-src": "rust-analyzer-src"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1762929886,
|
||||
"narHash": "sha256-TQZ3Ugb1FoHpTSc8KLrzN4njIZU4FemAMHyS4M3mt6s=",
|
||||
"owner": "nix-community",
|
||||
"repo": "fenix",
|
||||
"rev": "6998514dce2c365142a0a119a95ef95d89b84086",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-community",
|
||||
"repo": "fenix",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"firefox-addons": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
@@ -143,11 +165,11 @@
|
||||
},
|
||||
"locked": {
|
||||
"dir": "pkgs/firefox-addons",
|
||||
"lastModified": 1764389080,
|
||||
"narHash": "sha256-BEn1Z9Uv20u2DS6wzLKdzx5kAzynM3wMQ9JnGf3VJvI=",
|
||||
"lastModified": 1769918637,
|
||||
"narHash": "sha256-3XyGk89S0UFvKRZiKpFL4ImP5qP/2AOJUaYC7ogXnJo=",
|
||||
"owner": "rycee",
|
||||
"repo": "nur-expressions",
|
||||
"rev": "897437c09bf22ce59efb3370f0783d0c662dba31",
|
||||
"rev": "5659e4c18d1350d1b511fcdce885fdd879effa22",
|
||||
"type": "gitlab"
|
||||
},
|
||||
"original": {
|
||||
@@ -160,11 +182,11 @@
|
||||
"firefox-gnome-theme": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1758112371,
|
||||
"narHash": "sha256-lizRM2pj6PHrR25yimjyFn04OS4wcdbc38DCdBVa2rk=",
|
||||
"lastModified": 1764873433,
|
||||
"narHash": "sha256-1XPewtGMi+9wN9Ispoluxunw/RwozuTRVuuQOmxzt+A=",
|
||||
"owner": "rafaelmardojai",
|
||||
"repo": "firefox-gnome-theme",
|
||||
"rev": "0909cfe4a2af8d358ad13b20246a350e14c2473d",
|
||||
"rev": "f7ffd917ac0d253dbd6a3bf3da06888f57c69f92",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -189,15 +211,15 @@
|
||||
"flake-compat_2": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1747046372,
|
||||
"narHash": "sha256-CIVLLkVgvHYbgI2UpXvIIBJ12HWgX+fjA8Xf8PUmqCY=",
|
||||
"owner": "edolstra",
|
||||
"lastModified": 1767039857,
|
||||
"narHash": "sha256-vNpUSpF5Nuw8xvDLj2KCwwksIbjua2LZCqhV1LNRDns=",
|
||||
"owner": "NixOS",
|
||||
"repo": "flake-compat",
|
||||
"rev": "9100a0f413b0c601e0533d1d94ffd501ce2e7885",
|
||||
"rev": "5edf11c44bc78a0d334f6334cdaf7d60d732daab",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "edolstra",
|
||||
"owner": "NixOS",
|
||||
"repo": "flake-compat",
|
||||
"type": "github"
|
||||
}
|
||||
@@ -207,11 +229,11 @@
|
||||
"nixpkgs-lib": "nixpkgs-lib"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1762980239,
|
||||
"narHash": "sha256-8oNVE8TrD19ulHinjaqONf9QWCKK+w4url56cdStMpM=",
|
||||
"lastModified": 1767609335,
|
||||
"narHash": "sha256-feveD98mQpptwrAEggBQKJTYbvwwglSbOv53uCfH9PY=",
|
||||
"owner": "hercules-ci",
|
||||
"repo": "flake-parts",
|
||||
"rev": "52a2caecc898d0b46b2b905f058ccc5081f842da",
|
||||
"rev": "250481aafeb741edfe23d29195671c19b36b6dca",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -227,11 +249,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1756770412,
|
||||
"narHash": "sha256-+uWLQZccFHwqpGqr2Yt5VsW/PbeJVTn9Dk6SHWhNRPw=",
|
||||
"lastModified": 1767609335,
|
||||
"narHash": "sha256-feveD98mQpptwrAEggBQKJTYbvwwglSbOv53uCfH9PY=",
|
||||
"owner": "hercules-ci",
|
||||
"repo": "flake-parts",
|
||||
"rev": "4524271976b625a4a605beefd893f270620fd751",
|
||||
"rev": "250481aafeb741edfe23d29195671c19b36b6dca",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -256,6 +278,29 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"garandos-tui": {
|
||||
"inputs": {
|
||||
"fenix": "fenix",
|
||||
"naersk": "naersk",
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1765060905,
|
||||
"narHash": "sha256-YLU5g2aSs1Sh+6j301BtQYUdQ8IqLvoeR4Eivr4eVYc=",
|
||||
"ref": "main",
|
||||
"rev": "028b50c9e4d7160cfa8fac8150a54a52680f4ff5",
|
||||
"revCount": 13,
|
||||
"type": "git",
|
||||
"url": "https://gitea.garandplg.com/GarandPLG/garandos-tui"
|
||||
},
|
||||
"original": {
|
||||
"ref": "main",
|
||||
"type": "git",
|
||||
"url": "https://gitea.garandplg.com/GarandPLG/garandos-tui"
|
||||
}
|
||||
},
|
||||
"git-hooks": {
|
||||
"inputs": {
|
||||
"flake-compat": "flake-compat_2",
|
||||
@@ -265,11 +310,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1763319842,
|
||||
"narHash": "sha256-YG19IyrTdnVn0l3DvcUYm85u3PaqBt6tI6VvolcuHnA=",
|
||||
"lastModified": 1767281941,
|
||||
"narHash": "sha256-6MkqajPICgugsuZ92OMoQcgSHnD6sJHwk8AxvMcIgTE=",
|
||||
"owner": "cachix",
|
||||
"repo": "git-hooks.nix",
|
||||
"rev": "7275fa67fbbb75891c16d9dee7d88e58aea2d761",
|
||||
"rev": "f0927703b7b1c8d97511c4116eb9b4ec6645a0fa",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -302,11 +347,11 @@
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"host": "gitlab.gnome.org",
|
||||
"lastModified": 1762869044,
|
||||
"narHash": "sha256-nwm/GJ2Syigf7VccLAZ66mFC8mZJFqpJmIxSGKl7+Ds=",
|
||||
"lastModified": 1767737596,
|
||||
"narHash": "sha256-eFujfIUQDgWnSJBablOuG+32hCai192yRdrNHTv0a+s=",
|
||||
"owner": "GNOME",
|
||||
"repo": "gnome-shell",
|
||||
"rev": "680e3d195a92203f28d4bf8c6e8bb537cc3ed4ad",
|
||||
"rev": "ef02db02bf0ff342734d525b5767814770d85b49",
|
||||
"type": "gitlab"
|
||||
},
|
||||
"original": {
|
||||
@@ -324,11 +369,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1764361670,
|
||||
"narHash": "sha256-jgWzgpIaHbL3USIq0gihZeuy1lLf2YSfwvWEwnfAJUw=",
|
||||
"lastModified": 1769952507,
|
||||
"narHash": "sha256-eNTfxT3v8b7s1dqswgposi5Y1CUMoOUhQKiy29QY25U=",
|
||||
"owner": "nix-community",
|
||||
"repo": "home-manager",
|
||||
"rev": "780be8ef503a28939cf9dc7996b48ffb1a3e04c6",
|
||||
"rev": "b59376563943ce163b2553aeb63d0c170967d74e",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -341,11 +386,11 @@
|
||||
"libnbtplusplus": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1699286814,
|
||||
"narHash": "sha256-yy0q+bky80LtK1GWzz7qpM+aAGrOqLuewbid8WT1ilk=",
|
||||
"lastModified": 1744811532,
|
||||
"narHash": "sha256-qhmjaRkt+O7A+gu6HjUkl7QzOEb4r8y8vWZMG2R/C6o=",
|
||||
"owner": "PrismLauncher",
|
||||
"repo": "libnbtplusplus",
|
||||
"rev": "23b955121b8217c1c348a9ed2483167a6f3ff4ad",
|
||||
"rev": "531449ba1c930c98e0bcf5d332b237a8566f9d78",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -354,13 +399,38 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"naersk": {
|
||||
"inputs": {
|
||||
"fenix": [
|
||||
"garandos-tui",
|
||||
"fenix"
|
||||
],
|
||||
"nixpkgs": [
|
||||
"garandos-tui",
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1752689277,
|
||||
"narHash": "sha256-uldUBFkZe/E7qbvxa3mH1ItrWZyT6w1dBKJQF/3ZSsc=",
|
||||
"owner": "nix-community",
|
||||
"repo": "naersk",
|
||||
"rev": "0e72363d0938b0208d6c646d10649164c43f4d64",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-community",
|
||||
"repo": "naersk",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nix-flatpak": {
|
||||
"locked": {
|
||||
"lastModified": 1739444422,
|
||||
"narHash": "sha256-iAVVHi7X3kWORftY+LVbRiStRnQEob2TULWyjMS6dWg=",
|
||||
"lastModified": 1767983141,
|
||||
"narHash": "sha256-7ZCulYUD9RmJIDULTRkGLSW1faMpDlPKcbWJLYHoXcs=",
|
||||
"owner": "gmodena",
|
||||
"repo": "nix-flatpak",
|
||||
"rev": "5e54c3ca05a7c7d968ae1ddeabe01d2a9bc1e177",
|
||||
"rev": "440818969ac2cbd77bfe025e884d0aa528991374",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -372,11 +442,11 @@
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1764242076,
|
||||
"narHash": "sha256-sKoIWfnijJ0+9e4wRvIgm/HgE27bzwQxcEmo2J/gNpI=",
|
||||
"lastModified": 1769789167,
|
||||
"narHash": "sha256-kKB3bqYJU5nzYeIROI82Ef9VtTbu4uA3YydSk/Bioa8=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "2fad6eac6077f03fe109c4d4eb171cf96791faa4",
|
||||
"rev": "62c8382960464ceb98ea593cb8321a2cf8f9e3e5",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -388,11 +458,11 @@
|
||||
},
|
||||
"nixpkgs-lib": {
|
||||
"locked": {
|
||||
"lastModified": 1761765539,
|
||||
"narHash": "sha256-b0yj6kfvO8ApcSE+QmA6mUfu8IYG6/uU28OFn4PaC8M=",
|
||||
"lastModified": 1765674936,
|
||||
"narHash": "sha256-k00uTP4JNfmejrCLJOwdObYC9jHRrr/5M/a/8L2EIdo=",
|
||||
"owner": "nix-community",
|
||||
"repo": "nixpkgs.lib",
|
||||
"rev": "719359f4562934ae99f5443f20aa06c2ffff91fc",
|
||||
"rev": "2075416fcb47225d9b68ac469a5c4801a9c4dd85",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -417,6 +487,26 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"noctalia": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1769983098,
|
||||
"narHash": "sha256-PKej3N1BxAoKzusrdWuS9gT8bXW0U/Zk8RkedsP3qYc=",
|
||||
"owner": "noctalia-dev",
|
||||
"repo": "noctalia-shell",
|
||||
"rev": "2a98d04b2f5e251935ba296c0d7dc374bdc5e32d",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "noctalia-dev",
|
||||
"repo": "noctalia-shell",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nur": {
|
||||
"inputs": {
|
||||
"flake-parts": [
|
||||
@@ -428,11 +518,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1758998580,
|
||||
"narHash": "sha256-VLx0z396gDCGSiowLMFz5XRO/XuNV+4EnDYjdJhHvUk=",
|
||||
"lastModified": 1767810917,
|
||||
"narHash": "sha256-ZKqhk772+v/bujjhla9VABwcvz+hB2IaRyeLT6CFnT0=",
|
||||
"owner": "nix-community",
|
||||
"repo": "NUR",
|
||||
"rev": "ba8d9c98f5f4630bcb0e815ab456afd90c930728",
|
||||
"rev": "dead29c804adc928d3a69dfe7f9f12d0eec1f1a4",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -444,11 +534,11 @@
|
||||
"on-linux": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1763514293,
|
||||
"narHash": "sha256-x766SlDqS6DoOQyW4u1zV3iZbrEKoy4P9K6XDjZ4fGU=",
|
||||
"lastModified": 1766544016,
|
||||
"narHash": "sha256-3X1426N7n6bwM7GAQOvpCq2OVdlQevCzbpak0l9B6BU=",
|
||||
"owner": "seapear",
|
||||
"repo": "AffinityOnLinux",
|
||||
"rev": "2eacfdf625bfafa3099d411f8e2d5afec565fcd6",
|
||||
"rev": "da601564dfefe2ae3ec10e3f177db81578847b7b",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -477,11 +567,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1747683146,
|
||||
"narHash": "sha256-zZS//xyNYQHvD4fUMoWx86uVUwPk+p5FjZLTTu0pelQ=",
|
||||
"lastModified": 1768437816,
|
||||
"narHash": "sha256-GG+V2g5NfVrypTs8qbtGnUWTXTMkGtohy/uIDa5duI0=",
|
||||
"owner": "Diegiwg",
|
||||
"repo": "PrismLauncher-Cracked",
|
||||
"rev": "0612187254ef41a1087f3107e927e0dd59c9b29d",
|
||||
"rev": "e8418b74059bdbe4fcc97522b25dc17373b0cc21",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -495,11 +585,31 @@
|
||||
"affinity-nix": "affinity-nix",
|
||||
"auto-cpufreq": "auto-cpufreq",
|
||||
"firefox-addons": "firefox-addons",
|
||||
"garandos-tui": "garandos-tui",
|
||||
"home-manager": "home-manager",
|
||||
"nix-flatpak": "nix-flatpak",
|
||||
"nixpkgs": "nixpkgs",
|
||||
"noctalia": "noctalia",
|
||||
"prismlauncher-cracked": "prismlauncher-cracked",
|
||||
"stylix": "stylix"
|
||||
"stylix": "stylix",
|
||||
"wrappers": "wrappers"
|
||||
}
|
||||
},
|
||||
"rust-analyzer-src": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1762860488,
|
||||
"narHash": "sha256-rMfWMCOo/pPefM2We0iMBLi2kLBAnYoB9thi4qS7uk4=",
|
||||
"owner": "rust-lang",
|
||||
"repo": "rust-analyzer",
|
||||
"rev": "2efc80078029894eec0699f62ec8d5c1a56af763",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "rust-lang",
|
||||
"ref": "nightly",
|
||||
"repo": "rust-analyzer",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"stylix": {
|
||||
@@ -523,11 +633,11 @@
|
||||
"tinted-zed": "tinted-zed"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1764254063,
|
||||
"narHash": "sha256-V22JzkaTLF/GAL2LgqvOsJhAr8JbJsKaD8hnHjGwXfE=",
|
||||
"lastModified": 1769888473,
|
||||
"narHash": "sha256-4KWbaJwaYnZ60bFyTudZYAKskjr7Sa17R3/yh+oXS7w=",
|
||||
"owner": "danth",
|
||||
"repo": "stylix",
|
||||
"rev": "a1451bc40413870f0c7b576b751c1ca92055e323",
|
||||
"rev": "ae5c0239ae4f82a8c7e33ad8a456535d5a9ba813",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -587,11 +697,11 @@
|
||||
"tinted-schemes": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1757716333,
|
||||
"narHash": "sha256-d4km8W7w2zCUEmPAPUoLk1NlYrGODuVa3P7St+UrqkM=",
|
||||
"lastModified": 1767710407,
|
||||
"narHash": "sha256-+W1EB79Jl0/gm4JqmO0Nuc5C7hRdp4vfsV/VdzI+des=",
|
||||
"owner": "tinted-theming",
|
||||
"repo": "schemes",
|
||||
"rev": "317a5e10c35825a6c905d912e480dfe8e71c7559",
|
||||
"rev": "2800e2b8ac90f678d7e4acebe4fa253f602e05b2",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -603,11 +713,11 @@
|
||||
"tinted-tmux": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1757811970,
|
||||
"narHash": "sha256-n5ZJgmzGZXOD9pZdAl1OnBu3PIqD+X3vEBUGbTi4JiI=",
|
||||
"lastModified": 1767489635,
|
||||
"narHash": "sha256-e6nnFnWXKBCJjCv4QG4bbcouJ6y3yeT70V9MofL32lU=",
|
||||
"owner": "tinted-theming",
|
||||
"repo": "tinted-tmux",
|
||||
"rev": "d217ba31c846006e9e0ae70775b0ee0f00aa6b1e",
|
||||
"rev": "3c32729ccae99be44fe8a125d20be06f8d7d8184",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -619,11 +729,11 @@
|
||||
"tinted-zed": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1757811247,
|
||||
"narHash": "sha256-4EFOUyLj85NRL3OacHoLGEo0wjiRJzfsXtR4CZWAn6w=",
|
||||
"lastModified": 1767488740,
|
||||
"narHash": "sha256-wVOj0qyil8m+ouSsVZcNjl5ZR+1GdOOAooAatQXHbuU=",
|
||||
"owner": "tinted-theming",
|
||||
"repo": "base16-zed",
|
||||
"rev": "824fe0aacf82b3c26690d14e8d2cedd56e18404e",
|
||||
"rev": "11abb0b282ad3786a2aae088d3a01c60916f2e40",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -639,11 +749,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1762938485,
|
||||
"narHash": "sha256-AlEObg0syDl+Spi4LsZIBrjw+snSVU4T8MOeuZJUJjM=",
|
||||
"lastModified": 1767801790,
|
||||
"narHash": "sha256-QfX6g3Wj2vQe7oBJEbTf0npvC6sJoDbF9hb2+gM5tf8=",
|
||||
"owner": "numtide",
|
||||
"repo": "treefmt-nix",
|
||||
"rev": "5b4ee75aeefd1e2d5a1cc43cf6ba65eba75e83e4",
|
||||
"rev": "778a1d691f1ef45dd68c661715c5bf8cbf131c80",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -651,6 +761,26 @@
|
||||
"repo": "treefmt-nix",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"wrappers": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1769799671,
|
||||
"narHash": "sha256-b1LwqiIjgNLw6/aJlOwIqe1mfqc4PQqeRpKOo5sFWu0=",
|
||||
"owner": "lassulus",
|
||||
"repo": "wrappers",
|
||||
"rev": "8bef93dddd89a0b45486d5cd9f0bdd5ce8aceced",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "lassulus",
|
||||
"repo": "wrappers",
|
||||
"type": "github"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
|
||||
17
flake.nix
17
flake.nix
@@ -49,12 +49,28 @@
|
||||
};
|
||||
|
||||
nix-flatpak.url = "github:gmodena/nix-flatpak?ref=latest";
|
||||
|
||||
garandos-tui = {
|
||||
url = "git+https://gitea.garandplg.com/GarandPLG/garandos-tui?ref=main";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
|
||||
wrappers = {
|
||||
url = "github:lassulus/wrappers";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
|
||||
noctalia = {
|
||||
url = "github:noctalia-dev/noctalia-shell";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
};
|
||||
|
||||
outputs = {
|
||||
nixpkgs,
|
||||
nix-flatpak,
|
||||
auto-cpufreq,
|
||||
garandos-tui,
|
||||
...
|
||||
} @ inputs: let
|
||||
hostDirs = builtins.attrNames (builtins.readDir ./hosts);
|
||||
@@ -81,6 +97,7 @@
|
||||
./profiles/${profile}
|
||||
nix-flatpak.nixosModules.nix-flatpak
|
||||
auto-cpufreq.nixosModules.default
|
||||
garandos-tui.nixosModules.garandos-tui
|
||||
];
|
||||
};
|
||||
in {
|
||||
|
||||
@@ -2,65 +2,65 @@ _: {
|
||||
/*
|
||||
Development editors and IDEs
|
||||
*/
|
||||
# VSCodium: a free and open-source "demicrosofted" VSCode
|
||||
vscodium.enable = false;
|
||||
# Zed Editor: a modern, high‑performance code editor
|
||||
vscodium.enable = false; # VSCodium: a free and open-source "demicrosofted" VSCode
|
||||
zed-editor = {
|
||||
# Enable Zed Editor
|
||||
enable = true;
|
||||
# Remote Server: enable remote editing capabilities
|
||||
remote-server = true;
|
||||
enable = true; # Zed Editor: a modern, high‑performance code editor
|
||||
remote-server.enable = true; # Remote Server: enable remote editing capabilities
|
||||
};
|
||||
|
||||
/*
|
||||
Web browsers
|
||||
*/
|
||||
# Librewolf: a privacy-focused Firefox fork
|
||||
librewolf.enable = true;
|
||||
# Ungoogled Chromium: a privacy-focused Chromium fork
|
||||
ungoogled-chromium.enable = true;
|
||||
librewolf.enable = true; # Librewolf: a privacy-focused Firefox fork
|
||||
ungoogled-chromium.enable = true; # Ungoogled Chromium: a privacy-focused Chromium fork
|
||||
|
||||
/*
|
||||
System utilities
|
||||
*/
|
||||
# Btop: a resource monitor for the terminal
|
||||
btop.enable = true;
|
||||
# Cava: terminal audio visualizer
|
||||
cava.enable = false;
|
||||
# Fastfetch: a fast system information tool
|
||||
fastfetch.enable = true;
|
||||
btop.enable = true; # Btop: a resource monitor for the terminal
|
||||
cava.enable = false; # Cava: terminal audio visualizer
|
||||
fastfetch.enable = true; # Fastfetch: a fast system information tool
|
||||
peaclock.enable = true; # Peaclock: Clock, timer, and stopwatch for the terminal
|
||||
|
||||
/*
|
||||
Communication and synchronization
|
||||
*/
|
||||
# KDE Connect: integrate your phone and desktop
|
||||
kdeconnect.enable = false;
|
||||
# Nextcloud Client: sync files with a Nextcloud server
|
||||
nextcloud-client.enable = true;
|
||||
# Vesktop: a community‑driven Discord client
|
||||
vesktop.enable = true;
|
||||
kdeconnect.enable = false; # KDE Connect: integrate your phone and desktop
|
||||
nextcloud-client.enable = true; # Nextcloud Client: sync files with a Nextcloud server
|
||||
vesktop.enable = true; # Vesktop: a community‑driven Discord client
|
||||
|
||||
/*
|
||||
Gaming
|
||||
*/
|
||||
# Lutris: an open gaming platform
|
||||
lutris.enable = false;
|
||||
lutris.enable = false; # Lutris: an open gaming platform
|
||||
|
||||
/*
|
||||
Media recording and streaming
|
||||
*/
|
||||
# OBS Studio: streaming and recording software
|
||||
obs-studio.enable = false;
|
||||
obs-studio.enable = false; # OBS Studio: streaming and recording software
|
||||
|
||||
/*
|
||||
Office suite
|
||||
*/
|
||||
# OnlyOffice: an office suite compatible with Microsoft formats
|
||||
onlyoffice.enable = true;
|
||||
onlyoffice.enable = true; # OnlyOffice: an office suite compatible with Microsoft formats
|
||||
|
||||
/*
|
||||
Learning tools
|
||||
*/
|
||||
# Anki: spaced‑repetition flashcard program
|
||||
anki.enable = true;
|
||||
anki.enable = true; # Anki: spaced‑repetition flashcard program
|
||||
|
||||
/*
|
||||
XDG desktop entries (PWA)
|
||||
*/
|
||||
xdgDesktopEntries = {
|
||||
enable = true; # Enable XDG desktop entries
|
||||
entries = {
|
||||
messenger.enable = true; # Messenger: Facebook Messenger
|
||||
mastodon.enable = true; # Mastodon: a decentralized social network
|
||||
garandcloud.enable = true; # GarandCloud: my Nextcloud instance
|
||||
chatgpt.enable = true; # ChatGPT: a large language model
|
||||
claude.enable = true; # Claude: a large language model
|
||||
glance.enable = true; # Glance: my home server dashboard
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
@@ -2,86 +2,89 @@ _: {
|
||||
/*
|
||||
Container & Packaging
|
||||
*/
|
||||
# Docker: container runtime and management
|
||||
docker.enable = true;
|
||||
# Distrobox: containerized development environments
|
||||
distrobox.enable = false;
|
||||
# Flatpak: universal packaging system for Linux
|
||||
flatpak.enable = true;
|
||||
# Lazydocker: simple TUI for Docker
|
||||
lazydocker.enable = false;
|
||||
docker.enable = true; # Docker: container runtime and management
|
||||
virtualbox.enable = true; # VirtualBox: PC emulator
|
||||
flatpak = {
|
||||
enable = true; # Flatpak: universal packaging system for Linux
|
||||
packages = {
|
||||
sober.enable = false; # Roblox client
|
||||
warehouse.enable = true; # Flatpak manager
|
||||
flatseal.enable = true; # Flatpak permissions manager
|
||||
};
|
||||
};
|
||||
|
||||
/*
|
||||
Networking
|
||||
*/
|
||||
tailscale.enable = true; # Tailscale: secure network for remote access
|
||||
|
||||
/*
|
||||
Gaming
|
||||
*/
|
||||
# GameMode: optimizes system performance for gaming
|
||||
gamemode.enable = true;
|
||||
# Gamescope: micro-compositor for games
|
||||
gamescope.enable = false;
|
||||
# Prism Launcher: Minecraft modded launcher
|
||||
prismlauncher.enable = false;
|
||||
# Steam: platform for buying and playing games
|
||||
steam.enable = true;
|
||||
# SpaceCadet Pinball: classic pinball game
|
||||
spaceCadetPinball.enable = true;
|
||||
# TTY Solitaire: terminal based solitaire game
|
||||
ttySolitaire.enable = true;
|
||||
gamemode.enable = true; # GameMode: optimizes system performance for gaming
|
||||
gamescope.enable = false; # Gamescope: micro‑compositor for games
|
||||
steam.enable = true; # Steam: platform for buying and playing games
|
||||
|
||||
packages = {
|
||||
/*
|
||||
Container & Packaging
|
||||
*/
|
||||
distrobox.enable = false; # Distrobox: containerized development environments
|
||||
lazydocker.enable = false; # Lazydocker: simple TUI for Docker
|
||||
bottles.enable = false; # Bottles: Easy-to-use wineprefix manager
|
||||
|
||||
/*
|
||||
Gaming
|
||||
*/
|
||||
prismlauncher.enable = true; # Prism Launcher: Minecraft modded launcher
|
||||
spaceCadetPinball.enable = true; # SpaceCadet Pinball: classic pinball game
|
||||
ttySolitaire.enable = true; # TTY Solitaire: terminal‑based solitaire game
|
||||
heroic.enable = false; # Native GOG, Epic, and Amazon Games Launcher for Linux, Windows and Mac
|
||||
|
||||
/*
|
||||
Development Tools
|
||||
*/
|
||||
# Exercism: coding practice platform
|
||||
exercism.enable = true;
|
||||
# Gedit: GNOME text editor
|
||||
gedit.enable = false;
|
||||
# Lazygit: simple TUI for git
|
||||
lazygit.enable = false;
|
||||
# OpenCode: tools for coding and development
|
||||
opencode.enable = true;
|
||||
exercism.enable = true; # Exercism: coding practice platform
|
||||
lazygit.enable = false; # Lazygit: simple TUI for Git
|
||||
opencode.enable = false; # OpenCode: tools for coding and development
|
||||
jan.enable = true; # Jan: AI chat UI
|
||||
logisim-evolution.enable = true; # Logisim-Evolution: Digital logic designer and simulator
|
||||
|
||||
/*
|
||||
Communication & Collaboration
|
||||
*/
|
||||
# Mattermost: open-source Slack alternative
|
||||
mattermost.enable = true;
|
||||
# Slack: team communication and collaboration tool
|
||||
slack.enable = true;
|
||||
# Tutanota: secure email client
|
||||
tutanota.enable = true;
|
||||
mattermost.enable = true; # Mattermost: open‑source Slack alternative
|
||||
slack.enable = true; # Slack: team communication and collaboration tool
|
||||
tutanota.enable = true; # Tutanota: secure email client
|
||||
signal.enable = true; # Signal: secure messaging app
|
||||
teams.enable = true; # Teams-for-linux: Unofficial Microsoft Teams client for Linux
|
||||
ferdium.enable = false; # Ferdium: All your services in one place built by the community
|
||||
|
||||
/*
|
||||
Productivity / Knowledge Management
|
||||
*/
|
||||
# Bitwarden: password manager (desktop)
|
||||
bitwarden.enable = false;
|
||||
# Iotas: lightweight notes manager
|
||||
iotas.enable = true;
|
||||
# Logseq: knowledge base and outliner
|
||||
logseq.enable = false;
|
||||
bitwarden.enable = false; # Bitwarden: password manager (desktop)
|
||||
iotas.enable = true; # Iotas: lightweight notes manager
|
||||
logseq.enable = false; # Logseq: knowledge base and outliner
|
||||
|
||||
/*
|
||||
Media & Graphics
|
||||
*/
|
||||
# Affinity: professional graphics suite
|
||||
affinity.enable = false;
|
||||
# Eye of GNOME: image viewer
|
||||
eyeOfGnome.enable = true;
|
||||
# FreeTube: privacy‑friendly YouTube client
|
||||
freetube.enable = false;
|
||||
# GIMP: gnu image manipulation program
|
||||
gimp.enable = false;
|
||||
# Kdenlive: video editing software
|
||||
kdenlive.enable = false;
|
||||
# Plex: media player and server client
|
||||
plex.enable = true;
|
||||
affinity.enable = false; # Affinity: professional graphics suite
|
||||
eyeOfGnome.enable = true; # Eye of GNOME: image viewer
|
||||
freetube.enable = false; # FreeTube: privacy‑friendly YouTube client
|
||||
gimp.enable = false; # GIMP: GNU Image Manipulation Program
|
||||
kdenlive.enable = false; # Kdenlive: video editing software
|
||||
pixieditor.enable = true; # Pixieditor: Universal editor for all your 2D needs
|
||||
plex.enable = true; # Plex: media player and server client
|
||||
|
||||
/*
|
||||
Utilities / Misc
|
||||
*/
|
||||
# Eddie AirVPN: VPN client
|
||||
eddieAirVPN.enable = true;
|
||||
# Galculator: simple calculator
|
||||
galculator.enable = true;
|
||||
# Winboat: Windows remote desktop via RDP
|
||||
winboat.enable = false;
|
||||
eddieAirVPN.enable = true; # Eddie AirVPN: VPN client
|
||||
galculator.enable = false; # Galculator: simple calculator
|
||||
gedit.enable = true; # Gedit: GNOME text editor
|
||||
winboat.enable = true; # Winboat: Windows remote desktop via RDP
|
||||
adb.enable = false; # ADB: Android SDK platform tools
|
||||
};
|
||||
}
|
||||
|
||||
@@ -2,65 +2,65 @@ _: {
|
||||
/*
|
||||
Development editors and IDEs
|
||||
*/
|
||||
# VSCodium: a free and open-source "demicrosofted" VSCode
|
||||
vscodium.enable = false;
|
||||
# Zed Editor: a modern, high‑performance code editor
|
||||
vscodium.enable = false; # VSCodium: a free and open-source "demicrosofted" VSCode
|
||||
zed-editor = {
|
||||
# Enable Zed Editor
|
||||
enable = true;
|
||||
# Remote Server: enable remote editing capabilities
|
||||
remote-server = true;
|
||||
enable = true; # Zed Editor: a modern, high‑performance code editor
|
||||
remote-server.enable = true; # Remote Server: enable remote editing capabilities
|
||||
};
|
||||
|
||||
/*
|
||||
Web browsers
|
||||
*/
|
||||
# Librewolf: a privacy-focused Firefox fork
|
||||
librewolf.enable = true;
|
||||
# Ungoogled Chromium: a privacy-focused Chromium fork
|
||||
ungoogled-chromium.enable = true;
|
||||
librewolf.enable = true; # Librewolf: a privacy-focused Firefox fork
|
||||
ungoogled-chromium.enable = true; # Ungoogled Chromium: a privacy-focused Chromium fork
|
||||
|
||||
/*
|
||||
System utilities
|
||||
*/
|
||||
# Btop: a resource monitor for the terminal
|
||||
btop.enable = true;
|
||||
# Cava: terminal audio visualizer
|
||||
cava.enable = false;
|
||||
# Fastfetch: a fast system information tool
|
||||
fastfetch.enable = true;
|
||||
btop.enable = true; # Btop: a resource monitor for the terminal
|
||||
cava.enable = false; # Cava: terminal audio visualizer
|
||||
fastfetch.enable = true; # Fastfetch: a fast system information tool
|
||||
peaclock.enable = true; # Peaclock: Clock, timer, and stopwatch for the terminal
|
||||
|
||||
/*
|
||||
Communication and synchronization
|
||||
*/
|
||||
# KDE Connect: integrate your phone and desktop
|
||||
kdeconnect.enable = false;
|
||||
# Nextcloud Client: sync files with a Nextcloud server
|
||||
nextcloud-client.enable = true;
|
||||
# Vesktop: a community‑driven Discord client
|
||||
vesktop.enable = true;
|
||||
kdeconnect.enable = false; # KDE Connect: integrate your phone and desktop
|
||||
nextcloud-client.enable = true; # Nextcloud Client: sync files with a Nextcloud server
|
||||
vesktop.enable = true; # Vesktop: a community‑driven Discord client
|
||||
|
||||
/*
|
||||
Gaming
|
||||
*/
|
||||
# Lutris: an open gaming platform
|
||||
lutris.enable = false;
|
||||
lutris.enable = false; # Lutris: an open gaming platform
|
||||
|
||||
/*
|
||||
Media recording and streaming
|
||||
*/
|
||||
# OBS Studio: streaming and recording software
|
||||
obs-studio.enable = false;
|
||||
obs-studio.enable = false; # OBS Studio: streaming and recording software
|
||||
|
||||
/*
|
||||
Office suite
|
||||
*/
|
||||
# OnlyOffice: an office suite compatible with Microsoft formats
|
||||
onlyoffice.enable = true;
|
||||
onlyoffice.enable = true; # OnlyOffice: an office suite compatible with Microsoft formats
|
||||
|
||||
/*
|
||||
Learning tools
|
||||
*/
|
||||
# Anki: spaced‑repetition flashcard program
|
||||
anki.enable = true;
|
||||
anki.enable = true; # Anki: spaced‑repetition flashcard program
|
||||
|
||||
/*
|
||||
XDG desktop entries (PWA)
|
||||
*/
|
||||
xdgDesktopEntries = {
|
||||
enable = true; # Enable XDG desktop entries
|
||||
entries = {
|
||||
messenger.enable = true; # Messenger: Facebook Messenger
|
||||
mastodon.enable = true; # Mastodon: a decentralized social network
|
||||
garandcloud.enable = true; # GarandCloud: my Nextcloud instance
|
||||
chatgpt.enable = true; # ChatGPT: a large language model
|
||||
claude.enable = true; # Claude: a large language model
|
||||
glance.enable = true; # Glance: my home server dashboard
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
@@ -2,86 +2,89 @@ _: {
|
||||
/*
|
||||
Container & Packaging
|
||||
*/
|
||||
# Docker: container runtime and management
|
||||
docker.enable = true;
|
||||
# Distrobox: containerized development environments
|
||||
distrobox.enable = false;
|
||||
# Flatpak: universal packaging system for Linux
|
||||
flatpak.enable = true;
|
||||
# Lazydocker: simple TUI for Docker
|
||||
lazydocker.enable = false;
|
||||
docker.enable = true; # Docker: container runtime and management
|
||||
virtualbox.enable = false; # VirtualBox: PC emulator
|
||||
flatpak = {
|
||||
enable = true; # Flatpak: universal packaging system for Linux
|
||||
packages = {
|
||||
sober.enable = false; # Roblox client
|
||||
warehouse.enable = true; # Flatpak manager
|
||||
flatseal.enable = true; # Flatpak permissions manager
|
||||
};
|
||||
};
|
||||
|
||||
/*
|
||||
Networking
|
||||
*/
|
||||
tailscale.enable = true; # Tailscale: secure network for remote access
|
||||
|
||||
/*
|
||||
Gaming
|
||||
*/
|
||||
# GameMode: optimizes system performance for gaming
|
||||
gamemode.enable = true;
|
||||
# Gamescope: micro-compositor for games
|
||||
gamescope.enable = false;
|
||||
# Prism Launcher: Minecraft modded launcher
|
||||
prismlauncher.enable = false;
|
||||
# Steam: platform for buying and playing games
|
||||
steam.enable = true;
|
||||
# SpaceCadet Pinball: classic pinball game
|
||||
spaceCadetPinball.enable = true;
|
||||
# TTY Solitaire: terminal based solitaire game
|
||||
ttySolitaire.enable = true;
|
||||
gamemode.enable = true; # GameMode: optimizes system performance for gaming
|
||||
gamescope.enable = false; # Gamescope: micro‑compositor for games
|
||||
steam.enable = true; # Steam: platform for buying and playing games
|
||||
|
||||
packages = {
|
||||
/*
|
||||
Container & Packaging
|
||||
*/
|
||||
distrobox.enable = false; # Distrobox: containerized development environments
|
||||
lazydocker.enable = false; # Lazydocker: simple TUI for Docker
|
||||
bottles.enable = false; # Bottles: Easy-to-use wineprefix manager
|
||||
|
||||
/*
|
||||
Gaming
|
||||
*/
|
||||
prismlauncher.enable = true; # Prism Launcher: Minecraft modded launcher
|
||||
spaceCadetPinball.enable = true; # SpaceCadet Pinball: classic pinball game
|
||||
ttySolitaire.enable = true; # TTY Solitaire: terminal‑based solitaire game
|
||||
heroic.enable = false; # Native GOG, Epic, and Amazon Games Launcher for Linux, Windows and Mac
|
||||
|
||||
/*
|
||||
Development Tools
|
||||
*/
|
||||
# Exercism: coding practice platform
|
||||
exercism.enable = true;
|
||||
# Gedit: GNOME text editor
|
||||
gedit.enable = false;
|
||||
# Lazygit: simple TUI for git
|
||||
lazygit.enable = false;
|
||||
# OpenCode: tools for coding and development
|
||||
opencode.enable = true;
|
||||
exercism.enable = true; # Exercism: coding practice platform
|
||||
lazygit.enable = false; # Lazygit: simple TUI for Git
|
||||
opencode.enable = false; # OpenCode: tools for coding and development
|
||||
jan.enable = true; # Jan: AI chat UI
|
||||
logisim-evolution.enable = false; # Logisim-Evolution: Digital logic designer and simulator
|
||||
|
||||
/*
|
||||
Communication & Collaboration
|
||||
*/
|
||||
# Mattermost: open-source Slack alternative
|
||||
mattermost.enable = true;
|
||||
# Slack: team communication and collaboration tool
|
||||
slack.enable = true;
|
||||
# Tutanota: secure email client
|
||||
tutanota.enable = true;
|
||||
mattermost.enable = true; # Mattermost: open‑source Slack alternative
|
||||
slack.enable = true; # Slack: team communication and collaboration tool
|
||||
tutanota.enable = true; # Tutanota: secure email client
|
||||
signal.enable = true; # Signal: secure messaging app
|
||||
teams.enable = true; # Teams-for-linux: Unofficial Microsoft Teams client for Linux
|
||||
ferdium.enable = false; # Ferdium: All your services in one place built by the community
|
||||
|
||||
/*
|
||||
Productivity / Knowledge Management
|
||||
*/
|
||||
# Bitwarden: password manager (desktop)
|
||||
bitwarden.enable = false;
|
||||
# Iotas: lightweight notes manager
|
||||
iotas.enable = true;
|
||||
# Logseq: knowledge base and outliner
|
||||
logseq.enable = false;
|
||||
bitwarden.enable = false; # Bitwarden: password manager (desktop)
|
||||
iotas.enable = true; # Iotas: lightweight notes manager
|
||||
logseq.enable = false; # Logseq: knowledge base and outliner
|
||||
|
||||
/*
|
||||
Media & Graphics
|
||||
*/
|
||||
# Affinity: professional graphics suite
|
||||
affinity.enable = false;
|
||||
# Eye of GNOME: image viewer
|
||||
eyeOfGnome.enable = true;
|
||||
# FreeTube: privacy‑friendly YouTube client
|
||||
freetube.enable = false;
|
||||
# GIMP: gnu image manipulation program
|
||||
gimp.enable = false;
|
||||
# Kdenlive: video editing software
|
||||
kdenlive.enable = false;
|
||||
# Plex: media player and server client
|
||||
plex.enable = true;
|
||||
affinity.enable = false; # Affinity: professional graphics suite
|
||||
eyeOfGnome.enable = true; # Eye of GNOME: image viewer
|
||||
freetube.enable = false; # FreeTube: privacy‑friendly YouTube client
|
||||
gimp.enable = false; # GIMP: GNU Image Manipulation Program
|
||||
kdenlive.enable = false; # Kdenlive: video editing software
|
||||
pixieditor.enable = false; # Pixieditor: Universal editor for all your 2D needs
|
||||
plex.enable = true; # Plex: media player and server client
|
||||
|
||||
/*
|
||||
Utilities / Misc
|
||||
*/
|
||||
# Eddie AirVPN: VPN client
|
||||
eddieAirVPN.enable = true;
|
||||
# Galculator: simple calculator
|
||||
galculator.enable = true;
|
||||
# Winboat: Windows remote desktop via RDP
|
||||
winboat.enable = false;
|
||||
eddieAirVPN.enable = true; # Eddie AirVPN: VPN client
|
||||
galculator.enable = false; # Galculator: simple calculator
|
||||
gedit.enable = false; # Gedit: GNOME text editor
|
||||
winboat.enable = false; # Winboat: Windows remote desktop via RDP
|
||||
adb.enable = false; # ADB: Android SDK platform tools
|
||||
};
|
||||
}
|
||||
|
||||
@@ -2,65 +2,65 @@ _: {
|
||||
/*
|
||||
Development editors and IDEs
|
||||
*/
|
||||
# VSCodium: a free and open-source "demicrosofted" VSCode
|
||||
vscodium.enable = false;
|
||||
# Zed Editor: a modern, high‑performance code editor
|
||||
vscodium.enable = false; # VSCodium: a free and open-source "demicrosofted" VSCode
|
||||
zed-editor = {
|
||||
# Enable Zed Editor
|
||||
enable = true;
|
||||
# Remote Server: enable remote editing capabilities
|
||||
remote-server = true;
|
||||
enable = true; # Zed Editor: a modern, high‑performance code editor
|
||||
remote-server.enable = true; # Remote Server: enable remote editing capabilities
|
||||
};
|
||||
|
||||
/*
|
||||
Web browsers
|
||||
*/
|
||||
# Librewolf: a privacy-focused Firefox fork
|
||||
librewolf.enable = true;
|
||||
# Ungoogled Chromium: a privacy-focused Chromium fork
|
||||
ungoogled-chromium.enable = true;
|
||||
librewolf.enable = true; # Librewolf: a privacy-focused Firefox fork
|
||||
ungoogled-chromium.enable = true; # Ungoogled Chromium: a privacy-focused Chromium fork
|
||||
|
||||
/*
|
||||
System utilities
|
||||
*/
|
||||
# Btop: a resource monitor for the terminal
|
||||
btop.enable = true;
|
||||
# Cava: terminal audio visualizer
|
||||
cava.enable = false;
|
||||
# Fastfetch: a fast system information tool
|
||||
fastfetch.enable = true;
|
||||
btop.enable = true; # Btop: a resource monitor for the terminal
|
||||
cava.enable = false; # Cava: terminal audio visualizer
|
||||
fastfetch.enable = true; # Fastfetch: a fast system information tool
|
||||
peaclock.enable = true; # Peaclock: Clock, timer, and stopwatch for the terminal
|
||||
|
||||
/*
|
||||
Communication and synchronization
|
||||
*/
|
||||
# KDE Connect: integrate your phone and desktop
|
||||
kdeconnect.enable = false;
|
||||
# Nextcloud Client: sync files with a Nextcloud server
|
||||
nextcloud-client.enable = true;
|
||||
# Vesktop: a community‑driven Discord client
|
||||
vesktop.enable = true;
|
||||
kdeconnect.enable = false; # KDE Connect: integrate your phone and desktop
|
||||
nextcloud-client.enable = true; # Nextcloud Client: sync files with a Nextcloud server
|
||||
vesktop.enable = true; # Vesktop: a community‑driven Discord client
|
||||
|
||||
/*
|
||||
Gaming
|
||||
*/
|
||||
# Lutris: an open gaming platform
|
||||
lutris.enable = false;
|
||||
lutris.enable = false; # Lutris: an open gaming platform
|
||||
|
||||
/*
|
||||
Media recording and streaming
|
||||
*/
|
||||
# OBS Studio: streaming and recording software
|
||||
obs-studio.enable = false;
|
||||
obs-studio.enable = false; # OBS Studio: streaming and recording software
|
||||
|
||||
/*
|
||||
Office suite
|
||||
*/
|
||||
# OnlyOffice: an office suite compatible with Microsoft formats
|
||||
onlyoffice.enable = true;
|
||||
onlyoffice.enable = true; # OnlyOffice: an office suite compatible with Microsoft formats
|
||||
|
||||
/*
|
||||
Learning tools
|
||||
*/
|
||||
# Anki: spaced‑repetition flashcard program
|
||||
anki.enable = true;
|
||||
anki.enable = true; # Anki: spaced‑repetition flashcard program
|
||||
|
||||
/*
|
||||
XDG desktop entries (PWA)
|
||||
*/
|
||||
xdgDesktopEntries = {
|
||||
enable = true; # Enable XDG desktop entries
|
||||
entries = {
|
||||
messenger.enable = true; # Messenger: Facebook Messenger
|
||||
mastodon.enable = true; # Mastodon: a decentralized social network
|
||||
garandcloud.enable = true; # GarandCloud: my Nextcloud instance
|
||||
chatgpt.enable = true; # ChatGPT: a large language model
|
||||
claude.enable = true; # Claude: a large language model
|
||||
glance.enable = true; # Glance: my home server dashboard
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
@@ -2,86 +2,89 @@ _: {
|
||||
/*
|
||||
Container & Packaging
|
||||
*/
|
||||
# Docker: container runtime and management
|
||||
docker.enable = true;
|
||||
# Distrobox: containerized development environments
|
||||
distrobox.enable = false;
|
||||
# Flatpak: universal packaging system for Linux
|
||||
flatpak.enable = true;
|
||||
# Lazydocker: simple TUI for Docker
|
||||
lazydocker.enable = false;
|
||||
docker.enable = true; # Docker: container runtime and management
|
||||
virtualbox.enable = false; # VirtualBox: PC emulator
|
||||
flatpak = {
|
||||
enable = true; # Flatpak: universal packaging system for Linux
|
||||
packages = {
|
||||
sober.enable = false; # Roblox client
|
||||
warehouse.enable = true; # Flatpak manager
|
||||
flatseal.enable = true; # Flatpak permissions manager
|
||||
};
|
||||
};
|
||||
|
||||
/*
|
||||
Networking
|
||||
*/
|
||||
tailscale.enable = false; # Tailscale: secure network for remote access
|
||||
|
||||
/*
|
||||
Gaming
|
||||
*/
|
||||
# GameMode: optimizes system performance for gaming
|
||||
gamemode.enable = true;
|
||||
# Gamescope: micro-compositor for games
|
||||
gamescope.enable = false;
|
||||
# Prism Launcher: Minecraft modded launcher
|
||||
prismlauncher.enable = false;
|
||||
# Steam: platform for buying and playing games
|
||||
steam.enable = true;
|
||||
# SpaceCadet Pinball: classic pinball game
|
||||
spaceCadetPinball.enable = true;
|
||||
# TTY Solitaire: terminal based solitaire game
|
||||
ttySolitaire.enable = true;
|
||||
gamemode.enable = true; # GameMode: optimizes system performance for gaming
|
||||
gamescope.enable = false; # Gamescope: micro‑compositor for games
|
||||
steam.enable = true; # Steam: platform for buying and playing games
|
||||
|
||||
packages = {
|
||||
/*
|
||||
Container & Packaging
|
||||
*/
|
||||
distrobox.enable = false; # Distrobox: containerized development environments
|
||||
lazydocker.enable = false; # Lazydocker: simple TUI for Docker
|
||||
bottles.enable = false; # Bottles: Easy-to-use wineprefix manager
|
||||
|
||||
/*
|
||||
Gaming
|
||||
*/
|
||||
prismlauncher.enable = false; # Prism Launcher: Minecraft modded launcher
|
||||
spaceCadetPinball.enable = true; # SpaceCadet Pinball: classic pinball game
|
||||
ttySolitaire.enable = true; # TTY Solitaire: terminal‑based solitaire game
|
||||
heroic.enable = false; # Native GOG, Epic, and Amazon Games Launcher for Linux, Windows and Mac
|
||||
|
||||
/*
|
||||
Development Tools
|
||||
*/
|
||||
# Exercism: coding practice platform
|
||||
exercism.enable = true;
|
||||
# Gedit: GNOME text editor
|
||||
gedit.enable = false;
|
||||
# Lazygit: simple TUI for git
|
||||
lazygit.enable = false;
|
||||
# OpenCode: tools for coding and development
|
||||
opencode.enable = true;
|
||||
exercism.enable = true; # Exercism: coding practice platform
|
||||
lazygit.enable = false; # Lazygit: simple TUI for Git
|
||||
opencode.enable = false; # OpenCode: tools for coding and development
|
||||
jan.enable = true; # Jan: AI chat UI
|
||||
logisim-evolution.enable = false; # Logisim-Evolution: Digital logic designer and simulator
|
||||
|
||||
/*
|
||||
Communication & Collaboration
|
||||
*/
|
||||
# Mattermost: open-source Slack alternative
|
||||
mattermost.enable = true;
|
||||
# Slack: team communication and collaboration tool
|
||||
slack.enable = true;
|
||||
# Tutanota: secure email client
|
||||
tutanota.enable = true;
|
||||
mattermost.enable = true; # Mattermost: open‑source Slack alternative
|
||||
slack.enable = true; # Slack: team communication and collaboration tool
|
||||
tutanota.enable = true; # Tutanota: secure email client
|
||||
signal.enable = true; # Signal: secure messaging app
|
||||
teams.enable = true; # Teams-for-linux: Unofficial Microsoft Teams client for Linux
|
||||
ferdium.enable = false; # Ferdium: All your services in one place built by the community
|
||||
|
||||
/*
|
||||
Productivity / Knowledge Management
|
||||
*/
|
||||
# Bitwarden: password manager (desktop)
|
||||
bitwarden.enable = false;
|
||||
# Iotas: lightweight notes manager
|
||||
iotas.enable = true;
|
||||
# Logseq: knowledge base and outliner
|
||||
logseq.enable = false;
|
||||
bitwarden.enable = false; # Bitwarden: password manager (desktop)
|
||||
iotas.enable = true; # Iotas: lightweight notes manager
|
||||
logseq.enable = false; # Logseq: knowledge base and outliner
|
||||
|
||||
/*
|
||||
Media & Graphics
|
||||
*/
|
||||
# Affinity: professional graphics suite
|
||||
affinity.enable = false;
|
||||
# Eye of GNOME: image viewer
|
||||
eyeOfGnome.enable = true;
|
||||
# FreeTube: privacy‑friendly YouTube client
|
||||
freetube.enable = false;
|
||||
# GIMP: gnu image manipulation program
|
||||
gimp.enable = false;
|
||||
# Kdenlive: video editing software
|
||||
kdenlive.enable = false;
|
||||
# Plex: media player and server client
|
||||
plex.enable = true;
|
||||
affinity.enable = false; # Affinity: professional graphics suite
|
||||
eyeOfGnome.enable = true; # Eye of GNOME: image viewer
|
||||
freetube.enable = false; # FreeTube: privacy‑friendly YouTube client
|
||||
gimp.enable = false; # GIMP: GNU Image Manipulation Program
|
||||
kdenlive.enable = false; # Kdenlive: video editing software
|
||||
pixieditor.enable = false; # Pixieditor: Universal editor for all your 2D needs
|
||||
plex.enable = true; # Plex: media player and server client
|
||||
|
||||
/*
|
||||
Utilities / Misc
|
||||
*/
|
||||
# Eddie AirVPN: VPN client
|
||||
eddieAirVPN.enable = true;
|
||||
# Galculator: simple calculator
|
||||
galculator.enable = true;
|
||||
# Winboat: Windows remote desktop via RDP
|
||||
winboat.enable = false;
|
||||
eddieAirVPN.enable = true; # Eddie AirVPN: VPN client
|
||||
galculator.enable = false; # Galculator: simple calculator
|
||||
gedit.enable = false; # Gedit: GNOME text editor
|
||||
winboat.enable = false; # Winboat: Windows remote desktop via RDP
|
||||
adb.enable = false; # ADB: Android SDK platform tools
|
||||
};
|
||||
}
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
wallpapers = [
|
||||
./../../wallpapers/attack-on-titan-mikasa-ackerman.jpg
|
||||
];
|
||||
wallpaperStyle = lib.mkDefault "centered";
|
||||
wallpaperStyle = lib.mkForce "centered";
|
||||
backdrop = "${config.stylix.base16Scheme.base00}";
|
||||
interface = {
|
||||
branding = "GarandOS Bootloader";
|
||||
|
||||
@@ -6,11 +6,13 @@
|
||||
./docker.nix
|
||||
./flatpak.nix
|
||||
./fonts.nix
|
||||
./garandos-tui.nix
|
||||
./hardware.nix
|
||||
./network.nix
|
||||
./nfs.nix
|
||||
./nh.nix
|
||||
./printing.nix
|
||||
./quickshell.nix
|
||||
./greetd.nix
|
||||
./security.nix
|
||||
./services.nix
|
||||
@@ -18,8 +20,10 @@
|
||||
./stylix.nix
|
||||
./syncthing.nix
|
||||
./system.nix
|
||||
./tailscale.nix
|
||||
./thunar.nix
|
||||
./user.nix
|
||||
./virtualbox.nix
|
||||
./xdg.nix
|
||||
./xserver.nix
|
||||
inputs.stylix.nixosModules.stylix
|
||||
|
||||
@@ -2,16 +2,27 @@
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}: {
|
||||
}: let
|
||||
mkFlatpakPackage = name: pkgId: {
|
||||
options.flatpak.packages.${name}.enable = lib.mkEnableOption "Flatpak: ${name}";
|
||||
|
||||
config.services.flatpak.packages =
|
||||
lib.mkIf config.flatpak.packages.${name}.enable [pkgId];
|
||||
};
|
||||
|
||||
flatpakPackages = {
|
||||
sober = "org.vinegarhq.Sober";
|
||||
warehouse = "io.github.flattool.Warehouse";
|
||||
flatseal = "com.github.tchx84.Flatseal";
|
||||
};
|
||||
in {
|
||||
options.flatpak.enable = lib.mkEnableOption "Flatpak";
|
||||
|
||||
config.services.flatpak = lib.mkIf config.flatpak.enable {
|
||||
enable = true;
|
||||
update.onActivation = true;
|
||||
packages = [
|
||||
# "org.vinegarhq.Sober"
|
||||
"io.github.flattool.Warehouse"
|
||||
"com.github.tchx84.Flatseal"
|
||||
];
|
||||
packages = [];
|
||||
};
|
||||
|
||||
imports = builtins.attrValues (builtins.mapAttrs mkFlatpakPackage flatpakPackages);
|
||||
}
|
||||
|
||||
11
modules/core/garandos-tui.nix
Normal file
11
modules/core/garandos-tui.nix
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
host,
|
||||
username,
|
||||
...
|
||||
}: {
|
||||
programs.garandos-tui = {
|
||||
enable = true;
|
||||
systemModulesFilePath = "/home/${username}/garandos/hosts/${host}/system-modules.nix";
|
||||
homeModulesFilePath = "/home/${username}/garandos/hosts/${host}/home-modules.nix";
|
||||
};
|
||||
}
|
||||
@@ -1,4 +1,9 @@
|
||||
{pkgs, ...}: {
|
||||
{
|
||||
pkgs,
|
||||
inputs,
|
||||
system,
|
||||
...
|
||||
}: {
|
||||
environment.systemPackages = with pkgs; [
|
||||
mpv
|
||||
pavucontrol
|
||||
@@ -12,6 +17,7 @@
|
||||
file-roller
|
||||
unrar
|
||||
unzip
|
||||
p7zip
|
||||
# System monitoring & info
|
||||
inxi
|
||||
lm_sensors
|
||||
@@ -52,5 +58,10 @@
|
||||
hunspell
|
||||
hunspellDicts.pl_PL
|
||||
hunspellDicts.en_US
|
||||
# Noctalia Shell Dependencies
|
||||
matugen
|
||||
app2unit
|
||||
gpu-screen-recorder
|
||||
power-profiles-daemon
|
||||
];
|
||||
}
|
||||
|
||||
@@ -7,9 +7,9 @@
|
||||
...
|
||||
}: let
|
||||
mkPackage = name: pkgsOrList: {
|
||||
options.${name}.enable = lib.mkEnableOption name;
|
||||
options.packages.${name}.enable = lib.mkEnableOption name;
|
||||
config.environment.systemPackages =
|
||||
lib.mkIf config.${name}.enable
|
||||
lib.mkIf config.packages.${name}.enable
|
||||
(lib.toList pkgsOrList);
|
||||
};
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
tutanota = tutanota-desktop;
|
||||
exercism = exercism;
|
||||
opencode = opencode;
|
||||
jan = jan;
|
||||
lazygit = lazygit;
|
||||
prismlauncher = inputs.prismlauncher-cracked.packages.${system}.default;
|
||||
spaceCadetPinball = space-cadet-pinball;
|
||||
@@ -41,6 +42,14 @@
|
||||
lazydocker = lazydocker;
|
||||
distrobox = [distrobox pkgs.boxbuddy];
|
||||
winboat = [winboat freerdp];
|
||||
signal = signal-desktop;
|
||||
pixieditor = pixieditor;
|
||||
bottles = bottles;
|
||||
heroic = heroic;
|
||||
adb = android-tools;
|
||||
teams = teams-for-linux;
|
||||
ferdium = ferdium;
|
||||
logisim-evolution = logisim-evolution;
|
||||
};
|
||||
in {
|
||||
imports = builtins.attrValues (builtins.mapAttrs mkPackage packages);
|
||||
|
||||
@@ -1,7 +1,3 @@
|
||||
# {
|
||||
# pkgs
|
||||
# ...
|
||||
# }
|
||||
_: {
|
||||
programs = {
|
||||
nano.enable = true;
|
||||
@@ -13,7 +9,6 @@ _: {
|
||||
seahorse.enable = true;
|
||||
fuse.userAllowOther = true;
|
||||
mtr.enable = true;
|
||||
adb.enable = true;
|
||||
hyprlock.enable = true;
|
||||
gnupg.agent = {
|
||||
enable = true;
|
||||
|
||||
30
modules/core/quickshell.nix
Normal file
30
modules/core/quickshell.nix
Normal file
@@ -0,0 +1,30 @@
|
||||
{pkgs, ...}: {
|
||||
environment = {
|
||||
systemPackages = with pkgs; [
|
||||
quickshell
|
||||
|
||||
# Qt6 related kits(for slove Qt5Compat problem)
|
||||
qt6.qt5compat
|
||||
qt6.qtbase
|
||||
qt6.qtquick3d
|
||||
qt6.qtwayland
|
||||
qt6.qtdeclarative
|
||||
qt6.qtsvg
|
||||
|
||||
# alternate options
|
||||
# libsForQt5.qt5compat
|
||||
kdePackages.qt5compat
|
||||
libsForQt5.qt5.qtgraphicaleffects
|
||||
];
|
||||
# necessary environment variables
|
||||
variables = {
|
||||
QML_IMPORT_PATH = "${pkgs.qt6.qt5compat}/lib/qt-6/qml:${pkgs.qt6.qtbase}/lib/qt-6/qml";
|
||||
QML2_IMPORT_PATH = "${pkgs.qt6.qt5compat}/lib/qt-6/qml:${pkgs.qt6.qtbase}/lib/qt-6/qml";
|
||||
};
|
||||
# make sure the Qt application is working properly
|
||||
sessionVariables = {
|
||||
QT_QPA_PLATFORM = "wayland;xcb";
|
||||
QT_WAYLAND_DISABLE_WINDOWDECORATION = "1";
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -53,5 +53,6 @@
|
||||
];
|
||||
};
|
||||
};
|
||||
upower.enable = true; # noctalia shell battery
|
||||
};
|
||||
}
|
||||
|
||||
14
modules/core/tailscale.nix
Normal file
14
modules/core/tailscale.nix
Normal file
@@ -0,0 +1,14 @@
|
||||
{
|
||||
pkgs,
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}: {
|
||||
options.tailscale.enable = lib.mkEnableOption "Tailscale";
|
||||
|
||||
config.services.tailscale = lib.mkIf config.tailscale.enable {
|
||||
enable = true;
|
||||
package = pkgs.tailscale;
|
||||
openFirewall = true;
|
||||
};
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
{pkgs, ...}: {
|
||||
programs.thunar = {
|
||||
enable = true;
|
||||
plugins = with pkgs.xfce; [
|
||||
plugins = with pkgs; [
|
||||
thunar-archive-plugin
|
||||
thunar-volman
|
||||
];
|
||||
|
||||
17
modules/core/virtualbox.nix
Normal file
17
modules/core/virtualbox.nix
Normal file
@@ -0,0 +1,17 @@
|
||||
{
|
||||
pkgs,
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}: {
|
||||
options.virtualbox.enable = lib.mkEnableOption "Enable VirtualBox";
|
||||
|
||||
config.virtualisation.virtualbox.host = lib.mkIf config.virtualbox.enable {
|
||||
enable = true;
|
||||
package = pkgs.virtualbox;
|
||||
enableKvm = true;
|
||||
enableHardening = true;
|
||||
enableExtensionPack = false;
|
||||
addNetworkInterface = false;
|
||||
};
|
||||
}
|
||||
@@ -8,10 +8,12 @@
|
||||
pullos = "git -C /home/${username}/garandos pull";
|
||||
upd = "nh os switch --hostname ${host}";
|
||||
upg = "nh os switch --hostname ${host} --update";
|
||||
upf = "sudo nix flake update";
|
||||
upf = "sudo nix flake update --flake /home/${username}/garandos";
|
||||
upf-undo = "git -C /home/${username}/garandos restore /home/${username}/garandos/flake.lock";
|
||||
upd-bt = "nh os boot --hostname ${host}";
|
||||
upd-ts = "nh os test --hostname ${host}";
|
||||
upd-bd = "nh os build --hostname ${host}";
|
||||
tui = "garandos-tui";
|
||||
ncg = "nh clean all";
|
||||
|
||||
# Development aliases
|
||||
@@ -32,6 +34,12 @@
|
||||
nrd = "nix run .#develop";
|
||||
nbrd = "nix build .#develop && nix run .#develop";
|
||||
|
||||
# Development aliases for docker
|
||||
dcu = "docker compose up -d";
|
||||
dcd = "docker compose down";
|
||||
dcb = "docker compose build";
|
||||
dcub = "docker compose up -d --build";
|
||||
|
||||
# System aliases
|
||||
# flush-codium = "sudo killall codium && sudo rm -rf ~/.config/VSCodium/Cache && sudo rm -rf ~/.config/VSCodium/CachedData";
|
||||
kys = "shutdown now";
|
||||
@@ -122,7 +130,9 @@
|
||||
fc = "fortune | cowsay";
|
||||
|
||||
# Network aliases
|
||||
kssh-server = "kssh garand_plg@192.168.1.156 -i ~/.ssh/hp-t640-homeserver";
|
||||
ssh-server = "ssh garand_plg@192.168.1.156 -i ~/.ssh/hp-t640-homeserver";
|
||||
kssh-server = "kssh hp-t640-homeserver";
|
||||
kssh-server-ts = "kssh hp-t640-homeserver-tailscale";
|
||||
ssh-server = "ssh hp-t640-homeserver";
|
||||
ssh-server-ts = "ssh hp-t640-homeserver-tailscale";
|
||||
};
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ in {
|
||||
./hyprland
|
||||
./kitty
|
||||
./librewolf
|
||||
./peaclock
|
||||
./rofi
|
||||
./scripts
|
||||
./swaync
|
||||
@@ -28,8 +29,10 @@ in {
|
||||
./kdeConnect.nix
|
||||
./lutris.nix
|
||||
./nextcloud.nix
|
||||
./noctalia.nix
|
||||
./obs-studio.nix
|
||||
./onlyoffice.nix
|
||||
./overview.nix
|
||||
./qt.nix
|
||||
./ssh.nix
|
||||
./starship.nix
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 96 KiB After Width: | Height: | Size: 24 KiB |
@@ -1,6 +1,5 @@
|
||||
_: {
|
||||
wayland.windowManager.hyprland.settings = {
|
||||
animations = {
|
||||
wayland.windowManager.hyprland.settings.animations = {
|
||||
enabled = true;
|
||||
bezier = [
|
||||
"wind, -1.05, 0.9, 0.1, 1.05"
|
||||
@@ -18,5 +17,4 @@ _: {
|
||||
"workspaces, 0, 5, wind"
|
||||
];
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
_: {
|
||||
wayland.windowManager.hyprland.settings = {
|
||||
# name "Dynamic"
|
||||
# credit https://github.com/mylinuxforwork/dotfiles
|
||||
animations = {
|
||||
wayland.windowManager.hyprland.settings.animations = {
|
||||
enabled = true;
|
||||
bezier = [
|
||||
"wind, 0.05, 0.9, 0.1, 1.05"
|
||||
@@ -21,5 +19,4 @@ _: {
|
||||
"workspaces, 1, 5, wind"
|
||||
];
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
_: {
|
||||
wayland.windowManager.hyprland.settings = {
|
||||
# Name: END-4
|
||||
# Credit: END-4 project https://github.com/end-4/dots-hyprland
|
||||
animations = {
|
||||
wayland.windowManager.hyprland.settings.animations = {
|
||||
enabled = true;
|
||||
bezier = [
|
||||
"linear, 0, 0, 1, 1"
|
||||
@@ -33,5 +31,4 @@ _: {
|
||||
"workspaces, 1, 7, menu_decel, slide"
|
||||
];
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
_: {
|
||||
wayland.windowManager.hyprland.settings = {
|
||||
# name "moving"
|
||||
# credit https://github.com/mylinuxforwork/dotfiles
|
||||
animations = {
|
||||
wayland.windowManager.hyprland.settings.animations = {
|
||||
enabled = true;
|
||||
bezier = [
|
||||
"overshot, 0.05, 0.9, 0.1, 1.05"
|
||||
@@ -20,5 +18,4 @@ _: {
|
||||
"workspaces, 1, 6, default"
|
||||
];
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
@@ -11,127 +11,130 @@ in {
|
||||
# =============================================================================
|
||||
# APLIKACJE - GŁÓWNE
|
||||
# =============================================================================
|
||||
"$modifier, A, exec, anki"
|
||||
"$modifier, B, exec, bitwarden"
|
||||
"$modifier, C, exec, chromium"
|
||||
"$modifier, D, exec, vesktop"
|
||||
"$modifier, G, exec, affinity-v3"
|
||||
"$modifier, I, exec, iotas"
|
||||
"$modifier, L, exec, logseq"
|
||||
"$modifier, M, exec, plexamp"
|
||||
"$modifier, N, exec, dex ${desktopEntriesPath}/garandcloud.desktop"
|
||||
"$modifier, O, exec, obs"
|
||||
"$modifier, P, exec, plex-desktop"
|
||||
"$modifier, Return, exec, ${terminal}"
|
||||
"$modifier, S, exec, steam"
|
||||
"$modifier, T, exec, thunar"
|
||||
"$modifier, V, exec, codium"
|
||||
"$modifier, W, exec, ${browser}"
|
||||
"$modifier, Z, exec, zeditor"
|
||||
"SUPER, A, exec, anki"
|
||||
"SUPER, B, exec, bitwarden"
|
||||
"SUPER, C, exec, chromium"
|
||||
"SUPER, D, exec, vesktop"
|
||||
"SUPER, G, exec, affinity-v3"
|
||||
"SUPER, I, exec, iotas"
|
||||
"SUPER, J, exec, Jan"
|
||||
"SUPER, L, exec, logseq"
|
||||
"SUPER, M, exec, plexamp"
|
||||
"SUPER, N, exec, dex ${desktopEntriesPath}/garandcloud.desktop"
|
||||
"SUPER, O, exec, obs"
|
||||
"SUPER, P, exec, plex-desktop"
|
||||
"SUPER, Return, exec, ${terminal}"
|
||||
"SUPER, S, exec, steam"
|
||||
"SUPER, T, exec, thunar"
|
||||
"SUPER, V, exec, codium"
|
||||
"SUPER, W, exec, ${browser}"
|
||||
"SUPER, Z, exec, zeditor"
|
||||
|
||||
# =============================================================================
|
||||
# APLIKACJE - Z SHIFT
|
||||
# =============================================================================
|
||||
"$modifier SHIFT, B, exec, blueman-manager"
|
||||
"$modifier SHIFT, C, exec, dex ${desktopEntriesPath}/claude.desktop"
|
||||
"$modifier SHIFT, G, exec, dex ${desktopEntriesPath}/chatgpt.desktop"
|
||||
"$modifier SHIFT, M, exec, dex ${desktopEntriesPath}/messenger.desktop"
|
||||
"$modifier SHIFT, N, exec, nextcloud"
|
||||
"$modifier SHIFT, O, exec, onlyoffice-desktopeditors"
|
||||
"$modifier SHIFT, Return, exec, rofi-launcher"
|
||||
"$modifier SHIFT, T, exec, tutanota-desktop"
|
||||
"$modifier SHIFT, W, exec, web-search"
|
||||
"SUPER SHIFT, B, exec, blueman-manager"
|
||||
"SUPER SHIFT, C, exec, dex ${desktopEntriesPath}/claude.desktop"
|
||||
"SUPER SHIFT, G, exec, dex ${desktopEntriesPath}/chatgpt.desktop"
|
||||
"SUPER SHIFT, M, exec, dex ${desktopEntriesPath}/messenger.desktop"
|
||||
"SUPER SHIFT, N, exec, nextcloud"
|
||||
"SUPER SHIFT, O, exec, onlyoffice-desktopeditors"
|
||||
# "SUPER SHIFT, Return, exec, rofi-launcher"
|
||||
"SUPER SHIFT, T, exec, tutanota-desktop"
|
||||
# "SUPER SHIFT, W, exec, web-search"
|
||||
|
||||
# =============================================================================
|
||||
# APLIKACJE - Z ALT
|
||||
# =============================================================================
|
||||
"$modifier ALT, G, exec, dex ${desktopEntriesPath}/glance.desktop"
|
||||
"$modifier ALT, M, exec, dex ${desktopEntriesPath}/mastodon.desktop"
|
||||
"$modifier ALT, S, exec, slack"
|
||||
"$modifier ALT, T, exec, gedit"
|
||||
"SUPER ALT, G, exec, dex ${desktopEntriesPath}/glance.desktop"
|
||||
"SUPER ALT, M, exec, dex ${desktopEntriesPath}/mastodon.desktop"
|
||||
"SUPER ALT, S, exec, slack"
|
||||
"SUPER ALT, T, exec, gedit"
|
||||
|
||||
# =============================================================================
|
||||
# APLIKACJE - Z CONTROL
|
||||
# =============================================================================
|
||||
"$modifier CONTROL, G, exec, gimp"
|
||||
"$modifier CONTROL, M, exec, mattermost-desktop"
|
||||
"SUPER CONTROL, G, exec, gimp"
|
||||
"SUPER CONTROL, M, exec, mattermost-desktop"
|
||||
"SUPER CONTROL, S, exec, signal-desktop"
|
||||
|
||||
# =============================================================================
|
||||
# NARZĘDZIA SYSTEMOWE
|
||||
# =============================================================================
|
||||
"$modifier, E, exec, emopicker9000"
|
||||
"$modifier, K, exec, galculator"
|
||||
"$modifier ALT, W, exec, wallsetter"
|
||||
"$modifier CONTROL, P, exec, hyprpicker -a"
|
||||
"$modifier SHIFT, K, exec, list-keybinds"
|
||||
"$modifier SHIFT, P, exec, pavucontrol"
|
||||
"$modifier SHIFT, S, exec, screenshootin"
|
||||
"SUPER, E, exec, emopicker9000"
|
||||
"SUPER, K, exec, galculator"
|
||||
"SUPER ALT, W, exec, wallsetter"
|
||||
"SUPER CONTROL, P, exec, hyprpicker -a"
|
||||
"SUPER SHIFT, K, exec, list-keybinds"
|
||||
"SUPER SHIFT, P, exec, pavucontrol"
|
||||
"SUPER SHIFT, S, exec, screenshootin"
|
||||
|
||||
# =============================================================================
|
||||
# ZARZĄDZANIE OKNAMI
|
||||
# =============================================================================
|
||||
"$modifier, Escape, exec, hyprlock"
|
||||
"$modifier, F, fullscreen,"
|
||||
"$modifier, Q, killactive,"
|
||||
"$modifier CONTROL, Escape, exec, wlogout"
|
||||
"$modifier SHIFT, Escape, exit,"
|
||||
"$modifier SHIFT, I, togglesplit,"
|
||||
"SUPER, Escape, exec, hyprlock"
|
||||
"SUPER, F, fullscreen,"
|
||||
"SUPER, Q, killactive,"
|
||||
"SUPER CONTROL, Escape, exec, wlogout"
|
||||
"SUPER SHIFT, Escape, exit,"
|
||||
"SUPER SHIFT, I, togglesplit,"
|
||||
"SUPER SHIFT, F, togglefloating,"
|
||||
|
||||
# =============================================================================
|
||||
# FOKUS OKIEN
|
||||
# =============================================================================
|
||||
"$modifier, down, movefocus, d"
|
||||
"$modifier, left, movefocus, l"
|
||||
"$modifier, right, movefocus, r"
|
||||
"$modifier, up, movefocus, u"
|
||||
"SUPER, down, movefocus, d"
|
||||
"SUPER, left, movefocus, l"
|
||||
"SUPER, right, movefocus, r"
|
||||
"SUPER, up, movefocus, u"
|
||||
|
||||
# =============================================================================
|
||||
# PRZEMIESZCZANIE OKIEN
|
||||
# =============================================================================
|
||||
"$modifier SHIFT, down, movewindow, d"
|
||||
"$modifier SHIFT, left, movewindow, l"
|
||||
"$modifier SHIFT, right, movewindow, r"
|
||||
"$modifier SHIFT, up, movewindow, u"
|
||||
"SUPER SHIFT, down, movewindow, d"
|
||||
"SUPER SHIFT, left, movewindow, l"
|
||||
"SUPER SHIFT, right, movewindow, r"
|
||||
"SUPER SHIFT, up, movewindow, u"
|
||||
|
||||
# =============================================================================
|
||||
# ZAMIANA OKIEN
|
||||
# =============================================================================
|
||||
"$modifier ALT, down, swapwindow, d"
|
||||
"$modifier ALT, left, swapwindow, l"
|
||||
"$modifier ALT, right, swapwindow, r"
|
||||
"$modifier ALT, up, swapwindow, u"
|
||||
"SUPER ALT, down, swapwindow, d"
|
||||
"SUPER ALT, left, swapwindow, l"
|
||||
"SUPER ALT, right, swapwindow, r"
|
||||
"SUPER ALT, up, swapwindow, u"
|
||||
|
||||
# =============================================================================
|
||||
# WORKSPACES - PRZEŁĄCZANIE
|
||||
# =============================================================================
|
||||
"$modifier, 0, workspace, 10"
|
||||
"$modifier, 1, workspace, 1"
|
||||
"$modifier, 2, workspace, 2"
|
||||
"$modifier, 3, workspace, 3"
|
||||
"$modifier, 4, workspace, 4"
|
||||
"$modifier, 5, workspace, 5"
|
||||
"$modifier, 6, workspace, 6"
|
||||
"$modifier, 7, workspace, 7"
|
||||
"$modifier, 8, workspace, 8"
|
||||
"$modifier, 9, workspace, 9"
|
||||
"$modifier CONTROL, left, workspace, e-1"
|
||||
"$modifier CONTROL, right, workspace, e+1"
|
||||
"$modifier, mouse_down, workspace, e+1"
|
||||
"$modifier, mouse_up, workspace, e-1"
|
||||
"SUPER, 0, workspace, 10"
|
||||
"SUPER, 1, workspace, 1"
|
||||
"SUPER, 2, workspace, 2"
|
||||
"SUPER, 3, workspace, 3"
|
||||
"SUPER, 4, workspace, 4"
|
||||
"SUPER, 5, workspace, 5"
|
||||
"SUPER, 6, workspace, 6"
|
||||
"SUPER, 7, workspace, 7"
|
||||
"SUPER, 8, workspace, 8"
|
||||
"SUPER, 9, workspace, 9"
|
||||
"SUPER CONTROL, left, workspace, e-1"
|
||||
"SUPER CONTROL, right, workspace, e+1"
|
||||
"SUPER, mouse_down, workspace, e+1"
|
||||
"SUPER, mouse_up, workspace, e-1"
|
||||
|
||||
# =============================================================================
|
||||
# WORKSPACES - PRZENOSZENIE OKIEN
|
||||
# =============================================================================
|
||||
"$modifier SHIFT, 0, movetoworkspace, 10"
|
||||
"$modifier SHIFT, 1, movetoworkspace, 1"
|
||||
"$modifier SHIFT, 2, movetoworkspace, 2"
|
||||
"$modifier SHIFT, 3, movetoworkspace, 3"
|
||||
"$modifier SHIFT, 4, movetoworkspace, 4"
|
||||
"$modifier SHIFT, 5, movetoworkspace, 5"
|
||||
"$modifier SHIFT, 6, movetoworkspace, 6"
|
||||
"$modifier SHIFT, 7, movetoworkspace, 7"
|
||||
"$modifier SHIFT, 8, movetoworkspace, 8"
|
||||
"$modifier SHIFT, 9, movetoworkspace, 9"
|
||||
"SUPER SHIFT, 0, movetoworkspace, 10"
|
||||
"SUPER SHIFT, 1, movetoworkspace, 1"
|
||||
"SUPER SHIFT, 2, movetoworkspace, 2"
|
||||
"SUPER SHIFT, 3, movetoworkspace, 3"
|
||||
"SUPER SHIFT, 4, movetoworkspace, 4"
|
||||
"SUPER SHIFT, 5, movetoworkspace, 5"
|
||||
"SUPER SHIFT, 6, movetoworkspace, 6"
|
||||
"SUPER SHIFT, 7, movetoworkspace, 7"
|
||||
"SUPER SHIFT, 8, movetoworkspace, 8"
|
||||
"SUPER SHIFT, 9, movetoworkspace, 9"
|
||||
|
||||
# =============================================================================
|
||||
# MEDIA I KONTROLKI SYSTEMOWE
|
||||
@@ -146,22 +149,35 @@ in {
|
||||
",XF86MonBrightnessDown, exec, brightnessctl set 5%-"
|
||||
",XF86MonBrightnessUp, exec, brightnessctl set +5%"
|
||||
|
||||
# =============================================================================
|
||||
# NOCTALIA SHELL
|
||||
# =============================================================================
|
||||
"SUPER SHIFT, Return, exec, noctalia-shell ipc call launcher toggle"
|
||||
# "SUPER, M, Noctalia Notifications, exec, noctalia-shell ipc call notifications toggleHistory"
|
||||
"SUPER SHIFT, V, exec, noctalia-shell ipc call launcher clipboard"
|
||||
"SUPER ALT, P, exec, noctalia-shell ipc call settings toggle"
|
||||
"SUPER ALT, L, exec, noctalia-shell ipc call sessionMenu lockAndSuspend"
|
||||
"SUPER SHIFT, W, exec, noctalia-shell ipc call wallpaper toggle"
|
||||
"SUPER, X, exec, noctalia-shell ipc call sessionMenu toggle"
|
||||
"SUPER ALT, C, exec, noctalia-shell ipc call controlCenter toggle"
|
||||
"SUPER CTRL, R, exec, noctalia-shell ipc call screenRecorder toggle"
|
||||
"SUPER SHIFT, R, exec, restart.noctalia"
|
||||
|
||||
# =============================================================================
|
||||
# NIEUŻYWANE KEYBINDY
|
||||
# =============================================================================
|
||||
# "$modifier SHIFT, N, exec, swaync-client -rs"
|
||||
# "$modifier, P, pseudo,"
|
||||
# "$modifier SHIFT,F, togglefloating,"
|
||||
# "$modifier ALT,F, workspaceopt, allfloat"
|
||||
# "$modifier SHIFT, SPACE, movetoworkspace, special"
|
||||
# "$modifier, SPACE, togglespecialworkspace"
|
||||
# "SUPER SHIFT, N, exec, swaync-client -rs"
|
||||
# "SUPER, P, pseudo,"
|
||||
# "SUPER ALT,F, workspaceopt, allfloat"
|
||||
# "SUPER SHIFT, SPACE, movetoworkspace, special"
|
||||
# "SUPER, SPACE, togglespecialworkspace"
|
||||
# "ALT,Tab,cyclenext"
|
||||
# "ALT,Tab,bringactivetotop"
|
||||
];
|
||||
|
||||
bindm = [
|
||||
"$modifier, mouse:272, movewindow"
|
||||
"$modifier, mouse:273, resizewindow"
|
||||
"SUPER, mouse:272, movewindow"
|
||||
"SUPER, mouse:273, resizewindow"
|
||||
];
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
_: {
|
||||
wayland.windowManager.hyprland = {
|
||||
settings = {
|
||||
env = [
|
||||
wayland.windowManager.hyprland.settings.env = [
|
||||
"NIXOS_OZONE_WL, 1"
|
||||
"NIXPKGS_ALLOW_UNFREE, 1"
|
||||
"XDG_CURRENT_DESKTOP, Hyprland"
|
||||
@@ -31,6 +29,4 @@ _: {
|
||||
"TERMINAL,kitty"
|
||||
"XDG_TERMINAL_EMULATOR,kitty"
|
||||
];
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
@@ -4,21 +4,25 @@
|
||||
stylixImage
|
||||
;
|
||||
in {
|
||||
wayland.windowManager.hyprland.settings = {
|
||||
exec-once = [
|
||||
wayland.windowManager.hyprland.settings.exec-once = [
|
||||
"wl-paste --type text --watch cliphist store" # Saves text
|
||||
"wl-paste --type image --watch cliphist store" # Saves images
|
||||
"dbus-update-activation-environment --all --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP"
|
||||
"systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP"
|
||||
"systemctl --user start hyprpolkitagent"
|
||||
"qs -c overview" # Start quickshell-overview daemon
|
||||
|
||||
"killall -q swww;sleep .5 && swww-daemon"
|
||||
"killall -q waybar;sleep .5 && waybar"
|
||||
"killall -q swaync;sleep .5 && swaync"
|
||||
"#wallsetter &"
|
||||
"pypr &"
|
||||
"nm-applet --indicator"
|
||||
"sleep 1.0 && swww img ${stylixImage}"
|
||||
# "killall -q swww;sleep .5 && swww-daemon"
|
||||
# "killall -q waybar;sleep .5 && waybar"
|
||||
# "killall -q swaync;sleep .5 && swaync"
|
||||
# "#wallsetter &"
|
||||
# "pypr &"
|
||||
# "nm-applet --indicator"
|
||||
# "sleep 1.0 && swww img ${stylixImage}"
|
||||
"killall -q waybar"
|
||||
"pkill waybar"
|
||||
"killall -q swaync"
|
||||
"pkill swaync"
|
||||
"noctalia-shell &"
|
||||
];
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
_: {
|
||||
services = {
|
||||
hypridle = {
|
||||
services.hypridle = {
|
||||
enable = true;
|
||||
settings = {
|
||||
general = {
|
||||
@@ -21,5 +20,4 @@ _: {
|
||||
];
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
@@ -26,9 +26,7 @@ in {
|
||||
enableXdgAutostart = true;
|
||||
variables = ["--all"];
|
||||
};
|
||||
xwayland = {
|
||||
enable = true;
|
||||
};
|
||||
xwayland.enable = true;
|
||||
settings = {
|
||||
input = {
|
||||
kb_layout = "${keyboardLayout}";
|
||||
@@ -60,7 +58,6 @@ in {
|
||||
};
|
||||
|
||||
general = {
|
||||
"$modifier" = "SUPER";
|
||||
layout = "dwindle";
|
||||
gaps_in = 6;
|
||||
gaps_out = 8;
|
||||
@@ -132,9 +129,7 @@ in {
|
||||
direct_scanout = 0;
|
||||
};
|
||||
|
||||
debug = {
|
||||
full_cm_proto = true;
|
||||
};
|
||||
debug.full_cm_proto = true;
|
||||
|
||||
master = {
|
||||
new_status = "master";
|
||||
@@ -143,9 +138,7 @@ in {
|
||||
};
|
||||
|
||||
# Ensure Xwayland windows render at integer scale; compositor scales them
|
||||
xwayland = {
|
||||
force_zero_scaling = true;
|
||||
};
|
||||
xwayland.force_zero_scaling = true;
|
||||
};
|
||||
|
||||
extraConfig = "
|
||||
|
||||
@@ -1,101 +1,97 @@
|
||||
_: {
|
||||
wayland.windowManager.hyprland = {
|
||||
settings = {
|
||||
windowrule = [
|
||||
wayland.windowManager.hyprland.settings.windowrule = [
|
||||
# XWayland specific rules
|
||||
#"noblur, xwayland:1" # Helps prevent odd borders/shadows for xwayland apps
|
||||
# downside it can impact other xwayland apps
|
||||
# This rule is a template for a more targeted approach
|
||||
"noblur, class:^(\bresolve\b)$, xwayland:1" # Window rule for just resolve
|
||||
"no_blur on, match:class resolve, match:xwayland 1" # Window rule for just resolve
|
||||
|
||||
# Application tags
|
||||
"tag +file-manager, class:^([Tt]hunar|org.gnome.Nautilus|[Pp]cmanfm-qt)$"
|
||||
"tag +terminal, class:^(com.mitchellh.ghostty|org.wezfurlong.wezterm|Alacritty|kitty|kitty-dropterm)$"
|
||||
"tag +browser, class:^(Brave-browser(-beta|-dev|-unstable)?)$"
|
||||
"tag +browser, class:^([Ff]irefox|org.mozilla.firefox|[Ff]irefox-esr)$"
|
||||
"tag +browser, class:^([Gg]oogle-chrome(-beta|-dev|-unstable)?)$"
|
||||
"tag +browser, class:^([Tt]horium-browser|[Cc]achy-browser)$"
|
||||
"tag +projects, class:^(codium|codium-url-handler|VSCodium)$"
|
||||
"tag +projects, class:^(VSCode|code-url-handler)$"
|
||||
"tag +im, class:^([Dd]iscord|[Ww]ebCord|[Vv]esktop)$"
|
||||
"tag +im, class:^([Ff]erdium)$"
|
||||
"tag +im, class:^([Ww]hatsapp-for-linux)$"
|
||||
"tag +im, class:^(org.telegram.desktop|io.github.tdesktop_x64.TDesktop)$"
|
||||
"tag +im, class:^(teams-for-linux)$"
|
||||
"tag +games, class:^(gamescope)$"
|
||||
"tag +games, class:^(steam_app_\d+)$"
|
||||
"tag +gamestore, class:^([Ss]team)$"
|
||||
"tag +gamestore, title:^([Ll]utris)$"
|
||||
"tag +gamestore, class:^(com.heroicgameslauncher.hgl)$"
|
||||
"tag +settings, class:^(gnome-disks|wihotspot(-gui)?)$"
|
||||
"tag +settings, class:^([Rr]ofi)$"
|
||||
"tag +settings, class:^(file-roller|org.gnome.FileRoller)$"
|
||||
"tag +settings, class:^(nm-applet|nm-connection-editor|blueman-manager)$"
|
||||
"tag +settings, class:^(pavucontrol|org.pulseaudio.pavucontrol|com.saivert.pwvucontrol)$"
|
||||
"tag +settings, class:^(nwg-look|qt5ct|qt6ct|[Yy]ad)$"
|
||||
"tag +settings, class:(xdg-desktop-portal-gtk)"
|
||||
"tag +settings, class:(.blueman-manager-wrapped)"
|
||||
"tag +settings, class:(nwg-displays)"
|
||||
"tag +file-manager, match:class [Tt]hunar|org\.gnome\.Nautilus|[Pp]cmanfm-qt"
|
||||
"tag +terminal, match:class com\.mitchellh\.ghostty|org\.wezfurlong\.wezterm|Alacritty|kitty|kitty-dropterm"
|
||||
"tag +browser, match:class [Ff]irefox|org\.mozilla\.firefox|[Ff]irefox-esr"
|
||||
"tag +browser, match:class [Ll]ibrewolf|io\.gitlab\.librewolf-community"
|
||||
"tag +browser, match:class [Gg]oogle-chrome(-beta|-dev|-unstable)?|[Cc]hromium-browser(-beta|-dev|-unstable)?"
|
||||
"tag +projects, match:class VSCode|code|code-url-handler|codium|codium-url-handler|VSCodium|VSCodium-url-handler"
|
||||
"tag +projects, match:class dev\.zed\.Zed"
|
||||
"tag +im, match:class [Dd]iscord|[Ww]ebCord|[Vv]esktop"
|
||||
"tag +im, match:class [Ff]erdium"
|
||||
"tag +im, match:class [Ss]ignal"
|
||||
"tag +im, match:class [Ss]lack"
|
||||
"tag +im, match:class [Tt]eams-for-linux"
|
||||
"tag +games, match:class gamescope"
|
||||
"tag +games, match:class ?:steam_app_\d+"
|
||||
"tag +games, match:class tf_linux64"
|
||||
"tag +games, match:class Minecraft\*.*"
|
||||
"tag +gamestore, match:class [Ss]team"
|
||||
"tag +gamestore, match:title [Ll]utris"
|
||||
"tag +gamestore, match:class com\.heroicgameslauncher\.hgl"
|
||||
"tag +gamestore, match:class org\.prismlauncher\.PrismLauncher"
|
||||
"tag +settings, match:class gnome-disks|wihotspot(-gui)?"
|
||||
"tag +settings, match:class [Rr]ofi"
|
||||
"tag +settings, match:class file-roller|org\.gnome\.FileRoller"
|
||||
"tag +settings, match:class nm-applet|nm-connection-editor|blueman-manager"
|
||||
"tag +settings, match:class pavucontrol|org\.pulseaudio\.pavucontrol|com\.saivert\.pwvucontrol"
|
||||
"tag +settings, match:class nwg-look|qt5ct|qt6ct|[Yy]ad"
|
||||
"tag +settings, match:class xdg-desktop-portal-gtk"
|
||||
"tag +settings, match:class ?:blueman-manager-wrapped"
|
||||
"tag +settings, match:class nwg-displays"
|
||||
|
||||
# Position and movement rules
|
||||
"move 72% 7%,title:^(Picture-in-Picture)$"
|
||||
"center, class:^([Ff]erdium)$"
|
||||
"center, class:^(pavucontrol|org.pulseaudio.pavucontrol|com.saivert.pwvucontrol)$"
|
||||
"center, class:([Tt]hunar), title:negative:(.*[Tt]hunar.*)"
|
||||
"center, title:^(Authentication Required)$"
|
||||
"move 72% 7%, match:title Picture-in-Picture"
|
||||
"center on, match:class pavucontrol|org\.pulseaudio\.pavucontrol|com\.saivert\.pwvucontrol"
|
||||
"center on, match:class [Tt]hunar, match:title negative:.*[Tt]hunar.*"
|
||||
"center on, match:title Authentication Required"
|
||||
|
||||
# Idle inhibit rules
|
||||
"idleinhibit fullscreen, class:^(*)$"
|
||||
"idleinhibit fullscreen, title:^(*)$"
|
||||
"idleinhibit fullscreen, fullscreen:1"
|
||||
"idle_inhibit fullscreen, match:class .*"
|
||||
"idle_inhibit fullscreen, match:title .*"
|
||||
"idle_inhibit fullscreen, match:fullscreen 1"
|
||||
|
||||
# Float rules
|
||||
"float, class:^([Ww]aypaper)$"
|
||||
"float, tag:settings*"
|
||||
"float, class:^([Ff]erdium)$"
|
||||
"float, title:^(Picture-in-Picture)$"
|
||||
"float, class:^(mpv)$"
|
||||
"float, title:^(Authentication Required)$"
|
||||
"float, title:^(War in Tunnels)$"
|
||||
"float, class:(codium|codium-url-handler|VSCodium), title:negative:(.*codium.*|.*VSCodium.*)"
|
||||
"float, class:^(com.heroicgameslauncher.hgl)$, title:negative:(Heroic Games Launcher)"
|
||||
"float, class:^([Ss]team)$, title:negative:^([Ss]team)$"
|
||||
"float, class:([Tt]hunar), title:negative:(.*[Tt]hunar.*)"
|
||||
"float, class:^(galculator)$"
|
||||
"float, initialTitle:(Add Folder to Workspace)"
|
||||
"float, initialTitle:(Open Files)"
|
||||
"float, initialTitle:(wants to save)"
|
||||
"float on, match:class [Ww]aypaper"
|
||||
"float on, match:tag settings*"
|
||||
"float on, match:title Picture-in-Picture"
|
||||
"float on, match:title Authentication Required"
|
||||
"float on, match:title War in Tunnels"
|
||||
"float on, match:class codium|codium-url-handler|VSCodium, match:title negative:.*(?:codium|VSCodium).*"
|
||||
"float on, match:class com\.heroicgameslauncher\.hgl, match:title negative Heroic Games Launcher"
|
||||
"float on, match:class [Ss]team, match:title negative:[Ss]team"
|
||||
"float on, match:class [Tt]hunar, match:title negative:.*[Tt]hunar.*"
|
||||
"float on, match:class galculator"
|
||||
"float on, match:initial_title Add Folder to Workspace"
|
||||
"float on, match:initial_title Open Files"
|
||||
"float on, match:initial_title wants to save"
|
||||
|
||||
# Size rules
|
||||
"size 70% 60%, initialTitle:(Open Files)"
|
||||
"size 70% 60%, initialTitle:(Add Folder to Workspace)"
|
||||
"size 70% 70%, tag:settings*"
|
||||
"size 60% 70%, class:^([Ff]erdium)$"
|
||||
"size 70% 70%, class:^(mpv)$"
|
||||
"size 70% 60%, match:initial_title Open Files"
|
||||
"size 70% 60%, match:initial_title Add Folder to Workspace"
|
||||
"size 70% 70%, match:tag settings*"
|
||||
|
||||
# Tile rules
|
||||
"tile, class:^(affinity.exe)$"
|
||||
"tile, class:^(dev.zed.Zed)$"
|
||||
"tile on, match:class affinity\.exe"
|
||||
"tile on, match:class dev\.zed\.Zed"
|
||||
"tile on, match:class mpv"
|
||||
"tile on, match:class com-cburch-logisim-Main"
|
||||
|
||||
# Opacity rules
|
||||
"opacity 1.0 1.0, tag:browser*"
|
||||
"opacity 0.9 0.8, tag:projects*"
|
||||
"opacity 0.94 0.86, tag:im*"
|
||||
"opacity 0.9 0.8, tag:file-manager*"
|
||||
"opacity 0.8 0.7, tag:terminal*"
|
||||
"opacity 0.8 0.7, tag:settings*"
|
||||
"opacity 0.8 0.7, class:^(gedit|org.gnome.TextEditor|mousepad)$"
|
||||
"opacity 0.9 0.8, class:^(seahorse)$ # gnome-keyring gui"
|
||||
"opacity 0.95 0.75, title:^(Picture-in-Picture)$"
|
||||
"opacity 1.0 1.0, match:tag browser*"
|
||||
"opacity 0.9 0.8, match:tag projects*"
|
||||
"opacity 0.94 0.86, match:tag im*"
|
||||
"opacity 0.85 0.75, match:tag gamestore*"
|
||||
"opacity 0.9 0.8, match:tag file-manager*"
|
||||
"opacity 0.8 0.7, match:tag terminal*"
|
||||
"opacity 0.8 0.7, match:tag settings*"
|
||||
"opacity 0.8 0.7, match:class gedit|org\.gnome\.TextEditor|mousepad"
|
||||
"opacity 0.9 0.8, match:class seahorse # gnome-keyring gui"
|
||||
"opacity 0.95 0.75, match:title Picture-in-Picture"
|
||||
|
||||
# Picture-in-Picture specific rules
|
||||
"pin, title:^(Picture-in-Picture)$"
|
||||
"keepaspectratio, title:^(Picture-in-Picture)$"
|
||||
"pin on, match:title Picture-in-Picture"
|
||||
"keep_aspect_ratio on, match:title Picture-in-Picture"
|
||||
|
||||
# Games specific rules
|
||||
"noblur, tag:games*"
|
||||
"fullscreen, tag:games*"
|
||||
"no_blur on, match:tag games*"
|
||||
"fullscreen on, match:tag games*"
|
||||
];
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
config.programs.librewolf = lib.mkIf config.librewolf.enable {
|
||||
enable = true;
|
||||
package = pkgs.librewolf-bin;
|
||||
package = pkgs.librewolf;
|
||||
# nativeMessagingHosts = [pkgs.firefoxpwa];
|
||||
languagePacks = [
|
||||
"pl"
|
||||
|
||||
@@ -75,13 +75,7 @@
|
||||
icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg";
|
||||
urls = [
|
||||
{
|
||||
template = "https://search.nixos.org/options";
|
||||
params = [
|
||||
{
|
||||
name = "query";
|
||||
value = "{searchTerms}";
|
||||
}
|
||||
];
|
||||
template = "https://search.nixos.org/options?channel=unstable&query={searchTerms}";
|
||||
}
|
||||
];
|
||||
};
|
||||
|
||||
28
modules/home/noctalia.nix
Normal file
28
modules/home/noctalia.nix
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
pkgs,
|
||||
inputs,
|
||||
system,
|
||||
lib,
|
||||
...
|
||||
}: let
|
||||
noctalia = inputs.noctalia.packages.${system}.default;
|
||||
configDir = "${noctalia}/share/noctalia-shell";
|
||||
in {
|
||||
home = {
|
||||
packages = with pkgs; [
|
||||
noctalia
|
||||
quickshell # Ensure quickshell is available for the service
|
||||
];
|
||||
activation.seedNoctaliaShellCode = lib.hm.dag.entryAfter ["writeBoundary"] ''
|
||||
set -eu
|
||||
DEST="$HOME/.config/quickshell/noctalia-shell"
|
||||
SRC="${configDir}"
|
||||
|
||||
if [ ! -d "$DEST" ]; then
|
||||
$DRY_RUN_CMD mkdir -p "$HOME/.config/quickshell"
|
||||
$DRY_RUN_CMD cp -R "$SRC" "$DEST"
|
||||
$DRY_RUN_CMD chmod -R u+rwX "$DEST"
|
||||
fi
|
||||
'';
|
||||
};
|
||||
}
|
||||
22
modules/home/overview.nix
Normal file
22
modules/home/overview.nix
Normal file
@@ -0,0 +1,22 @@
|
||||
{lib, ...}: let
|
||||
overviewSource = ./overview;
|
||||
in {
|
||||
# Quickshell-overview is a Qt6 QML app for Hyprland workspace overview
|
||||
# It shows all workspaces with live window previews, drag-and-drop support
|
||||
# Toggled via: SUPER + TAB (bound in hyprland/binds.nix)
|
||||
# Started via exec-once in hyprland/exec-once.nix
|
||||
|
||||
# Seed the Quickshell overview code into ~/.config/quickshell/overview
|
||||
# Copy (not symlink) so QML module resolution works and users can edit files
|
||||
home.activation.seedOverviewCode = lib.hm.dag.entryAfter ["writeBoundary"] ''
|
||||
set -eu
|
||||
DEST="$HOME/.config/quickshell/overview"
|
||||
SRC="${overviewSource}"
|
||||
|
||||
if [ ! -d "$DEST" ]; then
|
||||
mkdir -p "$HOME/.config/quickshell"
|
||||
cp -R "$SRC" "$DEST"
|
||||
chmod -R u+rwX "$DEST"
|
||||
fi
|
||||
'';
|
||||
}
|
||||
214
modules/home/overview/README.md
Normal file
214
modules/home/overview/README.md
Normal file
@@ -0,0 +1,214 @@
|
||||
# Quickshell Overview for Hyprland
|
||||
|
||||
<div align="center">
|
||||
|
||||
A standalone workspace overview module for Hyprland using Quickshell - shows all workspaces with live window previews, drag-and-drop support, and Super+Tab keybind.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
</div>
|
||||
|
||||
---
|
||||
|
||||
## 📸 Preview
|
||||
|
||||

|
||||
|
||||
https://github.com/user-attachments/assets/79ceb141-6b9e-4956-8e09-aaf72b66550c
|
||||
|
||||
> *Workspace overview showing live window previews with drag-and-drop support*
|
||||
|
||||
---
|
||||
|
||||
## ✨ Features
|
||||
|
||||
- 🖼️ Visual workspace overview showing all workspaces and windows
|
||||
- 🎯 Click windows to focus them
|
||||
- 🖱️ Middle-click windows to close them
|
||||
- 🔄 Drag and drop windows between workspaces
|
||||
- ⌨️ Keyboard navigation (Arrow keys to switch workspaces, Escape/Enter to close)
|
||||
- 💡 Hover tooltips showing window information
|
||||
- 🎨 Material Design 3 theming
|
||||
- ⚡ Smooth animations and transitions
|
||||
|
||||
## 📦 Installation
|
||||
|
||||
### Prerequisites
|
||||
|
||||
- **Hyprland** compositor
|
||||
- **Quickshell** ([installation guide](https://quickshell.org/docs/v0.1.0/guide/install-setup/))
|
||||
- **Qt 6** with modules: QtQuick, QtQuick.Controls, Qt5Compat.GraphicalEffects
|
||||
|
||||
### Setup
|
||||
|
||||
1. **Clone this repository** to your Quickshell config directory:
|
||||
```bash
|
||||
git clone https://github.com/Shanu-Kumawat/quickshell-overview ~/.config/quickshell/overview
|
||||
```
|
||||
|
||||
2. **Add keybind** to your Hyprland config (`~/.config/hypr/hyprland.conf`):
|
||||
```conf
|
||||
bind = Super, TAB, exec, qs ipc -c overview call overview toggle
|
||||
```
|
||||
|
||||
3. **Auto-start** the overview (add to Hyprland config):
|
||||
```conf
|
||||
exec-once = qs -c overview
|
||||
```
|
||||
|
||||
4. **Reload Hyprland**:
|
||||
```bash
|
||||
hyprctl reload
|
||||
```
|
||||
|
||||
### Manual Start (if needed)
|
||||
|
||||
```bash
|
||||
qs -c overview &
|
||||
```
|
||||
|
||||
## 🎮 Usage
|
||||
|
||||
| Action | Description |
|
||||
|--------|-------------|
|
||||
| **Super + Tab** | Toggle the overview |
|
||||
| **Left/Right Arrow Keys** | Navigate between workspaces horizontally |
|
||||
| **Up/Down Arrow Keys** | Navigate between workspace rows |
|
||||
| **Escape / Enter** | Close the overview |
|
||||
| **Click workspace** | Switch to that workspace |
|
||||
| **Click window** | Focus that window |
|
||||
| **Middle-click window** | Close that window |
|
||||
| **Drag window** | Move window to different workspace |
|
||||
|
||||
---
|
||||
|
||||
## ⚙️ Configuration
|
||||
|
||||
> **⚠️ Want to change the size, position, or number of workspaces?**
|
||||
> Edit `~/.config/quickshell/overview/common/Config.qml` - it's all there!
|
||||
|
||||
### Workspace Grid
|
||||
|
||||
Edit `~/.config/quickshell/overview/common/Config.qml`:
|
||||
|
||||
```qml
|
||||
property QtObject overview: QtObject {
|
||||
property int rows: 2 // Number of workspace rows
|
||||
property int columns: 5 // Number of workspace columns (10 total workspaces)
|
||||
property real scale: 0.16 // Overview scale factor (0.1-0.3, smaller = more compact)
|
||||
property bool enable: true
|
||||
}
|
||||
```
|
||||
|
||||
**Common adjustments:**
|
||||
- **Too small?** Increase `scale` (try 0.20 or 0.25)
|
||||
- **Too big?** Decrease `scale` (try 0.12 or 0.14)
|
||||
- **More workspaces?** Change `rows` and `columns` (e.g., 3 rows × 4 columns = 12 workspaces)
|
||||
|
||||
### Position
|
||||
|
||||
Edit `~/.config/quickshell/overview/modules/overview/Overview.qml` (line ~111):
|
||||
|
||||
```qml
|
||||
anchors {
|
||||
horizontalCenter: parent.horizontalCenter
|
||||
top: parent.top
|
||||
topMargin: 100 // Change this value to move up/down
|
||||
}
|
||||
```
|
||||
|
||||
### Theme & Colors
|
||||
|
||||
Edit `~/.config/quickshell/overview/common/Appearance.qml` to customize:
|
||||
- Colors (m3colors and colors objects)
|
||||
- Font families and sizes
|
||||
- Animation curves and durations
|
||||
- Border radius values
|
||||
|
||||
---
|
||||
|
||||
## 📋 Requirements
|
||||
|
||||
- **Hyprland** compositor (tested on latest versions)
|
||||
- **Quickshell** (Qt6-based shell framework)
|
||||
- **Qt 6** with the following modules:
|
||||
- QtQuick
|
||||
- QtQuick.Controls
|
||||
- QtQuick.Layouts
|
||||
- Qt5Compat.GraphicalEffects
|
||||
- Quickshell.Wayland
|
||||
- Quickshell.Hyprland
|
||||
|
||||
## 🚫 Removed Features (from original illogical-impulse)
|
||||
|
||||
The following features were removed to make it standalone:
|
||||
|
||||
- App search functionality
|
||||
- Emoji picker
|
||||
- Clipboard history integration
|
||||
- Search widget
|
||||
- Integration with the full illogical-impulse shell ecosystem
|
||||
|
||||
## 📁 File Structure
|
||||
|
||||
```
|
||||
~/.config/quickshell/overview/
|
||||
├── shell.qml # Main entry point
|
||||
├── README.md # This file
|
||||
├── hyprland-config.conf # Configuration reference
|
||||
├── common/
|
||||
│ ├── Appearance.qml # Theme and styling
|
||||
│ ├── Config.qml # Configuration options
|
||||
│ ├── functions/
|
||||
│ │ └── ColorUtils.qml # Color manipulation utilities
|
||||
│ └── widgets/
|
||||
│ ├── StyledText.qml # Styled text component
|
||||
│ ├── StyledRectangularShadow.qml
|
||||
│ ├── StyledToolTip.qml
|
||||
│ └── StyledToolTipContent.qml
|
||||
├── services/
|
||||
│ ├── GlobalStates.qml # Global state management
|
||||
│ └── HyprlandData.qml # Hyprland data provider
|
||||
└── modules/
|
||||
└── overview/
|
||||
├── Overview.qml # Main overview component
|
||||
├── OverviewWidget.qml # Workspace grid widget
|
||||
└── OverviewWindow.qml # Individual window preview
|
||||
```
|
||||
|
||||
## 🎯 IPC Commands
|
||||
|
||||
```bash
|
||||
# Toggle overview
|
||||
qs ipc -c overview call overview toggle
|
||||
|
||||
# Open overview
|
||||
qs ipc -c overview call overview open
|
||||
|
||||
# Close overview
|
||||
qs ipc -c overview call overview close
|
||||
```
|
||||
|
||||
## 🐛 Known Issues
|
||||
|
||||
- Window icons may fallback to generic icon if app class name doesn't match icon theme
|
||||
- Potential crashes during rapid window state changes due to Wayland screencopy buffer management
|
||||
|
||||
## Credits
|
||||
|
||||
Extracted from the overview feature in [illogical-impulse](https://github.com/end-4/dots-hyprland) by [end-4](https://github.com/end-4).
|
||||
|
||||
Adapted as a standalone component for Hyprland + Quickshell users who want just the overview functionality.
|
||||
|
||||
---
|
||||
|
||||
<div align="center">
|
||||
|
||||
**Note:** Maintenance will be limited due to time constraints, but **PRs and code improvements are welcome!** Feel free to contribute or fork for your own needs.
|
||||
|
||||
Made with ❤️ for the Hyprland community
|
||||
|
||||
</div>
|
||||
BIN
modules/home/overview/assets/image.png
Normal file
BIN
modules/home/overview/assets/image.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.4 MiB |
148
modules/home/overview/common/Appearance.qml
Normal file
148
modules/home/overview/common/Appearance.qml
Normal file
@@ -0,0 +1,148 @@
|
||||
pragma Singleton
|
||||
pragma ComponentBehavior: Bound
|
||||
|
||||
import QtQuick
|
||||
import Quickshell
|
||||
import "functions"
|
||||
|
||||
Singleton {
|
||||
id: root
|
||||
property QtObject m3colors
|
||||
property QtObject animation
|
||||
property QtObject animationCurves
|
||||
property QtObject colors
|
||||
property QtObject rounding
|
||||
property QtObject font
|
||||
property QtObject sizes
|
||||
|
||||
m3colors: QtObject {
|
||||
property bool darkmode: true
|
||||
property color m3primary: "#E5B6F2"
|
||||
property color m3onPrimary: "#452152"
|
||||
property color m3primaryContainer: "#5D386A"
|
||||
property color m3onPrimaryContainer: "#F9D8FF"
|
||||
property color m3secondary: "#D5C0D7"
|
||||
property color m3onSecondary: "#392C3D"
|
||||
property color m3secondaryContainer: "#534457"
|
||||
property color m3onSecondaryContainer: "#F2DCF3"
|
||||
property color m3background: "#161217"
|
||||
property color m3onBackground: "#EAE0E7"
|
||||
property color m3surface: "#161217"
|
||||
property color m3surfaceContainerLow: "#1F1A1F"
|
||||
property color m3surfaceContainer: "#231E23"
|
||||
property color m3surfaceContainerHigh: "#2D282E"
|
||||
property color m3surfaceContainerHighest: "#383339"
|
||||
property color m3onSurface: "#EAE0E7"
|
||||
property color m3surfaceVariant: "#4C444D"
|
||||
property color m3onSurfaceVariant: "#CFC3CD"
|
||||
property color m3inverseSurface: "#EAE0E7"
|
||||
property color m3inverseOnSurface: "#342F34"
|
||||
property color m3outline: "#988E97"
|
||||
property color m3outlineVariant: "#4C444D"
|
||||
property color m3shadow: "#000000"
|
||||
}
|
||||
|
||||
colors: QtObject {
|
||||
property color colSubtext: m3colors.m3outline
|
||||
property color colLayer0: m3colors.m3background
|
||||
property color colOnLayer0: m3colors.m3onBackground
|
||||
property color colLayer0Border: ColorUtils.mix(root.m3colors.m3outlineVariant, colLayer0, 0.4)
|
||||
property color colLayer1: m3colors.m3surfaceContainerLow
|
||||
property color colOnLayer1: m3colors.m3onSurfaceVariant
|
||||
property color colOnLayer1Inactive: ColorUtils.mix(colOnLayer1, colLayer1, 0.45)
|
||||
property color colLayer1Hover: ColorUtils.mix(colLayer1, colOnLayer1, 0.92)
|
||||
property color colLayer1Active: ColorUtils.mix(colLayer1, colOnLayer1, 0.85)
|
||||
property color colLayer2: m3colors.m3surfaceContainer
|
||||
property color colOnLayer2: m3colors.m3onSurface
|
||||
property color colLayer2Hover: ColorUtils.mix(colLayer2, colOnLayer2, 0.90)
|
||||
property color colLayer2Active: ColorUtils.mix(colLayer2, colOnLayer2, 0.80)
|
||||
property color colPrimary: m3colors.m3primary
|
||||
property color colOnPrimary: m3colors.m3onPrimary
|
||||
property color colSecondary: m3colors.m3secondary
|
||||
property color colSecondaryContainer: m3colors.m3secondaryContainer
|
||||
property color colOnSecondaryContainer: m3colors.m3onSecondaryContainer
|
||||
property color colTooltip: m3colors.m3inverseSurface
|
||||
property color colOnTooltip: m3colors.m3inverseOnSurface
|
||||
property color colShadow: ColorUtils.transparentize(m3colors.m3shadow, 0.7)
|
||||
property color colOutline: m3colors.m3outline
|
||||
}
|
||||
|
||||
rounding: QtObject {
|
||||
property int unsharpen: 2
|
||||
property int verysmall: 8
|
||||
property int small: 12
|
||||
property int normal: 17
|
||||
property int large: 23
|
||||
property int full: 9999
|
||||
property int screenRounding: large
|
||||
property int windowRounding: 18
|
||||
}
|
||||
|
||||
font: QtObject {
|
||||
property QtObject family: QtObject {
|
||||
property string main: "sans-serif"
|
||||
property string title: "sans-serif"
|
||||
property string expressive: "sans-serif"
|
||||
}
|
||||
property QtObject pixelSize: QtObject {
|
||||
property int smaller: 12
|
||||
property int small: 15
|
||||
property int normal: 16
|
||||
property int larger: 19
|
||||
property int huge: 22
|
||||
}
|
||||
}
|
||||
|
||||
animationCurves: QtObject {
|
||||
readonly property list<real> expressiveDefaultSpatial: [0.38, 1.21, 0.22, 1.00, 1, 1]
|
||||
readonly property list<real> expressiveEffects: [0.34, 0.80, 0.34, 1.00, 1, 1]
|
||||
readonly property list<real> emphasizedDecel: [0.05, 0.7, 0.1, 1, 1, 1]
|
||||
readonly property real expressiveDefaultSpatialDuration: 500
|
||||
readonly property real expressiveEffectsDuration: 200
|
||||
}
|
||||
|
||||
animation: QtObject {
|
||||
property QtObject elementMove: QtObject {
|
||||
property int duration: animationCurves.expressiveDefaultSpatialDuration
|
||||
property int type: Easing.BezierSpline
|
||||
property list<real> bezierCurve: animationCurves.expressiveDefaultSpatial
|
||||
property Component numberAnimation: Component {
|
||||
NumberAnimation {
|
||||
duration: root.animation.elementMove.duration
|
||||
easing.type: root.animation.elementMove.type
|
||||
easing.bezierCurve: root.animation.elementMove.bezierCurve
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
property QtObject elementMoveEnter: QtObject {
|
||||
property int duration: 400
|
||||
property int type: Easing.BezierSpline
|
||||
property list<real> bezierCurve: animationCurves.emphasizedDecel
|
||||
property Component numberAnimation: Component {
|
||||
NumberAnimation {
|
||||
duration: root.animation.elementMoveEnter.duration
|
||||
easing.type: root.animation.elementMoveEnter.type
|
||||
easing.bezierCurve: root.animation.elementMoveEnter.bezierCurve
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
property QtObject elementMoveFast: QtObject {
|
||||
property int duration: animationCurves.expressiveEffectsDuration
|
||||
property int type: Easing.BezierSpline
|
||||
property list<real> bezierCurve: animationCurves.expressiveEffects
|
||||
property Component numberAnimation: Component {
|
||||
NumberAnimation {
|
||||
duration: root.animation.elementMoveFast.duration
|
||||
easing.type: root.animation.elementMoveFast.type
|
||||
easing.bezierCurve: root.animation.elementMoveFast.bezierCurve
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sizes: QtObject {
|
||||
property real elevationMargin: 10
|
||||
}
|
||||
}
|
||||
22
modules/home/overview/common/Config.qml
Normal file
22
modules/home/overview/common/Config.qml
Normal file
@@ -0,0 +1,22 @@
|
||||
pragma Singleton
|
||||
pragma ComponentBehavior: Bound
|
||||
|
||||
import QtQuick
|
||||
import Quickshell
|
||||
|
||||
Singleton {
|
||||
id: root
|
||||
|
||||
property QtObject options: QtObject {
|
||||
property QtObject overview: QtObject {
|
||||
property int rows: 2
|
||||
property int columns: 5
|
||||
property real scale: 0.16
|
||||
property bool enable: true
|
||||
}
|
||||
|
||||
property QtObject hacks: QtObject {
|
||||
property int arbitraryRaceConditionDelay: 150
|
||||
}
|
||||
}
|
||||
}
|
||||
68
modules/home/overview/common/functions/ColorUtils.qml
Normal file
68
modules/home/overview/common/functions/ColorUtils.qml
Normal file
@@ -0,0 +1,68 @@
|
||||
pragma Singleton
|
||||
import Quickshell
|
||||
|
||||
Singleton {
|
||||
id: root
|
||||
|
||||
function colorWithHueOf(color1, color2) {
|
||||
var c1 = Qt.color(color1);
|
||||
var c2 = Qt.color(color2);
|
||||
var hue = c2.hsvHue;
|
||||
var sat = c1.hsvSaturation;
|
||||
var val = c1.hsvValue;
|
||||
var alpha = c1.a;
|
||||
return Qt.hsva(hue, sat, val, alpha);
|
||||
}
|
||||
|
||||
function colorWithSaturationOf(color1, color2) {
|
||||
var c1 = Qt.color(color1);
|
||||
var c2 = Qt.color(color2);
|
||||
var hue = c1.hsvHue;
|
||||
var sat = c2.hsvSaturation;
|
||||
var val = c1.hsvValue;
|
||||
var alpha = c1.a;
|
||||
return Qt.hsva(hue, sat, val, alpha);
|
||||
}
|
||||
|
||||
function colorWithLightness(color, lightness) {
|
||||
var c = Qt.color(color);
|
||||
return Qt.hsla(c.hslHue, c.hslSaturation, lightness, c.a);
|
||||
}
|
||||
|
||||
function colorWithLightnessOf(color1, color2) {
|
||||
var c2 = Qt.color(color2);
|
||||
return colorWithLightness(color1, c2.hslLightness);
|
||||
}
|
||||
|
||||
function adaptToAccent(color1, color2) {
|
||||
var c1 = Qt.color(color1);
|
||||
var c2 = Qt.color(color2);
|
||||
var hue = c2.hslHue;
|
||||
var sat = c2.hslSaturation;
|
||||
var light = c1.hslLightness;
|
||||
var alpha = c1.a;
|
||||
return Qt.hsla(hue, sat, light, alpha);
|
||||
}
|
||||
|
||||
function mix(color1, color2, percentage = 0.5) {
|
||||
var c1 = Qt.color(color1);
|
||||
var c2 = Qt.color(color2);
|
||||
return Qt.rgba(
|
||||
percentage * c1.r + (1 - percentage) * c2.r,
|
||||
percentage * c1.g + (1 - percentage) * c2.g,
|
||||
percentage * c1.b + (1 - percentage) * c2.b,
|
||||
percentage * c1.a + (1 - percentage) * c2.a
|
||||
);
|
||||
}
|
||||
|
||||
function transparentize(color, percentage = 1) {
|
||||
var c = Qt.color(color);
|
||||
return Qt.rgba(c.r, c.g, c.b, c.a * (1 - percentage));
|
||||
}
|
||||
|
||||
function applyAlpha(color, alpha) {
|
||||
var c = Qt.color(color);
|
||||
var a = Math.max(0, Math.min(1, alpha));
|
||||
return Qt.rgba(c.r, c.g, c.b, a);
|
||||
}
|
||||
}
|
||||
1
modules/home/overview/common/functions/qmldir
Normal file
1
modules/home/overview/common/functions/qmldir
Normal file
@@ -0,0 +1 @@
|
||||
singleton ColorUtils 1.0 ColorUtils.qml
|
||||
7
modules/home/overview/common/qmldir
Normal file
7
modules/home/overview/common/qmldir
Normal file
@@ -0,0 +1,7 @@
|
||||
singleton Appearance 1.0 Appearance.qml
|
||||
singleton Config 1.0 Config.qml
|
||||
singleton ColorUtils 1.0 functions/ColorUtils.qml
|
||||
StyledText 1.0 widgets/StyledText.qml
|
||||
StyledRectangularShadow 1.0 widgets/StyledRectangularShadow.qml
|
||||
StyledToolTip 1.0 widgets/StyledToolTip.qml
|
||||
StyledToolTipContent 1.0 widgets/StyledToolTipContent.qml
|
||||
@@ -0,0 +1,14 @@
|
||||
import QtQuick
|
||||
import QtQuick.Effects
|
||||
import ".."
|
||||
|
||||
RectangularShadow {
|
||||
required property var target
|
||||
anchors.fill: target
|
||||
radius: 20
|
||||
blur: 0.9 * Appearance.sizes.elevationMargin
|
||||
offset: Qt.vector2d(0.0, 1.0)
|
||||
spread: 1
|
||||
color: Appearance.colors.colShadow
|
||||
cached: true
|
||||
}
|
||||
16
modules/home/overview/common/widgets/StyledText.qml
Normal file
16
modules/home/overview/common/widgets/StyledText.qml
Normal file
@@ -0,0 +1,16 @@
|
||||
import QtQuick
|
||||
import ".."
|
||||
|
||||
Text {
|
||||
id: root
|
||||
property bool animateChange: false
|
||||
|
||||
renderType: Text.NativeRendering
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
font {
|
||||
hintingPreference: Font.PreferFullHinting
|
||||
family: Appearance?.font.family.main ?? "sans-serif"
|
||||
pixelSize: Appearance?.font.pixelSize.small ?? 15
|
||||
}
|
||||
color: Appearance?.m3colors.m3onBackground ?? "white"
|
||||
}
|
||||
23
modules/home/overview/common/widgets/StyledToolTip.qml
Normal file
23
modules/home/overview/common/widgets/StyledToolTip.qml
Normal file
@@ -0,0 +1,23 @@
|
||||
import QtQuick
|
||||
import QtQuick.Controls
|
||||
import "."
|
||||
|
||||
ToolTip {
|
||||
id: root
|
||||
property bool extraVisibleCondition: true
|
||||
property bool alternativeVisibleCondition: false
|
||||
readonly property bool internalVisibleCondition: (extraVisibleCondition && (parent.hovered === undefined || parent?.hovered)) || alternativeVisibleCondition
|
||||
verticalPadding: 5
|
||||
horizontalPadding: 10
|
||||
background: null
|
||||
|
||||
visible: internalVisibleCondition
|
||||
|
||||
contentItem: StyledToolTipContent {
|
||||
id: contentItem
|
||||
text: root.text
|
||||
shown: root.internalVisibleCondition
|
||||
horizontalPadding: root.horizontalPadding
|
||||
verticalPadding: root.verticalPadding
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
import QtQuick
|
||||
import "."
|
||||
import "../"
|
||||
|
||||
Item {
|
||||
id: root
|
||||
required property string text
|
||||
property bool shown: false
|
||||
property real horizontalPadding: 10
|
||||
property real verticalPadding: 5
|
||||
implicitWidth: tooltipTextObject.implicitWidth + 2 * root.horizontalPadding
|
||||
implicitHeight: tooltipTextObject.implicitHeight + 2 * root.verticalPadding
|
||||
|
||||
property bool isVisible: backgroundRectangle.implicitHeight > 0
|
||||
|
||||
Rectangle {
|
||||
id: backgroundRectangle
|
||||
anchors {
|
||||
bottom: root.bottom
|
||||
horizontalCenter: root.horizontalCenter
|
||||
}
|
||||
color: Appearance?.colors.colTooltip ?? "#3C4043"
|
||||
radius: Appearance?.rounding.verysmall ?? 7
|
||||
opacity: shown ? 1 : 0
|
||||
implicitWidth: shown ? (tooltipTextObject.implicitWidth + 2 * root.horizontalPadding) : 0
|
||||
implicitHeight: shown ? (tooltipTextObject.implicitHeight + 2 * root.verticalPadding) : 0
|
||||
clip: true
|
||||
|
||||
Behavior on implicitWidth {
|
||||
animation: Appearance?.animation.elementMoveFast.numberAnimation.createObject(this)
|
||||
}
|
||||
Behavior on implicitHeight {
|
||||
animation: Appearance?.animation.elementMoveFast.numberAnimation.createObject(this)
|
||||
}
|
||||
Behavior on opacity {
|
||||
animation: Appearance?.animation.elementMoveFast.numberAnimation.createObject(this)
|
||||
}
|
||||
|
||||
StyledText {
|
||||
id: tooltipTextObject
|
||||
anchors.centerIn: parent
|
||||
text: root.text
|
||||
font.pixelSize: Appearance?.font.pixelSize.smaller ?? 14
|
||||
font.hintingPreference: Font.PreferNoHinting
|
||||
color: Appearance?.colors.colOnTooltip ?? "#FFFFFF"
|
||||
wrapMode: Text.Wrap
|
||||
}
|
||||
}
|
||||
}
|
||||
4
modules/home/overview/common/widgets/qmldir
Normal file
4
modules/home/overview/common/widgets/qmldir
Normal file
@@ -0,0 +1,4 @@
|
||||
StyledText 1.0 StyledText.qml
|
||||
StyledRectangularShadow 1.0 StyledRectangularShadow.qml
|
||||
StyledToolTip 1.0 StyledToolTip.qml
|
||||
StyledToolTipContent 1.0 StyledToolTipContent.qml
|
||||
147
modules/home/overview/modules/overview/Overview.qml
Normal file
147
modules/home/overview/modules/overview/Overview.qml
Normal file
@@ -0,0 +1,147 @@
|
||||
import QtQuick
|
||||
import QtQuick.Controls
|
||||
import QtQuick.Layouts
|
||||
import Quickshell
|
||||
import Quickshell.Io
|
||||
import Quickshell.Wayland
|
||||
import Quickshell.Hyprland
|
||||
import "../../common"
|
||||
import "../../services"
|
||||
import "."
|
||||
|
||||
Scope {
|
||||
id: overviewScope
|
||||
Variants {
|
||||
id: overviewVariants
|
||||
model: Quickshell.screens
|
||||
PanelWindow {
|
||||
id: root
|
||||
required property var modelData
|
||||
readonly property HyprlandMonitor monitor: Hyprland.monitorFor(root.screen)
|
||||
property bool monitorIsFocused: (Hyprland.focusedMonitor?.id == monitor?.id)
|
||||
screen: modelData
|
||||
visible: GlobalStates.overviewOpen
|
||||
|
||||
WlrLayershell.namespace: "quickshell:overview"
|
||||
WlrLayershell.layer: WlrLayer.Overlay
|
||||
WlrLayershell.keyboardFocus: WlrKeyboardFocus.Exclusive
|
||||
color: "transparent"
|
||||
|
||||
mask: Region {
|
||||
item: GlobalStates.overviewOpen ? keyHandler : null
|
||||
}
|
||||
|
||||
anchors {
|
||||
top: true
|
||||
bottom: true
|
||||
left: !(Config?.options.overview.enable ?? true)
|
||||
right: !(Config?.options.overview.enable ?? true)
|
||||
}
|
||||
|
||||
HyprlandFocusGrab {
|
||||
id: grab
|
||||
windows: [root]
|
||||
property bool canBeActive: root.monitorIsFocused
|
||||
active: false
|
||||
onCleared: () => {
|
||||
if (!active)
|
||||
GlobalStates.overviewOpen = false;
|
||||
}
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: GlobalStates
|
||||
function onOverviewOpenChanged() {
|
||||
if (GlobalStates.overviewOpen) {
|
||||
delayedGrabTimer.start();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Timer {
|
||||
id: delayedGrabTimer
|
||||
interval: Config.options.hacks.arbitraryRaceConditionDelay
|
||||
repeat: false
|
||||
onTriggered: {
|
||||
if (!grab.canBeActive)
|
||||
return;
|
||||
grab.active = GlobalStates.overviewOpen;
|
||||
}
|
||||
}
|
||||
|
||||
implicitWidth: columnLayout.implicitWidth
|
||||
implicitHeight: columnLayout.implicitHeight
|
||||
|
||||
Item {
|
||||
id: keyHandler
|
||||
anchors.fill: parent
|
||||
visible: GlobalStates.overviewOpen
|
||||
focus: GlobalStates.overviewOpen
|
||||
|
||||
Keys.onPressed: event => {
|
||||
if (event.key === Qt.Key_Escape || event.key === Qt.Key_Return) {
|
||||
GlobalStates.overviewOpen = false;
|
||||
event.accepted = true;
|
||||
} else if (event.key === Qt.Key_Left || event.key === Qt.Key_Right || event.key === Qt.Key_Up || event.key === Qt.Key_Down) {
|
||||
const workspacesPerGroup = Config.options.overview.rows * Config.options.overview.columns;
|
||||
const currentId = Hyprland.focusedMonitor?.activeWorkspace?.id ?? 1;
|
||||
const currentGroup = Math.floor((currentId - 1) / workspacesPerGroup);
|
||||
const minWorkspaceId = currentGroup * workspacesPerGroup + 1;
|
||||
const maxWorkspaceId = minWorkspaceId + workspacesPerGroup - 1;
|
||||
|
||||
let targetId;
|
||||
if (event.key === Qt.Key_Left) {
|
||||
targetId = currentId - 1;
|
||||
if (targetId < minWorkspaceId) targetId = maxWorkspaceId;
|
||||
} else if (event.key === Qt.Key_Right) {
|
||||
targetId = currentId + 1;
|
||||
if (targetId > maxWorkspaceId) targetId = minWorkspaceId;
|
||||
} else if (event.key === Qt.Key_Up) {
|
||||
targetId = currentId - Config.options.overview.columns;
|
||||
if (targetId < minWorkspaceId) targetId += workspacesPerGroup;
|
||||
} else {
|
||||
targetId = currentId + Config.options.overview.columns;
|
||||
if (targetId > maxWorkspaceId) targetId -= workspacesPerGroup;
|
||||
}
|
||||
|
||||
Hyprland.dispatch("workspace " + targetId);
|
||||
event.accepted = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
id: columnLayout
|
||||
visible: GlobalStates.overviewOpen
|
||||
anchors {
|
||||
horizontalCenter: parent.horizontalCenter
|
||||
top: parent.top
|
||||
topMargin: 100
|
||||
}
|
||||
|
||||
Loader {
|
||||
id: overviewLoader
|
||||
active: GlobalStates.overviewOpen && (Config?.options.overview.enable ?? true)
|
||||
sourceComponent: OverviewWidget {
|
||||
panelWindow: root
|
||||
visible: true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
IpcHandler {
|
||||
target: "overview"
|
||||
|
||||
function toggle() {
|
||||
GlobalStates.overviewOpen = !GlobalStates.overviewOpen;
|
||||
}
|
||||
function close() {
|
||||
GlobalStates.overviewOpen = false;
|
||||
}
|
||||
function open() {
|
||||
GlobalStates.overviewOpen = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
303
modules/home/overview/modules/overview/OverviewWidget.qml
Normal file
303
modules/home/overview/modules/overview/OverviewWidget.qml
Normal file
@@ -0,0 +1,303 @@
|
||||
import QtQuick
|
||||
import QtQuick.Layouts
|
||||
import Quickshell
|
||||
import Quickshell.Wayland
|
||||
import Quickshell.Hyprland
|
||||
import "../../common"
|
||||
import "../../common/functions"
|
||||
import "../../common/widgets"
|
||||
import "../../services"
|
||||
import "."
|
||||
|
||||
Item {
|
||||
id: root
|
||||
required property var panelWindow
|
||||
readonly property HyprlandMonitor monitor: Hyprland.monitorFor(panelWindow.screen)
|
||||
readonly property var toplevels: ToplevelManager.toplevels
|
||||
readonly property int workspacesShown: Config.options.overview.rows * Config.options.overview.columns
|
||||
readonly property int workspaceGroup: Math.floor((monitor.activeWorkspace?.id - 1) / workspacesShown)
|
||||
property bool monitorIsFocused: (Hyprland.focusedMonitor?.name == monitor.name)
|
||||
property var windows: HyprlandData.windowList
|
||||
property var windowByAddress: HyprlandData.windowByAddress
|
||||
property var windowAddresses: HyprlandData.addresses
|
||||
property var monitorData: HyprlandData.monitors.find(m => m.id === root.monitor?.id)
|
||||
property real scale: Config.options.overview.scale
|
||||
property color activeBorderColor: Appearance.colors.colSecondary
|
||||
|
||||
property real workspaceImplicitWidth: (monitorData?.transform % 2 === 1) ?
|
||||
((monitor.height / monitor.scale - (monitorData?.reserved?.[0] ?? 0) - (monitorData?.reserved?.[2] ?? 0)) * root.scale) :
|
||||
((monitor.width / monitor.scale - (monitorData?.reserved?.[0] ?? 0) - (monitorData?.reserved?.[2] ?? 0)) * root.scale)
|
||||
property real workspaceImplicitHeight: (monitorData?.transform % 2 === 1) ?
|
||||
((monitor.width / monitor.scale - (monitorData?.reserved?.[1] ?? 0) - (monitorData?.reserved?.[3] ?? 0)) * root.scale) :
|
||||
((monitor.height / monitor.scale - (monitorData?.reserved?.[1] ?? 0) - (monitorData?.reserved?.[3] ?? 0)) * root.scale)
|
||||
|
||||
property real workspaceNumberMargin: 80
|
||||
property real workspaceNumberSize: 250 * monitor.scale
|
||||
property int workspaceZ: 0
|
||||
property int windowZ: 1
|
||||
property int windowDraggingZ: 99999
|
||||
property real workspaceSpacing: 5
|
||||
|
||||
property int draggingFromWorkspace: -1
|
||||
property int draggingTargetWorkspace: -1
|
||||
|
||||
implicitWidth: overviewBackground.implicitWidth + Appearance.sizes.elevationMargin * 2
|
||||
implicitHeight: overviewBackground.implicitHeight + Appearance.sizes.elevationMargin * 2
|
||||
|
||||
property Component windowComponent: OverviewWindow {}
|
||||
property list<OverviewWindow> windowWidgets: []
|
||||
|
||||
StyledRectangularShadow {
|
||||
target: overviewBackground
|
||||
}
|
||||
Rectangle { // Background
|
||||
id: overviewBackground
|
||||
property real padding: 10
|
||||
anchors.fill: parent
|
||||
anchors.margins: Appearance.sizes.elevationMargin
|
||||
|
||||
implicitWidth: workspaceColumnLayout.implicitWidth + padding * 2
|
||||
implicitHeight: workspaceColumnLayout.implicitHeight + padding * 2
|
||||
radius: Appearance.rounding.screenRounding * root.scale + padding
|
||||
color: Appearance.colors.colLayer0
|
||||
border.width: 1
|
||||
border.color: Appearance.colors.colLayer0Border
|
||||
|
||||
ColumnLayout { // Workspaces
|
||||
id: workspaceColumnLayout
|
||||
|
||||
z: root.workspaceZ
|
||||
anchors.centerIn: parent
|
||||
spacing: workspaceSpacing
|
||||
Repeater {
|
||||
model: Config.options.overview.rows
|
||||
delegate: RowLayout {
|
||||
id: row
|
||||
property int rowIndex: index
|
||||
spacing: workspaceSpacing
|
||||
|
||||
Repeater { // Workspace repeater
|
||||
model: Config.options.overview.columns
|
||||
Rectangle { // Workspace
|
||||
id: workspace
|
||||
property int colIndex: index
|
||||
property int workspaceValue: root.workspaceGroup * workspacesShown + rowIndex * Config.options.overview.columns + colIndex + 1
|
||||
property color defaultWorkspaceColor: Appearance.colors.colLayer1
|
||||
property color hoveredWorkspaceColor: ColorUtils.mix(defaultWorkspaceColor, Appearance.colors.colLayer1Hover, 0.1)
|
||||
property color hoveredBorderColor: Appearance.colors.colLayer2Hover
|
||||
property bool hoveredWhileDragging: false
|
||||
|
||||
implicitWidth: root.workspaceImplicitWidth
|
||||
implicitHeight: root.workspaceImplicitHeight
|
||||
color: hoveredWhileDragging ? hoveredWorkspaceColor : defaultWorkspaceColor
|
||||
radius: Appearance.rounding.screenRounding * root.scale
|
||||
border.width: 2
|
||||
border.color: hoveredWhileDragging ? hoveredBorderColor : "transparent"
|
||||
|
||||
StyledText {
|
||||
anchors.centerIn: parent
|
||||
text: workspaceValue
|
||||
font {
|
||||
pixelSize: root.workspaceNumberSize * root.scale
|
||||
weight: Font.DemiBold
|
||||
family: Appearance.font.family.expressive
|
||||
}
|
||||
color: ColorUtils.transparentize(Appearance.colors.colOnLayer1, 0.8)
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
id: workspaceArea
|
||||
anchors.fill: parent
|
||||
acceptedButtons: Qt.LeftButton
|
||||
onClicked: {
|
||||
if (root.draggingTargetWorkspace === -1) {
|
||||
GlobalStates.overviewOpen = false
|
||||
Hyprland.dispatch(`workspace ${workspaceValue}`)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
DropArea {
|
||||
anchors.fill: parent
|
||||
onEntered: {
|
||||
root.draggingTargetWorkspace = workspaceValue
|
||||
if (root.draggingFromWorkspace == root.draggingTargetWorkspace) return;
|
||||
hoveredWhileDragging = true
|
||||
}
|
||||
onExited: {
|
||||
hoveredWhileDragging = false
|
||||
if (root.draggingTargetWorkspace == workspaceValue) root.draggingTargetWorkspace = -1
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Item { // Windows & focused workspace indicator
|
||||
id: windowSpace
|
||||
anchors.centerIn: parent
|
||||
implicitWidth: workspaceColumnLayout.implicitWidth
|
||||
implicitHeight: workspaceColumnLayout.implicitHeight
|
||||
|
||||
Repeater { // Window repeater
|
||||
model: ScriptModel {
|
||||
values: {
|
||||
return ToplevelManager.toplevels.values.filter((toplevel) => {
|
||||
const address = `0x${toplevel.HyprlandToplevel.address}`
|
||||
var win = windowByAddress[address]
|
||||
const inWorkspaceGroup = (root.workspaceGroup * root.workspacesShown < win?.workspace?.id && win?.workspace?.id <= (root.workspaceGroup + 1) * root.workspacesShown)
|
||||
return inWorkspaceGroup;
|
||||
}).sort((a, b) => {
|
||||
// Proper stacking order based on Hyprland's window properties
|
||||
const addrA = `0x${a.HyprlandToplevel.address}`
|
||||
const addrB = `0x${b.HyprlandToplevel.address}`
|
||||
const winA = windowByAddress[addrA]
|
||||
const winB = windowByAddress[addrB]
|
||||
|
||||
// 1. Pinned windows are always on top
|
||||
if (winA?.pinned !== winB?.pinned) {
|
||||
return winA?.pinned ? 1 : -1
|
||||
}
|
||||
|
||||
// 2. Floating windows above tiled windows
|
||||
if (winA?.floating !== winB?.floating) {
|
||||
return winA?.floating ? 1 : -1
|
||||
}
|
||||
|
||||
// 3. Within same category, sort by focus history
|
||||
// Lower focusHistoryID = more recently focused = higher in stack
|
||||
return (winB?.focusHistoryID ?? 0) - (winA?.focusHistoryID ?? 0)
|
||||
})
|
||||
}
|
||||
}
|
||||
delegate: OverviewWindow {
|
||||
id: window
|
||||
required property var modelData
|
||||
required property int index
|
||||
property int monitorId: windowData?.monitor
|
||||
property var monitor: HyprlandData.monitors.find(m => m.id === monitorId)
|
||||
property var address: `0x${modelData.HyprlandToplevel.address}`
|
||||
windowData: windowByAddress[address]
|
||||
toplevel: modelData
|
||||
monitorData: monitor
|
||||
|
||||
// Calculate scale relative to window's source monitor
|
||||
property real sourceMonitorWidth: (monitor?.transform % 2 === 1) ?
|
||||
(monitor?.height ?? 1920) / (monitor?.scale ?? 1) - (monitor?.reserved?.[0] ?? 0) - (monitor?.reserved?.[2] ?? 0) :
|
||||
(monitor?.width ?? 1920) / (monitor?.scale ?? 1) - (monitor?.reserved?.[0] ?? 0) - (monitor?.reserved?.[2] ?? 0)
|
||||
property real sourceMonitorHeight: (monitor?.transform % 2 === 1) ?
|
||||
(monitor?.width ?? 1080) / (monitor?.scale ?? 1) - (monitor?.reserved?.[1] ?? 0) - (monitor?.reserved?.[3] ?? 0) :
|
||||
(monitor?.height ?? 1080) / (monitor?.scale ?? 1) - (monitor?.reserved?.[1] ?? 0) - (monitor?.reserved?.[3] ?? 0)
|
||||
|
||||
// Scale windows to fit the workspace size, accounting for different monitor sizes
|
||||
scale: Math.min(
|
||||
root.workspaceImplicitWidth / sourceMonitorWidth,
|
||||
root.workspaceImplicitHeight / sourceMonitorHeight
|
||||
)
|
||||
|
||||
availableWorkspaceWidth: root.workspaceImplicitWidth
|
||||
availableWorkspaceHeight: root.workspaceImplicitHeight
|
||||
widgetMonitorId: root.monitor.id
|
||||
|
||||
property bool atInitPosition: (initX == x && initY == y)
|
||||
|
||||
property int workspaceColIndex: (windowData?.workspace.id - 1) % Config.options.overview.columns
|
||||
property int workspaceRowIndex: Math.floor((windowData?.workspace.id - 1) % root.workspacesShown / Config.options.overview.columns)
|
||||
xOffset: (root.workspaceImplicitWidth + workspaceSpacing) * workspaceColIndex
|
||||
yOffset: (root.workspaceImplicitHeight + workspaceSpacing) * workspaceRowIndex
|
||||
|
||||
Timer {
|
||||
id: updateWindowPosition
|
||||
interval: Config.options.hacks.arbitraryRaceConditionDelay
|
||||
repeat: false
|
||||
running: false
|
||||
onTriggered: {
|
||||
window.x = Math.round(Math.max((windowData?.at[0] - (monitor?.x ?? 0) - (monitorData?.reserved?.[0] ?? 0)) * root.scale, 0) + xOffset)
|
||||
window.y = Math.round(Math.max((windowData?.at[1] - (monitor?.y ?? 0) - (monitorData?.reserved?.[1] ?? 0)) * root.scale, 0) + yOffset)
|
||||
}
|
||||
}
|
||||
|
||||
z: atInitPosition ? (root.windowZ + index) : root.windowDraggingZ
|
||||
Drag.hotSpot.x: targetWindowWidth / 2
|
||||
Drag.hotSpot.y: targetWindowHeight / 2
|
||||
MouseArea {
|
||||
id: dragArea
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
onEntered: hovered = true
|
||||
onExited: hovered = false
|
||||
acceptedButtons: Qt.LeftButton | Qt.MiddleButton
|
||||
drag.target: parent
|
||||
onPressed: (mouse) => {
|
||||
root.draggingFromWorkspace = windowData?.workspace.id
|
||||
window.pressed = true
|
||||
window.Drag.active = true
|
||||
window.Drag.source = window
|
||||
window.Drag.hotSpot.x = mouse.x
|
||||
window.Drag.hotSpot.y = mouse.y
|
||||
}
|
||||
onReleased: {
|
||||
const targetWorkspace = root.draggingTargetWorkspace
|
||||
window.pressed = false
|
||||
window.Drag.active = false
|
||||
root.draggingFromWorkspace = -1
|
||||
if (targetWorkspace !== -1 && targetWorkspace !== windowData?.workspace.id) {
|
||||
Hyprland.dispatch(`movetoworkspacesilent ${targetWorkspace}, address:${window.windowData?.address}`)
|
||||
updateWindowPosition.restart()
|
||||
}
|
||||
else {
|
||||
window.x = window.initX
|
||||
window.y = window.initY
|
||||
}
|
||||
}
|
||||
onClicked: (event) => {
|
||||
if (!windowData) return;
|
||||
|
||||
if (event.button === Qt.LeftButton) {
|
||||
GlobalStates.overviewOpen = false
|
||||
Hyprland.dispatch(`focuswindow address:${windowData.address}`)
|
||||
event.accepted = true
|
||||
} else if (event.button === Qt.MiddleButton) {
|
||||
Hyprland.dispatch(`closewindow address:${windowData.address}`)
|
||||
event.accepted = true
|
||||
}
|
||||
}
|
||||
|
||||
StyledToolTip {
|
||||
extraVisibleCondition: false
|
||||
alternativeVisibleCondition: dragArea.containsMouse && !window.Drag.active
|
||||
text: `${windowData?.title ?? "Unknown"}\n[${windowData?.class ?? "unknown"}] ${windowData?.xwayland ? "[XWayland] " : ""}`
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle { // Focused workspace indicator
|
||||
id: focusedWorkspaceIndicator
|
||||
property int activeWorkspaceInGroup: monitor.activeWorkspace?.id - (root.workspaceGroup * root.workspacesShown)
|
||||
property int activeWorkspaceRowIndex: Math.floor((activeWorkspaceInGroup - 1) / Config.options.overview.columns)
|
||||
property int activeWorkspaceColIndex: (activeWorkspaceInGroup - 1) % Config.options.overview.columns
|
||||
x: (root.workspaceImplicitWidth + workspaceSpacing) * activeWorkspaceColIndex
|
||||
y: (root.workspaceImplicitHeight + workspaceSpacing) * activeWorkspaceRowIndex
|
||||
z: root.windowZ
|
||||
width: root.workspaceImplicitWidth
|
||||
height: root.workspaceImplicitHeight
|
||||
color: "transparent"
|
||||
radius: Appearance.rounding.screenRounding * root.scale
|
||||
border.width: 2
|
||||
border.color: root.activeBorderColor
|
||||
Behavior on x {
|
||||
animation: Appearance.animation.elementMoveFast.numberAnimation.createObject(this)
|
||||
}
|
||||
Behavior on y {
|
||||
animation: Appearance.animation.elementMoveFast.numberAnimation.createObject(this)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
109
modules/home/overview/modules/overview/OverviewWindow.qml
Normal file
109
modules/home/overview/modules/overview/OverviewWindow.qml
Normal file
@@ -0,0 +1,109 @@
|
||||
import Qt5Compat.GraphicalEffects
|
||||
import QtQuick
|
||||
import QtQuick.Layouts
|
||||
import Quickshell
|
||||
import Quickshell.Wayland
|
||||
import "../../common"
|
||||
import "../../common/functions"
|
||||
import "../../services"
|
||||
|
||||
Item { // Window
|
||||
id: root
|
||||
property var toplevel
|
||||
property var windowData
|
||||
property var monitorData
|
||||
property var scale
|
||||
property var availableWorkspaceWidth
|
||||
property var availableWorkspaceHeight
|
||||
property bool restrictToWorkspace: true
|
||||
property real initX: Math.max(((windowData?.at[0] ?? 0) - (monitorData?.x ?? 0) - (monitorData?.reserved?.[0] ?? 0)) * root.scale, 0) + xOffset
|
||||
property real initY: Math.max(((windowData?.at[1] ?? 0) - (monitorData?.y ?? 0) - (monitorData?.reserved?.[1] ?? 0)) * root.scale, 0) + yOffset
|
||||
property real xOffset: 0
|
||||
property real yOffset: 0
|
||||
property int widgetMonitorId: 0
|
||||
|
||||
property var targetWindowWidth: (windowData?.size[0] ?? 100) * scale
|
||||
property var targetWindowHeight: (windowData?.size[1] ?? 100) * scale
|
||||
property bool hovered: false
|
||||
property bool pressed: false
|
||||
|
||||
property var iconToWindowRatio: 0.25
|
||||
property var xwaylandIndicatorToIconRatio: 0.35
|
||||
property var iconToWindowRatioCompact: 0.45
|
||||
property var entry: DesktopEntries.heuristicLookup(windowData?.class)
|
||||
property var iconPath: Quickshell.iconPath(entry?.icon ?? windowData?.class ?? "application-x-executable", "image-missing")
|
||||
property bool compactMode: Appearance.font.pixelSize.smaller * 4 > targetWindowHeight || Appearance.font.pixelSize.smaller * 4 > targetWindowWidth
|
||||
|
||||
property bool indicateXWayland: windowData?.xwayland ?? false
|
||||
|
||||
x: initX
|
||||
y: initY
|
||||
width: Math.min((windowData?.size[0] ?? 100) * root.scale, availableWorkspaceWidth)
|
||||
height: Math.min((windowData?.size[1] ?? 100) * root.scale, availableWorkspaceHeight)
|
||||
opacity: (windowData?.monitor ?? -1) == widgetMonitorId ? 1 : 0.4
|
||||
|
||||
layer.enabled: true
|
||||
layer.effect: OpacityMask {
|
||||
maskSource: Rectangle {
|
||||
width: root.width
|
||||
height: root.height
|
||||
radius: Appearance.rounding.windowRounding * root.scale
|
||||
}
|
||||
}
|
||||
|
||||
Behavior on x {
|
||||
animation: Appearance.animation.elementMoveEnter.numberAnimation.createObject(this)
|
||||
}
|
||||
Behavior on y {
|
||||
animation: Appearance.animation.elementMoveEnter.numberAnimation.createObject(this)
|
||||
}
|
||||
Behavior on width {
|
||||
animation: Appearance.animation.elementMoveEnter.numberAnimation.createObject(this)
|
||||
}
|
||||
Behavior on height {
|
||||
animation: Appearance.animation.elementMoveEnter.numberAnimation.createObject(this)
|
||||
}
|
||||
|
||||
ScreencopyView {
|
||||
id: windowPreview
|
||||
anchors.fill: parent
|
||||
captureSource: GlobalStates.overviewOpen ? root.toplevel : null
|
||||
live: true
|
||||
|
||||
Rectangle {
|
||||
anchors.fill: parent
|
||||
radius: Appearance.rounding.windowRounding * root.scale
|
||||
color: pressed ? ColorUtils.transparentize(Appearance.colors.colLayer2Active, 0.5) :
|
||||
hovered ? ColorUtils.transparentize(Appearance.colors.colLayer2Hover, 0.7) :
|
||||
ColorUtils.transparentize(Appearance.colors.colLayer2)
|
||||
border.color : ColorUtils.transparentize(Appearance.m3colors.m3outline, 0.7)
|
||||
border.width : 1
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
spacing: Appearance.font.pixelSize.smaller * 0.5
|
||||
|
||||
Image {
|
||||
id: windowIcon
|
||||
property var iconSize: {
|
||||
return Math.min(targetWindowWidth, targetWindowHeight) * (root.compactMode ? root.iconToWindowRatioCompact : root.iconToWindowRatio) / (root.monitorData?.scale ?? 1);
|
||||
}
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
source: root.iconPath
|
||||
width: iconSize
|
||||
height: iconSize
|
||||
sourceSize: Qt.size(iconSize, iconSize)
|
||||
|
||||
Behavior on width {
|
||||
animation: Appearance.animation.elementMoveEnter.numberAnimation.createObject(this)
|
||||
}
|
||||
Behavior on height {
|
||||
animation: Appearance.animation.elementMoveEnter.numberAnimation.createObject(this)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
3
modules/home/overview/modules/overview/qmldir
Normal file
3
modules/home/overview/modules/overview/qmldir
Normal file
@@ -0,0 +1,3 @@
|
||||
Overview 1.0 Overview.qml
|
||||
OverviewWidget 1.0 OverviewWidget.qml
|
||||
OverviewWindow 1.0 OverviewWindow.qml
|
||||
11
modules/home/overview/services/GlobalStates.qml
Normal file
11
modules/home/overview/services/GlobalStates.qml
Normal file
@@ -0,0 +1,11 @@
|
||||
pragma Singleton
|
||||
pragma ComponentBehavior: Bound
|
||||
|
||||
import QtQuick
|
||||
import Quickshell
|
||||
|
||||
Singleton {
|
||||
id: root
|
||||
property bool overviewOpen: false
|
||||
property bool superReleaseMightTrigger: true
|
||||
}
|
||||
137
modules/home/overview/services/HyprlandData.qml
Normal file
137
modules/home/overview/services/HyprlandData.qml
Normal file
@@ -0,0 +1,137 @@
|
||||
pragma Singleton
|
||||
pragma ComponentBehavior: Bound
|
||||
|
||||
import QtQuick
|
||||
import Quickshell
|
||||
import Quickshell.Io
|
||||
import Quickshell.Hyprland
|
||||
|
||||
/**
|
||||
* Provides access to some Hyprland data not available in Quickshell.Hyprland.
|
||||
*/
|
||||
Singleton {
|
||||
id: root
|
||||
property var windowList: []
|
||||
property var addresses: []
|
||||
property var windowByAddress: ({})
|
||||
property var workspaces: []
|
||||
property var workspaceIds: []
|
||||
property var workspaceById: ({})
|
||||
property var activeWorkspace: null
|
||||
property var monitors: []
|
||||
property var layers: ({})
|
||||
|
||||
function updateWindowList() {
|
||||
getClients.running = true;
|
||||
}
|
||||
|
||||
function updateLayers() {
|
||||
getLayers.running = true;
|
||||
}
|
||||
|
||||
function updateMonitors() {
|
||||
getMonitors.running = true;
|
||||
}
|
||||
|
||||
function updateWorkspaces() {
|
||||
getWorkspaces.running = true;
|
||||
getActiveWorkspace.running = true;
|
||||
}
|
||||
|
||||
function updateAll() {
|
||||
updateWindowList();
|
||||
updateMonitors();
|
||||
updateLayers();
|
||||
updateWorkspaces();
|
||||
}
|
||||
|
||||
function biggestWindowForWorkspace(workspaceId) {
|
||||
const windowsInThisWorkspace = HyprlandData.windowList.filter(w => w.workspace.id == workspaceId);
|
||||
return windowsInThisWorkspace.reduce((maxWin, win) => {
|
||||
const maxArea = (maxWin?.size?.[0] ?? 0) * (maxWin?.size?.[1] ?? 0);
|
||||
const winArea = (win?.size?.[0] ?? 0) * (win?.size?.[1] ?? 0);
|
||||
return winArea > maxArea ? win : maxWin;
|
||||
}, null);
|
||||
}
|
||||
|
||||
Component.onCompleted: {
|
||||
updateAll();
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: Hyprland
|
||||
|
||||
function onRawEvent(event) {
|
||||
updateAll()
|
||||
}
|
||||
}
|
||||
|
||||
Process {
|
||||
id: getClients
|
||||
command: ["hyprctl", "clients", "-j"]
|
||||
stdout: StdioCollector {
|
||||
id: clientsCollector
|
||||
onStreamFinished: {
|
||||
root.windowList = JSON.parse(clientsCollector.text)
|
||||
let tempWinByAddress = {};
|
||||
for (var i = 0; i < root.windowList.length; ++i) {
|
||||
var win = root.windowList[i];
|
||||
tempWinByAddress[win.address] = win;
|
||||
}
|
||||
root.windowByAddress = tempWinByAddress;
|
||||
root.addresses = root.windowList.map(win => win.address);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Process {
|
||||
id: getMonitors
|
||||
command: ["hyprctl", "monitors", "-j"]
|
||||
stdout: StdioCollector {
|
||||
id: monitorsCollector
|
||||
onStreamFinished: {
|
||||
root.monitors = JSON.parse(monitorsCollector.text);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Process {
|
||||
id: getLayers
|
||||
command: ["hyprctl", "layers", "-j"]
|
||||
stdout: StdioCollector {
|
||||
id: layersCollector
|
||||
onStreamFinished: {
|
||||
root.layers = JSON.parse(layersCollector.text);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Process {
|
||||
id: getWorkspaces
|
||||
command: ["hyprctl", "workspaces", "-j"]
|
||||
stdout: StdioCollector {
|
||||
id: workspacesCollector
|
||||
onStreamFinished: {
|
||||
root.workspaces = JSON.parse(workspacesCollector.text);
|
||||
let tempWorkspaceById = {};
|
||||
for (var i = 0; i < root.workspaces.length; ++i) {
|
||||
var ws = root.workspaces[i];
|
||||
tempWorkspaceById[ws.id] = ws;
|
||||
}
|
||||
root.workspaceById = tempWorkspaceById;
|
||||
root.workspaceIds = root.workspaces.map(ws => ws.id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Process {
|
||||
id: getActiveWorkspace
|
||||
command: ["hyprctl", "activeworkspace", "-j"]
|
||||
stdout: StdioCollector {
|
||||
id: activeWorkspaceCollector
|
||||
onStreamFinished: {
|
||||
root.activeWorkspace = JSON.parse(activeWorkspaceCollector.text);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
2
modules/home/overview/services/qmldir
Normal file
2
modules/home/overview/services/qmldir
Normal file
@@ -0,0 +1,2 @@
|
||||
singleton HyprlandData 1.0 HyprlandData.qml
|
||||
singleton GlobalStates 1.0 GlobalStates.qml
|
||||
16
modules/home/overview/shell.qml
Normal file
16
modules/home/overview/shell.qml
Normal file
@@ -0,0 +1,16 @@
|
||||
//@ pragma UseQApplication
|
||||
//@ pragma Env QT_QUICK_CONTROLS_STYLE=Basic
|
||||
|
||||
import "./modules/overview/"
|
||||
import "./services/"
|
||||
import "./common/"
|
||||
import "./common/functions/"
|
||||
import "./common/widgets/"
|
||||
|
||||
import QtQuick
|
||||
import Quickshell
|
||||
import Quickshell.Hyprland
|
||||
|
||||
ShellRoot {
|
||||
Overview {}
|
||||
}
|
||||
25
modules/home/peaclock/default.nix
Normal file
25
modules/home/peaclock/default.nix
Normal file
@@ -0,0 +1,25 @@
|
||||
{
|
||||
pkgs,
|
||||
lib,
|
||||
config,
|
||||
inputs,
|
||||
username,
|
||||
...
|
||||
}: let
|
||||
in {
|
||||
options.peaclock.enable = lib.mkEnableOption "Peaclock";
|
||||
|
||||
config.home.packages = lib.mkIf config.peaclock.enable [
|
||||
(inputs.wrappers.lib.wrapPackage
|
||||
{
|
||||
inherit pkgs;
|
||||
package = pkgs.peaclock;
|
||||
flags = {
|
||||
"--config-dir" = "/home/${username}/.peaclock";
|
||||
"--config" = "/home/${username}/.peaclock/config/digital";
|
||||
};
|
||||
})
|
||||
];
|
||||
|
||||
imports = [./digital.nix];
|
||||
}
|
||||
61
modules/home/peaclock/digital.nix
Normal file
61
modules/home/peaclock/digital.nix
Normal file
@@ -0,0 +1,61 @@
|
||||
{config, ...}: {
|
||||
home.file.".peaclock/config/digital" = {
|
||||
# recursive = true;
|
||||
text = let
|
||||
colors = config.stylix.base16Scheme;
|
||||
in ''
|
||||
# peaclock
|
||||
# digital config
|
||||
#
|
||||
# For more information, refer to the 'Configuration' and 'Commands'
|
||||
# sections of the programs help output with '--help' or '-h'.
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# general
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
block 2 1
|
||||
padding 2 1
|
||||
margin 2 1
|
||||
ratio 2 1
|
||||
date-padding 1
|
||||
locale 'pl_PL.utf8'
|
||||
timezone 'Europe/Warsaw'
|
||||
date '%a %b %d %p'
|
||||
mode stopwatch
|
||||
view digital
|
||||
toggle padding
|
||||
stopwatch start
|
||||
timer 10m:0s
|
||||
timer-exec 'notify-send -a peaclock "timer complete"'
|
||||
rate-input 50
|
||||
rate-refresh 250
|
||||
rate-status 5000
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# toggles
|
||||
# -----------------------------------------------------------------------------
|
||||
set hour-24 on
|
||||
set seconds on
|
||||
set date on
|
||||
set auto-size on
|
||||
set auto-ratio on
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# styles
|
||||
# -----------------------------------------------------------------------------
|
||||
style active-fg #${colors.base05}
|
||||
style inactive-fg #${colors.base03}
|
||||
style colon-fg #${colors.base07}
|
||||
style active-bg #${colors.base0E}
|
||||
style inactive-bg #${colors.base00}
|
||||
style colon-bg #${colors.base00}
|
||||
style date #${colors.base04}
|
||||
style background #${colors.base00}
|
||||
style text #${colors.base05}
|
||||
style prompt #${colors.base09}
|
||||
style success #${colors.base0A}
|
||||
style error #${colors.base02}
|
||||
'';
|
||||
};
|
||||
}
|
||||
@@ -30,5 +30,6 @@
|
||||
inherit username;
|
||||
})
|
||||
(import ./web-search.nix {inherit pkgs;})
|
||||
(import ./restart.noctalia.nix {inherit pkgs;})
|
||||
];
|
||||
}
|
||||
|
||||
@@ -14,13 +14,13 @@ in
|
||||
msg=' = Windows/Super/CAPS LOCK (Enter nie wykonuje skrótu)'
|
||||
keybinds=$(cat ~/.config/hypr/hyprland.conf | grep -E '^bind')
|
||||
|
||||
# replace $modifier with SUPER and clean up paths
|
||||
display_keybinds=$(echo "$keybinds" | sed 's/\$modifier//g' | sed 's|${desktopEntriesPath}/||g')
|
||||
# replace SUPER with SUPER and clean up paths
|
||||
display_keybinds=$(echo "$keybinds" | sed 's/\SUPER//g' | sed 's|${desktopEntriesPath}/||g')
|
||||
|
||||
# remove "bind=" and "bindm=" prefixes
|
||||
display_keybinds=$(echo "$display_keybinds" | sed 's/^bind=//' | sed 's/^bindm=/🖱️/')
|
||||
|
||||
# add + before CONTROL, SHIFT, ALT when they appear after removed $modifier
|
||||
# add + before CONTROL, SHIFT, ALT when they appear after removed SUPER
|
||||
display_keybinds=$(echo "$display_keybinds" | sed 's/ CONTROL/ + CONTROL/g' | sed 's/ SHIFT/ + SHIFT/g' | sed 's/ ALT/ + ALT/g')
|
||||
|
||||
# replace commas: first comma -> " +", second comma -> " =", remaining commas -> " ->"
|
||||
|
||||
54
modules/home/scripts/restart.noctalia
Normal file
54
modules/home/scripts/restart.noctalia
Normal file
@@ -0,0 +1,54 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
# Restart the Noctalia QuickShell session by terminating only the noctalia-shell
|
||||
# processes, avoiding any signals to unrelated process groups (e.g. Hyprland).
|
||||
|
||||
log() { printf "[restart.noctalia] %s\n" "$*"; }
|
||||
|
||||
list_target_pids() {
|
||||
# Collect only PIDs whose command explicitly runs noctalia-shell
|
||||
# - direct wrapper: ".../noctalia-shell"
|
||||
# - quickshell/qs with "-c noctalia-shell"
|
||||
ps -eo pid=,cmd= \
|
||||
| ${GREP:-grep} -E "(^|/)(noctalia-shell)( |$)|(^| )((qs|quickshell))( | ).*-c( |=)?noctalia-shell( |$)" \
|
||||
| awk '{print $1}'
|
||||
}
|
||||
|
||||
terminate_targets() {
|
||||
local pids left tries
|
||||
mapfile -t pids < <(list_target_pids || true)
|
||||
|
||||
if ((${#pids[@]} > 0)); then
|
||||
kill -TERM "${pids[@]}" 2>/dev/null || true
|
||||
fi
|
||||
|
||||
# Wait up to ~3s for clean exit
|
||||
for tries in {1..15}; do
|
||||
mapfile -t left < <(list_target_pids || true)
|
||||
((${#left[@]} == 0)) && break
|
||||
sleep 0.2
|
||||
done
|
||||
|
||||
# Force kill leftovers only (do not touch anything else)
|
||||
if ((${#left[@]} > 0)); then
|
||||
kill -KILL "${left[@]}" 2>/dev/null || true
|
||||
fi
|
||||
}
|
||||
|
||||
start_noctalia() {
|
||||
# Prefer the noctalia-shell wrapper to ensure proper env and runtime flags
|
||||
if command -v noctalia-shell >/dev/null 2>&1; then
|
||||
nohup setsid noctalia-shell >/dev/null 2>&1 &
|
||||
elif command -v quickshell >/dev/null 2>&1; then
|
||||
nohup setsid quickshell -c noctalia-shell >/dev/null 2>&1 &
|
||||
elif command -v qs >/dev/null 2>&1; then
|
||||
nohup setsid qs -c noctalia-shell >/dev/null 2>&1 &
|
||||
else
|
||||
echo "Error: noctalia-shell/quickshell/qs not found in PATH" >&2
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
terminate_targets
|
||||
start_noctalia
|
||||
24
modules/home/scripts/restart.noctalia.nix
Normal file
24
modules/home/scripts/restart.noctalia.nix
Normal file
@@ -0,0 +1,24 @@
|
||||
{pkgs, ...}: let
|
||||
binPath = pkgs.lib.makeBinPath [
|
||||
pkgs.coreutils
|
||||
pkgs.procps
|
||||
pkgs.psmisc
|
||||
pkgs.gnugrep
|
||||
pkgs.findutils
|
||||
pkgs.util-linux
|
||||
pkgs.bash
|
||||
];
|
||||
script = builtins.readFile ./restart.noctalia;
|
||||
in
|
||||
pkgs.writeShellScriptBin "restart.noctalia" ''
|
||||
set -euo pipefail
|
||||
export PATH=${binPath}:$PATH
|
||||
|
||||
tmp_script=$(mktemp)
|
||||
trap 'rm -f "$tmp_script"' EXIT
|
||||
cat > "$tmp_script" <<'BASH_EOF'
|
||||
${script}
|
||||
BASH_EOF
|
||||
chmod +x "$tmp_script"
|
||||
exec ${pkgs.bash}/bin/bash "$tmp_script" "$@"
|
||||
''
|
||||
@@ -1,11 +1,17 @@
|
||||
_: {
|
||||
{username, ...}: {
|
||||
programs.ssh = {
|
||||
enable = true;
|
||||
enableDefaultConfig = false;
|
||||
matchBlocks = {
|
||||
"hp-t640-homeserver" = {
|
||||
hostname = "192.168.1.156";
|
||||
user = "garand_plg";
|
||||
user = "${username}";
|
||||
port = 22;
|
||||
identityFile = "~/.ssh/hp-t640-homeserver";
|
||||
};
|
||||
"hp-t640-homeserver-tailscale" = {
|
||||
hostname = "100.106.225.106";
|
||||
user = "${username}";
|
||||
port = 22;
|
||||
identityFile = "~/.ssh/hp-t640-homeserver";
|
||||
};
|
||||
|
||||
@@ -12,5 +12,6 @@
|
||||
enable = true;
|
||||
platform = "qtct";
|
||||
};
|
||||
noctalia-shell.enable = true;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ _: {
|
||||
enable = true;
|
||||
mime.enable = true;
|
||||
mimeApps.enable = true;
|
||||
configFile."mimeapps.list".force = true;
|
||||
};
|
||||
|
||||
imports = [
|
||||
|
||||
@@ -1,4 +1,9 @@
|
||||
{pkgs, ...}: let
|
||||
{
|
||||
pkgs,
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}: let
|
||||
fetchIcon = url: sha256:
|
||||
pkgs.fetchurl {
|
||||
inherit url sha256;
|
||||
@@ -57,18 +62,37 @@
|
||||
iconUrl = "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/glance.png";
|
||||
iconSha = "sha256-xyFlmPpt+DABoGX5oBqj/aQVdxtmNflat9Jb2BE7SOY=";
|
||||
}
|
||||
{
|
||||
name = "microsoftTeams";
|
||||
displayName = "Microsoft Teams";
|
||||
url = "https://teams.microsoft.com/v2/";
|
||||
iconUrl = "https://i.pinimg.com/236x/e6/b6/28/e6b628706696320cd0ede93f7053abd8.jpg";
|
||||
iconSha = "sha256-bZVmoWHeG8rycS8lj7LQaxFggXINjUx/7NWKPVhPTFw=";
|
||||
}
|
||||
];
|
||||
in {
|
||||
xdg.desktopEntries = builtins.listToAttrs (builtins.map (app: {
|
||||
options.xdgDesktopEntries = {
|
||||
enable = lib.mkEnableOption "PWA Apps";
|
||||
entries = builtins.listToAttrs (
|
||||
map (app: {
|
||||
name = app.name;
|
||||
value = {
|
||||
enable = lib.mkEnableOption "Enable ${app.displayName} PWA";
|
||||
};
|
||||
})
|
||||
apps
|
||||
);
|
||||
};
|
||||
|
||||
config.xdg.desktopEntries = lib.mkIf config.xdgDesktopEntries.enable (
|
||||
builtins.listToAttrs (
|
||||
builtins.concatMap (
|
||||
app: let
|
||||
entryConfig = config.xdgDesktopEntries.entries.${app.name};
|
||||
in
|
||||
if entryConfig.enable
|
||||
then [
|
||||
{
|
||||
name = app.name;
|
||||
value = makeEntry app;
|
||||
})
|
||||
apps);
|
||||
}
|
||||
]
|
||||
else []
|
||||
)
|
||||
apps
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
@@ -6,13 +6,13 @@
|
||||
}: {
|
||||
options.zed-editor = {
|
||||
enable = lib.mkEnableOption "Zed Editor";
|
||||
remote-server = lib.mkEnableOption "Zed Editor Remote Server";
|
||||
remote-server.enable = lib.mkEnableOption "Zed Editor Remote Server";
|
||||
};
|
||||
|
||||
config.programs.zed-editor = lib.mkIf config.zed-editor.enable {
|
||||
enable = true;
|
||||
package = pkgs.zed-editor;
|
||||
installRemoteServer = lib.mkIf config.zed-editor.remote-server true;
|
||||
installRemoteServer = lib.mkIf config.zed-editor.remote-server.enable true;
|
||||
};
|
||||
|
||||
imports = [
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{pkgs, ...}: {
|
||||
programs.zed-editor.extraPackages = with pkgs; [
|
||||
biome
|
||||
# biome
|
||||
rust-analyzer
|
||||
nixd
|
||||
alejandra
|
||||
|
||||
@@ -62,5 +62,9 @@ _: {
|
||||
};
|
||||
tab_size = 2;
|
||||
};
|
||||
"C++" = {
|
||||
format_on_save = "on";
|
||||
tab_size = 2;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
@@ -6,6 +6,15 @@
|
||||
...
|
||||
}: {
|
||||
programs.zed-editor.userSettings.lsp = {
|
||||
# biome = {
|
||||
# binary = {
|
||||
# path = lib.getExe pkgs.bash;
|
||||
# arguments = [
|
||||
# "-c"
|
||||
# "if [ -e flake.nix ]; then nix develop --command bun --bun run biome; else biome; fi"
|
||||
# ];
|
||||
# };
|
||||
# };
|
||||
rust-analyzer = {
|
||||
binary = {
|
||||
path = lib.getExe pkgs.bash;
|
||||
@@ -27,6 +36,27 @@
|
||||
};
|
||||
};
|
||||
};
|
||||
clangd = {
|
||||
binary = {
|
||||
path = lib.getExe pkgs.bash;
|
||||
arguments = [
|
||||
"-c"
|
||||
"if [ -e flake.nix ]; then nix develop --command clangd; else clangd; fi"
|
||||
];
|
||||
};
|
||||
initialization_options = {
|
||||
inlayHints = {
|
||||
maxLength = null;
|
||||
lifetimeElisionHints = {
|
||||
enable = "skip_trivial";
|
||||
useParameterNames = true;
|
||||
};
|
||||
closureReturnTypeHints = {
|
||||
enable = "always";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
nixd = {
|
||||
initialization_options.formatting.command = [
|
||||
"alejandra"
|
||||
|
||||
Reference in New Issue
Block a user