#hyprland #workspace #eww #widgets #class #aware #monitor

app hyprland-workspaces

一个支持多显示器的 Hyprland 工作区小部件

2 个稳定版本

2.0.1 2024 年 5 月 11 日
2.0.0 2024 年 3 月 27 日
1.0.0 2023 年 12 月 30 日
0.0.7 2023 年 12 月 28 日
0.0.4 2023 年 4 月 27 日

#10 in #eww

MITGPL-3.0-or-later

15KB
230

hyprland-workspaces

一个支持多显示器的 Hyprland 工作区小部件。根据指定的显示器输出当前打开的工作区。设计用于与 Eww 一起使用,但可能与其他栏一起工作。与 hyprland-autoname-workspaces 兼容。

安装说明

依赖项

Hyprland

Arch Linux

Arch 用户可以使用您喜欢的包管理器从 AUR 安装。

  pikaur -S hyprland-workspaces

NixOS

NixOS 用户可以使用 不稳定频道 尝试或安装该软件包。

nix-shell -p hyprland-workspaces

Crates.io

可以直接使用 cargo 从 crates.io 安装。

  cargo install hyprland-workspaces

从源码构建

git clone https://github.com/FieldofClay/hyprland-workspaces.git
cd hyprland-workspaces
cargo build --release

使用方法

基本使用

将要跟踪的显示器的名称作为唯一参数传递。

./hyprland-workspaces eDP-1

如果您希望获取所有显示器上的所有工作区,请传递特殊参数 "ALL"。

./hyprland-workspaces ALL

然后跟踪该显示器(们),并将工作区详细信息以 JSON 格式输出到 stdout。

[{"active":false,"class":"workspace-button w1","id":1,"name":"1: "},{"active":false,"class":"workspace-button w2","id":2,"name":"2: "},{"active":true,"class":"workspace-button w4 workspace-active wa4","id":4,"name":"4: "}]

您可以通过运行

hyprctl monitors -j

它可以作为 Eww 中的工作区小部件使用,配置类似于以下。

(deflisten workspace0 "hyprland-workspaces `hyprctl monitors -j | jq -r \".[0].name\"`")
(deflisten workspace1 "hyprland-workspaces `hyprctl monitors -j | jq -r \".[1].name\"`")

(defwidget workspaces0 []
  (eventbox :onscroll "hyprctl dispatch workspace `echo {} | sed 's/up/+/\' | sed 's/down/-/'`1"
    (box :class "workspaces"
      (for i in workspace0
        (button
          :onclick "hyprctl dispatch workspace ${i.id}"
          :class "${i.class}"
          "${i.name}")))))
(defwidget workspaces1 []
  (eventbox :onscroll "hyprctl dispatch workspace `echo {} | sed 's/up/+/\' | sed 's/down/-/'`1"
    (box :class "workspaces"
      (for i in workspace1
        (button
          :onclick "hyprctl dispatch workspace ${i.id}"
          :class "${i.class}"
          "${i.name}")))))

(defwindow bar0 []
  :monitor 0
  (box 
    (workspaces0)
    (other_widget)))
(defwindow bar1 []
  :monitor 1
  (box
    (workspaces1)
    (other_widget)))

高级使用

传递特殊参数 '_' 将输出所有工作区,包含在一个显示器数组的包装中。这允许只运行一个 hyprland-workspaces 实例并简化 eww 配置。

./hyprland-workspaces _

每个显示器将有一个子数组,称为 workspaces,它将输出与 hyprland-workspaces MONITORNAME 相同的信息。

[
   {
      "name": "eDP-1",
      "workspaces": [
         {"active": false,"class": "workspace-button w6","id": 6,"name": "6 []"}
      ]
   },
   {
      "name": "DP-3",
      "workspaces": [
         {"active": false,"class": "workspace-button w1","id": 1,"name": "1 "},
         {"active": true,"class": "workspace-button w3 workspace-active wa3","id": 3,"name": "3 "}
      ]
   },
   {
      "name": "DP-4",
      "workspaces": [
         {"active": false,"class": "workspace-button w2","id": 2,"name": "2 "},
         {"active": false,"class": "workspace-button w5","id": 5,"name": "5 "}
      ]
   }
]

这有助于通过使用类似以下的方法来避免在 eww 配置中的重复。

(deflisten workspaces "hyprland-workspaces _")

(defwidget workspaceWidget [monitor]
  (eventbox :onscroll "hyprctl dispatch workspace `echo {} | sed 's/up/+/\' | sed 's/down/-/'`1"
    (box :class "workspaces"
      (for i in {workspaces[monitor].workspaces}
        (button
          :onclick "hyprctl dispatch workspace ${i.id}"
          :class "${i.class}"
          "${i.name}")))))

(defwidget bar0 []
  (box
    (workspaceWidget :monitor 0)
  )
)

(defwidget bar1 []
  (box
    (workspaceWidget :monitor 1)
  )
)

以下类被输出,以提供多种主题化工作区小部件的选项。

  • workspace-button:所有工作区都将具有此类
  • workspace-active:只有活动工作区将具有此类。如果工作区处于活动状态但焦点在另一个显示器上,则不会存在。
  • w<WORKSPACEID>:每个工作空间都将具有此类,以允许每个工作空间有独特的CSS。
  • wa<WORKSPACEID>:当工作空间处于活动状态时,将具有此类以允许每个工作空间有独特的CSS,类似于workspace-active,当焦点在其他显示器上时,此元素不会显示。

依赖项

~8–19MB
~236K SLoC