diff --git a/flake.nix b/flake.nix index f556c99..8a3decb 100644 --- a/flake.nix +++ b/flake.nix @@ -85,6 +85,8 @@ neovim-nightly = neovim-nightly.overlays.default; jpassmenu = jpassmenu.overlays.default; audiomenu = audiomenu.overlays.default; + # Pin to v0.9 due to https://github.com/Alexays/Waybar/issues/3009 + "waybar-0.9" = final: prev: { waybar = final.callPackage ./waybar.nix { }; }; }; # Nix files formatter (run `nix fmt`) diff --git a/waybar.nix b/waybar.nix new file mode 100644 index 0000000..dad61b8 --- /dev/null +++ b/waybar.nix @@ -0,0 +1,195 @@ +{ lib +, stdenv +, bash +, fetchFromGitHub +, SDL2 +, alsa-lib +, catch2_3 +, fftw +, glib +, gobject-introspection +, gtk-layer-shell +, gtkmm3 +, howard-hinnant-date +, hyprland +, iniparser +, jsoncpp +, libdbusmenu-gtk3 +, libevdev +, libinotify-kqueue +, libinput +, libjack2 +, libmpdclient +, libnl +, libpulseaudio +, libsigcxx +, libxkbcommon +, meson +, ncurses +, ninja +, pipewire +, pkg-config +, playerctl +, portaudio +, python3 +, scdoc +, sndio +, spdlog +, sway +, udev +, upower +, wayland +, wireplumber +, wrapGAppsHook + +, cavaSupport ? true +, evdevSupport ? true +, experimentalPatches ? true +, hyprlandSupport ? true +, inputSupport ? true +, jackSupport ? true +, mpdSupport ? true +, mprisSupport ? stdenv.isLinux +, nlSupport ? true +, pulseSupport ? true +, rfkillSupport ? true +, runTests ? true +, sndioSupport ? true +, swaySupport ? true +, traySupport ? true +, udevSupport ? true +, upowerSupport ? true +, wireplumberSupport ? true +, withMediaPlayer ? mprisSupport && false +}: + +let + # Derived from subprojects/cava.wrap + libcava.src = fetchFromGitHub { + owner = "LukashonakV"; + repo = "cava"; + rev = "0.9.1"; + hash = "sha256-FnRJJV0poRmw+y4nt1X7Z0ipX86LRK1TJhNKHFk0rTw="; + }; +in +stdenv.mkDerivation (finalAttrs: { + pname = "waybar"; + version = "0.9.24"; + + src = fetchFromGitHub { + owner = "Alexays"; + repo = "Waybar"; + rev = finalAttrs.version; + hash = "sha256-JhLKGzqZ8akWcyHTav2TGcGmXk9dy9Xj4+/oFCPeNU0="; + }; + + postUnpack = lib.optional cavaSupport '' + pushd "$sourceRoot" + cp -R --no-preserve=mode,ownership ${libcava.src} subprojects/cava-0.9.1 + patchShebangs . + popd + ''; + + nativeBuildInputs = [ + meson + ninja + pkg-config + scdoc + wrapGAppsHook + ] ++ lib.optional withMediaPlayer gobject-introspection; + + propagatedBuildInputs = lib.optionals withMediaPlayer [ + glib + playerctl + python3.pkgs.pygobject3 + ]; + + strictDeps = false; + + buildInputs = [ + gtk-layer-shell + gtkmm3 + howard-hinnant-date + jsoncpp + libsigcxx + libxkbcommon + spdlog + wayland + ] + ++ lib.optionals cavaSupport [ + SDL2 + alsa-lib + fftw + iniparser + ncurses + pipewire + portaudio + ] + ++ lib.optional evdevSupport libevdev + ++ lib.optional hyprlandSupport hyprland + ++ lib.optional inputSupport libinput + ++ lib.optional jackSupport libjack2 + ++ lib.optional mpdSupport libmpdclient + ++ lib.optional mprisSupport playerctl + ++ lib.optional nlSupport libnl + ++ lib.optional pulseSupport libpulseaudio + ++ lib.optional sndioSupport sndio + ++ lib.optional swaySupport sway + ++ lib.optional traySupport libdbusmenu-gtk3 + ++ lib.optional udevSupport udev + ++ lib.optional upowerSupport upower + ++ lib.optional wireplumberSupport wireplumber + ++ lib.optional (!stdenv.isLinux) libinotify-kqueue; + + nativeCheckInputs = [ catch2_3 ]; + doCheck = runTests; + + mesonFlags = (lib.mapAttrsToList lib.mesonEnable { + "cava" = cavaSupport; + "dbusmenu-gtk" = traySupport; + "gtk-layer-shell" = true; + "jack" = jackSupport; + "libinput" = inputSupport; + "libnl" = nlSupport; + "libudev" = udevSupport; + "man-pages" = true; + "mpd" = mpdSupport; + "mpris" = mprisSupport; + "pulseaudio" = pulseSupport; + "rfkill" = rfkillSupport; + "sndio" = sndioSupport; + "systemd" = false; + "tests" = runTests; + "upower_glib" = upowerSupport; + "wireplumber" = wireplumberSupport; + }) ++ lib.optional experimentalPatches (lib.mesonBool "experimental" true); + + postPatch = '' + substituteInPlace include/util/command.hpp \ + --replace-fail /bin/sh ${lib.getExe' bash "sh"} + ''; + + preFixup = lib.optionalString withMediaPlayer '' + cp $src/resources/custom_modules/mediaplayer.py $out/bin/waybar-mediaplayer.py + + wrapProgram $out/bin/waybar-mediaplayer.py \ + --prefix PYTHONPATH : "$PYTHONPATH:$out/${python3.sitePackages}" + ''; + + meta = { + homepage = "https://github.com/alexays/waybar"; + description = "Highly customizable Wayland bar for Sway and Wlroots based compositors"; + changelog = "https://github.com/alexays/waybar/releases/tag/${finalAttrs.version}"; + license = lib.licenses.mit; + mainProgram = "waybar"; + maintainers = with lib.maintainers; [ + FlorianFranzen + lovesegfault + minijackson + rodrgz + synthetica + khaneliman + ]; + platforms = lib.platforms.linux; + }; +})