2022-10-19 15:22:42 +02:00
|
|
|
# Hyprland with Nix
|
|
|
|
|
2022-08-13 19:06:18 +02:00
|
|
|
## Table of contents
|
2022-10-19 15:22:42 +02:00
|
|
|
|
2022-08-13 19:06:18 +02:00
|
|
|
{{< toc format=html >}}
|
|
|
|
|
2022-08-29 18:32:20 +02:00
|
|
|
{{< hint type=warning >}}
|
|
|
|
Hyprland is NOT supported on NixOS stable. It may (not) compile or
|
2022-08-13 19:06:18 +02:00
|
|
|
work as intended. Please use the
|
|
|
|
[flake](https://github.com/hyprwm/Hyprland/blob/main/flake.nix).
|
2022-08-29 18:32:20 +02:00
|
|
|
{{< /hint >}}
|
2022-08-12 20:46:36 +02:00
|
|
|
|
2022-08-13 19:06:18 +02:00
|
|
|
## Install and configure Hyprland on NixOS
|
2022-08-12 20:46:36 +02:00
|
|
|
|
|
|
|
Make sure to check out the options of the
|
|
|
|
[Nix module](https://github.com/hyprwm/Hyprland/blob/main/nix/module.nix).
|
|
|
|
|
2022-10-20 18:09:25 +02:00
|
|
|
Do note that the Nixpkgs Hyprland package is not actively maintained, and may be outdated
|
2022-10-19 15:22:42 +02:00
|
|
|
Installation using the Flake is recommended.
|
|
|
|
|
2022-08-12 20:46:36 +02:00
|
|
|
### With flakes
|
|
|
|
|
|
|
|
```nix
|
|
|
|
# flake.nix
|
|
|
|
{
|
|
|
|
inputs = {
|
|
|
|
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
|
|
|
hyprland = {
|
|
|
|
url = "github:hyprwm/Hyprland";
|
|
|
|
# build with your own instance of nixpkgs
|
|
|
|
inputs.nixpkgs.follows = "nixpkgs";
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
outputs = { self, nixpkgs, hyprland }: {
|
|
|
|
nixosConfigurations.HOSTNAME = nixpkgs.lib.nixosSystem {
|
|
|
|
# ...
|
|
|
|
modules = [
|
2022-10-19 15:22:42 +02:00
|
|
|
hyprland.nixosModules.default
|
2022-08-12 20:46:36 +02:00
|
|
|
{ programs.hyprland.enable = true; }
|
|
|
|
# ...
|
|
|
|
];
|
|
|
|
};
|
|
|
|
};
|
|
|
|
```
|
|
|
|
|
|
|
|
Don't forget to replace `HOSTNAME` with your hostname!
|
|
|
|
|
|
|
|
### Without flakes
|
|
|
|
|
2022-08-13 19:06:18 +02:00
|
|
|
{{< hint >}}
|
|
|
|
If you're using Hyprland through an overlay, set
|
2022-08-12 20:46:36 +02:00
|
|
|
`programs.hyprland.package = pkgs.hyprland;`.
|
2022-08-13 19:06:18 +02:00
|
|
|
{{< /hint >}}
|
2022-08-12 20:46:36 +02:00
|
|
|
|
|
|
|
```nix
|
|
|
|
# configuration.nix
|
|
|
|
{config, pkgs, ...}: let
|
|
|
|
flake-compat = builtins.fetchTarball "https://github.com/edolstra/flake-compat/archive/master.tar.gz";
|
|
|
|
hyprland = (import flake-compat {
|
|
|
|
src = builtins.fetchTarball "https://github.com/hyprwm/Hyprland/archive/master.tar.gz";
|
|
|
|
}).defaultNix;
|
|
|
|
in {
|
|
|
|
imports = [
|
|
|
|
hyprland.nixosModules.default
|
|
|
|
];
|
2022-10-19 15:22:42 +02:00
|
|
|
|
2022-08-12 20:46:36 +02:00
|
|
|
programs.hyprland = {
|
|
|
|
enable = true;
|
2022-08-13 19:06:18 +02:00
|
|
|
package = hyprland.packages.${pkgs.system}.default;
|
2022-08-12 20:46:36 +02:00
|
|
|
};
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
2022-08-13 19:06:18 +02:00
|
|
|
## Install and configure through Home Manager
|
2022-08-12 20:46:36 +02:00
|
|
|
|
|
|
|
You can use the Home Manager module by adding it to your configuration:
|
|
|
|
|
2022-09-09 16:53:49 +02:00
|
|
|
### With flakes
|
|
|
|
|
2022-08-12 20:46:36 +02:00
|
|
|
```nix
|
2022-09-09 16:53:49 +02:00
|
|
|
# flake.nix
|
|
|
|
{
|
|
|
|
inputs = {
|
|
|
|
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
|
|
|
home-manager = {
|
|
|
|
url = "github:nix-community/home-manager";
|
|
|
|
inputs.nixpkgs.follows = "nixpkgs";
|
|
|
|
};
|
|
|
|
hyprland = {
|
|
|
|
url = "github:hyprwm/Hyprland";
|
|
|
|
# build with your own instance of nixpkgs
|
|
|
|
inputs.nixpkgs.follows = "nixpkgs";
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
outputs = { self, nixpkgs, home-manager, hyprland }: {
|
|
|
|
homeConfigurations."USER@HOSTNAME"= home-manager.lib.homeManagerConfiguration {
|
|
|
|
pkgs = nixpkgs.legacyPackages.x86_64-linux;
|
|
|
|
modules = [
|
2022-10-19 15:22:42 +02:00
|
|
|
hyprland.homeManagerModules.default
|
2022-09-09 16:53:49 +02:00
|
|
|
{ wayland.windowManager.hyprland.enable = true; }
|
|
|
|
# ...
|
|
|
|
];
|
|
|
|
};
|
|
|
|
};
|
|
|
|
```
|
|
|
|
|
|
|
|
Don't forget to replace `USER@HOSTNAME` with your username and hostname!
|
|
|
|
|
|
|
|
### Without flakes
|
|
|
|
|
|
|
|
```nix
|
|
|
|
# home config
|
|
|
|
{ config, pkgs, inputs, ... }: let
|
|
|
|
flake-compat = builtins.fetchTarball "https://github.com/edolstra/flake-compat/archive/master.tar.gz";
|
|
|
|
hyprland = (import flake-compat {
|
|
|
|
src = builtins.fetchTarball "https://github.com/hyprwm/Hyprland/archive/master.tar.gz";
|
|
|
|
}).defaultNix;
|
|
|
|
in {
|
2022-08-12 20:46:36 +02:00
|
|
|
imports = [
|
2022-09-09 16:53:49 +02:00
|
|
|
hyprland.homeManagerModules.default
|
2022-08-12 20:46:36 +02:00
|
|
|
];
|
|
|
|
|
|
|
|
wayland.windowManager.hyprland.enable = true;
|
|
|
|
# ...
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
For a list of available options, check the
|
|
|
|
[module file](https://github.com/hyprwm/Hyprland/blob/main/nix/hm-module.nix).
|
|
|
|
|
|
|
|
## Modules mix'n'match
|
|
|
|
|
2022-08-13 19:06:18 +02:00
|
|
|
- If you plan on using the HM module alongside the NixOS module, set the NixOS
|
2022-10-19 15:22:42 +02:00
|
|
|
`programs.hyprland.package = null;`.
|
2022-08-12 20:46:36 +02:00
|
|
|
|
2022-08-13 19:06:18 +02:00
|
|
|
- If you don't plan on using the NixOS module, but want to use the HM module, you
|
2022-10-19 15:22:42 +02:00
|
|
|
will have to enable all the options the NixOS module enables.
|
2022-08-12 20:46:36 +02:00
|
|
|
|
2022-08-13 19:06:18 +02:00
|
|
|
- If you don't plan on using any module, manually enable whatever options the
|
2022-10-19 15:22:42 +02:00
|
|
|
modules set.
|
2022-08-12 20:46:36 +02:00
|
|
|
|
2022-08-13 19:06:18 +02:00
|
|
|
## Non-NixOS install
|
|
|
|
|
2022-08-26 19:04:30 +02:00
|
|
|
### With flakes
|
|
|
|
|
|
|
|
First, [enable flakes](https://nixos.wiki/wiki/Flakes#Enable_flakes).
|
|
|
|
|
|
|
|
Once you have flakes working, install Hyprland through `nix profile`:
|
|
|
|
|
|
|
|
```sh
|
2022-10-19 15:22:42 +02:00
|
|
|
nix profile install github:hyprwm/Hyprland
|
2022-08-26 19:04:30 +02:00
|
|
|
```
|
|
|
|
|
|
|
|
Since you're using Hyprland outside of NixOS, it won't be able to find graphics
|
|
|
|
drivers. To get around that, you can use [nixGL](https://github.com/guibou/nixGL).
|
|
|
|
|
|
|
|
First, install it, in the same manner you installed Hyprland:
|
2022-10-19 15:22:42 +02:00
|
|
|
|
2022-08-26 19:04:30 +02:00
|
|
|
```sh
|
2022-10-19 15:22:42 +02:00
|
|
|
nix profile install github:guibou/nixGL --impure
|
2022-08-26 19:04:30 +02:00
|
|
|
```
|
2022-10-19 15:22:42 +02:00
|
|
|
|
2022-09-02 14:41:56 +02:00
|
|
|
Impure is needed due to `nixGL`'s reliance on hardware information.
|
2022-08-26 19:04:30 +02:00
|
|
|
|
|
|
|
From now on, you can run Hyprland by invoking it with nixGL
|
2022-10-19 15:22:42 +02:00
|
|
|
|
2022-08-26 19:04:30 +02:00
|
|
|
```sh
|
2022-10-19 15:22:42 +02:00
|
|
|
nixGL Hyprland
|
2022-08-26 19:04:30 +02:00
|
|
|
```
|
2022-10-19 15:22:42 +02:00
|
|
|
|
2022-08-26 19:04:30 +02:00
|
|
|
or by creating a wrapper script that runs the above command inside.
|
|
|
|
|
|
|
|
### Upgrading
|
|
|
|
|
2022-08-26 19:10:44 +02:00
|
|
|
In order to upgrade all your packages, you can run
|
2022-10-19 15:22:42 +02:00
|
|
|
|
2022-08-26 19:04:30 +02:00
|
|
|
```sh
|
2022-10-19 15:22:42 +02:00
|
|
|
nix profile upgrade '.*'
|
2022-08-26 19:04:30 +02:00
|
|
|
```
|
2022-10-19 15:22:42 +02:00
|
|
|
|
2022-08-26 19:04:30 +02:00
|
|
|
Check the
|
|
|
|
[nix profile](https://nixos.org/manual/nix/stable/command-ref/new-cli/nix3-profile.html)
|
|
|
|
command documentation for other upgrade options.
|
2022-08-13 19:06:18 +02:00
|
|
|
|
2022-08-29 18:32:20 +02:00
|
|
|
## XWayland
|
|
|
|
|
|
|
|
XWayland is enabled by default in the Nix package. You can disable it either
|
|
|
|
in the package itself, or through the Home Manager module.
|
|
|
|
|
2022-10-19 15:22:42 +02:00
|
|
|
### Package
|
2022-08-29 18:32:20 +02:00
|
|
|
|
|
|
|
```nix
|
|
|
|
(inputs.hyprland.packages.${pkgs.default}.default.override {
|
|
|
|
enableXWayland = false;
|
|
|
|
})
|
|
|
|
```
|
|
|
|
|
|
|
|
#### HM module
|
|
|
|
|
|
|
|
```nix
|
|
|
|
wayland.windowManager.hyprland = {
|
|
|
|
enable = true;
|
|
|
|
xwayland.enable = false;
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
### HiDPI
|
|
|
|
|
|
|
|
By default, the Nix package includes a patched wlroots that can render HiDPI
|
|
|
|
XWayland windows.
|
|
|
|
|
|
|
|
In order to enable the functionality, you have to add:
|
|
|
|
|
|
|
|
```toml
|
|
|
|
exec-once=xprop -root -f _XWAYLAND_GLOBAL_OUTPUT_SCALE 32c -set _XWAYLAND_GLOBAL_OUTPUT_SCALE 2
|
|
|
|
```
|
|
|
|
|
|
|
|
This will make XWL programs look as if they were unscaled. To fix this, you
|
|
|
|
have to export different environment variables to make the specific toolkits
|
|
|
|
render at the proper scaling. For example
|
|
|
|
|
|
|
|
```sh
|
|
|
|
export GDK_SCALE=2
|
|
|
|
export XCURSOR_SIZE=32
|
|
|
|
```
|
|
|
|
|
|
|
|
{{< hint >}}
|
|
|
|
The GDK_SCALE variable won't conflict with wayland-native GTK programs.
|
|
|
|
{{< /hint >}}
|
|
|
|
|
|
|
|
Usually, there's no reason to disable this functionality, as it won't affect
|
|
|
|
people who don't have HiDPI screens.
|
|
|
|
|
2022-10-19 15:22:42 +02:00
|
|
|
If you _do_ insist on disabling it though (e.g. for adding your own patches
|
2022-08-29 18:32:20 +02:00
|
|
|
to wlroots), you can do so by either using the `hyprland-no-hidpi` package,
|
|
|
|
or by passing the `hidpiXWayland = false;` flag, the same way as
|
|
|
|
[disabling XWayland](#package)
|
|
|
|
|
2022-08-12 20:46:36 +02:00
|
|
|
## Cachix
|
|
|
|
|
2022-08-13 19:06:18 +02:00
|
|
|
A [Hyprland Cachix](https://app.cachix.org/cache/hyprland) exists to cache the
|
2022-08-13 01:47:48 +02:00
|
|
|
`wlroots` package and speed up builds.
|
2022-08-12 20:46:36 +02:00
|
|
|
|
2022-08-13 19:06:18 +02:00
|
|
|
In case you don't plan on changing the Nixpkgs input of Hyprland, you can use
|
|
|
|
this cache to download the binary directly, instead of building locally.
|
2022-08-12 20:46:36 +02:00
|
|
|
|
|
|
|
```nix
|
|
|
|
# configuration.nix
|
|
|
|
{
|
|
|
|
nix.settings = {
|
|
|
|
substituters = ["https://hyprland.cachix.org"];
|
|
|
|
trusted-public-keys = ["hyprland.cachix.org-1:a7pgxzMz7+chwVL3/pzj6jIBMioiJM7ypFP8PwtkuGc="];
|
|
|
|
};
|
|
|
|
}
|
|
|
|
```
|
2022-09-02 14:41:56 +02:00
|
|
|
|
|
|
|
## Overrides
|
|
|
|
|
|
|
|
You can override the package through `.override` or `.overrideAttrs`. This is
|
|
|
|
easily achievable through NixOS or Home Manager.
|
|
|
|
|
|
|
|
If you're using Nix (and not NixOS or Home Manager) and you want to override,
|
|
|
|
you can do it like this
|
|
|
|
|
|
|
|
```sh
|
|
|
|
$ nix repl
|
|
|
|
nix-repl> :lf "github:hyprwm/Hyprland"
|
|
|
|
nix-repl> :bl outputs.packages.x86_64-linux.hyprland.override { nvidiaPatches = true; } # option = value
|
|
|
|
```
|
|
|
|
|
|
|
|
Then you can run Hyprland from the built path.
|