Compare commits

...

32 Commits

Author SHA1 Message Date
80d7fc08cc Update settings shortcut and force mimeapps.list
- Replace Super+Shift+, with Super+Alt+P to toggle settings
- Force mimeapps.list in XDG config
2026-02-02 02:20:37 +01:00
8ccb9205bf Add Noctalia shell with Quickshell overview
- Add `noctalia` input to flake and lock it in `flake.lock`.
- Include `noctalia` and `quickshell` modules in `flake.nix`.
- Extend core packages to accept `inputs` and `system`; add
  `quickshell.nix`
  with required Qt6 packages and environment variables.
- Enable `upower` service for battery handling.
- Add home modules `noctalia.nix` and `overview.nix` (QML UI, README,
  assets, widgets, services) to provide a workspace overview.
- Comment out unused rofi and web‑search binds; update `exec‑once` to
  start
  the overview daemon and `noctalia-shell`.
- Provide `restart.noctalia` script and its Nix wrapper.
- Enable `noctalia-shell` in `stylix` configuration.
2026-02-02 01:57:56 +01:00
51ad90dc9c Update flake.lock with latest revisions 2026-02-02 00:38:36 +01:00
248b2f1dbb Enable VirtualBox and add development aliases 2026-01-31 16:48:35 +01:00
c258681d10 Add VirtualBox support with disabled default 2026-01-30 14:15:28 +01:00
5314aba270 update 2026-01-29 01:55:42 +01:00
0f00938787 Enable Winboat remote desktop module 2026-01-27 19:43:17 +01:00
6cbbd0110d Tile mpv windows instead of floating 2026-01-21 23:43:01 +01:00
01cc53fff1 Add tailscale SSH host and use username variable
- Simplify server aliases and add tailscale‑specific aliases
- Make SSH module accept a username argument
- Add match block for Tailscale host with port 22 and identity file
2026-01-19 11:14:41 +01:00
7501159100 Add Logisim Evolution support
- Include logisim‑evolution in the core packages list.
- Add `logisim-evolution.enable` option to system modules (enabled on
  desktop).
- Bind `SUPER SHIFT F` to toggle floating windows.
- Add tiling rule for Logisim windows.
- Update `upf` alias to specify the flake path.
- Refresh flake.lock revisions for firefox‑addons and wrappers.
2026-01-18 02:12:59 +01:00
727462ffd3 Update flake.lock with latest revisions 2026-01-17 13:57:47 +01:00
7446d8c239 Enable Tailscale and Prism Launcher in Garand-Laptop config 2026-01-15 08:30:32 +01:00
085e02f539 Update flake.lock and add game window rules
- Bump all flake.lock entries to their latest revisions (updated
  lastModified, narHash, and rev values).
- Add Hyprland rule to tag Minecraft windows as games.
- Tag PrismLauncher windows as gamestore.
- Apply reduced opacity for the gamestore tag.
2026-01-12 05:52:55 +01:00
9d9ed0f04b Add Teams, disable Ferdium, refactor Hyprland
Enable teams-for-linux and disable ferdium in system modules; add both
to core packages. Simplify Hyprland configuration by using direct
settings for animations, window rules, env, exec‑once and hypridle.
Remove unused Microsoft Teams PWA entry.
2026-01-07 19:49:21 +01:00
28daa28c6b Replace $modifier with SUPER and update defaults 2026-01-06 21:46:12 +01:00
b8a7ead4be Add Tailscale module 2026-01-04 13:49:01 +01:00
2881d84c16 Add Peaclock home module and wrappers input
Enable Peaclock in the user’s home configuration and add a new
`wrappers` input to the flake. System‑level Peaclock references are
commented out, and default and digital config files for Peaclock are
included.
2026-01-03 18:00:23 +01:00
591e42fe61 aktualizacja 2025-12-29 01:14:13 +01:00
f21640749a Disable Opencode; update flake.lock and librewolf
- Opencode module disabled in desktop, laptop, and default host configs
- Updated flake.lock revisions for firefox‑addons, home‑manager, nixpkgs
  and stylix
- Librewolf now uses pkgs.librewolf (source) instead of the binary
  package
2025-12-23 06:05:45 +01:00
0b9623241a Add Bottles and Heroic
Update flake.lock revisions for firefox‑addons, home‑manager and nixpkgs
to reflect the inclusion of the new Bottles and Heroic packages.
2025-12-20 14:36:34 +01:00
7a6e3916f5 Add p7zip to essential packages 2025-12-17 16:30:45 +01:00
43c657523e Enable peaclock and bump locked revisions
Add peaclock to the core packages list and enable the peaclock module in
all system configurations. Update the flake.lock entries for several
packages with newer revisions and nar hashes.
2025-12-16 23:31:30 +01:00
594accfe8d Update flake.lock and force wallpaper style
Bump locked revisions for firefox‑addons, home‑manager, nixpkgs and
stylix in flake.lock, updating their lastModified timestamps, narHash
values and rev identifiers.

Change wallpaperStyle in boot.nix from lib.mkDefault to lib.mkForce to
ensure the centered style is always applied.
2025-12-15 15:55:39 +01:00
86c5e8ad5b Add Pixieditor module 2025-12-10 15:54:42 +01:00
f7fe35b3be update 2025-12-10 01:50:19 +01:00
629e7b6a9e Add enable XDG PWA entries and enable Signal 2025-12-08 21:43:17 +01:00
29c62adbd1 dodanie garandos-tui 2025-12-07 00:00:33 +01:00
5747e449b2 Update flake.lock with latest revisions 2025-12-04 10:47:39 +01:00
087ffd4194 Refactor Zed/Flatpak options and add C++ & clangd settings
- Switch Zed remote server and Flatpak packages to use `enable`
suboption - Update host modules to match the new option hierarchy - Add
default C++ settings (format on save, tab size) to Zed user settings -
Introduce clangd LSP configuration with inlay hints and fallback command
2025-12-01 13:28:43 +01:00
7a2382cb3c zmiana logo 2025-11-30 22:01:42 +01:00
be74b351e8 Restructure system-modules and bump flake.lock
- Consolidate enable flags into a `packages` attribute in all host
system-modules.nix files. - Rename package option paths to
`config.packages.<name>.enable` in modules/core/packages/packages.nix. -
Update locked revisions (lastModified, narHash, rev) for firefox‑addons
and stylix in flake.lock.
2025-11-30 14:05:19 +01:00
8d3fd7dbe2 Add Jan UI and selective Flatpak options
- Expose Jan as a core package and add a Hyprland shortcut (Mod + J). -
Refactor Flatpak module to provide per‑package enable options; default
package list is now empty. - Update librewolf search template to use a
single‑parameter URL. - Minor comment formatting changes across host
module files.
2025-11-30 13:26:51 +01:00
72 changed files with 2628 additions and 792 deletions

View File

@@ -191,7 +191,10 @@ git add .
- `waybarChoice` - system top bar style. - `waybarChoice` - system top bar style.
- `animChoice` - system animation style. - `animChoice` - system animation style.
### 5. Review module activation options ### 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: Open the module files for your host and adjust the `enable` options for the services you need:
```bash ```bash

282
flake.lock generated
View File

@@ -15,11 +15,11 @@
"treefmt-nix": "treefmt-nix" "treefmt-nix": "treefmt-nix"
}, },
"locked": { "locked": {
"lastModified": 1764195413, "lastModified": 1767916874,
"narHash": "sha256-YNehE1Vq7Gntrpl6FYwfHU+8U/5v5OaS/KtiB35AWfE=", "narHash": "sha256-IcvLwoF1CIOd7yELc0Xwqskilw2FxHHRm5ZnmNdBuKc=",
"owner": "mrshmllow", "owner": "mrshmllow",
"repo": "affinity-nix", "repo": "affinity-nix",
"rev": "5312de0bb4808e256a346c58ab3607bd7ffc924b", "rev": "0c110a15fb5605490f7de451073db1c775745fee",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -35,11 +35,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1763546214, "lastModified": 1769608722,
"narHash": "sha256-vc9seqvw2ElF8jPetsCoCQ5lo9P3fmgiTle3HlOMezk=", "narHash": "sha256-yWUG0Emd9EuqIZ8jQ6fxqf7USw7Gtcqb4+sBhn+S+Wg=",
"owner": "AdnanHodzic", "owner": "AdnanHodzic",
"repo": "auto-cpufreq", "repo": "auto-cpufreq",
"rev": "76ccb66f8e4875671fd746fb6b50931454ab8cd8", "rev": "a11a98c46bf6a77d0c2e0ea8d87acef78507cae5",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -69,28 +69,28 @@
"base16-fish": { "base16-fish": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1754405784, "lastModified": 1765809053,
"narHash": "sha256-l9xHIy+85FN+bEo6yquq2IjD1rSg9fjfjpyGP1W8YXo=", "narHash": "sha256-XCUQLoLfBJ8saWms2HCIj4NEN+xNsWBlU1NrEPcQG4s=",
"owner": "tomyun", "owner": "tomyun",
"repo": "base16-fish", "repo": "base16-fish",
"rev": "23ae20a0093dca0d7b39d76ba2401af0ccf9c561", "rev": "86cbea4dca62e08fb7fd83a70e96472f92574782",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "tomyun", "owner": "tomyun",
"repo": "base16-fish", "repo": "base16-fish",
"rev": "23ae20a0093dca0d7b39d76ba2401af0ccf9c561", "rev": "86cbea4dca62e08fb7fd83a70e96472f92574782",
"type": "github" "type": "github"
} }
}, },
"base16-helix": { "base16-helix": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1752979451, "lastModified": 1760703920,
"narHash": "sha256-0CQM+FkYy0fOO/sMGhOoNL80ftsAzYCg9VhIrodqusM=", "narHash": "sha256-m82fGUYns4uHd+ZTdoLX2vlHikzwzdu2s2rYM2bNwzw=",
"owner": "tinted-theming", "owner": "tinted-theming",
"repo": "base16-helix", "repo": "base16-helix",
"rev": "27cf1e66e50abc622fb76a3019012dc07c678fac", "rev": "d646af9b7d14bff08824538164af99d0c521b185",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -135,6 +135,28 @@
"type": "gitlab" "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": { "firefox-addons": {
"inputs": { "inputs": {
"nixpkgs": [ "nixpkgs": [
@@ -143,11 +165,11 @@
}, },
"locked": { "locked": {
"dir": "pkgs/firefox-addons", "dir": "pkgs/firefox-addons",
"lastModified": 1764389080, "lastModified": 1769918637,
"narHash": "sha256-BEn1Z9Uv20u2DS6wzLKdzx5kAzynM3wMQ9JnGf3VJvI=", "narHash": "sha256-3XyGk89S0UFvKRZiKpFL4ImP5qP/2AOJUaYC7ogXnJo=",
"owner": "rycee", "owner": "rycee",
"repo": "nur-expressions", "repo": "nur-expressions",
"rev": "897437c09bf22ce59efb3370f0783d0c662dba31", "rev": "5659e4c18d1350d1b511fcdce885fdd879effa22",
"type": "gitlab" "type": "gitlab"
}, },
"original": { "original": {
@@ -160,11 +182,11 @@
"firefox-gnome-theme": { "firefox-gnome-theme": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1758112371, "lastModified": 1764873433,
"narHash": "sha256-lizRM2pj6PHrR25yimjyFn04OS4wcdbc38DCdBVa2rk=", "narHash": "sha256-1XPewtGMi+9wN9Ispoluxunw/RwozuTRVuuQOmxzt+A=",
"owner": "rafaelmardojai", "owner": "rafaelmardojai",
"repo": "firefox-gnome-theme", "repo": "firefox-gnome-theme",
"rev": "0909cfe4a2af8d358ad13b20246a350e14c2473d", "rev": "f7ffd917ac0d253dbd6a3bf3da06888f57c69f92",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -189,15 +211,15 @@
"flake-compat_2": { "flake-compat_2": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1747046372, "lastModified": 1767039857,
"narHash": "sha256-CIVLLkVgvHYbgI2UpXvIIBJ12HWgX+fjA8Xf8PUmqCY=", "narHash": "sha256-vNpUSpF5Nuw8xvDLj2KCwwksIbjua2LZCqhV1LNRDns=",
"owner": "edolstra", "owner": "NixOS",
"repo": "flake-compat", "repo": "flake-compat",
"rev": "9100a0f413b0c601e0533d1d94ffd501ce2e7885", "rev": "5edf11c44bc78a0d334f6334cdaf7d60d732daab",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "edolstra", "owner": "NixOS",
"repo": "flake-compat", "repo": "flake-compat",
"type": "github" "type": "github"
} }
@@ -207,11 +229,11 @@
"nixpkgs-lib": "nixpkgs-lib" "nixpkgs-lib": "nixpkgs-lib"
}, },
"locked": { "locked": {
"lastModified": 1762980239, "lastModified": 1767609335,
"narHash": "sha256-8oNVE8TrD19ulHinjaqONf9QWCKK+w4url56cdStMpM=", "narHash": "sha256-feveD98mQpptwrAEggBQKJTYbvwwglSbOv53uCfH9PY=",
"owner": "hercules-ci", "owner": "hercules-ci",
"repo": "flake-parts", "repo": "flake-parts",
"rev": "52a2caecc898d0b46b2b905f058ccc5081f842da", "rev": "250481aafeb741edfe23d29195671c19b36b6dca",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -227,11 +249,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1756770412, "lastModified": 1767609335,
"narHash": "sha256-+uWLQZccFHwqpGqr2Yt5VsW/PbeJVTn9Dk6SHWhNRPw=", "narHash": "sha256-feveD98mQpptwrAEggBQKJTYbvwwglSbOv53uCfH9PY=",
"owner": "hercules-ci", "owner": "hercules-ci",
"repo": "flake-parts", "repo": "flake-parts",
"rev": "4524271976b625a4a605beefd893f270620fd751", "rev": "250481aafeb741edfe23d29195671c19b36b6dca",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -256,6 +278,29 @@
"type": "github" "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": { "git-hooks": {
"inputs": { "inputs": {
"flake-compat": "flake-compat_2", "flake-compat": "flake-compat_2",
@@ -265,11 +310,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1763319842, "lastModified": 1767281941,
"narHash": "sha256-YG19IyrTdnVn0l3DvcUYm85u3PaqBt6tI6VvolcuHnA=", "narHash": "sha256-6MkqajPICgugsuZ92OMoQcgSHnD6sJHwk8AxvMcIgTE=",
"owner": "cachix", "owner": "cachix",
"repo": "git-hooks.nix", "repo": "git-hooks.nix",
"rev": "7275fa67fbbb75891c16d9dee7d88e58aea2d761", "rev": "f0927703b7b1c8d97511c4116eb9b4ec6645a0fa",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -302,11 +347,11 @@
"flake": false, "flake": false,
"locked": { "locked": {
"host": "gitlab.gnome.org", "host": "gitlab.gnome.org",
"lastModified": 1762869044, "lastModified": 1767737596,
"narHash": "sha256-nwm/GJ2Syigf7VccLAZ66mFC8mZJFqpJmIxSGKl7+Ds=", "narHash": "sha256-eFujfIUQDgWnSJBablOuG+32hCai192yRdrNHTv0a+s=",
"owner": "GNOME", "owner": "GNOME",
"repo": "gnome-shell", "repo": "gnome-shell",
"rev": "680e3d195a92203f28d4bf8c6e8bb537cc3ed4ad", "rev": "ef02db02bf0ff342734d525b5767814770d85b49",
"type": "gitlab" "type": "gitlab"
}, },
"original": { "original": {
@@ -324,11 +369,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1764361670, "lastModified": 1769952507,
"narHash": "sha256-jgWzgpIaHbL3USIq0gihZeuy1lLf2YSfwvWEwnfAJUw=", "narHash": "sha256-eNTfxT3v8b7s1dqswgposi5Y1CUMoOUhQKiy29QY25U=",
"owner": "nix-community", "owner": "nix-community",
"repo": "home-manager", "repo": "home-manager",
"rev": "780be8ef503a28939cf9dc7996b48ffb1a3e04c6", "rev": "b59376563943ce163b2553aeb63d0c170967d74e",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -341,11 +386,11 @@
"libnbtplusplus": { "libnbtplusplus": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1699286814, "lastModified": 1744811532,
"narHash": "sha256-yy0q+bky80LtK1GWzz7qpM+aAGrOqLuewbid8WT1ilk=", "narHash": "sha256-qhmjaRkt+O7A+gu6HjUkl7QzOEb4r8y8vWZMG2R/C6o=",
"owner": "PrismLauncher", "owner": "PrismLauncher",
"repo": "libnbtplusplus", "repo": "libnbtplusplus",
"rev": "23b955121b8217c1c348a9ed2483167a6f3ff4ad", "rev": "531449ba1c930c98e0bcf5d332b237a8566f9d78",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -354,13 +399,38 @@
"type": "github" "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": { "nix-flatpak": {
"locked": { "locked": {
"lastModified": 1739444422, "lastModified": 1767983141,
"narHash": "sha256-iAVVHi7X3kWORftY+LVbRiStRnQEob2TULWyjMS6dWg=", "narHash": "sha256-7ZCulYUD9RmJIDULTRkGLSW1faMpDlPKcbWJLYHoXcs=",
"owner": "gmodena", "owner": "gmodena",
"repo": "nix-flatpak", "repo": "nix-flatpak",
"rev": "5e54c3ca05a7c7d968ae1ddeabe01d2a9bc1e177", "rev": "440818969ac2cbd77bfe025e884d0aa528991374",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -372,11 +442,11 @@
}, },
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1764242076, "lastModified": 1769789167,
"narHash": "sha256-sKoIWfnijJ0+9e4wRvIgm/HgE27bzwQxcEmo2J/gNpI=", "narHash": "sha256-kKB3bqYJU5nzYeIROI82Ef9VtTbu4uA3YydSk/Bioa8=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "2fad6eac6077f03fe109c4d4eb171cf96791faa4", "rev": "62c8382960464ceb98ea593cb8321a2cf8f9e3e5",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -388,11 +458,11 @@
}, },
"nixpkgs-lib": { "nixpkgs-lib": {
"locked": { "locked": {
"lastModified": 1761765539, "lastModified": 1765674936,
"narHash": "sha256-b0yj6kfvO8ApcSE+QmA6mUfu8IYG6/uU28OFn4PaC8M=", "narHash": "sha256-k00uTP4JNfmejrCLJOwdObYC9jHRrr/5M/a/8L2EIdo=",
"owner": "nix-community", "owner": "nix-community",
"repo": "nixpkgs.lib", "repo": "nixpkgs.lib",
"rev": "719359f4562934ae99f5443f20aa06c2ffff91fc", "rev": "2075416fcb47225d9b68ac469a5c4801a9c4dd85",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -417,6 +487,26 @@
"type": "github" "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": { "nur": {
"inputs": { "inputs": {
"flake-parts": [ "flake-parts": [
@@ -428,11 +518,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1758998580, "lastModified": 1767810917,
"narHash": "sha256-VLx0z396gDCGSiowLMFz5XRO/XuNV+4EnDYjdJhHvUk=", "narHash": "sha256-ZKqhk772+v/bujjhla9VABwcvz+hB2IaRyeLT6CFnT0=",
"owner": "nix-community", "owner": "nix-community",
"repo": "NUR", "repo": "NUR",
"rev": "ba8d9c98f5f4630bcb0e815ab456afd90c930728", "rev": "dead29c804adc928d3a69dfe7f9f12d0eec1f1a4",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -444,11 +534,11 @@
"on-linux": { "on-linux": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1763514293, "lastModified": 1766544016,
"narHash": "sha256-x766SlDqS6DoOQyW4u1zV3iZbrEKoy4P9K6XDjZ4fGU=", "narHash": "sha256-3X1426N7n6bwM7GAQOvpCq2OVdlQevCzbpak0l9B6BU=",
"owner": "seapear", "owner": "seapear",
"repo": "AffinityOnLinux", "repo": "AffinityOnLinux",
"rev": "2eacfdf625bfafa3099d411f8e2d5afec565fcd6", "rev": "da601564dfefe2ae3ec10e3f177db81578847b7b",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -477,11 +567,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1747683146, "lastModified": 1768437816,
"narHash": "sha256-zZS//xyNYQHvD4fUMoWx86uVUwPk+p5FjZLTTu0pelQ=", "narHash": "sha256-GG+V2g5NfVrypTs8qbtGnUWTXTMkGtohy/uIDa5duI0=",
"owner": "Diegiwg", "owner": "Diegiwg",
"repo": "PrismLauncher-Cracked", "repo": "PrismLauncher-Cracked",
"rev": "0612187254ef41a1087f3107e927e0dd59c9b29d", "rev": "e8418b74059bdbe4fcc97522b25dc17373b0cc21",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -495,11 +585,31 @@
"affinity-nix": "affinity-nix", "affinity-nix": "affinity-nix",
"auto-cpufreq": "auto-cpufreq", "auto-cpufreq": "auto-cpufreq",
"firefox-addons": "firefox-addons", "firefox-addons": "firefox-addons",
"garandos-tui": "garandos-tui",
"home-manager": "home-manager", "home-manager": "home-manager",
"nix-flatpak": "nix-flatpak", "nix-flatpak": "nix-flatpak",
"nixpkgs": "nixpkgs", "nixpkgs": "nixpkgs",
"noctalia": "noctalia",
"prismlauncher-cracked": "prismlauncher-cracked", "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": { "stylix": {
@@ -523,11 +633,11 @@
"tinted-zed": "tinted-zed" "tinted-zed": "tinted-zed"
}, },
"locked": { "locked": {
"lastModified": 1764254063, "lastModified": 1769888473,
"narHash": "sha256-V22JzkaTLF/GAL2LgqvOsJhAr8JbJsKaD8hnHjGwXfE=", "narHash": "sha256-4KWbaJwaYnZ60bFyTudZYAKskjr7Sa17R3/yh+oXS7w=",
"owner": "danth", "owner": "danth",
"repo": "stylix", "repo": "stylix",
"rev": "a1451bc40413870f0c7b576b751c1ca92055e323", "rev": "ae5c0239ae4f82a8c7e33ad8a456535d5a9ba813",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -587,11 +697,11 @@
"tinted-schemes": { "tinted-schemes": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1757716333, "lastModified": 1767710407,
"narHash": "sha256-d4km8W7w2zCUEmPAPUoLk1NlYrGODuVa3P7St+UrqkM=", "narHash": "sha256-+W1EB79Jl0/gm4JqmO0Nuc5C7hRdp4vfsV/VdzI+des=",
"owner": "tinted-theming", "owner": "tinted-theming",
"repo": "schemes", "repo": "schemes",
"rev": "317a5e10c35825a6c905d912e480dfe8e71c7559", "rev": "2800e2b8ac90f678d7e4acebe4fa253f602e05b2",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -603,11 +713,11 @@
"tinted-tmux": { "tinted-tmux": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1757811970, "lastModified": 1767489635,
"narHash": "sha256-n5ZJgmzGZXOD9pZdAl1OnBu3PIqD+X3vEBUGbTi4JiI=", "narHash": "sha256-e6nnFnWXKBCJjCv4QG4bbcouJ6y3yeT70V9MofL32lU=",
"owner": "tinted-theming", "owner": "tinted-theming",
"repo": "tinted-tmux", "repo": "tinted-tmux",
"rev": "d217ba31c846006e9e0ae70775b0ee0f00aa6b1e", "rev": "3c32729ccae99be44fe8a125d20be06f8d7d8184",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -619,11 +729,11 @@
"tinted-zed": { "tinted-zed": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1757811247, "lastModified": 1767488740,
"narHash": "sha256-4EFOUyLj85NRL3OacHoLGEo0wjiRJzfsXtR4CZWAn6w=", "narHash": "sha256-wVOj0qyil8m+ouSsVZcNjl5ZR+1GdOOAooAatQXHbuU=",
"owner": "tinted-theming", "owner": "tinted-theming",
"repo": "base16-zed", "repo": "base16-zed",
"rev": "824fe0aacf82b3c26690d14e8d2cedd56e18404e", "rev": "11abb0b282ad3786a2aae088d3a01c60916f2e40",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -639,11 +749,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1762938485, "lastModified": 1767801790,
"narHash": "sha256-AlEObg0syDl+Spi4LsZIBrjw+snSVU4T8MOeuZJUJjM=", "narHash": "sha256-QfX6g3Wj2vQe7oBJEbTf0npvC6sJoDbF9hb2+gM5tf8=",
"owner": "numtide", "owner": "numtide",
"repo": "treefmt-nix", "repo": "treefmt-nix",
"rev": "5b4ee75aeefd1e2d5a1cc43cf6ba65eba75e83e4", "rev": "778a1d691f1ef45dd68c661715c5bf8cbf131c80",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -651,6 +761,26 @@
"repo": "treefmt-nix", "repo": "treefmt-nix",
"type": "github" "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", "root": "root",

View File

@@ -49,12 +49,28 @@
}; };
nix-flatpak.url = "github:gmodena/nix-flatpak?ref=latest"; 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 = { outputs = {
nixpkgs, nixpkgs,
nix-flatpak, nix-flatpak,
auto-cpufreq, auto-cpufreq,
garandos-tui,
... ...
} @ inputs: let } @ inputs: let
hostDirs = builtins.attrNames (builtins.readDir ./hosts); hostDirs = builtins.attrNames (builtins.readDir ./hosts);
@@ -81,6 +97,7 @@
./profiles/${profile} ./profiles/${profile}
nix-flatpak.nixosModules.nix-flatpak nix-flatpak.nixosModules.nix-flatpak
auto-cpufreq.nixosModules.default auto-cpufreq.nixosModules.default
garandos-tui.nixosModules.garandos-tui
]; ];
}; };
in { in {

View File

@@ -2,65 +2,65 @@ _: {
/* /*
Development editors and IDEs Development editors and IDEs
*/ */
# VSCodium: a free and open-source "demicrosofted" VSCode vscodium.enable = false; # VSCodium: a free and open-source "demicrosofted" VSCode
vscodium.enable = false;
# Zed Editor: a modern, highperformance code editor
zed-editor = { zed-editor = {
# Enable Zed Editor enable = true; # Zed Editor: a modern, highperformance code editor
enable = true; remote-server.enable = true; # Remote Server: enable remote editing capabilities
# Remote Server: enable remote editing capabilities
remote-server = true;
}; };
/* /*
Web browsers Web browsers
*/ */
# Librewolf: a privacy-focused Firefox fork librewolf.enable = true; # Librewolf: a privacy-focused Firefox fork
librewolf.enable = true; ungoogled-chromium.enable = true; # Ungoogled Chromium: a privacy-focused Chromium fork
# Ungoogled Chromium: a privacy-focused Chromium fork
ungoogled-chromium.enable = true;
/* /*
System utilities System utilities
*/ */
# Btop: a resource monitor for the terminal btop.enable = true; # Btop: a resource monitor for the terminal
btop.enable = true; cava.enable = false; # Cava: terminal audio visualizer
# Cava: terminal audio visualizer fastfetch.enable = true; # Fastfetch: a fast system information tool
cava.enable = false; peaclock.enable = true; # Peaclock: Clock, timer, and stopwatch for the terminal
# Fastfetch: a fast system information tool
fastfetch.enable = true;
/* /*
Communication and synchronization Communication and synchronization
*/ */
# KDE Connect: integrate your phone and desktop kdeconnect.enable = false; # KDE Connect: integrate your phone and desktop
kdeconnect.enable = false; nextcloud-client.enable = true; # Nextcloud Client: sync files with a Nextcloud server
# Nextcloud Client: sync files with a Nextcloud server vesktop.enable = true; # Vesktop: a communitydriven Discord client
nextcloud-client.enable = true;
# Vesktop: a communitydriven Discord client
vesktop.enable = true;
/* /*
Gaming Gaming
*/ */
# Lutris: an open gaming platform lutris.enable = false; # Lutris: an open gaming platform
lutris.enable = false;
/* /*
Media recording and streaming Media recording and streaming
*/ */
# OBS Studio: streaming and recording software obs-studio.enable = false; # OBS Studio: streaming and recording software
obs-studio.enable = false;
/* /*
Office suite Office suite
*/ */
# OnlyOffice: an office suite compatible with Microsoft formats onlyoffice.enable = true; # OnlyOffice: an office suite compatible with Microsoft formats
onlyoffice.enable = true;
/* /*
Learning tools Learning tools
*/ */
# Anki: spacedrepetition flashcard program anki.enable = true; # Anki: spacedrepetition flashcard program
anki.enable = true;
/*
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
};
};
} }

View File

@@ -2,86 +2,89 @@ _: {
/* /*
Container & Packaging Container & Packaging
*/ */
# Docker: container runtime and management docker.enable = true; # Docker: container runtime and management
docker.enable = true; virtualbox.enable = true; # VirtualBox: PC emulator
# Distrobox: containerized development environments flatpak = {
distrobox.enable = false; enable = true; # Flatpak: universal packaging system for Linux
# Flatpak: universal packaging system for Linux packages = {
flatpak.enable = true; sober.enable = false; # Roblox client
# Lazydocker: simple TUI for Docker warehouse.enable = true; # Flatpak manager
lazydocker.enable = false; flatseal.enable = true; # Flatpak permissions manager
};
};
/*
Networking
*/
tailscale.enable = true; # Tailscale: secure network for remote access
/* /*
Gaming Gaming
*/ */
# GameMode: optimizes system performance for gaming gamemode.enable = true; # GameMode: optimizes system performance for gaming
gamemode.enable = true; gamescope.enable = false; # Gamescope: microcompositor for games
# Gamescope: micro-compositor for games steam.enable = true; # Steam: platform for buying and playing 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;
/* packages = {
Development Tools /*
*/ Container & Packaging
# Exercism: coding practice platform */
exercism.enable = true; distrobox.enable = false; # Distrobox: containerized development environments
# Gedit: GNOME text editor lazydocker.enable = false; # Lazydocker: simple TUI for Docker
gedit.enable = false; bottles.enable = false; # Bottles: Easy-to-use wineprefix manager
# Lazygit: simple TUI for git
lazygit.enable = false;
# OpenCode: tools for coding and development
opencode.enable = true;
/* /*
Communication & Collaboration Gaming
*/ */
# Mattermost: open-source Slack alternative prismlauncher.enable = true; # Prism Launcher: Minecraft modded launcher
mattermost.enable = true; spaceCadetPinball.enable = true; # SpaceCadet Pinball: classic pinball game
# Slack: team communication and collaboration tool ttySolitaire.enable = true; # TTY Solitaire: terminalbased solitaire game
slack.enable = true; heroic.enable = false; # Native GOG, Epic, and Amazon Games Launcher for Linux, Windows and Mac
# Tutanota: secure email client
tutanota.enable = true;
/* /*
Productivity / Knowledge Management Development Tools
*/ */
# Bitwarden: password manager (desktop) exercism.enable = true; # Exercism: coding practice platform
bitwarden.enable = false; lazygit.enable = false; # Lazygit: simple TUI for Git
# Iotas: lightweight notes manager opencode.enable = false; # OpenCode: tools for coding and development
iotas.enable = true; jan.enable = true; # Jan: AI chat UI
# Logseq: knowledge base and outliner logisim-evolution.enable = true; # Logisim-Evolution: Digital logic designer and simulator
logseq.enable = false;
/* /*
Media & Graphics Communication & Collaboration
*/ */
# Affinity: professional graphics suite mattermost.enable = true; # Mattermost: opensource Slack alternative
affinity.enable = false; slack.enable = true; # Slack: team communication and collaboration tool
# Eye of GNOME: image viewer tutanota.enable = true; # Tutanota: secure email client
eyeOfGnome.enable = true; signal.enable = true; # Signal: secure messaging app
# FreeTube: privacyfriendly YouTube client teams.enable = true; # Teams-for-linux: Unofficial Microsoft Teams client for Linux
freetube.enable = false; ferdium.enable = false; # Ferdium: All your services in one place built by the community
# GIMP: gnu image manipulation program
gimp.enable = false;
# Kdenlive: video editing software
kdenlive.enable = false;
# Plex: media player and server client
plex.enable = true;
/* /*
Utilities / Misc Productivity / Knowledge Management
*/ */
# Eddie AirVPN: VPN client bitwarden.enable = false; # Bitwarden: password manager (desktop)
eddieAirVPN.enable = true; iotas.enable = true; # Iotas: lightweight notes manager
# Galculator: simple calculator logseq.enable = false; # Logseq: knowledge base and outliner
galculator.enable = true;
# Winboat: Windows remote desktop via RDP /*
winboat.enable = false; Media & Graphics
*/
affinity.enable = false; # Affinity: professional graphics suite
eyeOfGnome.enable = true; # Eye of GNOME: image viewer
freetube.enable = false; # FreeTube: privacyfriendly 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
*/
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
};
} }

View File

@@ -2,65 +2,65 @@ _: {
/* /*
Development editors and IDEs Development editors and IDEs
*/ */
# VSCodium: a free and open-source "demicrosofted" VSCode vscodium.enable = false; # VSCodium: a free and open-source "demicrosofted" VSCode
vscodium.enable = false;
# Zed Editor: a modern, highperformance code editor
zed-editor = { zed-editor = {
# Enable Zed Editor enable = true; # Zed Editor: a modern, highperformance code editor
enable = true; remote-server.enable = true; # Remote Server: enable remote editing capabilities
# Remote Server: enable remote editing capabilities
remote-server = true;
}; };
/* /*
Web browsers Web browsers
*/ */
# Librewolf: a privacy-focused Firefox fork librewolf.enable = true; # Librewolf: a privacy-focused Firefox fork
librewolf.enable = true; ungoogled-chromium.enable = true; # Ungoogled Chromium: a privacy-focused Chromium fork
# Ungoogled Chromium: a privacy-focused Chromium fork
ungoogled-chromium.enable = true;
/* /*
System utilities System utilities
*/ */
# Btop: a resource monitor for the terminal btop.enable = true; # Btop: a resource monitor for the terminal
btop.enable = true; cava.enable = false; # Cava: terminal audio visualizer
# Cava: terminal audio visualizer fastfetch.enable = true; # Fastfetch: a fast system information tool
cava.enable = false; peaclock.enable = true; # Peaclock: Clock, timer, and stopwatch for the terminal
# Fastfetch: a fast system information tool
fastfetch.enable = true;
/* /*
Communication and synchronization Communication and synchronization
*/ */
# KDE Connect: integrate your phone and desktop kdeconnect.enable = false; # KDE Connect: integrate your phone and desktop
kdeconnect.enable = false; nextcloud-client.enable = true; # Nextcloud Client: sync files with a Nextcloud server
# Nextcloud Client: sync files with a Nextcloud server vesktop.enable = true; # Vesktop: a communitydriven Discord client
nextcloud-client.enable = true;
# Vesktop: a communitydriven Discord client
vesktop.enable = true;
/* /*
Gaming Gaming
*/ */
# Lutris: an open gaming platform lutris.enable = false; # Lutris: an open gaming platform
lutris.enable = false;
/* /*
Media recording and streaming Media recording and streaming
*/ */
# OBS Studio: streaming and recording software obs-studio.enable = false; # OBS Studio: streaming and recording software
obs-studio.enable = false;
/* /*
Office suite Office suite
*/ */
# OnlyOffice: an office suite compatible with Microsoft formats onlyoffice.enable = true; # OnlyOffice: an office suite compatible with Microsoft formats
onlyoffice.enable = true;
/* /*
Learning tools Learning tools
*/ */
# Anki: spacedrepetition flashcard program anki.enable = true; # Anki: spacedrepetition flashcard program
anki.enable = true;
/*
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
};
};
} }

View File

@@ -2,86 +2,89 @@ _: {
/* /*
Container & Packaging Container & Packaging
*/ */
# Docker: container runtime and management docker.enable = true; # Docker: container runtime and management
docker.enable = true; virtualbox.enable = false; # VirtualBox: PC emulator
# Distrobox: containerized development environments flatpak = {
distrobox.enable = false; enable = true; # Flatpak: universal packaging system for Linux
# Flatpak: universal packaging system for Linux packages = {
flatpak.enable = true; sober.enable = false; # Roblox client
# Lazydocker: simple TUI for Docker warehouse.enable = true; # Flatpak manager
lazydocker.enable = false; flatseal.enable = true; # Flatpak permissions manager
};
};
/*
Networking
*/
tailscale.enable = true; # Tailscale: secure network for remote access
/* /*
Gaming Gaming
*/ */
# GameMode: optimizes system performance for gaming gamemode.enable = true; # GameMode: optimizes system performance for gaming
gamemode.enable = true; gamescope.enable = false; # Gamescope: microcompositor for games
# Gamescope: micro-compositor for games steam.enable = true; # Steam: platform for buying and playing 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;
/* packages = {
Development Tools /*
*/ Container & Packaging
# Exercism: coding practice platform */
exercism.enable = true; distrobox.enable = false; # Distrobox: containerized development environments
# Gedit: GNOME text editor lazydocker.enable = false; # Lazydocker: simple TUI for Docker
gedit.enable = false; bottles.enable = false; # Bottles: Easy-to-use wineprefix manager
# Lazygit: simple TUI for git
lazygit.enable = false;
# OpenCode: tools for coding and development
opencode.enable = true;
/* /*
Communication & Collaboration Gaming
*/ */
# Mattermost: open-source Slack alternative prismlauncher.enable = true; # Prism Launcher: Minecraft modded launcher
mattermost.enable = true; spaceCadetPinball.enable = true; # SpaceCadet Pinball: classic pinball game
# Slack: team communication and collaboration tool ttySolitaire.enable = true; # TTY Solitaire: terminalbased solitaire game
slack.enable = true; heroic.enable = false; # Native GOG, Epic, and Amazon Games Launcher for Linux, Windows and Mac
# Tutanota: secure email client
tutanota.enable = true;
/* /*
Productivity / Knowledge Management Development Tools
*/ */
# Bitwarden: password manager (desktop) exercism.enable = true; # Exercism: coding practice platform
bitwarden.enable = false; lazygit.enable = false; # Lazygit: simple TUI for Git
# Iotas: lightweight notes manager opencode.enable = false; # OpenCode: tools for coding and development
iotas.enable = true; jan.enable = true; # Jan: AI chat UI
# Logseq: knowledge base and outliner logisim-evolution.enable = false; # Logisim-Evolution: Digital logic designer and simulator
logseq.enable = false;
/* /*
Media & Graphics Communication & Collaboration
*/ */
# Affinity: professional graphics suite mattermost.enable = true; # Mattermost: opensource Slack alternative
affinity.enable = false; slack.enable = true; # Slack: team communication and collaboration tool
# Eye of GNOME: image viewer tutanota.enable = true; # Tutanota: secure email client
eyeOfGnome.enable = true; signal.enable = true; # Signal: secure messaging app
# FreeTube: privacyfriendly YouTube client teams.enable = true; # Teams-for-linux: Unofficial Microsoft Teams client for Linux
freetube.enable = false; ferdium.enable = false; # Ferdium: All your services in one place built by the community
# GIMP: gnu image manipulation program
gimp.enable = false;
# Kdenlive: video editing software
kdenlive.enable = false;
# Plex: media player and server client
plex.enable = true;
/* /*
Utilities / Misc Productivity / Knowledge Management
*/ */
# Eddie AirVPN: VPN client bitwarden.enable = false; # Bitwarden: password manager (desktop)
eddieAirVPN.enable = true; iotas.enable = true; # Iotas: lightweight notes manager
# Galculator: simple calculator logseq.enable = false; # Logseq: knowledge base and outliner
galculator.enable = true;
# Winboat: Windows remote desktop via RDP /*
winboat.enable = false; Media & Graphics
*/
affinity.enable = false; # Affinity: professional graphics suite
eyeOfGnome.enable = true; # Eye of GNOME: image viewer
freetube.enable = false; # FreeTube: privacyfriendly 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
*/
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
};
} }

View File

@@ -2,65 +2,65 @@ _: {
/* /*
Development editors and IDEs Development editors and IDEs
*/ */
# VSCodium: a free and open-source "demicrosofted" VSCode vscodium.enable = false; # VSCodium: a free and open-source "demicrosofted" VSCode
vscodium.enable = false;
# Zed Editor: a modern, highperformance code editor
zed-editor = { zed-editor = {
# Enable Zed Editor enable = true; # Zed Editor: a modern, highperformance code editor
enable = true; remote-server.enable = true; # Remote Server: enable remote editing capabilities
# Remote Server: enable remote editing capabilities
remote-server = true;
}; };
/* /*
Web browsers Web browsers
*/ */
# Librewolf: a privacy-focused Firefox fork librewolf.enable = true; # Librewolf: a privacy-focused Firefox fork
librewolf.enable = true; ungoogled-chromium.enable = true; # Ungoogled Chromium: a privacy-focused Chromium fork
# Ungoogled Chromium: a privacy-focused Chromium fork
ungoogled-chromium.enable = true;
/* /*
System utilities System utilities
*/ */
# Btop: a resource monitor for the terminal btop.enable = true; # Btop: a resource monitor for the terminal
btop.enable = true; cava.enable = false; # Cava: terminal audio visualizer
# Cava: terminal audio visualizer fastfetch.enable = true; # Fastfetch: a fast system information tool
cava.enable = false; peaclock.enable = true; # Peaclock: Clock, timer, and stopwatch for the terminal
# Fastfetch: a fast system information tool
fastfetch.enable = true;
/* /*
Communication and synchronization Communication and synchronization
*/ */
# KDE Connect: integrate your phone and desktop kdeconnect.enable = false; # KDE Connect: integrate your phone and desktop
kdeconnect.enable = false; nextcloud-client.enable = true; # Nextcloud Client: sync files with a Nextcloud server
# Nextcloud Client: sync files with a Nextcloud server vesktop.enable = true; # Vesktop: a communitydriven Discord client
nextcloud-client.enable = true;
# Vesktop: a communitydriven Discord client
vesktop.enable = true;
/* /*
Gaming Gaming
*/ */
# Lutris: an open gaming platform lutris.enable = false; # Lutris: an open gaming platform
lutris.enable = false;
/* /*
Media recording and streaming Media recording and streaming
*/ */
# OBS Studio: streaming and recording software obs-studio.enable = false; # OBS Studio: streaming and recording software
obs-studio.enable = false;
/* /*
Office suite Office suite
*/ */
# OnlyOffice: an office suite compatible with Microsoft formats onlyoffice.enable = true; # OnlyOffice: an office suite compatible with Microsoft formats
onlyoffice.enable = true;
/* /*
Learning tools Learning tools
*/ */
# Anki: spacedrepetition flashcard program anki.enable = true; # Anki: spacedrepetition flashcard program
anki.enable = true;
/*
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
};
};
} }

View File

@@ -2,86 +2,89 @@ _: {
/* /*
Container & Packaging Container & Packaging
*/ */
# Docker: container runtime and management docker.enable = true; # Docker: container runtime and management
docker.enable = true; virtualbox.enable = false; # VirtualBox: PC emulator
# Distrobox: containerized development environments flatpak = {
distrobox.enable = false; enable = true; # Flatpak: universal packaging system for Linux
# Flatpak: universal packaging system for Linux packages = {
flatpak.enable = true; sober.enable = false; # Roblox client
# Lazydocker: simple TUI for Docker warehouse.enable = true; # Flatpak manager
lazydocker.enable = false; flatseal.enable = true; # Flatpak permissions manager
};
};
/*
Networking
*/
tailscale.enable = false; # Tailscale: secure network for remote access
/* /*
Gaming Gaming
*/ */
# GameMode: optimizes system performance for gaming gamemode.enable = true; # GameMode: optimizes system performance for gaming
gamemode.enable = true; gamescope.enable = false; # Gamescope: microcompositor for games
# Gamescope: micro-compositor for games steam.enable = true; # Steam: platform for buying and playing 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;
/* packages = {
Development Tools /*
*/ Container & Packaging
# Exercism: coding practice platform */
exercism.enable = true; distrobox.enable = false; # Distrobox: containerized development environments
# Gedit: GNOME text editor lazydocker.enable = false; # Lazydocker: simple TUI for Docker
gedit.enable = false; bottles.enable = false; # Bottles: Easy-to-use wineprefix manager
# Lazygit: simple TUI for git
lazygit.enable = false;
# OpenCode: tools for coding and development
opencode.enable = true;
/* /*
Communication & Collaboration Gaming
*/ */
# Mattermost: open-source Slack alternative prismlauncher.enable = false; # Prism Launcher: Minecraft modded launcher
mattermost.enable = true; spaceCadetPinball.enable = true; # SpaceCadet Pinball: classic pinball game
# Slack: team communication and collaboration tool ttySolitaire.enable = true; # TTY Solitaire: terminalbased solitaire game
slack.enable = true; heroic.enable = false; # Native GOG, Epic, and Amazon Games Launcher for Linux, Windows and Mac
# Tutanota: secure email client
tutanota.enable = true;
/* /*
Productivity / Knowledge Management Development Tools
*/ */
# Bitwarden: password manager (desktop) exercism.enable = true; # Exercism: coding practice platform
bitwarden.enable = false; lazygit.enable = false; # Lazygit: simple TUI for Git
# Iotas: lightweight notes manager opencode.enable = false; # OpenCode: tools for coding and development
iotas.enable = true; jan.enable = true; # Jan: AI chat UI
# Logseq: knowledge base and outliner logisim-evolution.enable = false; # Logisim-Evolution: Digital logic designer and simulator
logseq.enable = false;
/* /*
Media & Graphics Communication & Collaboration
*/ */
# Affinity: professional graphics suite mattermost.enable = true; # Mattermost: opensource Slack alternative
affinity.enable = false; slack.enable = true; # Slack: team communication and collaboration tool
# Eye of GNOME: image viewer tutanota.enable = true; # Tutanota: secure email client
eyeOfGnome.enable = true; signal.enable = true; # Signal: secure messaging app
# FreeTube: privacyfriendly YouTube client teams.enable = true; # Teams-for-linux: Unofficial Microsoft Teams client for Linux
freetube.enable = false; ferdium.enable = false; # Ferdium: All your services in one place built by the community
# GIMP: gnu image manipulation program
gimp.enable = false;
# Kdenlive: video editing software
kdenlive.enable = false;
# Plex: media player and server client
plex.enable = true;
/* /*
Utilities / Misc Productivity / Knowledge Management
*/ */
# Eddie AirVPN: VPN client bitwarden.enable = false; # Bitwarden: password manager (desktop)
eddieAirVPN.enable = true; iotas.enable = true; # Iotas: lightweight notes manager
# Galculator: simple calculator logseq.enable = false; # Logseq: knowledge base and outliner
galculator.enable = true;
# Winboat: Windows remote desktop via RDP /*
winboat.enable = false; Media & Graphics
*/
affinity.enable = false; # Affinity: professional graphics suite
eyeOfGnome.enable = true; # Eye of GNOME: image viewer
freetube.enable = false; # FreeTube: privacyfriendly 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
*/
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
};
} }

View File

@@ -19,7 +19,7 @@
wallpapers = [ wallpapers = [
./../../wallpapers/attack-on-titan-mikasa-ackerman.jpg ./../../wallpapers/attack-on-titan-mikasa-ackerman.jpg
]; ];
wallpaperStyle = lib.mkDefault "centered"; wallpaperStyle = lib.mkForce "centered";
backdrop = "${config.stylix.base16Scheme.base00}"; backdrop = "${config.stylix.base16Scheme.base00}";
interface = { interface = {
branding = "GarandOS Bootloader"; branding = "GarandOS Bootloader";

View File

@@ -6,11 +6,13 @@
./docker.nix ./docker.nix
./flatpak.nix ./flatpak.nix
./fonts.nix ./fonts.nix
./garandos-tui.nix
./hardware.nix ./hardware.nix
./network.nix ./network.nix
./nfs.nix ./nfs.nix
./nh.nix ./nh.nix
./printing.nix ./printing.nix
./quickshell.nix
./greetd.nix ./greetd.nix
./security.nix ./security.nix
./services.nix ./services.nix
@@ -18,8 +20,10 @@
./stylix.nix ./stylix.nix
./syncthing.nix ./syncthing.nix
./system.nix ./system.nix
./tailscale.nix
./thunar.nix ./thunar.nix
./user.nix ./user.nix
./virtualbox.nix
./xdg.nix ./xdg.nix
./xserver.nix ./xserver.nix
inputs.stylix.nixosModules.stylix inputs.stylix.nixosModules.stylix

View File

@@ -2,16 +2,27 @@
lib, lib,
config, 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"; options.flatpak.enable = lib.mkEnableOption "Flatpak";
config.services.flatpak = lib.mkIf config.flatpak.enable { config.services.flatpak = lib.mkIf config.flatpak.enable {
enable = true; enable = true;
update.onActivation = true; update.onActivation = true;
packages = [ packages = [];
# "org.vinegarhq.Sober"
"io.github.flattool.Warehouse"
"com.github.tchx84.Flatseal"
];
}; };
imports = builtins.attrValues (builtins.mapAttrs mkFlatpakPackage flatpakPackages);
} }

View 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";
};
}

View File

@@ -1,4 +1,9 @@
{pkgs, ...}: { {
pkgs,
inputs,
system,
...
}: {
environment.systemPackages = with pkgs; [ environment.systemPackages = with pkgs; [
mpv mpv
pavucontrol pavucontrol
@@ -12,6 +17,7 @@
file-roller file-roller
unrar unrar
unzip unzip
p7zip
# System monitoring & info # System monitoring & info
inxi inxi
lm_sensors lm_sensors
@@ -52,5 +58,10 @@
hunspell hunspell
hunspellDicts.pl_PL hunspellDicts.pl_PL
hunspellDicts.en_US hunspellDicts.en_US
# Noctalia Shell Dependencies
matugen
app2unit
gpu-screen-recorder
power-profiles-daemon
]; ];
} }

View File

@@ -7,9 +7,9 @@
... ...
}: let }: let
mkPackage = name: pkgsOrList: { mkPackage = name: pkgsOrList: {
options.${name}.enable = lib.mkEnableOption name; options.packages.${name}.enable = lib.mkEnableOption name;
config.environment.systemPackages = config.environment.systemPackages =
lib.mkIf config.${name}.enable lib.mkIf config.packages.${name}.enable
(lib.toList pkgsOrList); (lib.toList pkgsOrList);
}; };
@@ -25,6 +25,7 @@
tutanota = tutanota-desktop; tutanota = tutanota-desktop;
exercism = exercism; exercism = exercism;
opencode = opencode; opencode = opencode;
jan = jan;
lazygit = lazygit; lazygit = lazygit;
prismlauncher = inputs.prismlauncher-cracked.packages.${system}.default; prismlauncher = inputs.prismlauncher-cracked.packages.${system}.default;
spaceCadetPinball = space-cadet-pinball; spaceCadetPinball = space-cadet-pinball;
@@ -41,6 +42,14 @@
lazydocker = lazydocker; lazydocker = lazydocker;
distrobox = [distrobox pkgs.boxbuddy]; distrobox = [distrobox pkgs.boxbuddy];
winboat = [winboat freerdp]; 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 { in {
imports = builtins.attrValues (builtins.mapAttrs mkPackage packages); imports = builtins.attrValues (builtins.mapAttrs mkPackage packages);

View File

@@ -1,7 +1,3 @@
# {
# pkgs
# ...
# }
_: { _: {
programs = { programs = {
nano.enable = true; nano.enable = true;
@@ -13,7 +9,6 @@ _: {
seahorse.enable = true; seahorse.enable = true;
fuse.userAllowOther = true; fuse.userAllowOther = true;
mtr.enable = true; mtr.enable = true;
adb.enable = true;
hyprlock.enable = true; hyprlock.enable = true;
gnupg.agent = { gnupg.agent = {
enable = true; enable = true;

View File

@@ -0,0 +1,30 @@
{pkgs, ...}: {
environment = {
systemPackages = with pkgs; [
quickshell
# Qt6 related kitsfor 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";
};
};
}

View File

@@ -53,5 +53,6 @@
]; ];
}; };
}; };
upower.enable = true; # noctalia shell battery
}; };
} }

View 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;
};
}

View File

@@ -1,7 +1,7 @@
{pkgs, ...}: { {pkgs, ...}: {
programs.thunar = { programs.thunar = {
enable = true; enable = true;
plugins = with pkgs.xfce; [ plugins = with pkgs; [
thunar-archive-plugin thunar-archive-plugin
thunar-volman thunar-volman
]; ];

View 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;
};
}

View File

@@ -8,10 +8,12 @@
pullos = "git -C /home/${username}/garandos pull"; pullos = "git -C /home/${username}/garandos pull";
upd = "nh os switch --hostname ${host}"; upd = "nh os switch --hostname ${host}";
upg = "nh os switch --hostname ${host} --update"; 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-bt = "nh os boot --hostname ${host}";
upd-ts = "nh os test --hostname ${host}"; upd-ts = "nh os test --hostname ${host}";
upd-bd = "nh os build --hostname ${host}"; upd-bd = "nh os build --hostname ${host}";
tui = "garandos-tui";
ncg = "nh clean all"; ncg = "nh clean all";
# Development aliases # Development aliases
@@ -32,6 +34,12 @@
nrd = "nix run .#develop"; nrd = "nix run .#develop";
nbrd = "nix build .#develop && 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 # System aliases
# flush-codium = "sudo killall codium && sudo rm -rf ~/.config/VSCodium/Cache && sudo rm -rf ~/.config/VSCodium/CachedData"; # flush-codium = "sudo killall codium && sudo rm -rf ~/.config/VSCodium/Cache && sudo rm -rf ~/.config/VSCodium/CachedData";
kys = "shutdown now"; kys = "shutdown now";
@@ -122,7 +130,9 @@
fc = "fortune | cowsay"; fc = "fortune | cowsay";
# Network aliases # Network aliases
kssh-server = "kssh garand_plg@192.168.1.156 -i ~/.ssh/hp-t640-homeserver"; kssh-server = "kssh hp-t640-homeserver";
ssh-server = "ssh garand_plg@192.168.1.156 -i ~/.ssh/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";
}; };
} }

View File

@@ -8,6 +8,7 @@ in {
./hyprland ./hyprland
./kitty ./kitty
./librewolf ./librewolf
./peaclock
./rofi ./rofi
./scripts ./scripts
./swaync ./swaync
@@ -28,8 +29,10 @@ in {
./kdeConnect.nix ./kdeConnect.nix
./lutris.nix ./lutris.nix
./nextcloud.nix ./nextcloud.nix
./noctalia.nix
./obs-studio.nix ./obs-studio.nix
./onlyoffice.nix ./onlyoffice.nix
./overview.nix
./qt.nix ./qt.nix
./ssh.nix ./ssh.nix
./starship.nix ./starship.nix

Binary file not shown.

Before

Width:  |  Height:  |  Size: 96 KiB

After

Width:  |  Height:  |  Size: 24 KiB

View File

@@ -1,22 +1,20 @@
_: { _: {
wayland.windowManager.hyprland.settings = { wayland.windowManager.hyprland.settings.animations = {
animations = { enabled = true;
enabled = true; bezier = [
bezier = [ "wind, -1.05, 0.9, 0.1, 1.05"
"wind, -1.05, 0.9, 0.1, 1.05" "winIn, -1.1, 1.1, 0.1, 1.1"
"winIn, -1.1, 1.1, 0.1, 1.1" "winOut, -1.3, -0.3, 0, 1"
"winOut, -1.3, -0.3, 0, 1" "liner, 0, 1, 1, 1"
"liner, 0, 1, 1, 1" ];
]; animation = [
animation = [ "windows, 0, 6, wind, slide"
"windows, 0, 6, wind, slide" "windowsIn, 0, 6, winIn, slide"
"windowsIn, 0, 6, winIn, slide" "windowsOut, 0, 5, winOut, slide"
"windowsOut, 0, 5, winOut, slide" "windowsMove, 0, 5, wind, slide"
"windowsMove, 0, 5, wind, slide" "border, 0, 1, liner"
"border, 0, 1, liner" "fade, 0, 10, default"
"fade, 0, 10, default" "workspaces, 0, 5, wind"
"workspaces, 0, 5, wind" ];
];
};
}; };
} }

View File

@@ -1,25 +1,22 @@
_: { _: {
wayland.windowManager.hyprland.settings = { # name "Dynamic"
# name "Dynamic" wayland.windowManager.hyprland.settings.animations = {
# credit https://github.com/mylinuxforwork/dotfiles enabled = true;
animations = { bezier = [
enabled = true; "wind, 0.05, 0.9, 0.1, 1.05"
bezier = [ "winIn, 0.1, 1.1, 0.1, 1.1"
"wind, 0.05, 0.9, 0.1, 1.05" "winOut, 0.3, -0.3, 0, 1"
"winIn, 0.1, 1.1, 0.1, 1.1" "liner, 1, 1, 1, 1"
"winOut, 0.3, -0.3, 0, 1" ];
"liner, 1, 1, 1, 1" animation = [
]; "windows, 1, 6, wind, slide"
animation = [ "windowsIn, 1, 6, winIn, slide"
"windows, 1, 6, wind, slide" "windowsOut, 1, 5, winOut, slide"
"windowsIn, 1, 6, winIn, slide" "windowsMove, 1, 5, wind, slide"
"windowsOut, 1, 5, winOut, slide" "border, 1, 1, liner"
"windowsMove, 1, 5, wind, slide" "borderangle, 1, 30, liner, loop"
"border, 1, 1, liner" "fade, 1, 10, default"
"borderangle, 1, 30, liner, loop" "workspaces, 1, 5, wind"
"fade, 1, 10, default" ];
"workspaces, 1, 5, wind"
];
};
}; };
} }

View File

@@ -1,37 +1,34 @@
_: { _: {
wayland.windowManager.hyprland.settings = { # Name: END-4
# Name: END-4 wayland.windowManager.hyprland.settings.animations = {
# Credit: END-4 project https://github.com/end-4/dots-hyprland enabled = true;
animations = { bezier = [
enabled = true; "linear, 0, 0, 1, 1"
bezier = [ "md3_standard, 0.2, 0, 0, 1"
"linear, 0, 0, 1, 1" "md3_decel, 0.05, 0.7, 0.1, 1"
"md3_standard, 0.2, 0, 0, 1" "md3_accel, 0.3, 0, 0.8, 0.15"
"md3_decel, 0.05, 0.7, 0.1, 1" "overshot, 0.05, 0.9, 0.1, 1.1"
"md3_accel, 0.3, 0, 0.8, 0.15" "crazyshot, 0.1, 1.5, 0.76, 0.92 "
"overshot, 0.05, 0.9, 0.1, 1.1" "hyprnostretch, 0.05, 0.9, 0.1, 1.0"
"crazyshot, 0.1, 1.5, 0.76, 0.92 " "menu_decel, 0.1, 1, 0, 1"
"hyprnostretch, 0.05, 0.9, 0.1, 1.0" "menu_accel, 0.38, 0.04, 1, 0.07"
"menu_decel, 0.1, 1, 0, 1" "easeInOutCirc, 0.85, 0, 0.15, 1"
"menu_accel, 0.38, 0.04, 1, 0.07" "easeOutCirc, 0, 0.55, 0.45, 1"
"easeInOutCirc, 0.85, 0, 0.15, 1" "easeOutExpo, 0.16, 1, 0.3, 1"
"easeOutCirc, 0, 0.55, 0.45, 1" "softAcDecel, 0.26, 0.26, 0.15, 1"
"easeOutExpo, 0.16, 1, 0.3, 1" "md2, 0.4, 0, 0.2, 1 # use with .2s duration"
"softAcDecel, 0.26, 0.26, 0.15, 1" ];
"md2, 0.4, 0, 0.2, 1 # use with .2s duration" animation = [
]; "windows, 1, 3, md3_decel, popin 60%"
animation = [ "windowsIn, 1, 3, md3_decel, popin 60%"
"windows, 1, 3, md3_decel, popin 60%" "windowsOut, 1, 3, md3_accel, popin 60%"
"windowsIn, 1, 3, md3_decel, popin 60%" "border, 1, 10, default"
"windowsOut, 1, 3, md3_accel, popin 60%" "fade, 1, 3, md3_decel"
"border, 1, 10, default" "layersIn, 1, 3, menu_decel, slide"
"fade, 1, 3, md3_decel" "layersOut, 1, 1.6, menu_accel"
"layersIn, 1, 3, menu_decel, slide" "fadeLayersIn, 1, 2, menu_decel"
"layersOut, 1, 1.6, menu_accel" "fadeLayersOut, 1, 4.5, menu_accel"
"fadeLayersIn, 1, 2, menu_decel" "workspaces, 1, 7, menu_decel, slide"
"fadeLayersOut, 1, 4.5, menu_accel" ];
"workspaces, 1, 7, menu_decel, slide"
];
};
}; };
} }

View File

@@ -1,24 +1,21 @@
_: { _: {
wayland.windowManager.hyprland.settings = { # name "moving"
# name "moving" wayland.windowManager.hyprland.settings.animations = {
# credit https://github.com/mylinuxforwork/dotfiles enabled = true;
animations = { bezier = [
enabled = true; "overshot, 0.05, 0.9, 0.1, 1.05"
bezier = [ "smoothOut, 0.5, 0, 0.99, 0.99"
"overshot, 0.05, 0.9, 0.1, 1.05" "smoothIn, 0.5, -0.5, 0.68, 1.5"
"smoothOut, 0.5, 0, 0.99, 0.99" ];
"smoothIn, 0.5, -0.5, 0.68, 1.5" animation = [
]; "windows, 1, 5, overshot, slide"
animation = [ "windowsOut, 1, 3, smoothOut"
"windows, 1, 5, overshot, slide" "windowsIn, 1, 3, smoothOut"
"windowsOut, 1, 3, smoothOut" "windowsMove, 1, 4, smoothIn, slide"
"windowsIn, 1, 3, smoothOut" "border, 1, 5, default"
"windowsMove, 1, 4, smoothIn, slide" "fade, 1, 5, smoothIn"
"border, 1, 5, default" "fadeDim, 1, 5, smoothIn"
"fade, 1, 5, smoothIn" "workspaces, 1, 6, default"
"fadeDim, 1, 5, smoothIn" ];
"workspaces, 1, 6, default"
];
};
}; };
} }

View File

@@ -11,127 +11,130 @@ in {
# ============================================================================= # =============================================================================
# APLIKACJE - GŁÓWNE # APLIKACJE - GŁÓWNE
# ============================================================================= # =============================================================================
"$modifier, A, exec, anki" "SUPER, A, exec, anki"
"$modifier, B, exec, bitwarden" "SUPER, B, exec, bitwarden"
"$modifier, C, exec, chromium" "SUPER, C, exec, chromium"
"$modifier, D, exec, vesktop" "SUPER, D, exec, vesktop"
"$modifier, G, exec, affinity-v3" "SUPER, G, exec, affinity-v3"
"$modifier, I, exec, iotas" "SUPER, I, exec, iotas"
"$modifier, L, exec, logseq" "SUPER, J, exec, Jan"
"$modifier, M, exec, plexamp" "SUPER, L, exec, logseq"
"$modifier, N, exec, dex ${desktopEntriesPath}/garandcloud.desktop" "SUPER, M, exec, plexamp"
"$modifier, O, exec, obs" "SUPER, N, exec, dex ${desktopEntriesPath}/garandcloud.desktop"
"$modifier, P, exec, plex-desktop" "SUPER, O, exec, obs"
"$modifier, Return, exec, ${terminal}" "SUPER, P, exec, plex-desktop"
"$modifier, S, exec, steam" "SUPER, Return, exec, ${terminal}"
"$modifier, T, exec, thunar" "SUPER, S, exec, steam"
"$modifier, V, exec, codium" "SUPER, T, exec, thunar"
"$modifier, W, exec, ${browser}" "SUPER, V, exec, codium"
"$modifier, Z, exec, zeditor" "SUPER, W, exec, ${browser}"
"SUPER, Z, exec, zeditor"
# ============================================================================= # =============================================================================
# APLIKACJE - Z SHIFT # APLIKACJE - Z SHIFT
# ============================================================================= # =============================================================================
"$modifier SHIFT, B, exec, blueman-manager" "SUPER SHIFT, B, exec, blueman-manager"
"$modifier SHIFT, C, exec, dex ${desktopEntriesPath}/claude.desktop" "SUPER SHIFT, C, exec, dex ${desktopEntriesPath}/claude.desktop"
"$modifier SHIFT, G, exec, dex ${desktopEntriesPath}/chatgpt.desktop" "SUPER SHIFT, G, exec, dex ${desktopEntriesPath}/chatgpt.desktop"
"$modifier SHIFT, M, exec, dex ${desktopEntriesPath}/messenger.desktop" "SUPER SHIFT, M, exec, dex ${desktopEntriesPath}/messenger.desktop"
"$modifier SHIFT, N, exec, nextcloud" "SUPER SHIFT, N, exec, nextcloud"
"$modifier SHIFT, O, exec, onlyoffice-desktopeditors" "SUPER SHIFT, O, exec, onlyoffice-desktopeditors"
"$modifier SHIFT, Return, exec, rofi-launcher" # "SUPER SHIFT, Return, exec, rofi-launcher"
"$modifier SHIFT, T, exec, tutanota-desktop" "SUPER SHIFT, T, exec, tutanota-desktop"
"$modifier SHIFT, W, exec, web-search" # "SUPER SHIFT, W, exec, web-search"
# ============================================================================= # =============================================================================
# APLIKACJE - Z ALT # APLIKACJE - Z ALT
# ============================================================================= # =============================================================================
"$modifier ALT, G, exec, dex ${desktopEntriesPath}/glance.desktop" "SUPER ALT, G, exec, dex ${desktopEntriesPath}/glance.desktop"
"$modifier ALT, M, exec, dex ${desktopEntriesPath}/mastodon.desktop" "SUPER ALT, M, exec, dex ${desktopEntriesPath}/mastodon.desktop"
"$modifier ALT, S, exec, slack" "SUPER ALT, S, exec, slack"
"$modifier ALT, T, exec, gedit" "SUPER ALT, T, exec, gedit"
# ============================================================================= # =============================================================================
# APLIKACJE - Z CONTROL # APLIKACJE - Z CONTROL
# ============================================================================= # =============================================================================
"$modifier CONTROL, G, exec, gimp" "SUPER CONTROL, G, exec, gimp"
"$modifier CONTROL, M, exec, mattermost-desktop" "SUPER CONTROL, M, exec, mattermost-desktop"
"SUPER CONTROL, S, exec, signal-desktop"
# ============================================================================= # =============================================================================
# NARZĘDZIA SYSTEMOWE # NARZĘDZIA SYSTEMOWE
# ============================================================================= # =============================================================================
"$modifier, E, exec, emopicker9000" "SUPER, E, exec, emopicker9000"
"$modifier, K, exec, galculator" "SUPER, K, exec, galculator"
"$modifier ALT, W, exec, wallsetter" "SUPER ALT, W, exec, wallsetter"
"$modifier CONTROL, P, exec, hyprpicker -a" "SUPER CONTROL, P, exec, hyprpicker -a"
"$modifier SHIFT, K, exec, list-keybinds" "SUPER SHIFT, K, exec, list-keybinds"
"$modifier SHIFT, P, exec, pavucontrol" "SUPER SHIFT, P, exec, pavucontrol"
"$modifier SHIFT, S, exec, screenshootin" "SUPER SHIFT, S, exec, screenshootin"
# ============================================================================= # =============================================================================
# ZARZĄDZANIE OKNAMI # ZARZĄDZANIE OKNAMI
# ============================================================================= # =============================================================================
"$modifier, Escape, exec, hyprlock" "SUPER, Escape, exec, hyprlock"
"$modifier, F, fullscreen," "SUPER, F, fullscreen,"
"$modifier, Q, killactive," "SUPER, Q, killactive,"
"$modifier CONTROL, Escape, exec, wlogout" "SUPER CONTROL, Escape, exec, wlogout"
"$modifier SHIFT, Escape, exit," "SUPER SHIFT, Escape, exit,"
"$modifier SHIFT, I, togglesplit," "SUPER SHIFT, I, togglesplit,"
"SUPER SHIFT, F, togglefloating,"
# ============================================================================= # =============================================================================
# FOKUS OKIEN # FOKUS OKIEN
# ============================================================================= # =============================================================================
"$modifier, down, movefocus, d" "SUPER, down, movefocus, d"
"$modifier, left, movefocus, l" "SUPER, left, movefocus, l"
"$modifier, right, movefocus, r" "SUPER, right, movefocus, r"
"$modifier, up, movefocus, u" "SUPER, up, movefocus, u"
# ============================================================================= # =============================================================================
# PRZEMIESZCZANIE OKIEN # PRZEMIESZCZANIE OKIEN
# ============================================================================= # =============================================================================
"$modifier SHIFT, down, movewindow, d" "SUPER SHIFT, down, movewindow, d"
"$modifier SHIFT, left, movewindow, l" "SUPER SHIFT, left, movewindow, l"
"$modifier SHIFT, right, movewindow, r" "SUPER SHIFT, right, movewindow, r"
"$modifier SHIFT, up, movewindow, u" "SUPER SHIFT, up, movewindow, u"
# ============================================================================= # =============================================================================
# ZAMIANA OKIEN # ZAMIANA OKIEN
# ============================================================================= # =============================================================================
"$modifier ALT, down, swapwindow, d" "SUPER ALT, down, swapwindow, d"
"$modifier ALT, left, swapwindow, l" "SUPER ALT, left, swapwindow, l"
"$modifier ALT, right, swapwindow, r" "SUPER ALT, right, swapwindow, r"
"$modifier ALT, up, swapwindow, u" "SUPER ALT, up, swapwindow, u"
# ============================================================================= # =============================================================================
# WORKSPACES - PRZEŁĄCZANIE # WORKSPACES - PRZEŁĄCZANIE
# ============================================================================= # =============================================================================
"$modifier, 0, workspace, 10" "SUPER, 0, workspace, 10"
"$modifier, 1, workspace, 1" "SUPER, 1, workspace, 1"
"$modifier, 2, workspace, 2" "SUPER, 2, workspace, 2"
"$modifier, 3, workspace, 3" "SUPER, 3, workspace, 3"
"$modifier, 4, workspace, 4" "SUPER, 4, workspace, 4"
"$modifier, 5, workspace, 5" "SUPER, 5, workspace, 5"
"$modifier, 6, workspace, 6" "SUPER, 6, workspace, 6"
"$modifier, 7, workspace, 7" "SUPER, 7, workspace, 7"
"$modifier, 8, workspace, 8" "SUPER, 8, workspace, 8"
"$modifier, 9, workspace, 9" "SUPER, 9, workspace, 9"
"$modifier CONTROL, left, workspace, e-1" "SUPER CONTROL, left, workspace, e-1"
"$modifier CONTROL, right, workspace, e+1" "SUPER CONTROL, right, workspace, e+1"
"$modifier, mouse_down, workspace, e+1" "SUPER, mouse_down, workspace, e+1"
"$modifier, mouse_up, workspace, e-1" "SUPER, mouse_up, workspace, e-1"
# ============================================================================= # =============================================================================
# WORKSPACES - PRZENOSZENIE OKIEN # WORKSPACES - PRZENOSZENIE OKIEN
# ============================================================================= # =============================================================================
"$modifier SHIFT, 0, movetoworkspace, 10" "SUPER SHIFT, 0, movetoworkspace, 10"
"$modifier SHIFT, 1, movetoworkspace, 1" "SUPER SHIFT, 1, movetoworkspace, 1"
"$modifier SHIFT, 2, movetoworkspace, 2" "SUPER SHIFT, 2, movetoworkspace, 2"
"$modifier SHIFT, 3, movetoworkspace, 3" "SUPER SHIFT, 3, movetoworkspace, 3"
"$modifier SHIFT, 4, movetoworkspace, 4" "SUPER SHIFT, 4, movetoworkspace, 4"
"$modifier SHIFT, 5, movetoworkspace, 5" "SUPER SHIFT, 5, movetoworkspace, 5"
"$modifier SHIFT, 6, movetoworkspace, 6" "SUPER SHIFT, 6, movetoworkspace, 6"
"$modifier SHIFT, 7, movetoworkspace, 7" "SUPER SHIFT, 7, movetoworkspace, 7"
"$modifier SHIFT, 8, movetoworkspace, 8" "SUPER SHIFT, 8, movetoworkspace, 8"
"$modifier SHIFT, 9, movetoworkspace, 9" "SUPER SHIFT, 9, movetoworkspace, 9"
# ============================================================================= # =============================================================================
# MEDIA I KONTROLKI SYSTEMOWE # MEDIA I KONTROLKI SYSTEMOWE
@@ -146,22 +149,35 @@ in {
",XF86MonBrightnessDown, exec, brightnessctl set 5%-" ",XF86MonBrightnessDown, exec, brightnessctl set 5%-"
",XF86MonBrightnessUp, 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 # NIEUŻYWANE KEYBINDY
# ============================================================================= # =============================================================================
# "$modifier SHIFT, N, exec, swaync-client -rs" # "SUPER SHIFT, N, exec, swaync-client -rs"
# "$modifier, P, pseudo," # "SUPER, P, pseudo,"
# "$modifier SHIFT,F, togglefloating," # "SUPER ALT,F, workspaceopt, allfloat"
# "$modifier ALT,F, workspaceopt, allfloat" # "SUPER SHIFT, SPACE, movetoworkspace, special"
# "$modifier SHIFT, SPACE, movetoworkspace, special" # "SUPER, SPACE, togglespecialworkspace"
# "$modifier, SPACE, togglespecialworkspace"
# "ALT,Tab,cyclenext" # "ALT,Tab,cyclenext"
# "ALT,Tab,bringactivetotop" # "ALT,Tab,bringactivetotop"
]; ];
bindm = [ bindm = [
"$modifier, mouse:272, movewindow" "SUPER, mouse:272, movewindow"
"$modifier, mouse:273, resizewindow" "SUPER, mouse:273, resizewindow"
]; ];
}; };
} }

View File

@@ -1,36 +1,32 @@
_: { _: {
wayland.windowManager.hyprland = { wayland.windowManager.hyprland.settings.env = [
settings = { "NIXOS_OZONE_WL, 1"
env = [ "NIXPKGS_ALLOW_UNFREE, 1"
"NIXOS_OZONE_WL, 1" "XDG_CURRENT_DESKTOP, Hyprland"
"NIXPKGS_ALLOW_UNFREE, 1" "XDG_SESSION_TYPE, wayland"
"XDG_CURRENT_DESKTOP, Hyprland" "XDG_SESSION_DESKTOP, Hyprland"
"XDG_SESSION_TYPE, wayland" "GDK_BACKEND, wayland, x11"
"XDG_SESSION_DESKTOP, Hyprland" "CLUTTER_BACKEND, wayland"
"GDK_BACKEND, wayland, x11" "QT_QPA_PLATFORM=wayland;xcb"
"CLUTTER_BACKEND, wayland" "QT_WAYLAND_DISABLE_WINDOWDECORATION, 1"
"QT_QPA_PLATFORM=wayland;xcb" "QT_AUTO_SCREEN_SCALE_FACTOR, 1"
"QT_WAYLAND_DISABLE_WINDOWDECORATION, 1" "SDL_VIDEODRIVER, x11"
"QT_AUTO_SCREEN_SCALE_FACTOR, 1" "MOZ_ENABLE_WAYLAND, 1"
"SDL_VIDEODRIVER, x11" # This is to make electron apps start in wayland
"MOZ_ENABLE_WAYLAND, 1" "ELECTRON_OZONE_PLATFORM_HINT,wayland"
# This is to make electron apps start in wayland # Disabling this by default as it can result in inop cfg
"ELECTRON_OZONE_PLATFORM_HINT,wayland" # Added card2 in case this gets enabled. For better coverage
# Disabling this by default as it can result in inop cfg # This is mostly needed by Hybrid laptops.
# Added card2 in case this gets enabled. For better coverage # but if you have multiple discrete GPUs this will set order
# This is mostly needed by Hybrid laptops. #"AQ_DRM_DEVICES,/dev/dri/card0:/dev/dri/card1:/dev/card2"
# but if you have multiple discrete GPUs this will set order "GDK_SCALE,1"
#"AQ_DRM_DEVICES,/dev/dri/card0:/dev/dri/card1:/dev/card2" "QT_SCALE_FACTOR,1"
"GDK_SCALE,1" "EDITOR,nano"
"QT_SCALE_FACTOR,1" # Set terminal and xdg_terminal_emulator to kitty
"EDITOR,nano" # To provent yazi from starting xterm when run from rofi menu
# Set terminal and xdg_terminal_emulator to kitty # You can set to your preferred terminal if you you like
# To provent yazi from starting xterm when run from rofi menu # ToDo: Pull default terminal from config
# You can set to your preferred terminal if you you like "TERMINAL,kitty"
# ToDo: Pull default terminal from config "XDG_TERMINAL_EMULATOR,kitty"
"TERMINAL,kitty" ];
"XDG_TERMINAL_EMULATOR,kitty"
];
};
};
} }

View File

@@ -4,21 +4,25 @@
stylixImage stylixImage
; ;
in { in {
wayland.windowManager.hyprland.settings = { wayland.windowManager.hyprland.settings.exec-once = [
exec-once = [ "wl-paste --type text --watch cliphist store" # Saves text
"wl-paste --type text --watch cliphist store" # Saves text "wl-paste --type image --watch cliphist store" # Saves images
"wl-paste --type image --watch cliphist store" # Saves images "dbus-update-activation-environment --all --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP"
"dbus-update-activation-environment --all --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP" "systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP"
"systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP" "systemctl --user start hyprpolkitagent"
"systemctl --user start hyprpolkitagent" "qs -c overview" # Start quickshell-overview daemon
"killall -q swww;sleep .5 && swww-daemon" # "killall -q swww;sleep .5 && swww-daemon"
"killall -q waybar;sleep .5 && waybar" # "killall -q waybar;sleep .5 && waybar"
"killall -q swaync;sleep .5 && swaync" # "killall -q swaync;sleep .5 && swaync"
"#wallsetter &" # "#wallsetter &"
"pypr &" # "pypr &"
"nm-applet --indicator" # "nm-applet --indicator"
"sleep 1.0 && swww img ${stylixImage}" # "sleep 1.0 && swww img ${stylixImage}"
]; "killall -q waybar"
}; "pkill waybar"
"killall -q swaync"
"pkill swaync"
"noctalia-shell &"
];
} }

View File

@@ -1,25 +1,23 @@
_: { _: {
services = { services.hypridle = {
hypridle = { enable = true;
enable = true; settings = {
settings = { general = {
general = { after_sleep_cmd = "hyprctl dispatch dpms on";
after_sleep_cmd = "hyprctl dispatch dpms on"; ignore_dbus_inhibit = false;
ignore_dbus_inhibit = false; lock_cmd = "hyprlock";
lock_cmd = "hyprlock";
};
listener = [
{
timeout = 900;
on-timeout = "hyprlock";
}
{
timeout = 1200;
on-timeout = "hyprctl dispatch dpms off";
on-resume = "hyprctl dispatch dpms on";
}
];
}; };
listener = [
{
timeout = 900;
on-timeout = "hyprlock";
}
{
timeout = 1200;
on-timeout = "hyprctl dispatch dpms off";
on-resume = "hyprctl dispatch dpms on";
}
];
}; };
}; };
} }

View File

@@ -26,9 +26,7 @@ in {
enableXdgAutostart = true; enableXdgAutostart = true;
variables = ["--all"]; variables = ["--all"];
}; };
xwayland = { xwayland.enable = true;
enable = true;
};
settings = { settings = {
input = { input = {
kb_layout = "${keyboardLayout}"; kb_layout = "${keyboardLayout}";
@@ -60,7 +58,6 @@ in {
}; };
general = { general = {
"$modifier" = "SUPER";
layout = "dwindle"; layout = "dwindle";
gaps_in = 6; gaps_in = 6;
gaps_out = 8; gaps_out = 8;
@@ -132,9 +129,7 @@ in {
direct_scanout = 0; direct_scanout = 0;
}; };
debug = { debug.full_cm_proto = true;
full_cm_proto = true;
};
master = { master = {
new_status = "master"; new_status = "master";
@@ -143,9 +138,7 @@ in {
}; };
# Ensure Xwayland windows render at integer scale; compositor scales them # Ensure Xwayland windows render at integer scale; compositor scales them
xwayland = { xwayland.force_zero_scaling = true;
force_zero_scaling = true;
};
}; };
extraConfig = " extraConfig = "

View File

@@ -1,101 +1,97 @@
_: { _: {
wayland.windowManager.hyprland = { wayland.windowManager.hyprland.settings.windowrule = [
settings = { # XWayland specific rules
windowrule = [ #"noblur, xwayland:1" # Helps prevent odd borders/shadows for xwayland apps
# XWayland specific rules # downside it can impact other xwayland apps
#"noblur, xwayland:1" # Helps prevent odd borders/shadows for xwayland apps # This rule is a template for a more targeted approach
# downside it can impact other xwayland apps "no_blur on, match:class resolve, match:xwayland 1" # Window rule for just resolve
# This rule is a template for a more targeted approach
"noblur, class:^(\bresolve\b)$, xwayland:1" # Window rule for just resolve
# Application tags # Application tags
"tag +file-manager, class:^([Tt]hunar|org.gnome.Nautilus|[Pp]cmanfm-qt)$" "tag +file-manager, match:class [Tt]hunar|org\.gnome\.Nautilus|[Pp]cmanfm-qt"
"tag +terminal, class:^(com.mitchellh.ghostty|org.wezfurlong.wezterm|Alacritty|kitty|kitty-dropterm)$" "tag +terminal, match:class com\.mitchellh\.ghostty|org\.wezfurlong\.wezterm|Alacritty|kitty|kitty-dropterm"
"tag +browser, class:^(Brave-browser(-beta|-dev|-unstable)?)$" "tag +browser, match:class [Ff]irefox|org\.mozilla\.firefox|[Ff]irefox-esr"
"tag +browser, class:^([Ff]irefox|org.mozilla.firefox|[Ff]irefox-esr)$" "tag +browser, match:class [Ll]ibrewolf|io\.gitlab\.librewolf-community"
"tag +browser, class:^([Gg]oogle-chrome(-beta|-dev|-unstable)?)$" "tag +browser, match:class [Gg]oogle-chrome(-beta|-dev|-unstable)?|[Cc]hromium-browser(-beta|-dev|-unstable)?"
"tag +browser, class:^([Tt]horium-browser|[Cc]achy-browser)$" "tag +projects, match:class VSCode|code|code-url-handler|codium|codium-url-handler|VSCodium|VSCodium-url-handler"
"tag +projects, class:^(codium|codium-url-handler|VSCodium)$" "tag +projects, match:class dev\.zed\.Zed"
"tag +projects, class:^(VSCode|code-url-handler)$" "tag +im, match:class [Dd]iscord|[Ww]ebCord|[Vv]esktop"
"tag +im, class:^([Dd]iscord|[Ww]ebCord|[Vv]esktop)$" "tag +im, match:class [Ff]erdium"
"tag +im, class:^([Ff]erdium)$" "tag +im, match:class [Ss]ignal"
"tag +im, class:^([Ww]hatsapp-for-linux)$" "tag +im, match:class [Ss]lack"
"tag +im, class:^(org.telegram.desktop|io.github.tdesktop_x64.TDesktop)$" "tag +im, match:class [Tt]eams-for-linux"
"tag +im, class:^(teams-for-linux)$" "tag +games, match:class gamescope"
"tag +games, class:^(gamescope)$" "tag +games, match:class ?:steam_app_\d+"
"tag +games, class:^(steam_app_\d+)$" "tag +games, match:class tf_linux64"
"tag +gamestore, class:^([Ss]team)$" "tag +games, match:class Minecraft\*.*"
"tag +gamestore, title:^([Ll]utris)$" "tag +gamestore, match:class [Ss]team"
"tag +gamestore, class:^(com.heroicgameslauncher.hgl)$" "tag +gamestore, match:title [Ll]utris"
"tag +settings, class:^(gnome-disks|wihotspot(-gui)?)$" "tag +gamestore, match:class com\.heroicgameslauncher\.hgl"
"tag +settings, class:^([Rr]ofi)$" "tag +gamestore, match:class org\.prismlauncher\.PrismLauncher"
"tag +settings, class:^(file-roller|org.gnome.FileRoller)$" "tag +settings, match:class gnome-disks|wihotspot(-gui)?"
"tag +settings, class:^(nm-applet|nm-connection-editor|blueman-manager)$" "tag +settings, match:class [Rr]ofi"
"tag +settings, class:^(pavucontrol|org.pulseaudio.pavucontrol|com.saivert.pwvucontrol)$" "tag +settings, match:class file-roller|org\.gnome\.FileRoller"
"tag +settings, class:^(nwg-look|qt5ct|qt6ct|[Yy]ad)$" "tag +settings, match:class nm-applet|nm-connection-editor|blueman-manager"
"tag +settings, class:(xdg-desktop-portal-gtk)" "tag +settings, match:class pavucontrol|org\.pulseaudio\.pavucontrol|com\.saivert\.pwvucontrol"
"tag +settings, class:(.blueman-manager-wrapped)" "tag +settings, match:class nwg-look|qt5ct|qt6ct|[Yy]ad"
"tag +settings, class:(nwg-displays)" "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 # Position and movement rules
"move 72% 7%,title:^(Picture-in-Picture)$" "move 72% 7%, match:title Picture-in-Picture"
"center, class:^([Ff]erdium)$" "center on, match:class pavucontrol|org\.pulseaudio\.pavucontrol|com\.saivert\.pwvucontrol"
"center, class:^(pavucontrol|org.pulseaudio.pavucontrol|com.saivert.pwvucontrol)$" "center on, match:class [Tt]hunar, match:title negative:.*[Tt]hunar.*"
"center, class:([Tt]hunar), title:negative:(.*[Tt]hunar.*)" "center on, match:title Authentication Required"
"center, title:^(Authentication Required)$"
# Idle inhibit rules # Idle inhibit rules
"idleinhibit fullscreen, class:^(*)$" "idle_inhibit fullscreen, match:class .*"
"idleinhibit fullscreen, title:^(*)$" "idle_inhibit fullscreen, match:title .*"
"idleinhibit fullscreen, fullscreen:1" "idle_inhibit fullscreen, match:fullscreen 1"
# Float rules # Float rules
"float, class:^([Ww]aypaper)$" "float on, match:class [Ww]aypaper"
"float, tag:settings*" "float on, match:tag settings*"
"float, class:^([Ff]erdium)$" "float on, match:title Picture-in-Picture"
"float, title:^(Picture-in-Picture)$" "float on, match:title Authentication Required"
"float, class:^(mpv)$" "float on, match:title War in Tunnels"
"float, title:^(Authentication Required)$" "float on, match:class codium|codium-url-handler|VSCodium, match:title negative:.*(?:codium|VSCodium).*"
"float, title:^(War in Tunnels)$" "float on, match:class com\.heroicgameslauncher\.hgl, match:title negative Heroic Games Launcher"
"float, class:(codium|codium-url-handler|VSCodium), title:negative:(.*codium.*|.*VSCodium.*)" "float on, match:class [Ss]team, match:title negative:[Ss]team"
"float, class:^(com.heroicgameslauncher.hgl)$, title:negative:(Heroic Games Launcher)" "float on, match:class [Tt]hunar, match:title negative:.*[Tt]hunar.*"
"float, class:^([Ss]team)$, title:negative:^([Ss]team)$" "float on, match:class galculator"
"float, class:([Tt]hunar), title:negative:(.*[Tt]hunar.*)" "float on, match:initial_title Add Folder to Workspace"
"float, class:^(galculator)$" "float on, match:initial_title Open Files"
"float, initialTitle:(Add Folder to Workspace)" "float on, match:initial_title wants to save"
"float, initialTitle:(Open Files)"
"float, initialTitle:(wants to save)"
# Size rules # Size rules
"size 70% 60%, initialTitle:(Open Files)" "size 70% 60%, match:initial_title Open Files"
"size 70% 60%, initialTitle:(Add Folder to Workspace)" "size 70% 60%, match:initial_title Add Folder to Workspace"
"size 70% 70%, tag:settings*" "size 70% 70%, match:tag settings*"
"size 60% 70%, class:^([Ff]erdium)$"
"size 70% 70%, class:^(mpv)$"
# Tile rules # Tile rules
"tile, class:^(affinity.exe)$" "tile on, match:class affinity\.exe"
"tile, class:^(dev.zed.Zed)$" "tile on, match:class dev\.zed\.Zed"
"tile on, match:class mpv"
"tile on, match:class com-cburch-logisim-Main"
# Opacity rules # Opacity rules
"opacity 1.0 1.0, tag:browser*" "opacity 1.0 1.0, match:tag browser*"
"opacity 0.9 0.8, tag:projects*" "opacity 0.9 0.8, match:tag projects*"
"opacity 0.94 0.86, tag:im*" "opacity 0.94 0.86, match:tag im*"
"opacity 0.9 0.8, tag:file-manager*" "opacity 0.85 0.75, match:tag gamestore*"
"opacity 0.8 0.7, tag:terminal*" "opacity 0.9 0.8, match:tag file-manager*"
"opacity 0.8 0.7, tag:settings*" "opacity 0.8 0.7, match:tag terminal*"
"opacity 0.8 0.7, class:^(gedit|org.gnome.TextEditor|mousepad)$" "opacity 0.8 0.7, match:tag settings*"
"opacity 0.9 0.8, class:^(seahorse)$ # gnome-keyring gui" "opacity 0.8 0.7, match:class gedit|org\.gnome\.TextEditor|mousepad"
"opacity 0.95 0.75, title:^(Picture-in-Picture)$" "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 # Picture-in-Picture specific rules
"pin, title:^(Picture-in-Picture)$" "pin on, match:title Picture-in-Picture"
"keepaspectratio, title:^(Picture-in-Picture)$" "keep_aspect_ratio on, match:title Picture-in-Picture"
# Games specific rules # Games specific rules
"noblur, tag:games*" "no_blur on, match:tag games*"
"fullscreen, tag:games*" "fullscreen on, match:tag games*"
]; ];
};
};
} }

View File

@@ -8,7 +8,7 @@
config.programs.librewolf = lib.mkIf config.librewolf.enable { config.programs.librewolf = lib.mkIf config.librewolf.enable {
enable = true; enable = true;
package = pkgs.librewolf-bin; package = pkgs.librewolf;
# nativeMessagingHosts = [pkgs.firefoxpwa]; # nativeMessagingHosts = [pkgs.firefoxpwa];
languagePacks = [ languagePacks = [
"pl" "pl"

View File

@@ -75,13 +75,7 @@
icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg"; icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg";
urls = [ urls = [
{ {
template = "https://search.nixos.org/options"; template = "https://search.nixos.org/options?channel=unstable&query={searchTerms}";
params = [
{
name = "query";
value = "{searchTerms}";
}
];
} }
]; ];
}; };

28
modules/home/noctalia.nix Normal file
View 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
View 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
'';
}

View 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.
![Quickshell](https://img.shields.io/badge/Quickshell-0.2.0-blue?style=flat-square)
![Hyprland](https://img.shields.io/badge/Hyprland-Compatible-purple?style=flat-square)
![Qt6](https://img.shields.io/badge/Qt-6-green?style=flat-square)
![License](https://img.shields.io/badge/License-GPL-orange?style=flat-square)
</div>
---
## 📸 Preview
![Overview Screenshot](assets/image.png)
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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

View 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
}
}

View 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
}
}
}

View 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);
}
}

View File

@@ -0,0 +1 @@
singleton ColorUtils 1.0 ColorUtils.qml

View 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

View File

@@ -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
}

View 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"
}

View 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
}
}

View File

@@ -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
}
}
}

View 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

View 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;
}
}
}

View 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)
}
}
}
}
}

View 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)
}
}
}
}
}

View File

@@ -0,0 +1,3 @@
Overview 1.0 Overview.qml
OverviewWidget 1.0 OverviewWidget.qml
OverviewWindow 1.0 OverviewWindow.qml

View 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
}

View 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);
}
}
}
}

View File

@@ -0,0 +1,2 @@
singleton HyprlandData 1.0 HyprlandData.qml
singleton GlobalStates 1.0 GlobalStates.qml

View 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 {}
}

View 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];
}

View 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}
'';
};
}

View File

@@ -30,5 +30,6 @@
inherit username; inherit username;
}) })
(import ./web-search.nix {inherit pkgs;}) (import ./web-search.nix {inherit pkgs;})
(import ./restart.noctalia.nix {inherit pkgs;})
]; ];
} }

View File

@@ -14,13 +14,13 @@ in
msg=' = Windows/Super/CAPS LOCK (Enter nie wykonuje skrótu)' msg=' = Windows/Super/CAPS LOCK (Enter nie wykonuje skrótu)'
keybinds=$(cat ~/.config/hypr/hyprland.conf | grep -E '^bind') keybinds=$(cat ~/.config/hypr/hyprland.conf | grep -E '^bind')
# replace $modifier with SUPER and clean up paths # replace SUPER with SUPER and clean up paths
display_keybinds=$(echo "$keybinds" | sed 's/\$modifier//g' | sed 's|${desktopEntriesPath}/||g') display_keybinds=$(echo "$keybinds" | sed 's/\SUPER//g' | sed 's|${desktopEntriesPath}/||g')
# remove "bind=" and "bindm=" prefixes # remove "bind=" and "bindm=" prefixes
display_keybinds=$(echo "$display_keybinds" | sed 's/^bind=//' | sed 's/^bindm=/🖱/') 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') 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 -> " ->" # replace commas: first comma -> " +", second comma -> " =", remaining commas -> " ->"

View 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

View 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" "$@"
''

View File

@@ -1,11 +1,17 @@
_: { {username, ...}: {
programs.ssh = { programs.ssh = {
enable = true; enable = true;
enableDefaultConfig = false; enableDefaultConfig = false;
matchBlocks = { matchBlocks = {
"hp-t640-homeserver" = { "hp-t640-homeserver" = {
hostname = "192.168.1.156"; 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; port = 22;
identityFile = "~/.ssh/hp-t640-homeserver"; identityFile = "~/.ssh/hp-t640-homeserver";
}; };

View File

@@ -12,5 +12,6 @@
enable = true; enable = true;
platform = "qtct"; platform = "qtct";
}; };
noctalia-shell.enable = true;
}; };
} }

View File

@@ -3,6 +3,7 @@ _: {
enable = true; enable = true;
mime.enable = true; mime.enable = true;
mimeApps.enable = true; mimeApps.enable = true;
configFile."mimeapps.list".force = true;
}; };
imports = [ imports = [

View File

@@ -1,4 +1,9 @@
{pkgs, ...}: let {
pkgs,
lib,
config,
...
}: let
fetchIcon = url: sha256: fetchIcon = url: sha256:
pkgs.fetchurl { pkgs.fetchurl {
inherit url sha256; inherit url sha256;
@@ -57,18 +62,37 @@
iconUrl = "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/glance.png"; iconUrl = "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/glance.png";
iconSha = "sha256-xyFlmPpt+DABoGX5oBqj/aQVdxtmNflat9Jb2BE7SOY="; 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 { in {
xdg.desktopEntries = builtins.listToAttrs (builtins.map (app: { options.xdgDesktopEntries = {
name = app.name; enable = lib.mkEnableOption "PWA Apps";
value = makeEntry app; entries = builtins.listToAttrs (
}) map (app: {
apps); 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;
}
]
else []
)
apps
)
);
} }

View File

@@ -6,13 +6,13 @@
}: { }: {
options.zed-editor = { options.zed-editor = {
enable = lib.mkEnableOption "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 { config.programs.zed-editor = lib.mkIf config.zed-editor.enable {
enable = true; enable = true;
package = pkgs.zed-editor; package = pkgs.zed-editor;
installRemoteServer = lib.mkIf config.zed-editor.remote-server true; installRemoteServer = lib.mkIf config.zed-editor.remote-server.enable true;
}; };
imports = [ imports = [

View File

@@ -1,6 +1,6 @@
{pkgs, ...}: { {pkgs, ...}: {
programs.zed-editor.extraPackages = with pkgs; [ programs.zed-editor.extraPackages = with pkgs; [
biome # biome
rust-analyzer rust-analyzer
nixd nixd
alejandra alejandra

View File

@@ -62,5 +62,9 @@ _: {
}; };
tab_size = 2; tab_size = 2;
}; };
"C++" = {
format_on_save = "on";
tab_size = 2;
};
}; };
} }

View File

@@ -6,6 +6,15 @@
... ...
}: { }: {
programs.zed-editor.userSettings.lsp = { 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 = { rust-analyzer = {
binary = { binary = {
path = lib.getExe pkgs.bash; 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 = { nixd = {
initialization_options.formatting.command = [ initialization_options.formatting.command = [
"alejandra" "alejandra"