From 22274a6feb1f90dfacd02b63ded1f42f7fdb561b Mon Sep 17 00:00:00 2001 From: Phil Pluckthun Date: Tue, 6 May 2025 14:37:50 +0100 Subject: [PATCH] Add hyprland panel and update fonts --- flake.lock | 69 ++++++++++++++++++++ flake.nix | 9 +++ home/desktop/hyprland.nix | 29 +++++++-- home/desktop/hyprpanel/default.nix | 56 ----------------- home/desktop/hyprpanel/meson.build | 2 - home/desktop/hyprpanel/src/gresource.xml | 7 --- home/desktop/hyprpanel/src/main.scss | 1 - home/desktop/hyprpanel/src/meson.build | 66 ------------------- home/desktop/hyprpanel/src/scss/Bar.scss | 25 -------- home/desktop/hyprpanel/src/ui/Bar.blp | 41 ------------ home/desktop/hyprpanel/src/vala/App.vala | 46 -------------- home/desktop/hyprpanel/src/vala/Bar.vala | 73 ---------------------- lib/pkgs/default.nix | 4 +- lib/pkgs/{sf-pro-mono.nix => new-york.nix} | 12 ++-- lib/pkgs/sf-mono.nix | 24 +++++++ lib/pkgs/sf-pro.nix | 2 +- modules/desktop/fonts.nix | 10 +-- 17 files changed, 139 insertions(+), 337 deletions(-) delete mode 100644 home/desktop/hyprpanel/default.nix delete mode 100644 home/desktop/hyprpanel/meson.build delete mode 100644 home/desktop/hyprpanel/src/gresource.xml delete mode 100644 home/desktop/hyprpanel/src/main.scss delete mode 100644 home/desktop/hyprpanel/src/meson.build delete mode 100644 home/desktop/hyprpanel/src/scss/Bar.scss delete mode 100644 home/desktop/hyprpanel/src/ui/Bar.blp delete mode 100644 home/desktop/hyprpanel/src/vala/App.vala delete mode 100644 home/desktop/hyprpanel/src/vala/Bar.vala rename lib/pkgs/{sf-pro-mono.nix => new-york.nix} (56%) create mode 100644 lib/pkgs/sf-mono.nix diff --git a/flake.lock b/flake.lock index 6071819..40ff71e 100644 --- a/flake.lock +++ b/flake.lock @@ -27,6 +27,28 @@ "type": "github" } }, + "ags": { + "inputs": { + "astal": "astal", + "nixpkgs": [ + "system-shell", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1744557573, + "narHash": "sha256-XAyj0iDuI51BytJ1PwN53uLpzTDdznPDQFG4RwihlTQ=", + "owner": "aylur", + "repo": "ags", + "rev": "3ed9737bdbc8fc7a7c7ceef2165c9109f336bff6", + "type": "github" + }, + "original": { + "owner": "aylur", + "repo": "ags", + "type": "github" + } + }, "android-sdk": { "inputs": { "devshell": "devshell", @@ -74,6 +96,28 @@ "type": "github" } }, + "astal": { + "inputs": { + "nixpkgs": [ + "system-shell", + "ags", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1742571008, + "narHash": "sha256-5WgfJAeBpxiKbTR/gJvxrGYfqQRge5aUDcGKmU1YZ1Q=", + "owner": "aylur", + "repo": "astal", + "rev": "dc0e5d37abe9424c53dcbd2506a4886ffee6296e", + "type": "github" + }, + "original": { + "owner": "aylur", + "repo": "astal", + "type": "github" + } + }, "autocomplete-nvim": { "flake": false, "locked": { @@ -805,6 +849,7 @@ "nixos-hardware": "nixos-hardware", "nixpkgs": "nixpkgs", "nvim-plugins": "nvim-plugins", + "system-shell": "system-shell", "yeetmouse": "yeetmouse", "zen-browser": "zen-browser" } @@ -830,6 +875,30 @@ "type": "github" } }, + "system-shell": { + "inputs": { + "ags": "ags", + "flake-utils": [ + "flake-utils" + ], + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1746537812, + "narHash": "sha256-gr1DbuTbbEa53Hx0BlC+9a382hcUn/XZfdFiQhO8nNw=", + "owner": "kitten", + "repo": "system-shell", + "rev": "bccdaa60737f39c008a79c84fb7b5e36f14dc911", + "type": "github" + }, + "original": { + "owner": "kitten", + "repo": "system-shell", + "type": "github" + } + }, "systems": { "locked": { "lastModified": 1681028828, diff --git a/flake.nix b/flake.nix index c527e46..f49887c 100644 --- a/flake.nix +++ b/flake.nix @@ -54,6 +54,14 @@ }; }; + system-shell = { + url = "github:kitten/system-shell"; + inputs = { + nixpkgs.follows = "nixpkgs"; + flake-utils.follows = "flake-utils"; + }; + }; + nvim-plugins = { url = "github:kitten/system-nvim-plugins.nix"; inputs = { @@ -95,6 +103,7 @@ inputs.language-servers.overlays.default (self: super: { zen-browser = inputs.zen-browser.packages.${self.system}.beta; + system-shell = inputs.system-shell.packages.${self.system}.default; } // (import ./lib/pkgs self)) ]; in { diff --git a/home/desktop/hyprland.nix b/home/desktop/hyprland.nix index 7a44908..42c4f3d 100644 --- a/home/desktop/hyprland.nix +++ b/home/desktop/hyprland.nix @@ -4,8 +4,6 @@ with lib; let cfg = config.modules.desktop; - hyprpanel = pkgs.callPackage ./hyprpanel {}; - wpctl = "${pkgs.wireplumber}/bin/wpctl"; brightnessctl = "${pkgs.brightnessctl}/bin/brightnessctl"; playerctl = "${pkgs.playerctl}/bin/playerctl"; @@ -55,7 +53,9 @@ in { brightness = 0.45; vibrancy = 0.15; vibrancy_darkness = 0.1; - ignore_opacity = true; + ignore_opacity = false; + popups_ignorealpha = 0.1; + input_methods_ignorealpha = 0.1; noise = 0.012; }; @@ -88,7 +88,6 @@ in { monitor = [ "eDP-1, preferred, 0x0, 1.6" - "eDP-1, addreserved, 35, 0, 0, 0" ]; bindm = [ @@ -97,8 +96,8 @@ in { ]; bindel = [ - ", XF86AudioRaiseVolume, exec, ${wpctl} set-volume @DEFAULT_AUDIO_SINK@ 3%+" - ", XF86AudioLowerVolume, exec, ${wpctl} set-volume @DEFAULT_AUDIO_SINK@ 3%-" + ", XF86AudioRaiseVolume, exec, ${wpctl} set-volume -l 1.0 @DEFAULT_AUDIO_SINK@ 3%+" + ", XF86AudioLowerVolume, exec, ${wpctl} set-volume -l 1.0 @DEFAULT_AUDIO_SINK@ 3%-" ", XF86MonBrightnessDown, exec, ${brightnessctl} s 10%-" ", XF86MonBrightnessUp, exec, ${brightnessctl} set +10%" ]; @@ -130,6 +129,9 @@ in { layerrule = [ "blur, hyprpanel" + "ignorezero, hyprpanel" + "xray, hyprpanel" + "animation slide, hyprpanel" ]; }; }; @@ -197,5 +199,20 @@ in { ]; }; }; + + systemd.user.services.hyprpanel = { + Install.WantedBy = ["graphical-session.target"]; + Service = { + ExecStart = "${lib.getExe pkgs.system-shell}"; + Restart = "on-failure"; + RestartSec = 5; + Environment = [ "GSK_RENDERER=ngl" ]; + }; + Unit = { + After = [ "graphical-session.target" ]; + ConditionEnvironment = "WAYLAND_DISPLAY"; + PartOf = [ "graphical-session.target" ]; + }; + }; }; } diff --git a/home/desktop/hyprpanel/default.nix b/home/desktop/hyprpanel/default.nix deleted file mode 100644 index e18cc5a..0000000 --- a/home/desktop/hyprpanel/default.nix +++ /dev/null @@ -1,56 +0,0 @@ -{ - stdenv, - astal, - meson, - ninja, - pkg-config, - gobject-introspection, - blueprint-compiler, - gtk4-layer-shell, - gtk4, - json-glib, - networkmanager, - dart-sass, - vala, - wrapGAppsHook4, - ... -}: let - astalPackages = [ - astal.astal4 - astal.io - astal.gjs - astal.auth - astal.cava - astal.apps - astal.greet - astal.mpris - astal.notifd - astal.network - astal.battery - astal.hyprland - astal.bluetooth - astal.wireplumber - astal.powerprofiles - ]; -in stdenv.mkDerivation { - name = "hyprpanel"; - src = ./.; - depsBuildBuild = [ - pkg-config - ]; - nativeBuildInputs = [ - meson - ninja - gobject-introspection - wrapGAppsHook4 - blueprint-compiler - dart-sass - vala - ]; - buildInputs = [ - gtk4 - gtk4-layer-shell - networkmanager - json-glib - ] ++ astalPackages; -} diff --git a/home/desktop/hyprpanel/meson.build b/home/desktop/hyprpanel/meson.build deleted file mode 100644 index 147f49d..0000000 --- a/home/desktop/hyprpanel/meson.build +++ /dev/null @@ -1,2 +0,0 @@ -project('hyprpanel', 'vala') -subdir('src') diff --git a/home/desktop/hyprpanel/src/gresource.xml b/home/desktop/hyprpanel/src/gresource.xml deleted file mode 100644 index abc50e5..0000000 --- a/home/desktop/hyprpanel/src/gresource.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - main.css - ui/Bar.ui - - diff --git a/home/desktop/hyprpanel/src/main.scss b/home/desktop/hyprpanel/src/main.scss deleted file mode 100644 index c37695a..0000000 --- a/home/desktop/hyprpanel/src/main.scss +++ /dev/null @@ -1 +0,0 @@ -@use "./scss/Bar.scss"; diff --git a/home/desktop/hyprpanel/src/meson.build b/home/desktop/hyprpanel/src/meson.build deleted file mode 100644 index fa715eb..0000000 --- a/home/desktop/hyprpanel/src/meson.build +++ /dev/null @@ -1,66 +0,0 @@ -pkgdatadir = get_option('prefix') / get_option('datadir') -bindir = get_option('prefix') / get_option('bindir') -blp = find_program('blueprint-compiler', required: true) -sass = find_program('sass', required: true) - -dependencies = [ - dependency('glib-2.0'), - dependency('libnm'), - dependency('gtk4-layer-shell-0'), - dependency('astal-io-0.1'), - dependency('astal-4-4.0'), - dependency('astal-battery-0.1'), - dependency('astal-wireplumber-0.1'), - dependency('astal-network-0.1'), - dependency('astal-mpris-0.1'), - dependency('astal-power-profiles-0.1'), - dependency('astal-bluetooth-0.1'), -] - -blueprint_sources = files( - 'ui/Bar.blp', -) - -vala_sources = files( - 'vala/Bar.vala', - 'vala/App.vala', -) - -# transplie blueprints -ui = custom_target( - 'blueprint', - input: blueprint_sources, - output: '.', - command: [ - blp, - 'batch-compile', - '@OUTPUT@', - '@CURRENT_SOURCE_DIR@', - '@INPUT@', - ], -) - -# bundle scss files -css = custom_target( - 'scss', - input: files('main.scss'), - command: [sass, '@INPUT@', '@OUTPUT@'], - output: ['main.css'], -) - -# compiling data files into a binary -resource = import('gnome').compile_resources( - 'data', - files('gresource.xml'), - dependencies: [ui, css], - source_dir: meson.current_build_dir(), -) - -executable( - meson.project_name(), - dependencies: dependencies, - sources: [vala_sources, resource], - link_args: ['-lm'], # Link math library - install: true, - install_dir: bindir, -) diff --git a/home/desktop/hyprpanel/src/scss/Bar.scss b/home/desktop/hyprpanel/src/scss/Bar.scss deleted file mode 100644 index 01bde85..0000000 --- a/home/desktop/hyprpanel/src/scss/Bar.scss +++ /dev/null @@ -1,25 +0,0 @@ -// https://gitlab.gnome.org/GNOME/gtk/-/blob/gtk-4-16/gtk/theme/Default/_colors-public.scss -$fg-color: #{"@theme_fg_color"}; -$bg-color: #{"@theme_bg_color"}; - -window.Bar { - background: transparent; - - > box { - min-height: 36px; - padding: 2px 18px; - background: transparent; - color: $fg-color; - - font-family: SF Pro Display; - font-weight: medium; - font-size: 13px; - } - - .menubar-item { - > * + * { - margin-left: 6px; - } - } -} - diff --git a/home/desktop/hyprpanel/src/ui/Bar.blp b/home/desktop/hyprpanel/src/ui/Bar.blp deleted file mode 100644 index 0b02572..0000000 --- a/home/desktop/hyprpanel/src/ui/Bar.blp +++ /dev/null @@ -1,41 +0,0 @@ -using Gtk 4.0; -using Astal 4.0; - -template $Bar: Astal.Window { - default-height: 40; - - CenterBox centerbox { - start-widget: Box { - }; - - center-widget: Box { - }; - - end-widget: Box { - spacing: 14; - - Image { - styles ["menubar-item"] - icon-name: bind template.network-icon; - } - - Box { - styles ["menubar-item"] - Image { - icon-name: bind template.volume-icon; - } - } - - Box { - styles ["menubar-item"] - Label { - label: bind template.battery-label; - } - Image { - icon-name: bind template.battery-icon; - } - } - }; - } -} - diff --git a/home/desktop/hyprpanel/src/vala/App.vala b/home/desktop/hyprpanel/src/vala/App.vala deleted file mode 100644 index 9026b51..0000000 --- a/home/desktop/hyprpanel/src/vala/App.vala +++ /dev/null @@ -1,46 +0,0 @@ -class App : Astal.Application { - static App instance; - - // this is where request handlers can be implemented - // that will be used to handle `astal` cli invocations - public override void request(string request, GLib.SocketConnection conn) { - print(@"incoming request: $request\n"); - - AstalIO.write_sock.begin(conn, "response", null); - } - - // this is the method that will be invoked on `app.run()` - // this is where everything should be initialized and instantiated - public override void activate() { - this.apply_css("resource:///main.css", false); - this.add_window(new Bar()); - } - - // entry point of our app - static int main(string[] argv) { - App.instance = new App() { instance_name = "hyprpanel" }; - - try { - // `app.acquire_socket()` needed for the request API to work - App.instance.acquire_socket(); - - // if it succeeds we can run the app - return App.instance.run(null); - } catch (Error _) { - // if it throws an error it means there is already an instance - // with `instance_name` running, so we just send a request instead - try { - var response = AstalIO.send_request( - "hyprpanel", - string.joinv(" ", argv[1:]) - ); - print(@"$response\n"); - return 0; - } catch (Error err) { - printerr(err.message); - return 1; - } - } - } -} - diff --git a/home/desktop/hyprpanel/src/vala/Bar.vala b/home/desktop/hyprpanel/src/vala/Bar.vala deleted file mode 100644 index f381b06..0000000 --- a/home/desktop/hyprpanel/src/vala/Bar.vala +++ /dev/null @@ -1,73 +0,0 @@ -[GtkTemplate(ui="/ui/Bar.ui")] -class Bar : Astal.Window { - public string volume_icon { get; set; } - public string battery_visible { get; set; } - public string battery_label { get; set; } - public string battery_icon { get; set; } - public string network_icon { get; set; } - - public Bar() { - namespace = "hyprpanel"; - anchor = TOP | LEFT | RIGHT; - exclusivity = EXCLUSIVE; - add_css_class("Bar"); - present(); - - // network - var nw = AstalNetwork.get_default(); - Binding networkBinding = null; - - nw.bind_property( - "primary", - this, - "network-icon", - BindingFlags.SYNC_CREATE, - (_, primary) => { - if (networkBinding != null) networkBinding.unbind(); - - switch (primary.get_enum()) { - case AstalNetwork.Primary.WIRED: - networkBinding = nw.wired.bind_property( - "icon-name", - this, - "network-icon", - BindingFlags.SYNC_CREATE - ); - return false; - - case AstalNetwork.Primary.WIFI: - networkBinding = nw.wifi.bind_property( - "icon-name", - this, - "network-icon", - BindingFlags.SYNC_CREATE - ); - return false; - - default: - network_icon = "network-idle-symbolic"; - return false; - } - }, - null - ); - - // battery - var bat = AstalBattery.get_default(); - bat.bind_property("is-present", this, "battery-visible", BindingFlags.SYNC_CREATE); - bat.bind_property("icon-name", this, "battery-icon", BindingFlags.SYNC_CREATE); - bat.bind_property("percentage", this, "battery-label", BindingFlags.SYNC_CREATE, (_, src, ref target) => { - target.set_string(@"$(Math.floor(bat.percentage * 100))%"); - return true; - }, null); - - // volume - var speaker = AstalWp.get_default().get_default_speaker(); - speaker.bind_property("volume-icon", this, "volume-icon", BindingFlags.SYNC_CREATE); - } - - public override void dispose() { - base.dispose(); - } -} - diff --git a/lib/pkgs/default.nix b/lib/pkgs/default.nix index 2bb8b58..8b35cae 100644 --- a/lib/pkgs/default.nix +++ b/lib/pkgs/default.nix @@ -1,5 +1,5 @@ pkgs: { sf-pro = import ./sf-pro.nix pkgs; - sf-pro-mono = import ./sf-pro-mono.nix pkgs; - hyprpanel = import ../../home/desktop/hyprpanel pkgs; + sf-mono = import ./sf-mono.nix pkgs; + new-york = import ./new-york.nix pkgs; } diff --git a/lib/pkgs/sf-pro-mono.nix b/lib/pkgs/new-york.nix similarity index 56% rename from lib/pkgs/sf-pro-mono.nix rename to lib/pkgs/new-york.nix index 7056f27..b35669e 100644 --- a/lib/pkgs/sf-pro-mono.nix +++ b/lib/pkgs/new-york.nix @@ -5,14 +5,14 @@ unzip, ... }: stdenv.mkDerivation rec { - pname = "SF-Pro-mono"; - version = "v3.0.0"; + pname = "New-York"; + version = "0"; src = fetchFromGitHub { - owner = "shaunsingh"; - repo = "SFMono-Nerd-Font-Ligaturized"; - rev = "main"; - sha256 = "sha256-AYjKrVLISsJWXN6Cj74wXmbJtREkFDYOCRw1t2nVH2w="; + owner = "yell0wsuit"; + repo = "New-York-fonts"; + rev = "master"; + sha256 = "sha256-0uuzr64KxDEMtkLizvGeHTXDBAMLe4j5iXGaJPfDdmg="; }; nativeBuildInputs = [unzip]; diff --git a/lib/pkgs/sf-mono.nix b/lib/pkgs/sf-mono.nix new file mode 100644 index 0000000..29d4503 --- /dev/null +++ b/lib/pkgs/sf-mono.nix @@ -0,0 +1,24 @@ +{ + stdenv, + lib, + fetchFromGitHub, + unzip, + ... +}: stdenv.mkDerivation rec { + pname = "SF-Mono"; + version = "0"; + + src = fetchFromGitHub { + owner = "supercomputra"; + repo = "SF-Mono-Font"; + rev = "master"; + sha256 = "sha256-3wG3M4Qep7MYjktzX9u8d0iDWa17FSXYnObSoTG2I/o="; + }; + + nativeBuildInputs = [unzip]; + + installPhase = '' + mkdir -p $out/share/fonts/opentype + cp *.otf $out/share/fonts/opentype/ + ''; +} diff --git a/lib/pkgs/sf-pro.nix b/lib/pkgs/sf-pro.nix index 4f9b5a2..ee7e97b 100644 --- a/lib/pkgs/sf-pro.nix +++ b/lib/pkgs/sf-pro.nix @@ -6,7 +6,7 @@ ... }: stdenv.mkDerivation rec { pname = "SF-Pro"; - version = "v3.0.0"; + version = "0"; src = fetchFromGitHub { owner = "sahibjotsaggu"; diff --git a/modules/desktop/fonts.nix b/modules/desktop/fonts.nix index 46815b4..7480ae0 100644 --- a/modules/desktop/fonts.nix +++ b/modules/desktop/fonts.nix @@ -22,18 +22,18 @@ in { packages = with pkgs; [ sf-pro - sf-pro-mono + sf-mono + new-york noto-fonts noto-fonts-cjk-sans noto-fonts-emoji - roboto-mono inter ]; fontconfig.defaultFonts = { - serif = [ "Noto Serif" "Noto Color Emoji" ]; - sansSerif = [ "SF Pro Display" "Noto Color Emoji" ]; - monospace = [ "Dank Mono" "Roboto Mono" "Noto Color Emoji" ]; + serif = [ "New York" "Noto Serif" "Noto Color Emoji" ]; + sansSerif = [ "SF Pro Display" "Inter" "Noto Color Emoji" ]; + monospace = [ "Dank Mono" "SF Mono" "Noto Color Emoji" ]; emoji = [ "Noto Color Emoji" ]; }; }; -- 2.51.2