Repository: colemickens/nixpkgs-wayland
Branch: dev
Commit: 0f2e1c75ea21
Files: 87
Total size: 82.3 KB
Directory structure:
gitextract_knidfuyg/
├── .envrc
├── .git-blame-ignore-revs
├── .github/
│ ├── dependabot.yml
│ ├── init
│ └── workflows/
│ ├── advance.yaml
│ ├── build.yaml
│ ├── check.yaml
│ └── update.yaml
├── .gitignore
├── README.md
├── default.nix
├── demo/
│ ├── README.md
│ ├── configuration.nix
│ ├── flake.nix
│ ├── home/
│ │ ├── profile.nix
│ │ └── sway-config
│ ├── legacy/
│ │ └── default.nix
│ ├── profile.nix
│ ├── vm-build.sh
│ └── vm-run.sh
├── flake.nix
├── main.nu
├── overlay.nix
├── packages.nix
├── pkgs/
│ ├── aml/
│ │ └── metadata.nix
│ ├── cage/
│ │ └── metadata.nix
│ ├── drm_info/
│ │ └── metadata.nix
│ ├── dunst/
│ │ └── metadata.nix
│ ├── eww/
│ │ └── metadata.nix
│ ├── foot/
│ │ ├── default.nix
│ │ └── metadata.nix
│ ├── freerdp3/
│ │ ├── default.nix
│ │ └── metadata.nix
│ ├── gebaar-libinput/
│ │ └── metadata.nix
│ ├── glpaper/
│ │ └── metadata.nix
│ ├── grim/
│ │ └── metadata.nix
│ ├── gtk-layer-shell/
│ │ └── metadata.nix
│ ├── i3status-rust/
│ │ └── metadata.nix
│ ├── imv/
│ │ └── metadata.nix
│ ├── kanshi/
│ │ └── metadata.nix
│ ├── lavalauncher/
│ │ └── metadata.nix
│ ├── libvncserver_master/
│ │ ├── metadata.nix
│ │ └── pkgconfig.patch
│ ├── mako/
│ │ └── metadata.nix
│ ├── neatvnc/
│ │ └── metadata.nix
│ ├── new-wayland-protocols/
│ │ └── metadata.nix
│ ├── obs-wlrobs/
│ │ └── metadata.nix
│ ├── rootbar/
│ │ └── metadata.nix
│ ├── salut/
│ │ ├── default.nix
│ │ └── metadata.nix
│ ├── shotman/
│ │ └── metadata.nix
│ ├── sirula/
│ │ └── metadata.nix
│ ├── slurp/
│ │ └── metadata.nix
│ ├── sway-unwrapped/
│ │ └── metadata.nix
│ ├── swaybg/
│ │ └── metadata.nix
│ ├── swayidle/
│ │ └── metadata.nix
│ ├── swaylock/
│ │ └── metadata.nix
│ ├── swaylock-effects/
│ │ └── metadata.nix
│ ├── swww/
│ │ └── metadata.nix
│ ├── waybar/
│ │ └── metadata.nix
│ ├── waypipe/
│ │ └── metadata.nix
│ ├── wayvnc/
│ │ └── metadata.nix
│ ├── wbg/
│ │ └── metadata.nix
│ ├── wdisplays/
│ │ └── metadata.nix
│ ├── wev/
│ │ └── metadata.nix
│ ├── wf-recorder/
│ │ └── metadata.nix
│ ├── wl-clipboard/
│ │ └── metadata.nix
│ ├── wl-gammarelay-rs/
│ │ ├── default.nix
│ │ └── metadata.nix
│ ├── wl-screenrec/
│ │ └── metadata.nix
│ ├── wlay/
│ │ └── metadata.nix
│ ├── wldash/
│ │ ├── default.nix
│ │ └── metadata.nix
│ ├── wlogout/
│ │ └── metadata.nix
│ ├── wlr-randr/
│ │ └── metadata.nix
│ ├── wlroots/
│ │ ├── default.nix
│ │ └── metadata.nix
│ ├── wlsunset/
│ │ └── metadata.nix
│ ├── wlvncc/
│ │ ├── default.nix
│ │ └── metadata.nix
│ ├── wob/
│ │ └── metadata.nix
│ ├── wofi/
│ │ └── metadata.nix
│ ├── wshowkeys/
│ │ └── metadata.nix
│ ├── wtype/
│ │ └── metadata.nix
│ └── xdg-desktop-portal-wlr/
│ └── metadata.nix
├── shell.nix
└── templates/
└── template.nix
================================================
FILE CONTENTS
================================================
================================================
FILE: .envrc
================================================
use flake
================================================
FILE: .git-blame-ignore-revs
================================================
# format with `nixfmt-rfc-style`
1030752c7fa96902b95212d522f7ea0fe7859b95
================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
================================================
FILE: .github/init
================================================
#!/usr/bin/env bash
set -euo pipefail
git config --global user.name 'Cole Botkens'
git config --global user.email 'cole.mickens+colebot@gmail.com'
git remote update
================================================
FILE: .github/workflows/advance.yaml
================================================
name: "Advance"
concurrency: update-advance
on:
schedule:
- cron: '13 */6 * * *'
workflow_dispatch:
workflow_call:
jobs:
advance:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: setup-nix
uses: DeterminateSystems/nix-installer-action@main
with:
extra-conf: |
accept-flake-config = true
- name: prepare
run: nix develop -c .github/init
- name: advance
env:
CACHIX_SIGNING_KEY_NIXPKGS_WAYLAND: "${{ secrets.cachix_signing_key_nixpkgs_wayland }}"
run: nix develop -c ./main.nu advance
================================================
FILE: .github/workflows/build.yaml
================================================
name: "Build"
on:
push:
branches:
- master
schedule:
- cron: '17 */14 * * *'
workflow_dispatch:
workflow_call:
jobs:
build:
runs-on: ubuntu-latest
concurrency: build-${{matrix.jobs.branch}}-${{matrix.jobs.target}}
steps:
- uses: actions/checkout@v4
- name: setup-nix
uses: DeterminateSystems/nix-installer-action@main
with:
extra-conf: |
accept-flake-config = true
- name: prepare
run: nix develop -c .github/init
- name: build
env:
CACHIX_SIGNING_KEY_NIXPKGS_WAYLAND: "${{ secrets.cachix_signing_key_nixpkgs_wayland }}"
run: nix develop -c ./main.nu build
================================================
FILE: .github/workflows/check.yaml
================================================
name: "Check"
on:
push:
branches:
- master
schedule:
- cron: '17 */14 * * *'
pull_request:
workflow_dispatch:
workflow_call:
jobs:
check:
runs-on: ubuntu-latest
concurrency: build-${{matrix.jobs.branch}}-${{matrix.jobs.target}}
steps:
- uses: actions/checkout@v4
- name: setup-nix
uses: DeterminateSystems/nix-installer-action@main
with:
extra-conf: |
accept-flake-config = true
- name: prepare
run: nix develop -c .github/init
- name: check
run: nix develop -c ./main.nu check
- name: success
run: echo "we made it, yay"
================================================
FILE: .github/workflows/update.yaml
================================================
name: "Update"
concurrency: update-advance
on:
schedule:
- cron: '38 */12 * * *'
workflow_dispatch:
workflow_call:
jobs:
update:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: setup-nix
uses: DeterminateSystems/nix-installer-action@main
with:
extra-conf: |
accept-flake-config = true
- name: prepare
run: nix develop -c .github/init
- name: update
env:
CACHIX_SIGNING_KEY_NIXPKGS_WAYLAND: "${{ secrets.cachix_signing_key_nixpkgs_wayland }}"
run: nix develop -c ./main.nu update
================================================
FILE: .gitignore
================================================
.ci/commit-message
.direnv
*.qcow2
result
result-*
================================================
FILE: README.md
================================================
# nixpkgs-wayland
[](https://github.com/nix-community/nixpkgs-wayland/actions/workflows/build.yaml)
[](https://github.com/nix-community/nixpkgs-wayland/actions/workflows/update.yaml)
[](https://github.com/nix-community/nixpkgs-wayland/actions/workflows/advance.yaml)
## overview
Automated, pre-built, (potentially) pre-release packages for Wayland (sway/wlroots) tools for NixOS (**nixos-unstable** channel).
These packages are auto-updated to the latest version available from their upstream source control. This means this overlay and package
set will often contain **unreleased** versions.
Community chat is on Matrix: [#nixpkgs-wayland:matrix.org](https://matrix.to/#/#nixpkgs-wayland:matrix.org). We are not on Libera.
Started by: [**@colemickens**](https://github.com/colemickens)
and co-maintained by [**@Artturin**](https://github.com/Artturin) (🙏).
- [overview](#overview)
- [Usage](#usage)
- [Binary Cache](#binary-cache)
- [Continuous Integration](#continuous-integration)
- [Flake Usage](#flake-usage)
- [Install for NixOS (non-flakes, manual import)](#install-for-nixos-non-flakes-manual-import)
- [Install for non-NixOS users](#install-for-non-nixos-users)
- [Packages](#packages)
- [Tips](#tips)
- [General](#general)
- [`sway`](#sway)
- [Nvidia Users](#nvidia-users)
- [Development Guide](#development-guide)
## Usage
### Binary Cache
The [Cachix landing page for `nixpkgs-wayland`](https://nixpkgs-wayland.cachix.org) shows how to utilize the binary cache.
Packages from this overlay are regularly built against `nixos-unstable` and pushed to this cache.
### Continuous Integration
We have multiple CI jobs:
1. Update - this tries to advance nixpkgs and upgrade all packages. If it can successfully build them, the updates are push to master.
2. Advance - this tries to advance nixpkgs without touching the packages. This can help show when nixpkgs upgrades via `nixos-unstable` has advanced
into a state where we are broken building against it.
3. Build - this just proves that `master` was working against `nixos-unstable` at the point in time captured by whatever is in `flake.lock` on `master`.
We don't have CI on Pull Requests, but I keep an eye on it after merging external contributions.
### Flake Usage
- Build and run [the Wayland-fixed up](https://github.com/obsproject/obs-studio/pull/2484) version of [OBS-Studio](https://obsproject.com/):
```
nix shell "github:nix-community/nixpkgs-wayland#obs-studio" --command obs
```
- Build and run `waybar`:
```
nix run "github:nix-community/nixpkgs-wayland#waybar"
```
* Use as an overlay or package set via flakes:
```nix
{
inputs = {
nixpkgs-wayland.url = "github:nix-community/nixpkgs-wayland";
# only needed if you use as a package set:
nixpkgs-wayland.inputs.nixpkgs.follows = "nixpkgs";
};
outputs = inputs: {
nixosConfigurations."my-laptop-hostname" =
let system = "x86_64-linux";
in nixpkgs.lib.nixosSystem {
inherit system;
modules = [({pkgs, config, ... }: {
config = {
nix.settings = {
# add binary caches
trusted-public-keys = [
"cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY="
"nixpkgs-wayland.cachix.org-1:3lwxaILxMRkVhehr5StQprHdEo4IrE8sRho9R9HOLYA="
];
substituters = [
"https://cache.nixos.org"
"https://nixpkgs-wayland.cachix.org"
];
};
# use it as an overlay
nixpkgs.overlays = [ inputs.nixpkgs-wayland.overlay ];
# or, pull specific packages (built against inputs.nixpkgs, usually `nixos-unstable`)
environment.systemPackages = [
inputs.nixpkgs-wayland.packages.${system}.waybar
];
};
})];
};
};
}
```
### Install for NixOS (non-flakes, manual import)
If you are not using Flakes, then consult the [NixOS Wiki page on Overlays](https://nixos.wiki/wiki/Overlays). Also, you can expand this section for a more literal, direct example. If you do pin, use a tool like `niv` to do the pinning so that you don't forget and wind up stuck on an old version.
```nix
{ config, lib, pkgs, ... }:
let
rev = "master"; # 'rev' could be a git rev, to pin the overlay.
url = "https://github.com/nix-community/nixpkgs-wayland/archive/${rev}.tar.gz";
waylandOverlay = (import "${builtins.fetchTarball url}/overlay.nix");
in
{
nixpkgs.overlays = [ waylandOverlay ];
environment.systemPackages = with pkgs; [ wayvnc ];
# ...
}
```
You could write that to a file `./wayland.nix` next to your `configuration.nix` and then use it like so:
```nix
{ config, lib, pkgs, ... }:
{
# ...
imports = [
# ...
./wayland.nix
];
}
```
### Install for non-NixOS users
Non-NixOS users have many options, but here are two explicitly:
1. Activate flakes mode, then just run them outright like the first example in this README.
2. See the following details block for an example of how to add `nixpkgs-wayland` as a user-level
overlay and then install a package with `nix-env`.
1. There are two ways to activate an overlay for just your user:
1. Add a new entry in ``~/.config/nixpkgs/overlays.nix`:
```nix
let
url = "https://github.com/nix-community/nixpkgs-wayland/archive/master.tar.gz";
in
[
(import "${builtins.fetchTarball url}/overlay.nix")
]
```
2. Add a new file under a dir, `~/.config/nixpkgs/overlays/nixpkgs-wayland.nix`:
```nix
let
url = "https://github.com/nix-community/nixpkgs-wayland/archive/master.tar.gz";
in
(import "${builtins.fetchTarball url}/overlay.nix")
```
Note, this method does not pin `nixpkgs-wayland`. That's left to the reader. (Just use flakes...)
2. Then, `nix-env` will have access to the packages:
```nix
nix-env -iA neatvnc
```
## Packages
| Package | Description |
| --- | --- |
| [aml](https://github.com/any1/aml) | Another main loop |
| [cage](https://github.com/Hjdskes/cage) | Wayland kiosk that runs a single, maximized application |
| [drm_info](https://github.com/ascent12/drm_info) | Small utility to dump info about DRM devices |
| [dunst](https://github.com/dunst-project/dunst) | Lightweight and customizable notification daemon |
| [eww](https://github.com/elkowar/eww) | Widget system made in Rust to create widgets for any WM |
| [foot](https://codeberg.org/dnkl/foot/) | Fast, lightweight and minimalistic Wayland terminal emulator |
| [freerdp3](https://www.freerdp.com/) | A Remote Desktop Protocol Client |
| [gebaar-libinput](https://github.com/Osleg/gebaar-libinput-fork) | Gebaar, A Super Simple WM Independent Touchpad Gesture Daemon for libinput |
| [glpaper](https://hg.sr.ht/~scoopta/glpaper) | Wallpaper program for wlroots based Wayland compositors such as sway that allows you to render glsl shaders as your wallpaper |
| [grim](https://github.com/emersion/grim) | Grab images from a Wayland compositor |
| [gtk-layer-shell](https://github.com/wmww/gtk-layer-shell) | Library to create panels and other desktop components for Wayland using the Layer Shell protocol |
| [i3status-rust](https://github.com/greshake/i3status-rust) | Very resource-friendly and feature-rich replacement for i3status |
| [imv](https://git.sr.ht/~exec64/imv) | Command line image viewer for tiling window managers |
| [kanshi](https://git.sr.ht/~emersion/kanshi) | Dynamic display configuration tool |
| [lavalauncher](https://git.sr.ht/~leon_plickat/lavalauncher) | Simple launcher panel for Wayland desktops |
| [libvncserver_master](https://github.com/LibVNC/libvncserver) | VNC server library |
| [mako](https://github.com/emersion/mako) | Lightweight Wayland notification daemon |
| [neatvnc](https://github.com/any1/neatvnc) | VNC server library |
| [new-wayland-protocols](https://gitlab.freedesktop.org/wayland/wayland-protocols/) | Wayland protocol extensions |
| [obs-wlrobs](https://hg.sr.ht/~scoopta/wlrobs) | Obs-studio plugin that allows you to screen capture on wlroots based wayland compositors |
| [rootbar](https://hg.sr.ht/~scoopta/rootbar) | Bar for Wayland WMs |
| [salut](https://gitlab.com/snakedye/salut) | A sleek notification daemon |
| [shotman](https://git.sr.ht/~whynothugo/shotman) | Uncompromising screenshot GUI for Wayland compositors |
| [sirula](https://github.com/DorianRudolph/sirula) | Simple app launcher for wayland written in rust |
| [slurp](https://github.com/emersion/slurp) | Select a region in a Wayland compositor |
| [sway-unwrapped](https://github.com/swaywm/sway) | I3-compatible tiling Wayland compositor |
| [swaybg](https://github.com/swaywm/swaybg) | Wallpaper tool for Wayland compositors |
| [swayidle](https://github.com/swaywm/swayidle) | Idle management daemon for Wayland |
| [swaylock](https://github.com/swaywm/swaylock) | Screen locker for Wayland |
| [swaylock-effects](https://github.com/jirutka/swaylock-effects) | Screen locker for Wayland |
| [swww](https://github.com/Horus645/swww) | Efficient animated wallpaper daemon for wayland, controlled at runtime |
| [waybar](https://github.com/Alexays/Waybar) | Highly customizable Wayland bar for Sway and Wlroots based compositors |
| [waypipe](https://gitlab.freedesktop.org/mstoeckl/waypipe/) | Network proxy for Wayland clients (applications) |
| [wayvnc](https://github.com/any1/wayvnc) | VNC server for wlroots based Wayland compositors |
| [wbg](https://codeberg.org/dnkl/wbg) | Wallpaper application for Wayland compositors |
| [wdisplays](https://github.com/artizirk/wdisplays) | Graphical application for configuring displays in Wayland compositors |
| [wev](https://git.sr.ht/~sircmpwn/wev) | Wayland event viewer |
| [wf-recorder](https://github.com/ammen99/wf-recorder) | Utility program for screen recording of wlroots-based compositors |
| [wl-clipboard](https://github.com/bugaevc/wl-clipboard) | Command-line copy/paste utilities for Wayland |
| [wl-gammarelay-rs](https://github.com/MaxVerevkin/wl-gammarelay-rs) | A simple program that provides DBus interface to control display temperature and brightness under wayland without flickering |
| [wlay](https://github.com/atx/wlay) | Graphical output management for Wayland |
| [wldash](https://wldash.org) | Wayland launcher/dashboard |
| [wlogout](https://github.com/ArtsyMacaw/wlogout) | Wayland based logout menu |
| [wlr-randr](https://git.sr.ht/~emersion/wlr-randr) | Xrandr clone for wlroots compositors |
| [wlroots](https://gitlab.freedesktop.org/wlroots/wlroots/) | Modular Wayland compositor library |
| [wlsunset](https://git.sr.ht/~kennylevinsen/wlsunset) | Day/night gamma adjustments for Wayland |
| [wlvncc](https://github.com/any1/wlvncc) | A Wayland Native VNC Client |
| [wob](https://github.com/francma/wob) | Lightweight overlay bar for Wayland |
| [wofi](https://hg.sr.ht/~scoopta/wofi) | Launcher/menu program for wlroots based wayland compositors such as sway |
| [wshowkeys](https://github.com/ammgws/wshowkeys) | Displays keys being pressed on a Wayland session |
| [wtype](https://github.com/atx/wtype) | xdotool type for wayland |
| [xdg-desktop-portal-wlr](https://github.com/emersion/xdg-desktop-portal-wlr) | xdg-desktop-portal backend for wlroots |
## Tips
#### General
- I recommend using [`home-manager`](https://github.com/rycee/home-manager/)!
- It has modules and options for:
- `sway`
- `waybar`
- `obs` and plugins!
- more!
#### `sway`
- You will likely want a default config file to place at `$HOME/.config/sway/config`. You can use the upstream default as a starting point: https://github.com/swaywm/sway/blob/master/config.in
- If you start `sway` from a raw TTY, make sure you use `exec sway` so that if sway crashes, an unlocked TTY is not exposed.
#### Nvidia Users
- Everything should just work now (aka, wlroots/sway don't need patching).
- This is a known-good working config, at least at one point in time:
[mixins/nvidia.nix@ccd992](https://github.com/cole-mickens/nixcfg/blob/cdd9929d5d36ce5b4d64cf80bdeb1df3f2cba332/mixins/nvidia.nix)
## Development Guide
- Use `nix develop`
- `./main.nu`:
- `./main.nu build` - builds and caches derivations that don't exist in the cache, use `nix-eval-jobs`
- `./main.nu advance` - advances the flake inputs, runs `main build`
- `./main.nu update` - advances the flake inputs, updates pkg revs, runs `main build`
- `build` pushes to the `nixpkgs-wayland` cachix
If for some reason the overlay isn't progressing and you want to help,
just clone the repo, run `nix develop -c ./main.nu update`
================================================
FILE: default.nix
================================================
# This file provides backward compatibility to nix < 2.4 clients
let
lock = builtins.fromJSON (builtins.readFile ./flake.lock);
inherit (lock.nodes.flake-compat.locked)
owner
repo
rev
narHash
;
flake-compat = fetchTarball {
url = "https://github.com/${owner}/${repo}/archive/${rev}.tar.gz";
sha256 = narHash;
};
flake = import flake-compat { src = ./.; };
warn = msg: builtins.trace "[1;31mwarning: ${msg}[0m";
example = ''
nixpkgs.overlays=[(import "''${builtins.fetchurl "https://github.com/nix-community/nixpkgs-wayland/archive/master.tar.gz"}/overlay.nix")];
'';
warning = "change your 'nixpkgs-wayland' import statement to import 'overlay.nix' directly. example:\n ${example}";
in
warn warning flake.defaultNix
================================================
FILE: demo/README.md
================================================
# Demo
This is a WIP demo
## QEMU Demo
./vm-build.sh && ./vm-run.sh
================================================
FILE: demo/configuration.nix
================================================
{ ... }:
{
imports = [ (import ./profile.nix { user = "demo"; }) ];
nix.settings.trusted-users = [
"root"
"@wheel"
];
security.sudo.enable = true;
users.users.demo = {
uid = 1000;
isNormalUser = true;
password = "demo1234";
extraGroups = [
# allow demo to administer the machine
"wheel"
];
};
users.users.root = {
password = "root1234";
};
services.xserver.enable = false;
services.getty.helpLine = ''
Welcome to the Sway demo
login: demo
password: demo1234
Once logged-in, type `sway` to start the desktop environment.
'';
}
================================================
FILE: demo/flake.nix
================================================
{
description = "nixpkgs-wayland";
inputs = {
nixpkgs = {
url = "github:nixos/nixpkgs/nixos-unstable";
};
lib-aggregate = {
url = "github:nix-community/lib-aggregate";
};
nixpkgs-wayland = {
url = "github:nix-community/nixpkgs-wayland";
};
home-manager = {
url = "github:nix-community/home-manager";
};
};
nixConfig = {
extra-substituters = [ "https://nixpkgs-wayland.cachix.org" ];
extra-trusted-public-keys = [
"nixpkgs-wayland.cachix.org-1:3lwxaILxMRkVhehr5StQprHdEo4IrE8sRho9R9HOLYA="
];
};
outputs =
inputs:
let
inherit (inputs.lib-aggregate) lib;
inherit (inputs) self;
in
lib.flake-utils.eachSystem
[
"aarch64-linux"
"x86_64-linux"
"riscv64-linux"
]
(system: {
nixosConfigurations.demo = inputs.nixpkgs.lib.nixosSystem {
inherit system;
specialArgs = {
inherit inputs;
};
modules = [
./configuration.nix
(
{ pkgs, ... }:
{
nixpkgs.overlays = [ inputs.nixpkgs-wayland.overlays.default ];
}
)
(
{ pkgs, modulesPath, ... }:
{
imports = [ (modulesPath + "/virtualisation/qemu-vm.nix") ];
virtualisation = {
memorySize = 1024 * 8;
diskSize = 1024 * 2;
cores = 8;
};
# For running Sway in a QEMU VM the Arch Linux Wiki recommends to use
# the QXL virtualized graphics card:
# https://wiki.archlinux.org/title/sway#Virtualization
# The screen resolution isn't automatically scaled. Full HD seems to
# be a good default that should work on most systems well.
virtualisation.qemu.options = [ "-device qxl-vga,xres=1920,yres=1080" ];
# The Arch Linux Wiki suggests using the qxl and bochs_drm kernel
# modules:
# https://wiki.archlinux.org/title/QEMU#qxl
boot.kernelModules = [
"qxl"
"bochs_drm"
];
}
)
];
};
packages = {
demo-vm = self.nixosConfigurations.${system}.demo.config.system.build.vmWithBootLoader;
};
});
}
================================================
FILE: demo/home/profile.nix
================================================
{ pkgs, ... }:
{
home.packages =
with pkgs;
[
brightnessctl
dmenu
pavucontrol
playerctl
termite
xdg_utils # needed for termite URL opening
xwayland
]
++ (with waylandPkgs; [
grim # screenshot CLI
waybar
kanshi # broken: display configurator
mako # notification manager
slurp # dimension-grabbing CLI, to use with grim
swayidle # lock screen manager
]);
programs.termite.enable = true;
programs.termite.scrollbackLines = 10000;
programs.firefox.enable = true;
# FIXME: doesn't work yet
xsession.enable = true;
xsession.windowManager.command = "sway";
xdg.enable = true;
xdg.configFile."sway/config" = {
source = pkgs.substituteAll {
name = "sway-config";
src = ./sway-config;
wallpaper = ./wallpaper.jpg;
};
};
xdg.configFile."chromium-flags.conf" = {
source = pkgs.writeText "chromium-flags.conf" ''
--force-device-scale-factor=1
'';
};
gtk.enable = true;
home.stateVersion = "23.11";
}
================================================
FILE: demo/home/sway-config
================================================
# Default config for sway
#
# Copy this to ~/.config/sway/config and edit it to your liking.
#
# Read `man 5 sway` for a complete reference.
### Variables
#
# Logo key. Use Mod1 for Alt.
set $mod Mod4
# Home row direction keys, like vim
set $left h
set $down j
set $up k
set $right l
# Your preferred terminal emulator
#set $term urxvt
set $term termite
# alacritty
# Your preferred application launcher
# Note: it's recommended that you pass the final command to sway
set $menu dmenu_path | dmenu | xargs swaymsg exec
### Output configuration
#
# Default wallpaper (more resolutions are available in __DATADIR__/backgrounds/sway/)
output * bg @wallpaper@ fill
output eDP-1 scale 1.5
#
# Example configuration:
#
# output HDMI-A-1 resolution 1920x1080 position 1920,0
#
# You can get the names of your outputs by running: swaymsg -t get_outputs
### Idle configuration
#
# Example configuration:
#
exec swayidle \
timeout 500 'swaylock -c 000000' \
timeout 600 'swaymsg "output * dpms off"' \
resume 'swaymsg "output * dpms on"' \
before-sleep 'swaylock -c 000000'
# Start the notification center
exec mako --default-timeout 50000
# Start one shell
exec $term
# This will lock your screen after 300 seconds of inactivity, then turn off
# your displays after another 600 seconds, and turn your screens back on when
# resumed. It will also lock your screen before your computer goes to sleep.
### Input configuration
#
# Example configuration:
#
# input "2:14:SynPS/2_Synaptics_TouchPad" {
# dwt enabled
# tap enabled
# natural_scroll enabled
# middle_emulation enabled
# }
#
# You can get the names of your inputs by running: swaymsg -t get_inputs
# Read `man 5 sway-input` for more information about this section.
input "1386:888:Wacom_Intuos_BT_M_Pen" {
map_to_output HDMI-A-2
# FIXME: map BTN_0 to BTN_3, BTN_STYLUS and BTN_STYLUS2 buttons
}
### Key bindings
#
# Basics:
#
# start a terminal
bindsym $mod+Return exec $term
# kill focused window
bindsym $mod+Shift+q kill
# start your launcher
bindsym $mod+d exec $menu
bindsym $mod+p exec $menu
# Drag floating windows by holding down $mod and left mouse button.
# Resize them with right mouse button + $mod.
# Despite the name, also works for non-floating windows.
# Change normal to inverse to use left mouse button for resizing and right
# mouse button for dragging.
floating_modifier $mod normal
# reload the configuration file
bindsym $mod+Shift+c reload
# exit sway (logs you out of your Wayland session)
bindsym $mod+Shift+e exec swaynag -t warning -m 'You pressed the exit shortcut. Do you really want to exit sway? This will end your Wayland session.' -b 'Yes, exit sway' 'swaymsg exit'
#
# Moving around:
#
# Move your focus around
bindsym $mod+$left focus left
bindsym $mod+$down focus down
bindsym $mod+$up focus up
bindsym $mod+$right focus right
# or use $mod+[up|down|left|right]
bindsym $mod+Left focus left
bindsym $mod+Down focus down
bindsym $mod+Up focus up
bindsym $mod+Right focus right
# _move_ the focused window with the same, but add Shift
bindsym $mod+Shift+$left move left
bindsym $mod+Shift+$down move down
bindsym $mod+Shift+$up move up
bindsym $mod+Shift+$right move right
# ditto, with arrow keys
bindsym $mod+Shift+Left move left
bindsym $mod+Shift+Down move down
bindsym $mod+Shift+Up move up
bindsym $mod+Shift+Right move right
#
# Workspaces:
#
# switch to workspace
bindsym $mod+1 workspace 1
bindsym $mod+2 workspace 2
bindsym $mod+3 workspace 3
bindsym $mod+4 workspace 4
bindsym $mod+5 workspace 5
bindsym $mod+6 workspace 6
bindsym $mod+7 workspace 7
bindsym $mod+8 workspace 8
bindsym $mod+9 workspace 9
bindsym $mod+0 workspace 10
# move focused container to workspace
bindsym $mod+Shift+1 move container to workspace 1
bindsym $mod+Shift+2 move container to workspace 2
bindsym $mod+Shift+3 move container to workspace 3
bindsym $mod+Shift+4 move container to workspace 4
bindsym $mod+Shift+5 move container to workspace 5
bindsym $mod+Shift+6 move container to workspace 6
bindsym $mod+Shift+7 move container to workspace 7
bindsym $mod+Shift+8 move container to workspace 8
bindsym $mod+Shift+9 move container to workspace 9
bindsym $mod+Shift+0 move container to workspace 10
# Note: workspaces can have any name you want, not just numbers.
# We just use 1-10 as the default.
#
# Layout stuff:
#
# You can "split" the current object of your focus with
# $mod+b or $mod+v, for horizontal and vertical splits
# respectively.
bindsym $mod+b splith
bindsym $mod+v splitv
# Switch the current container between different layout styles
bindsym $mod+s layout stacking
bindsym $mod+w layout tabbed
bindsym $mod+e layout toggle split
# Make the current focus fullscreen
bindsym $mod+f fullscreen
# Toggle the current focus between tiling and floating mode
bindsym $mod+Shift+space floating toggle
# Swap focus between the tiling area and the floating area
bindsym $mod+space focus mode_toggle
# move focus to the parent container
bindsym $mod+a focus parent
#
# Scratchpad:
#
# Sway has a "scratchpad", which is a bag of holding for windows.
# You can send windows there and get them back later.
# Move the currently focused window to the scratchpad
bindsym $mod+Shift+minus move scratchpad
# Show the next scratchpad window or hide the focused scratchpad window.
# If there are multiple scratchpad windows, this command cycles through them.
bindsym $mod+minus scratchpad show
#
# Resizing containers:
#
mode "resize" {
# left will shrink the containers width
# right will grow the containers width
# up will shrink the containers height
# down will grow the containers height
bindsym $left resize shrink width 10px
bindsym $down resize grow height 10px
bindsym $up resize shrink height 10px
bindsym $right resize grow width 10px
# ditto, with arrow keys
bindsym Left resize shrink width 10px
bindsym Down resize grow height 10px
bindsym Up resize shrink height 10px
bindsym Right resize grow width 10px
# return to default mode
bindsym Return mode "default"
bindsym Escape mode "default"
}
bindsym $mod+r mode "resize"
# Media keys
bindsym XF86AudioLowerVolume exec pactl set-sink-volume $(pacmd list-sinks |awk '/* index:/{print $3}') -5%
bindsym XF86AudioMute exec pactl set-sink-mute $(pacmd list-sinks |awk '/* index:/{print $3}') toggle
bindsym XF86AudioNext exec playerctl next
bindsym XF86AudioPlay exec playerctl play-pause
bindsym XF86AudioPrev exec playerctl previous
bindsym XF86AudioRaiseVolume exec pactl set-sink-volume $(pacmd list-sinks |awk '/* index:/{print $3}') +5%
bindsym XF86MonBrightnessDown exec brightnessctl set 5%-
bindsym XF86MonBrightnessUp exec brightnessctl set +5%
bindsym XF86LaunchB exec $menu
#
# Status Bar:
bar {
swaybar_command waybar
}
================================================
FILE: demo/legacy/default.nix
================================================
let
nixpkgs = builtins.fetchTarball {
url = "https://github.com/nixos/nixpkgs/archive/master.tar.gz";
sha256 = "195mgl12xa3qdxj2qnqswff4ic205442ankz0mgfrlsvp3jpm4qr";
};
rev = "master";
# 'rev' could be a git rev, to pin the overla.
# if you pin, you should use a tool like `niv` maybe, but please consider trying flakes
url = "https://github.com/colemickens/nixpkgs-wayland/archive/${rev}.tar.gz";
waylandOverlay = import (builtins.fetchTarball url);
pkgs = import nixpkgs { overlays = [ waylandOverlay ]; };
in
pkgs.waylandPkgs.waybar
================================================
FILE: demo/profile.nix
================================================
{ user }:
{ pkgs, inputs, ... }@args:
let
inherit (inputs) home-manager;
in
{
imports = [ "${home-manager}/nixos" ];
nixpkgs.overlays = [ (import ../overlay.nix) ];
# When this is enabled, the QEMU VM goes blank after boot
networking.networkmanager.enable = true;
fonts.packages = with pkgs; [
dejavu_fonts # just a basic good font
font-awesome_5
];
# add sound support
hardware.pulseaudio.enable = true;
# setup the user's home
home-manager.users."${user}" = (import ./home/profile.nix) args;
# Sway
programs.sway.enable = true;
programs.sway.extraSessionCommands = ''
# Tell toolkits to use wayland
export CLUTTER_BACKEND=wayland
#export QT_QPA_PLATFORM=wayland-egl
export QT_WAYLAND_DISABLE_WINDOWDECORATION=1
export SDL_VIDEODRIVER=wayland
# Fix krita and other Egl-using apps
export LD_LIBRARY_PATH=/run/opengl-driver/lib
# Disable HiDPI scaling for X apps
# https://wiki.archlinux.org/index.php/HiDPI#GUI_toolkits
export GDK_SCALE=1
export QT_AUTO_SCREEN_SCALE_FACTOR=0
'';
# manage those with home-manager
programs.sway.extraPackages = [ ];
# Add the required groups for the user to get access
users.extraUsers."${user}" = {
extraGroups = [
# allow sudo
"wheel"
"input"
"tty"
"audio"
"video"
# allow sway's setuid executable
"sway"
"networkmanager"
];
};
}
================================================
FILE: demo/vm-build.sh
================================================
#!/usr/bin/env bash
nix build ".#packages.x86_64-linux.demo-vm"
================================================
FILE: demo/vm-run.sh
================================================
#!/usr/bin/env bash
if [[ ! -e ./result ]]; then
echo Run ./vm-build.sh first
exit 1
fi
exec ./result/bin/run-nixos-vm
================================================
FILE: flake.nix
================================================
{
description = "nixpkgs-wayland";
inputs = {
nixpkgs = {
url = "github:nixos/nixpkgs/nixos-unstable";
};
lib-aggregate = {
url = "github:nix-community/lib-aggregate";
};
flake-compat = {
url = "github:nix-community/flake-compat";
};
};
nixConfig = {
extra-substituters = [ "https://nixpkgs-wayland.cachix.org" ];
extra-trusted-substituters = [ "https://nixpkgs-wayland.cachix.org" ];
extra-trusted-public-keys = [
"nixpkgs-wayland.cachix.org-1:3lwxaILxMRkVhehr5StQprHdEo4IrE8sRho9R9HOLYA="
];
};
outputs =
inputs:
let
inherit (inputs.lib-aggregate) lib;
inherit (inputs) self;
waylandOverlay =
final: prev:
let
template =
{
attrName,
nixpkgsAttrName ? "",
extra ? { },
replace ? { },
replaceInput ? { },
deprecationWarning ? "",
}:
import ./templates/template.nix {
inherit
prev
attrName
extra
replace
nixpkgsAttrName
replaceInput
deprecationWarning
;
};
checkMutuallyExclusive = lib.mutuallyExclusive (map (e: e.attrName) attrsExtraChangesNeeded) (
map (e: e.attrName) attrsNoExtraChangesNeeded
);
genPackagesGH =
if checkMutuallyExclusive then
lib.listToAttrs (
map (a: {
name = a.attrName;
value = template a;
}) (attrsExtraChangesNeeded ++ attrsNoExtraChangesNeeded)
)
else
throw "some 'attrName' value is in both attrsExtraChangesNeeded and attrsNoExtraChangesNeeded";
# these need extra nativeBuildInputs or buildInputs or the patches cleared
attrsExtraChangesNeeded = [
{
attrName = "drm_info";
extra.nativeBuildInputs = [ prev.scdoc ];
}
{
attrName = "swaylock";
replace.patches = [ ];
}
{
attrName = "grim";
replace.patches = [ ];
}
{
attrName = "waybar";
deprecationWarning = "'waybar' will be removed in October 2025. Please use the flake from https://github.com/Alexays/Waybar.";
extra.buildInputs = [ prev.gpsd ];
replace = previousAttrs: {
patches = [];
postUnpack =
let
# Derived from subprojects/cava.wrap
libcava = rec {
version = "0.10.4";
src = prev.fetchFromGitHub {
owner = "LukashonakV";
repo = "cava";
rev = version;
hash = "sha256-9eTDqM+O1tA/3bEfd1apm8LbEcR9CVgELTIspSVPMKM=";
};
};
# Derived from subprojects/catch2.wrap
catch2 = rec {
version = "3.7.0";
src = prev.fetchFromGitHub {
owner = "catchorg";
repo = "Catch2";
rev = "v${version}";
hash = "sha256-U9hv6DaqN5eCMcAQdfFPqWpsbqDFxRQixELSGbNlc0g=";
};
};
in
''
(
cd "$sourceRoot"
cp -R --no-preserve=mode,ownership ${libcava.src} subprojects/cava-${libcava.version}
cp -R --no-preserve=mode,ownership ${catch2.src} subprojects/Catch2-${catch2.version}
patchShebangs .
)
'';
};
}
{
attrName = "gtk-layer-shell";
extra.nativeBuildInputs = [ prev.vala ];
replace.patches = [ ];
}
{
attrName = "sway-unwrapped";
extra.buildInputs = [ prev.xorg.xcbutilwm ];
replaceInput = {
wlroots = final.wlroots;
wayland-protocols = final.new-wayland-protocols;
};
replace = previousAttrs: {
mesonFlags = lib.remove "-Dxwayland=disabled" (
lib.remove "-Dxwayland=enabled" prev.sway-unwrapped.mesonFlags
);
patches =
let
patchesToRemove = [
(prev.fetchpatch {
name = "libinput-1.27-p1.patch";
url = "https://github.com/swaywm/sway/commit/bbadf9b8b10d171a6d5196da7716ea50ee7a6062.patch";
hash = "sha256-lA+oL1vqGQOm7K+AthzHYBzmOALrDgxzX/5Dx7naq84=";
})
(prev.fetchpatch {
name = "libinput-1.27-p2.patch";
url = "https://github.com/swaywm/sway/commit/e2409aa49611bee1e1b99033461bfab0a7550c48.patch";
hash = "sha256-l598qfq+rpKy3/0arQruwd+BsELx85XDjwIDkb/o6og=";
})
];
in
(lib.filter (
patch: !(lib.any (rmpatch: rmpatch != patch) patchesToRemove)
) previousAttrs.patches);
};
}
{
attrName = "cage";
extra.buildInputs = [ prev.xorg.xcbutilwm ];
replaceInput = {
wlroots_0_18 = prev.wlroots_0_19;
};
# _FORTIFY_SOURCE requires compiling with optimization (-O)
# PR https://github.com/NixOS/nixpkgs/pull/232917 added -O0
replace.CFLAGS = "";
# https://github.com/cage-kiosk/cage/commit/d3fb99d6654325ec46277cfdb589f89316bed701
replace.mesonFlags = lib.remove "-Dxwayland=true" (
lib.remove "-Dxwayland=false" prev.cage.mesonFlags
);
}
{
attrName = "wob";
extra.buildInputs = [
prev.pixman
prev.cmocka
];
}
{
attrName = "libvncserver_master";
nixpkgsAttrName = "libvncserver";
# The version in nixpkgs has different paths so the patch is updated here.
replace.patches = [ ./pkgs/libvncserver_master/pkgconfig.patch ];
}
{
attrName = "wayvnc";
nixpkgsAttrName = "wayvnc";
extra.buildInputs = [ prev.jansson ];
}
{
attrName = "eww";
nixpkgsAttrName = "eww";
extra.buildInputs = [
prev.libdbusmenu
prev.libdbusmenu-gtk3
];
# patch was applied upstream
replace.cargoPatches = [ ];
# cargoPatches is addded to patches
replace.patches = [ ];
}
{
attrName = "wf-recorder";
replace.patches = [];
extra.buildInputs = [
prev.mesa
prev.pipewire
];
}
{
attrName = "xdg-desktop-portal-wlr";
nixpkgsAttrName = "xdg-desktop-portal-wlr";
replace.patches = [ ];
}
{
attrName = "new-wayland-protocols";
nixpkgsAttrName = "wayland-protocols";
}
# {
# attrName = "wl-screenrec";
# # soon in nixpkgs
# extra.buildInputs = [ prev.libdrm ];
# replace.doCheck = false;
# }
{
attrName = "wbg";
extra.buildInputs = [
prev.libjxl
prev.pixman
];
}
{
attrName = "dunst";
# remove once nixpkgs is above 1.11.1
replace = previousAttrs: {
postInstall =
builtins.replaceStrings
[
''
substituteInPlace $out/share/zsh/site-functions/_dunstctl $out/share/fish/vendor_completions.d/{dunstctl,dunstify} \
--replace-fail "jq" "${lib.getExe prev.jq}"
''
]
[
''
substituteInPlace $out/share/zsh/site-functions/_dunstctl $out/share/fish/vendor_completions.d/{dunstctl,dunstify}.fish \
--replace-fail "jq" "${lib.getExe prev.jq}"
''
]
previousAttrs.postInstall;
};
}
{
attrName = "neatvnc";
replace.patches = [];
replaceInput = {
ffmpeg = prev.ffmpeg_7;
};
}
{
attrName = "waypipe";
extra = {
depsBuildBuild = [ prev.pkg-config ];
nativeBuildInputs = [ prev.pkg-config prev.wayland-scanner ];
buildInputs = [ prev.wayland ];
};
}
];
# these do not need changes from the package that nixpkgs has
attrsNoExtraChangesNeeded = lib.attrValues (
lib.genAttrs
[
"gebaar-libinput"
"glpaper"
"imv"
"mako"
"slurp"
"swaybg"
"swayidle"
"swaylock-effects"
"wl-clipboard"
"wlogout"
"wlr-randr"
"wofi"
"wtype"
"wshowkeys"
"aml"
"wdisplays"
"kanshi"
"wev"
"lavalauncher"
"wlsunset"
"rootbar"
"sirula"
"swww"
"wlay"
"i3status-rust"
"shotman"
]
(s: {
attrName = s;
})
);
waylandPkgs = genPackagesGH // rec {
# wlroots-related
salut = prev.callPackage ./pkgs/salut { };
wlvncc = prev.callPackage ./pkgs/wlvncc { libvncserver = final.libvncserver_master; };
obs-wlrobs = template {
nixpkgsAttrName = "obs-studio-plugins.wlrobs";
attrName = "obs-wlrobs";
};
# the above should actually be, but there's eval error and doing
# 'nix build -f packages.nix' would build all packages in obs-studio-plugins
# obs-studio-plugins = prev.obs-studio-plugins // {
# wlrobs = template {
# nixpkgsAttrName = "obs-studio-plugins.wlrobs";
# attrName = "wlrobs";
# };
# };
wldash = prev.callPackage ./pkgs/wldash { };
wlroots = prev.callPackage ./pkgs/wlroots {
wlroots = prev.wlroots_0_18;
wayland-protocols = final.new-wayland-protocols;
};
wl-gammarelay-rs = prev.callPackage ./pkgs/wl-gammarelay-rs { };
freerdp3 = prev.callPackage ./pkgs/freerdp3 {
inherit (prev.darwin.apple_sdk.frameworks)
AudioToolbox
AVFoundation
Carbon
Cocoa
CoreMedia
;
inherit (prev.gst_all_1) gstreamer gst-plugins-base gst-plugins-good;
};
# misc
foot = prev.callPackage ./pkgs/foot { inherit foot; };
};
in
waylandPkgs // { inherit waylandPkgs; };
in
lib.flake-utils.eachSystem
[
"aarch64-linux"
"x86_64-linux"
"riscv64-linux"
]
(
system:
let
pkgsFor =
pkgs: overlays:
import pkgs {
inherit system overlays;
config.allowUnfree = true;
config.allowAliases = false;
};
pkgs_ = lib.genAttrs (builtins.attrNames inputs) (inp: pkgsFor inputs."${inp}" [ ]);
opkgs_ = overlays: lib.genAttrs (builtins.attrNames inputs) (inp: pkgsFor inputs."${inp}" overlays);
waypkgs = (opkgs_ [ self.overlays.default ]).nixpkgs;
in
rec {
devShells.default = pkgs_.nixpkgs.mkShell {
nativeBuildInputs = with pkgs_.nixpkgs; [
nix
nushell
cachix
cacert
git
mercurial
ripgrep
sd
];
};
formatter = pkgs_.nixpkgs.nixfmt;
bundle = pkgs_.nixpkgs.symlinkJoin {
name = "nixpkgs-wayland-bundle";
paths = builtins.attrValues (
lib.filterAttrs (_: v: lib.meta.availableOn pkgs_.nixpkgs.stdenv.hostPlatform v) waypkgs.waylandPkgs
);
};
packages = waypkgs.waylandPkgs // {
default = bundle;
};
}
)
// {
# overlays have to be outside of eachSystem block
overlay = waylandOverlay;
overlays.default = waylandOverlay;
};
}
================================================
FILE: main.nu
================================================
#!/usr/bin/env nu
let system = "x86_64-linux";
let forceCheck = false; # use for development to re-update all pkgs
$env.CACHIX_CACHE = (
if "CACHIX_CACHE" in $env { $env.CACHIX_CACHE }
else "nixpkgs-wayland"
)
$env.CACHIX_SIGNING_KEY = (
if "CACHIX_SIGNING_KEY_NIXPKGS_WAYLAND" in $env { $env.CACHIX_SIGNING_KEY_NIXPKGS_WAYLAND }
else "null"
)
def getBadHash [ attrName: string ] {
let val = ((do -i { ^nix build --no-link $attrName }| complete)
| get stderr
| split row "\n"
| where ($it | str contains "got:")
| str replace --regex '\s+got:(.*)(sha256-.*)' '$2'
| get 0
)
$val
}
def replaceHash [ packageName: string, position: string, hashName: string, oldHash: string ] {
let fakeSha256 = "0000000000000000000000000000000000000000000000000000";
do -c { ^sd -s $"($oldHash)" $"($fakeSha256)" $"($position)" }
let newHash = (getBadHash $".#($packageName)")
do -c { ^sd -s $"($fakeSha256)" $"($newHash)" $"($position)" }
print -e {packageName: $packageName, hashName: $hashName, oldHash: $oldHash, newHash: $newHash}
}
def updatePkg [packageName: string] {
let position = $"pkgs/($packageName)/metadata.nix"
let verinfo = (^nix eval --json -f $position | str trim | from json)
let skip = (("skip" in ($verinfo | transpose | get column0)) and $verinfo.skip)
if $skip {
print -e $"(ansi light_yellow) update ($packageName) - (ansi light_cyan_underline)skipped(ansi reset)"
} else {
# Try update rev
let newrev = (
if ("repo_git" in ($verinfo | transpose | get column0)) {
(do -c {
^git ls-remote $verinfo.repo_git $"refs/heads/($verinfo.branch)"
} | complete | get stdout | str trim | str replace --regex '(\s+)(.*)$' "")
} else if ( "repo_hg" in ($verinfo | transpose | get column0) ) {
(do -c {
^hg identify $verinfo.repo_hg -r $verinfo.branch
} | complete | get stdout | str trim)
} else {
error make { msg: "unknown repo type" }
}
)
let shouldUpdate = (if ($forceCheck) {
print -e $"(ansi light_yellow) update ($packageName) - (ansi light_yellow_underline)forced(ansi reset)"
true
} else if ($newrev != $verinfo.rev) {
print -e $"(ansi light_yellow) update ($packageName) - (ansi light_yellow_underline)update to ($newrev)(ansi reset)"
true
} else {
print -e $"(ansi dark_gray) update ($packageName) - noop(ansi reset)"
false
})
if ($shouldUpdate) {
do -c { ^sd -s $"($verinfo.rev)" $"($newrev)" $"($position)" }
print -e {packageName: $packageName, oldrev: $verinfo.rev, newrev: $newrev}
replaceHash $packageName $position "sha256" $verinfo.sha256
if "vendorSha256" in ($verinfo | transpose | get column0) {
replaceHash $packageName $position "vendorSha256" $verinfo.vendorSha256
}
do -c {
^git commit $position -m $"auto-update: ($packageName): ($verinfo.rev) => ($newrev)"
} | complete
}
null
} # end !skip
}
def updatePkgs [] {
let pkgs = (^nix eval --json $".#packages.($system)" --apply 'x: builtins.attrNames x' | str trim | from json)
let pkgs = ($pkgs | where ($it != "default"))
for pkg in $pkgs {
updatePkg $pkg
}
}
def "main rereadme" [] {
let color = "yellow"
let packageNames = (nix eval --json $".#packages.($system)" --apply 'x: builtins.attrNames x' | str trim | from json)
let pkgList = ($packageNames | where ($it != "default"))
let delimStart = ""
let delimEnd = ""
let pkgrows = ($pkgList | each { |packageName|
let meta = (do -c {
nix eval --json $".#packages.($system).($packageName).meta" | str trim | from json
})
let home = (if "homepage" in ($meta | transpose | get column0) {
$meta.homepage
} else { "__missing__" })
($"| [($packageName)]\(($home)\) | ($meta.description) |")
})
let rows = [
$delimStart
"| Package | Description |"
"| --- | --- |"
$pkgrows
$delimEnd
]
let tableText = ($rows | flatten | str join "\n")
let regexString = ([ '(?s)(.*)' $delimStart '(.*)' $delimEnd '(.*)' ] | str join '')
let replaceText = $"\$1($tableText)\$3"
^rg --multiline $regexString "README.md" --replace $replaceText | save --raw README2.md
mv -f README2.md README.md
do -i { ^git commit -m "auto-update: updated readme" "./README.md" }
}
def flakeAdvance [] {
^nix flake update --recreate-lock-file --commit-lock-file
}
def gitPush [] {
print -e ":: git push origin HEAD"
^git push origin HEAD
}
def "main build" [--cache] {
print -e ":: nix build bundle (cachix)"
rm -rf result*
^nix build --keep-going '.#bundle.x86_64-linux'
if $cache {
^ls -d result* | ^tee "/dev/stderr" | cachix push $"($env.CACHIX_CACHE)"
}
rm -rf result*
print -e ":: nix build devshell-inputDrv (cachix)"
^nix build --keep-going $".#devShells.($system).default.inputDerivation"
if $cache {
^ls -d result* | ^tee "/dev/stderr" | cachix push $"($env.CACHIX_CACHE)"
}
}
def "main advance" [] {
flakeAdvance
main build
gitPush
}
def "main update" [packageName?: string] {
print -e ":: update"
if $packageName == null {
flakeAdvance
updatePkgs
main build --cache=true
main rereadme
gitPush
} else {
updatePkg $packageName
}
}
def "main check" [packageName?: string] {
print -e ":: ci checks"
main build --cache=false
main rereadme
}
def main [] {
print -e "commands: [advance, update, build]"
}
================================================
FILE: overlay.nix
================================================
# This file provides backward compatibility to nix < 2.4 clients
let
lock = builtins.fromJSON (builtins.readFile ./flake.lock);
inherit (lock.nodes.flake-compat.locked)
owner
repo
rev
narHash
;
flake-compat = fetchTarball {
url = "https://github.com/${owner}/${repo}/archive/${rev}.tar.gz";
sha256 = narHash;
};
flake = import flake-compat { src = ./.; };
in
flake.defaultNix.overlays.default
================================================
FILE: packages.nix
================================================
# This file provides backward compatibility to nix < 2.4 clients
{
system ? builtins.currentSystem,
}:
let
lock = builtins.fromJSON (builtins.readFile ./flake.lock);
inherit (lock.nodes.flake-compat.locked)
owner
repo
rev
narHash
;
flake-compat = fetchTarball {
url = "https://github.com/${owner}/${repo}/archive/${rev}.tar.gz";
sha256 = narHash;
};
flake = import flake-compat {
inherit system;
src = ./.;
};
in
flake.defaultNix.packages.${builtins.currentSystem}
================================================
FILE: pkgs/aml/metadata.nix
================================================
rec {
domain = "github.com";
owner = "any1";
repo = "aml";
repo_git = "https://${domain}/${owner}/${repo}";
branch = "master";
rev = "685035c9830aa89df02a43df89b644690bd885f5";
sha256 = "sha256-10gm6YphZrpLShj3NUj/AG24dSVLZAZbbnXr7GiF4DI=";
}
================================================
FILE: pkgs/cage/metadata.nix
================================================
rec {
domain = "github.com";
owner = "Hjdskes";
repo = "cage";
repo_git = "https://${domain}/${owner}/${repo}";
branch = "master";
rev = "2e593fe5a8a2186a558ceb414674775e4ba5d2b1";
sha256 = "sha256-AgBlauOEQvLr4+LMoLRa8rcS4GDtwOFd9flBHyLUhxE=";
}
================================================
FILE: pkgs/drm_info/metadata.nix
================================================
rec {
domain = "github.com";
owner = "ascent12";
repo = "drm_info";
repo_git = "https://${domain}/${owner}/${repo}";
branch = "master";
rev = "e9cabcd98038e4e97e4b10d20be81df0f153d793";
sha256 = "sha256-RxT+i/syPdiOjQexY4sFKUCs10RK12AfYK8CW1woMy0=";
}
================================================
FILE: pkgs/dunst/metadata.nix
================================================
rec {
domain = "github.com";
owner = "dunst-project";
repo = "dunst";
repo_git = "https://${domain}/${owner}/${repo}";
branch = "master";
rev = "ee63a720acad34f62567a1ae6a8e7b0636e56a50";
sha256 = "sha256-tktbQHEl9YmuaeF+dbz8GWnjYBGwcbvrCCx03fXtZNI=";
}
================================================
FILE: pkgs/eww/metadata.nix
================================================
rec {
domain = "github.com";
owner = "elkowar";
repo = "eww";
repo_git = "https://${domain}/${owner}/${repo}";
branch = "master";
rev = "fddb4a09b107237819e661151e007b99b5cab36d";
sha256 = "sha256-PJW4LvW9FmkG9HyUtgXOq7MDjYtBc/iJuOxyf29nD0Y=";
}
================================================
FILE: pkgs/foot/default.nix
================================================
{
stdenv,
lib,
fetchFromGitea,
fetchurl,
runCommand,
fcft,
freetype,
pixman,
libxkbcommon,
fontconfig,
wayland,
meson,
ninja,
ncurses,
scdoc,
tllist,
wayland-protocols,
wayland-scanner,
pkg-config,
utf8proc,
allowPgo ? !stdenv.hostPlatform.isMusl,
python3, # for PGO
# for clang stdenv check
foot,
llvmPackages,
}:
let
metadata = import ./metadata.nix;
pname = "foot";
version = metadata.rev;
src = fetchFromGitea {
domain = "codeberg.org";
owner = "dnkl";
repo = pname;
rev = version;
inherit (metadata) sha256;
};
# build stimuli file for PGO build and the script to generate it
# independently of the foot's build, so we can cache the result
# and avoid unnecessary rebuilds as it can take relatively long
# to generate
#
# For every bump, make sure that the hash is still accurate.
stimulusGenerator = stdenv.mkDerivation {
name = "foot-generate-alt-random-writes";
src = "${src}/scripts/generate-alt-random-writes.py";
dontUnpack = true;
buildInputs = [ python3 ];
installPhase = ''
install -Dm755 $src $out
'';
};
stimuliFile = runCommand "pgo-stimulus-file" { } ''
${stimulusGenerator} \
--rows=67 --cols=135 \
--scroll --scroll-region \
--colors-regular --colors-bright --colors-256 --colors-rgb \
--attr-bold --attr-italic --attr-underline \
--sixel \
--seed=2305843009213693951 \
$out
'';
compilerName =
if stdenv.cc.isClang then
"clang"
else if stdenv.cc.isGNU then
"gcc"
else
"unknown";
# https://codeberg.org/dnkl/foot/src/branch/master/INSTALL.md#performance-optimized-pgo
pgoCflags =
{
"clang" = "-O3 -Wno-ignored-optimization-argument";
"gcc" = "-O3";
}
."${compilerName}";
# ar with lto support
ar =
stdenv.cc.bintools.targetPrefix
+ {
"clang" = "llvm-ar";
"gcc" = "gcc-ar";
"unknown" = "ar";
}
."${compilerName}";
# PGO only makes sense if we are not cross compiling and
# using a compiler which foot's PGO build supports (clang or gcc)
doPgo = allowPgo && (stdenv.hostPlatform == stdenv.buildPlatform) && compilerName != "unknown";
terminfoDir = "${placeholder "terminfo"}/share/terminfo";
in
stdenv.mkDerivation {
inherit version pname src;
separateDebugInfo = true;
depsBuildBuild = [
pkg-config
];
nativeBuildInputs =
[
wayland-scanner
meson
ninja
ncurses
scdoc
pkg-config
]
++ lib.optionals (compilerName == "clang") [
stdenv.cc.cc.libllvm.out
];
buildInputs = [
tllist
wayland-protocols
fontconfig
freetype
pixman
wayland
libxkbcommon
fcft
utf8proc
];
# recommended build flags for performance optimized foot builds
# https://codeberg.org/dnkl/foot/src/branch/master/INSTALL.md#release-build
CFLAGS = if !doPgo then "-O3" else pgoCflags;
# ar with gcc plugins for lto objects
preConfigure = ''
export AR="${ar}"
'';
mesonBuildType = "release";
# See https://codeberg.org/dnkl/foot/src/tag/1.9.2/INSTALL.md#options
mesonFlags = [
# Use lto
"-Db_lto=true"
# “Build” and install terminfo db
"-Dterminfo=enabled"
# Ensure TERM=foot is used
"-Ddefault-terminfo=foot"
# Tell foot to set TERMINFO and where to install the terminfo files
"-Dcustom-terminfo-install-location=${terminfoDir}"
# Install systemd user units for foot-server
"-Dsystemd-units-dir=${placeholder "out"}/lib/systemd/user"
# Especially -Wunused-command-line-argument is a problem with clang
"-Dwerror=false"
];
# build and run binary generating PGO profiles,
# then reconfigure to build the normal foot binary utilizing PGO
preBuild =
lib.optionalString doPgo ''
meson configure -Db_pgo=generate
ninja
# make sure there is _some_ profiling data on all binaries
meson test
./footclient --version
./foot --version
./utils/xtgettcap
# generate pgo data of wayland independent code
./pgo ${stimuliFile} ${stimuliFile} ${stimuliFile}
meson configure -Db_pgo=use
''
+ lib.optionalString (doPgo && compilerName == "clang") ''
llvm-profdata merge default_*profraw --output=default.profdata
'';
# Install example themes which can be added to foot.ini via the include
# directive to a separate output to save a bit of space
postInstall = ''
moveToOutput share/foot/themes "$themes"
'';
doCheck = true;
strictDeps = true;
outputs = [
"out"
"terminfo"
"themes"
];
passthru.tests = {
clang-default-compilation = foot.override {
inherit (llvmPackages) stdenv;
};
noPgo = foot.override {
allowPgo = false;
};
# By changing name, this will get rebuilt everytime we change version,
# even if the hash stays the same. Consequently it'll fail if we introduce
# a hash mismatch when updating.
stimulus-script-is-current = stimulusGenerator.src.overrideAttrs (_: {
name = "generate-alt-random-writes-${version}.py";
});
};
meta = with lib; {
homepage = "https://codeberg.org/dnkl/foot/";
changelog = "https://codeberg.org/dnkl/foot/releases/tag/${version}";
description = "Fast, lightweight and minimalistic Wayland terminal emulator";
license = licenses.mit;
maintainers = [
maintainers.sternenseemann
maintainers.abbe
];
platforms = platforms.linux;
mainProgram = "foot";
};
}
================================================
FILE: pkgs/foot/metadata.nix
================================================
rec {
type = "gitea";
domain = "codeberg.org";
owner = "dnkl";
repo = "foot";
repo_git = "https://${domain}/${owner}/${repo}";
branch = "master";
rev = "72d9a13c0c6b6ee4b56a38f508c2e8d5c56616b5";
sha256 = "sha256-cUUoAVBtlhnZJWfuCYqHjjYKIpKf9JBHcE5YCi5WscI=";
}
================================================
FILE: pkgs/freerdp3/default.nix
================================================
{
stdenv,
lib,
fetchFromGitHub,
cmake,
docbook-xsl-nons,
libxslt,
pkg-config,
alsa-lib,
faac,
faad2,
ffmpeg,
glib,
openh264,
openssl,
pcre2,
zlib,
libX11,
libXcursor,
libXdamage,
libXdmcp,
libXext,
libXi,
libXinerama,
libXrandr,
libXrender,
libXtst,
libXv,
libxkbcommon,
libxkbfile,
libv4l,
wayland,
wayland-scanner,
gstreamer,
gst-plugins-base,
gst-plugins-good,
libunwind,
orc,
cairo,
libusb1,
libpulseaudio,
cups,
pcsclite,
systemd,
libjpeg_turbo,
icu,
SDL2,
SDL2_ttf,
krb5,
cjson,
pkcs11helper,
webkitgtk_4_1,
buildServer ? true,
nocaps ? false,
AudioToolbox,
AVFoundation,
Carbon,
Cocoa,
CoreMedia,
fuse3,
withUnfree ? false,
}:
let
metadata = import ./metadata.nix;
cmFlag = flag: if flag then "ON" else "OFF";
disabledTests = lib.optionals stdenv.isDarwin [
{
dir = "winpr/libwinpr/sysinfo/test";
file = "TestGetComputerName.c";
}
];
inherit (lib) optionals;
in
stdenv.mkDerivation rec {
pname = "freerdp";
version = metadata.rev;
src = fetchFromGitHub {
owner = "FreeRDP";
repo = "FreeRDP";
inherit (metadata) rev sha256;
};
postPatch =
''
export HOME=$TMP
# skip NIB file generation on darwin
sed -z 's/NIB file generation.*//' -i client/Mac{,/cli}/CMakeLists.txt
# failing test(s)
${lib.concatMapStringsSep "\n" (e: ''
substituteInPlace ${e.dir}/CMakeLists.txt \
--replace ${e.file} ""
rm ${e.dir}/${e.file}
'') disabledTests}
substituteInPlace "libfreerdp/freerdp.pc.in" \
--replace "Requires:" "Requires: @WINPR_PKG_CONFIG_FILENAME@"
''
+ lib.optionalString (pcsclite != null) ''
substituteInPlace "winpr/libwinpr/smartcard/smartcard_pcsc.c" \
--replace "libpcsclite.so" "${lib.getLib pcsclite}/lib/libpcsclite.so"
''
+ lib.optionalString nocaps ''
substituteInPlace "libfreerdp/locale/keyboard_xkbfile.c" \
--replace "RDP_SCANCODE_CAPSLOCK" "RDP_SCANCODE_LCONTROL"
'';
buildInputs =
[
cairo
cups
faad2
ffmpeg
fuse3
glib
gst-plugins-base
gst-plugins-good
gstreamer
icu
libX11
libXcursor
libXdamage
libXdmcp
libXext
libXi
libXinerama
libXrandr
libXrender
libXtst
libXv
libjpeg_turbo
libpulseaudio
libunwind
libusb1
libxkbcommon
libxkbfile
openh264
openssl
orc
pcre2
pcsclite
zlib
SDL2
SDL2_ttf
krb5
cjson
pkcs11helper
webkitgtk_4_1
]
++ optionals stdenv.isLinux [
alsa-lib
libv4l
systemd
wayland
]
++ optionals stdenv.isDarwin [
AudioToolbox
AVFoundation
Carbon
Cocoa
CoreMedia
]
++ optionals withUnfree [ faac ];
nativeBuildInputs = [
cmake
libxslt
docbook-xsl-nons
pkg-config
] ++ optionals stdenv.isLinux [
wayland-scanner
];
doCheck = true;
# https://github.com/FreeRDP/FreeRDP/issues/8526#issuecomment-1357134746
cmakeFlags =
[
"-Wno-dev"
"-DCMAKE_INSTALL_LIBDIR=lib"
"-DDOCBOOKXSL_DIR=${docbook-xsl-nons}/xml/xsl/docbook"
]
++ lib.mapAttrsToList (k: v: "-D${k}=${cmFlag v}") {
BUILD_TESTING = false; # false is recommended by upstream
WITH_CAIRO = cairo != null;
WITH_CUPS = cups != null;
WITH_FAAC = withUnfree && faac != null;
WITH_FAAD2 = faad2 != null;
WITH_JPEG = libjpeg_turbo != null;
WITH_OPENH264 = openh264 != null;
WITH_OSS = false;
WITH_PCSC = pcsclite != null;
WITH_PULSE = libpulseaudio != null;
WITH_SERVER = buildServer;
WITH_VAAPI = false; # false is recommended by upstream
WITH_X11 = true;
};
env = {
NIX_CFLAGS_COMPILE = lib.optionalString stdenv.isDarwin "-DTARGET_OS_IPHONE=0 -DTARGET_OS_WATCH=0 -include AudioToolbox/AudioToolbox.h";
NIX_LDFLAGS = lib.optionalString stdenv.isDarwin "-framework AudioToolbox";
};
meta = with lib; {
description = "A Remote Desktop Protocol Client";
longDescription = ''
FreeRDP is a client-side implementation of the Remote Desktop Protocol (RDP)
following the Microsoft Open Specifications.
'';
homepage = "https://www.freerdp.com/";
license = licenses.asl20;
maintainers = with maintainers; [ peterhoeg ];
platforms = platforms.unix;
};
}
================================================
FILE: pkgs/freerdp3/metadata.nix
================================================
rec {
domain = "github.com";
owner = "FreeRDP";
repo = "FreeRDP";
repo_git = "https://${domain}/${owner}/${repo}";
branch = "master";
rev = "6111ac458c041e7d21d88910deb2f061317a743f";
sha256 = "sha256-yOkJ1uT8CwnhsjAR2E9nD2F+FXFm3ZbZFVY4913rVI4=";
# Can't find SDL2 started in https://github.com/FreeRDP/FreeRDP/pull/10996 probably
skip = true;
}
================================================
FILE: pkgs/gebaar-libinput/metadata.nix
================================================
rec {
domain = "github.com";
owner = "Osleg";
repo = "gebaar-libinput-fork";
repo_git = "https://${domain}/${owner}/${repo}";
branch = "master";
rev = "6ce14eb64a9f4bb8201bae26052521ae5e64f553";
sha256 = "sha256-NwF9TOJ6SzJJBa7mrUOCLEhz2xf0it7rVuOzhqvDwt0=";
}
================================================
FILE: pkgs/glpaper/metadata.nix
================================================
rec {
type = "hgsourcehut";
domain = "hg.sr.ht";
owner = "~scoopta";
repo = "glpaper";
repo_hg = "https://${domain}/${owner}/${repo}";
branch = "default";
rev = "af9827d20bfe";
sha256 = "sha256-zgvnWqsw243jZ9e6fG6L0hDfRRHwzmIdsxwnnWhimu0=";
}
================================================
FILE: pkgs/grim/metadata.nix
================================================
rec {
domain = "github.com";
owner = "emersion";
repo = "grim";
repo_git = "https://${domain}/${owner}/${repo}";
branch = "master";
rev = "47e2658619c6b5a790732c5876fb84e8273f08a9";
sha256 = "sha256-X3NHAFe27hnjM6YQ5YsFJWkGYe+mRAFUjiR20R5tTAQ=";
}
================================================
FILE: pkgs/gtk-layer-shell/metadata.nix
================================================
rec {
domain = "github.com";
owner = "wmww";
repo = "gtk-layer-shell";
repo_git = "https://${domain}/${owner}/${repo}";
branch = "master";
rev = "2a8ddaa09844ba78783c95d288300a1d8a93e429";
sha256 = "sha256-+vJouQEauTe/dp2WdOJcc2Byv1+Hb0iaUgwBPnV9g48=";
}
================================================
FILE: pkgs/i3status-rust/metadata.nix
================================================
rec {
domain = "github.com";
owner = "greshake";
repo = "i3status-rust";
repo_git = "https://${domain}/${owner}/${repo}";
branch = "master";
rev = "bb1a479bbb77cf6b390be87f948a3b4f756fa8c0";
sha256 = "sha256-utEFjWCyCbp5Jw1+NP4abaCuEGGKXrjZhSWqdTaxYHI=";
}
================================================
FILE: pkgs/imv/metadata.nix
================================================
rec {
type = "gitsourcehut";
domain = "git.sr.ht";
owner = "~exec64";
repo = "imv";
repo_git = "https://${domain}/${owner}/${repo}";
branch = "master";
rev = "8f36d35ff6a844de7d338a4e9b34bc98f114014b";
sha256 = "sha256-aJ2EXgsS0WUTxMqC1Q+uOWLG8BeuwAyXPmJB/9/NCCU=";
}
================================================
FILE: pkgs/kanshi/metadata.nix
================================================
rec {
type = "gitsourcehut";
domain = "git.sr.ht";
owner = "~emersion";
repo = "kanshi";
repo_git = "https://${domain}/${owner}/${repo}";
branch = "master";
rev = "00a653a9c5172a7fe97c4669f63703ac4a681007";
sha256 = "sha256-14n7k3GWghRfqjA7BwRofkUeajo2XH0fWAaICSc7pAM=";
}
================================================
FILE: pkgs/lavalauncher/metadata.nix
================================================
rec {
type = "gitsourcehut";
domain = "git.sr.ht";
owner = "~leon_plickat";
repo = "lavalauncher";
repo_git = "https://${domain}/${owner}/${repo}";
branch = "master";
rev = "da17d8a29bfc6b78280242b8fdbcb1b6df4f8aff";
sha256 = "sha256-hobhZ6s9m2xCdAurdj0EF1BeS88j96133zu+2jb1FMM=";
}
================================================
FILE: pkgs/libvncserver_master/metadata.nix
================================================
rec {
domain = "github.com";
owner = "LibVNC";
repo = "libvncserver";
repo_git = "https://${domain}/${owner}/${repo}";
branch = "master";
rev = "4c15a85d448c33f08ddd3d713672c70ea507f5ee";
sha256 = "sha256-YHe4DYlYNy1L7KzfvdVlLDxEi8we3UezEAaMSBfIhhc=";
}
================================================
FILE: pkgs/libvncserver_master/pkgconfig.patch
================================================
diff --git a/src/libvncclient/libvncclient.pc.cmakein b/src/libvncclient/libvncclient.pc.cmakein
index ceeda39d..2516e643 100644
--- a/src/libvncclient/libvncclient.pc.cmakein
+++ b/src/libvncclient/libvncclient.pc.cmakein
@@ -1,7 +1,7 @@
prefix=@CMAKE_INSTALL_PREFIX@
exec_prefix=@CMAKE_INSTALL_PREFIX@
-libdir=@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_LIBDIR@
-includedir=@CMAKE_INSTALL_PREFIX@/include
+libdir=@CMAKE_INSTALL_FULL_LIBDIR@
+includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@
Name: LibVNCClient
Description: A library for easy implementation of a VNC client.
diff --git a/src/libvncserver/libvncserver.pc.cmakein b/src/libvncserver/libvncserver.pc.cmakein
index 33ec6685..57244742 100644
--- a/src/libvncserver/libvncserver.pc.cmakein
+++ b/src/libvncserver/libvncserver.pc.cmakein
@@ -1,7 +1,7 @@
prefix=@CMAKE_INSTALL_PREFIX@
exec_prefix=@CMAKE_INSTALL_PREFIX@
-libdir=@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_LIBDIR@
-includedir=@CMAKE_INSTALL_PREFIX@/include
+libdir=@CMAKE_INSTALL_FULL_LIBDIR@
+includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@
Name: LibVNCServer
Description: A library for easy implementation of a VNC server.
================================================
FILE: pkgs/mako/metadata.nix
================================================
rec {
domain = "github.com";
owner = "emersion";
repo = "mako";
repo_git = "https://${domain}/${owner}/${repo}";
branch = "master";
rev = "84637d1cb42def0ef74d6ec961e05c3900b4c23f";
sha256 = "sha256-5Mv0P/SoUiJIiYvGm5wvNZhtz2ytwsqqRc3Pk3ju0WA=";
}
================================================
FILE: pkgs/neatvnc/metadata.nix
================================================
rec {
domain = "github.com";
owner = "any1";
repo = "neatvnc";
repo_git = "https://${domain}/${owner}/${repo}";
branch = "master";
rev = "4962e0af5d550b2c4fd34c79dbdca543f233d87c";
sha256 = "sha256-6xHasCH27useFWYPzDlUe0eaZ81WZu4JtftPb+ks+kk=";
}
================================================
FILE: pkgs/new-wayland-protocols/metadata.nix
================================================
rec {
type = "gitlab";
domain = "gitlab.freedesktop.org";
owner = "wayland";
repo = "wayland-protocols";
repo_git = "https://${domain}/${owner}/${repo}";
branch = "main";
rev = "6a73aacd7c04a1e40d64ce28d48fe10df550b6fb";
sha256 = "sha256-ykzFUVSg8kCkhYwO8IBiwiCAURumU5bQqqjn2gHi1sA=";
}
================================================
FILE: pkgs/obs-wlrobs/metadata.nix
================================================
rec {
type = "hgsourcehut";
domain = "hg.sr.ht";
owner = "~scoopta";
repo = "wlrobs";
repo_hg = "https://${domain}/${owner}/${repo}";
branch = "default";
rev = "b8668b4d6d6d";
sha256 = "sha256-gqGnDrfID5hTcpX3EkSGg4yDwa/ZKCQCqJ3feq44I1I=";
}
================================================
FILE: pkgs/rootbar/metadata.nix
================================================
rec {
type = "hgsourcehut";
domain = "hg.sr.ht";
owner = "~scoopta";
repo = "rootbar";
repo_hg = "https://${domain}/${owner}/${repo}";
branch = "default";
rev = "36333af9fd8d";
sha256 = "sha256-CpORCSJyHZhcK14EhjxoPt/h0026NU5J/kicL1dX96o=";
}
================================================
FILE: pkgs/salut/default.nix
================================================
{
lib,
rustPlatform,
fetchFromGitLab,
pkg-config,
libxkbcommon,
fontconfig,
}:
let
metadata = import ./metadata.nix;
in
rustPlatform.buildRustPackage rec {
pname = "salut";
version = metadata.rev;
src = fetchFromGitLab {
inherit (metadata)
owner
repo
rev
sha256
;
};
cargoLock = {
lockFile = src + "/Cargo.lock";
allowBuiltinFetchGit = true;
};
nativeBuildInputs = [ pkg-config ];
buildInputs = [
libxkbcommon
fontconfig
];
meta = with lib; {
description = "A sleek notification daemon";
homepage = "https://gitlab.com/snakedye/salut";
license = licenses.mpl20;
};
}
================================================
FILE: pkgs/salut/metadata.nix
================================================
rec {
owner = "snakedye";
repo = "salut";
repo_git = "https://gitlab.com/${owner}/${repo}";
branch = "master";
rev = "aa57c4d190812908a9c32cd49cff14390c6dfdcb";
sha256 = "sha256-W0lhhImSXtYJDeMbxyEioYu/Bh7ZclwR1/5DzNbxM8o=";
}
================================================
FILE: pkgs/shotman/metadata.nix
================================================
rec {
type = "gitsourcehut";
domain = "git.sr.ht";
owner = "~whynothugo";
repo = "shotman";
repo_git = "https://${domain}/${owner}/${repo}";
branch = "main";
rev = "da244d40ac8e60b37c77ecef4fde053cfbb6b82d";
sha256 = "sha256-j9HNqRJnGiy720uS0zC6Tt1WjF4b6+XqPEMTqTEOD6w=";
}
================================================
FILE: pkgs/sirula/metadata.nix
================================================
rec {
domain = "github.com";
owner = "DorianRudolph";
repo = "sirula";
repo_git = "https://${domain}/${owner}/${repo}";
branch = "master";
rev = "83efe28847060c30be311f6861e71bef6a407718";
sha256 = "sha256-njXsPgagJwpuqYQ2QxmOQS5SWElouwh1pomf52dYeG4=";
}
================================================
FILE: pkgs/slurp/metadata.nix
================================================
rec {
domain = "github.com";
owner = "emersion";
repo = "slurp";
repo_git = "https://${domain}/${owner}/${repo}";
branch = "master";
rev = "1de937788344c0c2beafd4a264fd8bfcf919bd93";
sha256 = "sha256-ywQwXK+1B6/TknkRDhOR0rTtQcLn35JK27UM/Ez4aF0=";
}
================================================
FILE: pkgs/sway-unwrapped/metadata.nix
================================================
rec {
upattr = "sway-unwrapped";
domain = "github.com";
owner = "swaywm";
repo = "sway";
repo_git = "https://${domain}/${owner}/${repo}";
branch = "master";
rev = "340505bb6f6ad2418448445fa7e5d58f771c3b4d";
sha256 = "sha256-AdggynGr51YRzrro1723JTASQJhtUY2hoZLhSLEUppE=";
}
================================================
FILE: pkgs/swaybg/metadata.nix
================================================
rec {
domain = "github.com";
owner = "swaywm";
repo = "swaybg";
repo_git = "https://${domain}/${owner}/${repo}";
branch = "master";
rev = "1bf721fcb61a7c78cc618868640a3ab24c5a3077";
sha256 = "sha256-AYZGM8EDQvpyv+vVHzihakltSWapSvnxio9yJcBWvRo=";
}
================================================
FILE: pkgs/swayidle/metadata.nix
================================================
rec {
domain = "github.com";
owner = "swaywm";
repo = "swayidle";
repo_git = "https://${domain}/${owner}/${repo}";
branch = "master";
rev = "c5e0e1fd11677b7732c073e1709cf92be9184c04";
sha256 = "sha256-CWp7YVG1qedSzZR3bO19Ppn1ojKpaB5xRYFw4rdAPUM=";
}
================================================
FILE: pkgs/swaylock/metadata.nix
================================================
rec {
domain = "github.com";
owner = "swaywm";
repo = "swaylock";
repo_git = "https://${domain}/${owner}/${repo}";
branch = "master";
rev = "b0f417c488fd12b1ac9f7c3eea9b49d6221b761d";
sha256 = "sha256-5JAA8mCY3vOsauvRK2zquBrzA2ROakEfahzp4a6j/Ac=";
}
================================================
FILE: pkgs/swaylock-effects/metadata.nix
================================================
rec {
domain = "github.com";
owner = "jirutka";
repo = "swaylock-effects";
repo_git = "https://${domain}/${owner}/${repo}";
branch = "master";
rev = "496059a8565c2d5eed672c2e5bc5e1edd14b3de8";
sha256 = "sha256-8RDaa7IvMpG3GK6wd0EPO+lLeQlr5ioVa5oyR9wct1U=";
}
================================================
FILE: pkgs/swww/metadata.nix
================================================
rec {
owner = "Horus645";
repo = "swww";
repo_git = "https://github.com/${owner}/${repo}";
branch = "main";
rev = "63d71f2b8c6d1533b5fef748dfc490dd461e343c";
sha256 = "sha256-KzuedC2yJU56sRBeMlndPuXK6UWHxSUtgAmJ/+Gww6I=";
}
================================================
FILE: pkgs/waybar/metadata.nix
================================================
rec {
domain = "github.com";
owner = "Alexays";
repo = "Waybar";
repo_git = "https://${domain}/${owner}/${repo}";
branch = "master";
rev = "0776e694df56c2c849b682369148210d81324e93";
sha256 = "sha256-rwN74KZdAQVLdengxHpUwkyaZTdoRzFjJ3SSr6rx2/o=";
}
================================================
FILE: pkgs/waypipe/metadata.nix
================================================
rec {
type = "gitlab";
domain = "gitlab.freedesktop.org";
owner = "mstoeckl";
repo = "waypipe";
repo_git = "https://${domain}/${owner}/${repo}";
branch = "master";
rev = "21639c783328e22faadeb1de8fab5b17b8d36abb";
sha256 = "sha256-BlKhtnhJkvVHxwW9UNDK7eCda2Awp2+h2TEuTpSWHtA=";
}
================================================
FILE: pkgs/wayvnc/metadata.nix
================================================
rec {
domain = "github.com";
owner = "any1";
repo = "wayvnc";
repo_git = "https://${domain}/${owner}/${repo}";
branch = "master";
rev = "1f7d299a318abd60af29c37b04175429f7a6c060";
sha256 = "sha256-FC3JT6G+8exK3WT+EmweOf/vrwmARiMnBh3zEuT2ZJs=";
}
================================================
FILE: pkgs/wbg/metadata.nix
================================================
rec {
type = "gitea";
domain = "codeberg.org";
owner = "dnkl";
repo = "wbg";
repo_git = "https://${domain}/${owner}/${repo}";
branch = "master";
rev = "bc00df2244a0d8f88d4051f505ef9aebb51447ca";
sha256 = "sha256-L+20795gILq4ClmKQFwBd2QJAJdH1sG2YXiTDMEVi7s=";
}
================================================
FILE: pkgs/wdisplays/metadata.nix
================================================
rec {
domain = "github.com";
owner = "artizirk";
repo = "wdisplays";
repo_git = "https://${domain}/${owner}/${repo}";
branch = "master";
rev = "157b8c51e850dc5f6b490f56f35cb101a9054e4c";
sha256 = "sha256-KabaW2BH4zAS0xWkzCM8YaAnP/hkZL7Wq3EARantRis=";
}
================================================
FILE: pkgs/wev/metadata.nix
================================================
rec {
type = "gitsourcehut";
domain = "git.sr.ht";
owner = "~sircmpwn";
repo = "wev";
repo_git = "https://${domain}/${owner}/${repo}";
branch = "master";
rev = "2a46014ec5e375139f91aed456d5f01065964f86";
sha256 = "sha256-0ZA44dMDuVYfplfutOfI2EdPNakE9KnOuRfk+CEDCRk=";
}
================================================
FILE: pkgs/wf-recorder/metadata.nix
================================================
rec {
domain = "github.com";
owner = "ammen99";
repo = "wf-recorder";
repo_git = "https://${domain}/${owner}/${repo}";
branch = "master";
rev = "664fc451caa7559a39c2cdd70ff02ea781e2d4b3";
sha256 = "sha256-poQ8Fe5cjpuf2t9OMI05PmCcFlium+cCiJB55x9jHvs=";
}
================================================
FILE: pkgs/wl-clipboard/metadata.nix
================================================
rec {
domain = "github.com";
owner = "bugaevc";
repo = "wl-clipboard";
repo_git = "https://${domain}/${owner}/${repo}";
branch = "master";
rev = "aaa927ee7f7d91bcc25a3b68f60d01005d3b0f7f";
sha256 = "sha256-V8JAai4gZ1nzia4kmQVeBwidQ+Sx5A5on3SJGSevrUU=";
}
================================================
FILE: pkgs/wl-gammarelay-rs/default.nix
================================================
{
lib,
fetchFromGitHub,
rustPlatform,
}:
let
metadata = import ./metadata.nix;
in
rustPlatform.buildRustPackage rec {
pname = "wl-gammarelay-rs";
version = metadata.rev;
src = fetchFromGitHub {
inherit (metadata)
owner
repo
rev
sha256
;
};
cargoLock = {
lockFile = src + "/Cargo.lock";
allowBuiltinFetchGit = true;
};
meta = with lib; {
description = "A simple program that provides DBus interface to control display temperature and brightness under wayland without flickering ";
homepage = "https://github.com/MaxVerevkin/wl-gammarelay-rs";
license = licenses.gpl3;
maintainers = with maintainers; [ artturin ];
};
}
================================================
FILE: pkgs/wl-gammarelay-rs/metadata.nix
================================================
rec {
domain = "github.com";
owner = "MaxVerevkin";
repo = "wl-gammarelay-rs";
repo_git = "https://${domain}/${owner}/${repo}";
branch = "main";
rev = "1dde760b03a5afd4761af17d8c49b7058cbd800d";
sha256 = "sha256-WdY90CUtphtUUFAh+daSQGmlWTn28Qc79A5yHTV3IOY=";
}
================================================
FILE: pkgs/wl-screenrec/metadata.nix
================================================
rec {
domain = "github.com";
owner = "russelltg";
repo = "wl-screenrec";
repo_git = "https://${domain}/${owner}/${repo}";
branch = "main";
rev = "a3d0b5da69487441ce81ebfc3be8ba8d2255c714";
sha256 = "sha256-DE0Olwc2hYuGjkA1p1kbEXxMmoWOH7PTrne6pm1z97s=";
}
================================================
FILE: pkgs/wlay/metadata.nix
================================================
rec {
domain = "github.com";
owner = "atx";
repo = "wlay";
repo_git = "https://${domain}/${owner}/${repo}";
branch = "master";
rev = "ed316060ac3ac122c0d3d8918293e19dfe9a6c90";
sha256 = "sha256-Lu+EyoDHiXK9QzD4jdwbllCOCl2aEU+uK6/KxC2AUGQ=";
}
================================================
FILE: pkgs/wldash/default.nix
================================================
{
lib,
rustPlatform,
fetchFromGitHub,
pkg-config,
dbus,
libpulseaudio,
alsa-lib,
libxkbcommon,
wayland,
fontconfig,
}:
let
metadata = import ./metadata.nix;
libraryPath = lib.makeLibraryPath [
wayland
];
in
rustPlatform.buildRustPackage rec {
pname = "wldash";
version = metadata.rev;
src = fetchFromGitHub {
owner = "kennylevinsen";
repo = "wldash";
inherit (metadata) rev;
inherit (metadata) sha256;
};
cargoLock = {
lockFile = src + "/Cargo.lock";
allowBuiltinFetchGit = true;
};
nativeBuildInputs = [ pkg-config ];
buildInputs = [
dbus
libpulseaudio
alsa-lib
fontconfig
libxkbcommon
];
dontPatchELF = true;
postInstall = ''
patchelf --set-rpath ${libraryPath}:$(patchelf --print-rpath $out/bin/wldash) $out/bin/wldash
'';
meta = with lib; {
description = "Wayland launcher/dashboard";
homepage = "https://wldash.org";
license = licenses.gpl3;
maintainers = with maintainers; [ alexarice ];
platforms = [
"x86_64-linux"
"i686-linux"
];
};
}
================================================
FILE: pkgs/wldash/metadata.nix
================================================
rec {
domain = "github.com";
owner = "kennylevinsen";
repo = "wldash";
repo_git = "https://${domain}/${owner}/${repo}";
branch = "master";
rev = "1156b3503a04780bbdcb6a781cce87281b8bf87d";
sha256 = "sha256-1MKZByK2afNHvd2h4ISb2ON6O0XCegBJ+xX3C223PY0=";
}
================================================
FILE: pkgs/wlogout/metadata.nix
================================================
rec {
domain = "github.com";
owner = "ArtsyMacaw";
repo = "wlogout";
repo_git = "https://${domain}/${owner}/${repo}";
branch = "master";
rev = "350fe88bd5fe818b386d503d766fe34b6ba0f87d";
sha256 = "sha256-/JEuFRKvtXiQPWswbXzFuqivNifP8VVfSKJQWZNbDlw=";
}
================================================
FILE: pkgs/wlr-randr/metadata.nix
================================================
rec {
type = "gitsourcehut";
domain = "git.sr.ht";
owner = "~emersion";
repo = "wlr-randr";
repo_git = "https://${domain}/${owner}/${repo}";
branch = "master";
rev = "3eac217684b8d9da2f9d4ab1784d0227dd04aa4a";
sha256 = "sha256-ncIUhePR/Njxti2OZU77umNgk60YVGhhOLETpHZgrcI=";
}
================================================
FILE: pkgs/wlroots/default.nix
================================================
args_@{
lib,
fetchFromGitLab,
wlroots,
libdisplay-info,
hwdata,
lcms2,
...
}:
let
metadata = import ./metadata.nix;
ignore = [
"wlroots"
"hwdata"
"libdisplay-info"
"lcms2"
];
args = lib.filterAttrs (n: _v: (!builtins.elem n ignore)) args_;
in
(wlroots.override args).overrideAttrs (old: {
version = "${metadata.rev}";
buildInputs = old.buildInputs ++ [
hwdata
libdisplay-info
lcms2
];
src = fetchFromGitLab {
inherit (metadata)
domain
owner
repo
rev
sha256
;
};
})
================================================
FILE: pkgs/wlroots/metadata.nix
================================================
rec {
domain = "gitlab.freedesktop.org";
owner = "wlroots";
repo = "wlroots";
repo_git = "https://${domain}/${owner}/${repo}";
branch = "master";
rev = "12316417b033465114705430105785e72dfe345d";
sha256 = "sha256-o0a0GBlKnDNZL/vAZN/a+QbZ8NWjD4F2bcQLAaPvkoY=";
}
================================================
FILE: pkgs/wlsunset/metadata.nix
================================================
rec {
type = "gitsourcehut";
domain = "git.sr.ht";
owner = "~kennylevinsen";
repo = "wlsunset";
repo_git = "https://${domain}/${owner}/${repo}";
branch = "master";
rev = "c056294f0f6022abec4eeab2fb7a1732f5a20f08";
sha256 = "sha256-GhU27nmE6FEDhU1GT1xN6bB7MXePAVK8ZPFlEbHG8VQ=";
}
================================================
FILE: pkgs/wlvncc/default.nix
================================================
{
stdenv,
lib,
fetchFromGitHub,
pkg-config,
meson,
ninja,
wayland,
wayland-protocols,
wayland-scanner,
libxkbcommon,
libvncserver,
libpthreadstubs,
lzo,
pixman,
libuv,
libglvnd,
libjpeg,
libpng,
neatvnc,
libX11,
libdrm,
aml,
libgbm,
ffmpeg,
openssl,
}:
let
metadata = import ./metadata.nix;
in
stdenv.mkDerivation rec {
pname = "wlvncc";
version = metadata.rev;
src = fetchFromGitHub {
owner = "any1";
repo = "wlvncc";
inherit (metadata) rev;
inherit (metadata) sha256;
};
nativeBuildInputs = [
pkg-config
wayland-scanner
meson
ninja
];
buildInputs = [
wayland
wayland-protocols
libxkbcommon
libvncserver
libpthreadstubs
lzo
pixman
libuv
libglvnd
libjpeg
libpng
neatvnc
libX11
libdrm
aml
libgbm
ffmpeg
openssl
];
enableParallelBuilding = true;
meta = with lib; {
description = "A Wayland Native VNC Client";
homepage = "https://github.com/any1/wlvncc";
license = licenses.isc;
platforms = platforms.linux;
maintainers = with maintainers; [ colemickens ];
};
}
================================================
FILE: pkgs/wlvncc/metadata.nix
================================================
rec {
domain = "github.com";
owner = "any1";
repo = "wlvncc";
repo_git = "https://${domain}/${owner}/${repo}";
branch = "master";
rev = "860232f34a77837915a94078efe8cd527fa582e3";
sha256 = "sha256-4VaBvocqnDf58RlIgCYwSy1YKlnKmzGU9kTYsxd4y98=";
}
================================================
FILE: pkgs/wob/metadata.nix
================================================
rec {
domain = "github.com";
owner = "francma";
repo = "wob";
repo_git = "https://${domain}/${owner}/${repo}";
branch = "master";
rev = "f7668d9715256a9d0dd05bc9eba7799d5ab2ce2d";
sha256 = "sha256-tLz2A/RLHkA7iEfCLr22rVcTmnWLVp8BM58MuJ/NGEI=";
}
================================================
FILE: pkgs/wofi/metadata.nix
================================================
rec {
type = "hgsourcehut";
domain = "hg.sr.ht";
owner = "~scoopta";
repo = "wofi";
repo_hg = "https://${domain}/${owner}/${repo}";
branch = "default";
rev = "ab9ba6305016";
sha256 = "sha256-XNM1vbdQOcm3pC6wgbTJeBxUqtGGnEi4ljZ6AQEkQ6o=";
}
================================================
FILE: pkgs/wshowkeys/metadata.nix
================================================
rec {
domain = "github.com";
owner = "ammgws";
repo = "wshowkeys";
repo_git = "https://${domain}/${owner}/${repo}";
branch = "main";
rev = "e8bfc78f08ebdd1316daae59ecc77e62bba68b2b";
sha256 = "sha256-/HvNCQWsXOJZeCxHWmsLlbBDhBzF7XP/SPLdDiWMDC4=";
}
================================================
FILE: pkgs/wtype/metadata.nix
================================================
rec {
domain = "github.com";
owner = "atx";
repo = "wtype";
repo_git = "https://${domain}/${owner}/${repo}";
branch = "master";
rev = "d71be3a7b3f93b534a2823fd68cabd7ac2a02359";
sha256 = "sha256-TfpzAi0mkXugQn70MISyNFOXIJpDwvgh3enGv0Xq8S4=";
}
================================================
FILE: pkgs/xdg-desktop-portal-wlr/metadata.nix
================================================
rec {
domain = "github.com";
owner = "emersion";
repo = "xdg-desktop-portal-wlr";
repo_git = "https://${domain}/${owner}/${repo}";
branch = "master";
rev = "e471c3dfe5fe03921fd7109e6affe7740f9503c3";
sha256 = "sha256-9T73obDmx4gsGo6KdaQHoBqOCig4/6TVJWhx7tOpym4=";
}
================================================
FILE: shell.nix
================================================
# This file provides backward compatibility to nix < 2.4 clients
{
system ? builtins.currentSystem,
}:
let
lock = builtins.fromJSON (builtins.readFile ./flake.lock);
inherit (lock.nodes.flake-compat.locked)
owner
repo
rev
narHash
;
flake-compat = fetchTarball {
url = "https://github.com/${owner}/${repo}/archive/${rev}.tar.gz";
sha256 = narHash;
};
flake = import flake-compat {
inherit system;
src = ./.;
};
in
flake.shellNix
================================================
FILE: templates/template.nix
================================================
args_@{
attrName,
# the attr in nixpkgs could be different from what we want to provide
# example: us libvncserver_master nixpkgs libvncserver
nixpkgsAttrName,
prev,
extra,
replace,
replaceInput,
deprecationWarning,
...
}:
let
inherit (prev) lib;
metadata = import ../pkgs/${attrName}/metadata.nix;
ignore = [
"attrName"
"nixpkgsAttrName"
"prev"
"extra"
"replace"
"replaceInput"
"deprecationWarning"
];
args = builtins.removeAttrs (args_ // replaceInput) ignore;
nixpkgsAttr = if nixpkgsAttrName != "" then nixpkgsAttrName else attrName;
overridenAttr =
(lib.attrByPath (lib.splitString "." nixpkgsAttr)
(throw "attr ${attrName} does not exist in nixpkgs")
prev
).override
args;
overridenAttr' = lib.warnIf (
deprecationWarning != ""
) "nixpkgs-wayland: ${deprecationWarning}" overridenAttr;
fetchers =
let
fetchSubmodules = metadata.fetchSubmodules or overridenAttr.src.fetchSubmodules or false;
in
{
github = prev.fetchFromGitHub {
inherit (metadata)
owner
repo
rev
sha256
;
inherit fetchSubmodules;
};
gitlab = prev.fetchFromGitLab {
inherit (metadata)
owner
repo
rev
sha256
;
domain = metadata.domain or "gitlab.com";
# uncomment after https://github.com/NixOS/nixpkgs/pull/198489
#inherit fetchSubmodules;
};
gitea = prev.fetchFromGitea {
inherit (metadata)
owner
repo
rev
sha256
domain
;
inherit fetchSubmodules;
};
gitsourcehut = prev.fetchFromSourcehut {
inherit (metadata)
owner
repo
rev
sha256
;
inherit fetchSubmodules;
};
hgsourcehut = prev.fetchFromSourcehut {
inherit (metadata)
owner
repo
rev
sha256
;
vc = "hg";
};
};
src = fetchers.${metadata.type or "github"};
cargoLock = {
lockFile = src + "/Cargo.lock";
allowBuiltinFetchGit = true;
};
replace' = previousAttrs: if builtins.isFunction replace then replace previousAttrs else replace;
in
overridenAttr'.overrideAttrs (
previousAttrs:
(
{
pname = attrName;
version = "+${lib.substring 0 7 metadata.rev}";
inherit src;
# `--version` will be different than the version above
dontVersionCheck = true;
}
// lib.optionalAttrs (src ? meta.homepage) {
meta = previousAttrs.meta // {
inherit (src.meta) homepage;
# null changelog as it may use `finalAttrs.src.tag` while we use `rev`
changelog = null;
};
}
// lib.optionalAttrs (extra ? depsBuildBuild) {
depsBuildBuild = extra.depsBuildBuild ++ previousAttrs.depsBuildBuild;
}
// lib.optionalAttrs (extra ? nativeBuildInputs) {
nativeBuildInputs = extra.nativeBuildInputs ++ previousAttrs.nativeBuildInputs;
}
// lib.optionalAttrs (extra ? mesonFlags) {
mesonFlags = previousAttrs.mesonFlags ++ extra.mesonFlags;
}
// lib.optionalAttrs (extra ? buildInputs) {
buildInputs = extra.buildInputs ++ previousAttrs.buildInputs;
}
// lib.optionalAttrs (previousAttrs ? cargoDeps) {
cargoDeps = prev.rustPlatform.importCargoLock cargoLock;
cargoHash = null;
}
// replace' previousAttrs
)
)