From 0995d0dfb93d533f1b292dbf69fe0962ef729b80 Mon Sep 17 00:00:00 2001 From: Nikolaos Karaolidis Date: Sat, 6 Jul 2024 11:49:19 +0300 Subject: [PATCH] Add ags system tray Signed-off-by: Nikolaos Karaolidis --- flake.lock | 21 ++++++++++++ flake.nix | 5 +++ hosts/common/configs/bluetooth/default.nix | 4 +++ hosts/common/configs/networking/default.nix | 4 +++ hosts/common/configs/persist/default.nix | 1 - users/configs/ags/config/eslint.config.js | 32 ++++++++++++------- .../configs/ags/config/src/widgets/bar/bar.ts | 17 ++++++---- .../src/widgets/bar/clipboard/clipboard.ts | 4 +-- .../src/widgets/bar/launcher/launcher.ts | 4 +-- .../config/src/widgets/bar/systray/systray.ts | 16 ++++++++++ .../src/widgets/bar/workspace/workspace.ts | 2 +- users/configs/ags/default.nix | 9 ++++-- users/configs/ags/theme.sass | 9 ++++++ 13 files changed, 101 insertions(+), 27 deletions(-) create mode 100644 users/configs/ags/config/src/widgets/bar/systray/systray.ts diff --git a/flake.lock b/flake.lock index b3b8060..3214cfd 100644 --- a/flake.lock +++ b/flake.lock @@ -1,5 +1,25 @@ { "nodes": { + "ags": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1718921313, + "narHash": "sha256-TFJah1RW5qnYW7kajjAFPAS5j/0q0R3vz9zPjrRA0Mc=", + "owner": "Aylur", + "repo": "ags", + "rev": "646d5ad073ff7f8b1d50cfbd40f5b8a250fcd59d", + "type": "github" + }, + "original": { + "owner": "Aylur", + "repo": "ags", + "type": "github" + } + }, "disko": { "inputs": { "nixpkgs": [ @@ -90,6 +110,7 @@ }, "root": { "inputs": { + "ags": "ags", "disko": "disko", "home-manager": "home-manager", "impermanence": "impermanence", diff --git a/flake.nix b/flake.nix index 7a38990..039079c 100644 --- a/flake.nix +++ b/flake.nix @@ -20,6 +20,11 @@ url = "github:nix-community/home-manager"; inputs.nixpkgs.follows = "nixpkgs"; }; + + ags = { + url = "github:Aylur/ags"; + inputs.nixpkgs.follows = "nixpkgs"; + }; }; outputs = { self, nixpkgs, ... } @ inputs: { diff --git a/hosts/common/configs/bluetooth/default.nix b/hosts/common/configs/bluetooth/default.nix index 58abd90..30dc518 100644 --- a/hosts/common/configs/bluetooth/default.nix +++ b/hosts/common/configs/bluetooth/default.nix @@ -6,4 +6,8 @@ General.Experimental = true; }; }; + + environment.persistence."/persist".directories = [ + "/var/lib/bluetooth" + ]; } diff --git a/hosts/common/configs/networking/default.nix b/hosts/common/configs/networking/default.nix index f29d881..f9015b0 100644 --- a/hosts/common/configs/networking/default.nix +++ b/hosts/common/configs/networking/default.nix @@ -1,3 +1,7 @@ { networking.networkmanager.enable = true; + + environment.persistence."/persist".directories = [ + "/etc/NetworkManager/system-connections" + ]; } diff --git a/hosts/common/configs/persist/default.nix b/hosts/common/configs/persist/default.nix index 4f79cb3..cfb5b39 100644 --- a/hosts/common/configs/persist/default.nix +++ b/hosts/common/configs/persist/default.nix @@ -35,7 +35,6 @@ hideMounts = true; directories = [ "/etc/nixos" - "/etc/NetworkManager/system-connections" "/var/lib/nixos" "/var/lib/systemd/coredump" "/var/log" diff --git a/users/configs/ags/config/eslint.config.js b/users/configs/ags/config/eslint.config.js index eaac88f..5d4c5a6 100644 --- a/users/configs/ags/config/eslint.config.js +++ b/users/configs/ags/config/eslint.config.js @@ -65,29 +65,39 @@ export default [ '@typescript-eslint/no-misused-promises': ['error', { checksVoidReturn: false, }], - - '@typescript-eslint/naming-convention': ['error', { - selector: 'default', - format: ['camelCase'], - }, { + '@typescript-eslint/naming-convention': [ + 'error', + { + selector: 'default', + format: ['camelCase'], + leadingUnderscore: 'allowSingleOrDouble', + }, + { selector: 'variableLike', format: ['camelCase', 'PascalCase'], - }, { + leadingUnderscore: 'allowSingleOrDouble', + }, + { selector: 'memberLike', format: ['camelCase'], - }, { + }, + { selector: 'typeLike', format: ['PascalCase'], - }, { + }, + { selector: 'property', format: ['snake_case'], - }, { + }, + { selector: 'method', format: ['camelCase'], - }, { + }, + { selector: ['enumMember', 'enum'], format: ['UPPER_CASE'], - }], + } + ], 'unicorn/empty-brace-spaces': 'off', 'unicorn/expiring-todo-comments': 'off', diff --git a/users/configs/ags/config/src/widgets/bar/bar.ts b/users/configs/ags/config/src/widgets/bar/bar.ts index c39f224..fff80f7 100644 --- a/users/configs/ags/config/src/widgets/bar/bar.ts +++ b/users/configs/ags/config/src/widgets/bar/bar.ts @@ -2,6 +2,7 @@ import gap from './gap/gap'; import launcher from './launcher/launcher'; import workspace from './workspace/workspace'; import date from './date/date'; +import systray from './systray/systray'; export default (monitor: number) => Widget.Window({ monitor, @@ -11,26 +12,28 @@ export default (monitor: number) => Widget.Window({ anchor: ['top', 'right', 'left'], child: Widget.CenterBox({ class_name: 'widgets', - // eslint-disable-next-line @typescript-eslint/naming-convention - startWidget: Widget.Box({ + start_widget: Widget.Box({ hexpand: true, + hpack: 'start', children: [ launcher(), gap(), workspace(), ], }), - // eslint-disable-next-line @typescript-eslint/naming-convention - centerWidget: Widget.Box({ + center_widget: Widget.Box({ + hexpand: true, hpack: 'center', children: [ date(), ], }), - // eslint-disable-next-line @typescript-eslint/naming-convention - endWidget: Widget.Box({ + end_widget: Widget.Box({ hexpand: true, - children: [], + hpack: 'end', + children: [ + systray(), + ], }), }), }); diff --git a/users/configs/ags/config/src/widgets/bar/clipboard/clipboard.ts b/users/configs/ags/config/src/widgets/bar/clipboard/clipboard.ts index 907801a..031e267 100644 --- a/users/configs/ags/config/src/widgets/bar/clipboard/clipboard.ts +++ b/users/configs/ags/config/src/widgets/bar/clipboard/clipboard.ts @@ -1,10 +1,10 @@ const icon = () => Widget.Icon({ class_name: 'icon', - icon: "edit-paste-symbolic", + icon: 'edit-paste-symbolic', }); export default () => Widget.EventBox({ class_name: 'clipboard', - on_primary_click: () => Utils.execAsync('bash -c "cliphist list | rofi -cache-dir $XDG_CACHE_HOME/rofi -dmenu -display-columns 2 | cliphist decode | wl-copy"'), child: icon(), + onPrimaryClick: () => Utils.execAsync('bash -c "cliphist list | rofi -cache-dir $XDG_CACHE_HOME/rofi -dmenu -display-columns 2 | cliphist decode | wl-copy"'), }); diff --git a/users/configs/ags/config/src/widgets/bar/launcher/launcher.ts b/users/configs/ags/config/src/widgets/bar/launcher/launcher.ts index 59fc627..912845a 100644 --- a/users/configs/ags/config/src/widgets/bar/launcher/launcher.ts +++ b/users/configs/ags/config/src/widgets/bar/launcher/launcher.ts @@ -1,10 +1,10 @@ const icon = () => Widget.Icon({ class_name: 'icon', - icon: "nix-snowflake-symbolic", + icon: 'nix-snowflake-symbolic', }); export default () => Widget.EventBox({ class_name: 'launcher', - on_primary_click: () => Utils.execAsync('bash -c "rofi -cache-dir $XDG_CACHE_HOME/rofi -show drun"'), child: icon(), + onPrimaryClick: () => Utils.execAsync('bash -c "rofi -cache-dir $XDG_CACHE_HOME/rofi -show drun"'), }); diff --git a/users/configs/ags/config/src/widgets/bar/systray/systray.ts b/users/configs/ags/config/src/widgets/bar/systray/systray.ts new file mode 100644 index 0000000..ccd81de --- /dev/null +++ b/users/configs/ags/config/src/widgets/bar/systray/systray.ts @@ -0,0 +1,16 @@ +import gdk from 'gi://Gdk'; + +const systemtray = await Service.import('systemtray'); + +const systrayItem = item => Widget.EventBox({ + class_name: 'item', + tooltip_markup: item.bind('tooltip_markup'), + child: Widget.Icon({ class_name: 'icon' }).bind('icon', item, 'icon'), + onPrimaryClick: (_, event: gdk.Event) => item.activate(event), + onSecondaryClick: (_, event: gdk.Event) => item.openMenu(event), +}); + +export default () => Widget.Box({ + class_name: 'systray', + children: systemtray.bind('items').as(i => i.map(systrayItem)) +}); diff --git a/users/configs/ags/config/src/widgets/bar/workspace/workspace.ts b/users/configs/ags/config/src/widgets/bar/workspace/workspace.ts index f88f79e..36f0e29 100644 --- a/users/configs/ags/config/src/widgets/bar/workspace/workspace.ts +++ b/users/configs/ags/config/src/widgets/bar/workspace/workspace.ts @@ -6,7 +6,7 @@ const dispatch = ws => hyprland.messageAsync(`dispatch workspace ${ws}`); const workspaceButton = (i: number) => Widget.Label({ class_name: 'button', attribute: i, - vpack: "center", + vpack: 'center', setup: self => self.hook(hyprland, () => { self.toggleClassName('active', hyprland.active.workspace.id === i); self.toggleClassName('occupied', (hyprland.getWorkspace(i)?.windows || 0) > 0); diff --git a/users/configs/ags/default.nix b/users/configs/ags/default.nix index 7aabaa5..b2d5818 100644 --- a/users/configs/ags/default.nix +++ b/users/configs/ags/default.nix @@ -1,4 +1,4 @@ -{ user ? throw "user argument is required" }: { config, lib, pkgs, ... }: +{ user ? throw "user argument is required" }: { config, lib, pkgs, inputs, ... }: let hmConfig = config.home-manager.users.${user.name}; @@ -6,7 +6,9 @@ let in { home-manager.users.${user.name} = { - home.packages = with pkgs; [ ags ]; + imports = [ inputs.ags.homeManagerModules.default ]; + + programs.ags.enable = true; xdg.configFile.ags = { source = "${agsConfig}/share/config.js"; @@ -21,13 +23,14 @@ in wayland.windowManager.hyprland.initExtraConfig = "${lib.meta.getExe (pkgs.writeShellApplication { name = "init-ags"; runtimeInputs = with pkgs; [ - ags + inputs.ags.packages.${stdenv.hostPlatform.system}.default sassc hyprland nixos-icons rofi-wayland wl-clipboard cliphist + libdbusmenu-gtk3 ]; text = "ags &> /tmp/ags.log"; })} &"; diff --git a/users/configs/ags/theme.sass b/users/configs/ags/theme.sass index a85ef25..eda6a1b 100644 --- a/users/configs/ags/theme.sass +++ b/users/configs/ags/theme.sass @@ -63,3 +63,12 @@ font-family: {{custom.font_sans_serif_all}} font-weight: 500 margin: 0 .5 * {{custom.padding}}pt + + .systray + .item + @include interactive + + .icon + font-size: {{custom.font_size}}pt + padding: 0 .3 * {{custom.padding}}pt + color: {{colors.on_surface.default.hex}}