[GH-ISSUE #820] ext-workspace support #254

Open
opened 2026-05-22 21:52:14 +01:00 by JakeStanger · 24 comments
Owner

Originally created by @ToxicMushroom on GitHub (Dec 22, 2024).
Original GitHub issue: https://github.com/JakeStanger/ironbar/issues/820

Is your feature request related to a problem? Please describe.
Currently the supported compositors for workspace module is very limited and requires compositor specific implementations.
This is a newly merged wayland protocol for workspaces that aims to unify this process

Describe the solution you'd like
Use this protocol in the workspace module.
Ironbar can then hopefully be used to show workspaces on any comp that implements this protocol :)

I think sway already does since it was based on their wlr workspace thing but not sure.

Describe alternatives you've considered
/

Additional context
https://gitlab.freedesktop.org/wayland/wayland-protocols/-/merge_requests/40

Originally created by @ToxicMushroom on GitHub (Dec 22, 2024). Original GitHub issue: https://github.com/JakeStanger/ironbar/issues/820 **Is your feature request related to a problem? Please describe.** Currently the supported compositors for workspace module is very limited and requires compositor specific implementations. This is a newly merged wayland protocol for workspaces that aims to unify this process **Describe the solution you'd like** Use this protocol in the workspace module. Ironbar can then hopefully be used to show workspaces on any comp that implements this protocol :) I think sway already does since it was based on their wlr workspace thing but not sure. **Describe alternatives you've considered** / **Additional context** https://gitlab.freedesktop.org/wayland/wayland-protocols/-/merge_requests/40
Author
Owner

@JakeStanger commented on GitHub (Dec 22, 2024):

I'd like to see both of Sway and Hyprland support the protocol first, as those are the two with merged support for the module. Once they ship releases, I'll definitely be happy to move away from relying on their IPCs

https://wayland.app/protocols/ext-workspace-v1

<!-- gh-comment-id:2558446238 --> @JakeStanger commented on GitHub (Dec 22, 2024): I'd like to see both of Sway and Hyprland support the protocol first, as those are the two with merged support for the module. Once they ship releases, I'll definitely be happy to move away from relying on their IPCs https://wayland.app/protocols/ext-workspace-v1
Author
Owner

@Brisingr05 commented on GitHub (Jun 15, 2025):

Niri will be implementing ext-workspace in https://github.com/YaLTeR/niri/pull/1800.

<!-- gh-comment-id:2973542507 --> @Brisingr05 commented on GitHub (Jun 15, 2025): Niri will be implementing ext-workspace in https://github.com/YaLTeR/niri/pull/1800.
Author
Owner

@JakeStanger commented on GitHub (Jun 26, 2025):

Hyprland has merged support

<!-- gh-comment-id:3009199845 --> @JakeStanger commented on GitHub (Jun 26, 2025): Hyprland has merged support
Author
Owner

@Brisingr05 commented on GitHub (Jul 13, 2025):

Niri has also merged support: https://github.com/YaLTeR/niri/issues/135#issuecomment-3066726736

<!-- gh-comment-id:3066868933 --> @Brisingr05 commented on GitHub (Jul 13, 2025): Niri has also merged support: https://github.com/YaLTeR/niri/issues/135#issuecomment-3066726736
Author
Owner

@leoVici9 commented on GitHub (Aug 31, 2025):

this is the only reason why i do not use ironbar on mangowc. mangowc just merged support.

<!-- gh-comment-id:3240118062 --> @leoVici9 commented on GitHub (Aug 31, 2025): this is the only reason why i do not use ironbar on mangowc. mangowc just merged support.
Author
Owner

@JakeStanger commented on GitHub (Oct 26, 2025):

I've started working on this in the past few days, and I've gotten to the point where I can log events from the protocol (you can test this on the feat/ext-workspaces branch).

After testing on Hyprland, Niri and COSMIC, it seems like the protocol has been (consistently) incorrectly implemented.

I've additionally not tested Jay but from reading the code, it looks to do the same thing. LabWC looks like it uses all three states from the code, but I've not been able to get it working well enough to test.

Image

https://wayland.app/protocols/ext-workspace-v1#ext_workspace_handle_v1:enum:state

The protocol offers 3 state values for a workspace, which I would interpret as follows:

  • Active: The workspace is currently focused
  • Urgent: The workspace has something requesting attention
  • Hidden: The workspace is open, but not currently visible

Compositors seem to be implementing it as follows though:

  • Active: The workspace is currently visible
  • Urgent: The workspace has something requesting attention
  • Hidden: Not used

This seems muddled up to me, and importantly makes representing the focused state through the protocol impossible. This is important for multi-monitor setups. For example, I've got 3 screens, so Hyprland reports 3 active workspaces. How can I tell which one is focused?

I will see if I can get something together still, as support without that would be better than no support at all. I think this needs fixing at a compositor-level before Ironbar can offer a full implementation still though.

I'm interested to see if anybody interprets this differently?

<!-- gh-comment-id:3448699527 --> @JakeStanger commented on GitHub (Oct 26, 2025): I've started working on this in the past few days, and I've gotten to the point where I can log events from the protocol (you can test this on the `feat/ext-workspaces` branch). After testing on Hyprland, Niri and COSMIC, it *seems* like the protocol has been (consistently) incorrectly implemented. I've additionally not tested Jay but from reading the code, it looks to do the same thing. LabWC looks like it uses all three states from the code, but I've not been able to get it working well enough to test. <img width="1476" height="402" alt="Image" src="https://github.com/user-attachments/assets/c09104b3-ed8f-4cf1-974e-b8dfff02fd5b" /> <https://wayland.app/protocols/ext-workspace-v1#ext_workspace_handle_v1:enum:state> The protocol offers 3 state values for a workspace, which I would interpret as follows: - **Active**: The workspace is currently focused - **Urgent**: The workspace has something requesting attention - **Hidden**: The workspace is open, but not currently visible Compositors seem to be implementing it as follows though: - **Active**: The workspace is currently visible - **Urgent**: The workspace has something requesting attention - **Hidden**: *Not used* This seems muddled up to me, and importantly makes representing the focused state through the protocol **impossible**. This is important for multi-monitor setups. For example, I've got 3 screens, so Hyprland reports 3 active workspaces. How can I tell which one is focused? I will see if I can get something together still, as support without that would be better than no support at all. I think this needs fixing at a compositor-level before Ironbar can offer a full implementation still though. I'm interested to see if anybody interprets this differently?
Author
Owner

@Consolatis commented on GitHub (Oct 26, 2025):

LabWC looks like it uses all three states from the code

Labwc only uses the active state (the protocol implementation itself supports everything from the protocol though, that was done to allow migrating the implementation to wlroots). Note that this protocol is written in a way that also supports tag-based compositors (a la awesomewm). In that case a tag is represented as a workspace and thus multiple workspaces within a single group can be active at the same time.

<!-- gh-comment-id:3448736803 --> @Consolatis commented on GitHub (Oct 26, 2025): > LabWC looks like it uses all three states from the code Labwc only uses the `active` state (the protocol implementation itself supports everything from the protocol though, that was done to allow migrating the implementation to wlroots). Note that this protocol is written in a way that also supports tag-based compositors (a la awesomewm). In that case a `tag` is represented as a `workspace` and thus multiple workspaces within a single group can be active at the same time.
Author
Owner

@JakeStanger commented on GitHub (Oct 26, 2025):

It still seems to me even in that case it should only be active if it actually has focus. The hidden flag should be used to indicate when the tag is not enabled surely?

<!-- gh-comment-id:3448767036 --> @JakeStanger commented on GitHub (Oct 26, 2025): It still seems to me even in that case it should only be active if it actually has focus. The hidden flag should be used to indicate when the tag is not enabled surely?
Author
Owner

@Consolatis commented on GitHub (Oct 26, 2025):

It still seems to me even in that case it should only be active if it actually has focus.

Can you elaborate on the use-case? You mean like keyboard-focus, so that a panel can show that keyboard actions will affect this specific workspace? I have a feeling that groups could have a focus state / focus events but not workspaces. E.g. what would be the "focused" workspace in a tag-based compositor.

The hidden flag should be used to indicate when the tag is not enabled surely?

The intention for that one is to completely hide this workspace from bars. As far as I remember that one was added for internal workspaces like the sway scratchpad (which I think is used as a container for "minimized" windows).

A tag / workspace not being enabled would simply have the active state not set.

<!-- gh-comment-id:3448801527 --> @Consolatis commented on GitHub (Oct 26, 2025): > It still seems to me even in that case it should only be active if it actually has focus. Can you elaborate on the use-case? You mean like keyboard-focus, so that a panel can show that keyboard actions will affect this specific workspace? I have a feeling that groups could have a focus state / focus events but not workspaces. E.g. what would be the "focused" workspace in a tag-based compositor. > The hidden flag should be used to indicate when the tag is not enabled surely? The intention for that one is to completely hide this workspace from bars. As far as I remember that one was added for internal workspaces like the sway scratchpad (which I think is used as a container for "minimized" windows). A tag / workspace not being enabled would simply have the `active` state not set.
Author
Owner

@JakeStanger commented on GitHub (Oct 27, 2025):

Right. It sounds like based on what you've said above, and from discussions outside of this thread, that I am indeed misinterpreting the protocol. The focused behaviour I am looking for is not part of it.

Just to clarify in case anybody stumbles across this, the correct interpretation of the states in full:

  • Active: The workspace is currently visible (or tag is enabled).
  • Urgent: The workspace has something requesting attention.
  • Hidden: The workspace is internal such as a scratchpad/special workspace, and in most cases should be ignored by shells and bars.

Can you elaborate on the use-case?

The current workspace module offers a .focused css class, meaning "this workspace current has [a client with] keyboard/mouse focus". This is differentiated from an active workspace, which just means it's visible (or enabled in the case of tags). It is useful for multi-monitor setups. All of the Sway/Hyprland/Niri IPC implementations offer this information.

As this isn't in the protocol, that will either have to be dropped, or there will need to be a layer of IPC implementations on top just to bring it in.

<!-- gh-comment-id:3450924727 --> @JakeStanger commented on GitHub (Oct 27, 2025): Right. It sounds like based on what you've said above, and from discussions outside of this thread, that I am indeed misinterpreting the protocol. The focused behaviour I am looking for is not part of it. Just to clarify in case anybody stumbles across this, the correct interpretation of the states in full: - **Active**: The workspace is currently visible (or tag is enabled). - **Urgent**: The workspace has something requesting attention. - **Hidden**: The workspace is internal such as a scratchpad/special workspace, and in most cases should be ignored by shells and bars. > Can you elaborate on the use-case? The current workspace module offers a `.focused` css class, meaning "this workspace current has [a client with] keyboard/mouse focus". This is differentiated from an active workspace, which just means it's visible (or enabled in the case of tags). It is useful for multi-monitor setups. All of the Sway/Hyprland/Niri IPC implementations offer this information. As this isn't in the protocol, that will either have to be dropped, or there will need to be a layer of IPC implementations on top just to bring it in.
Author
Owner

@Brisingr05 commented on GitHub (Oct 27, 2025):

Pinging @YaLTeR, in case you have any thoughts on this.

<!-- gh-comment-id:3450960046 --> @Brisingr05 commented on GitHub (Oct 27, 2025): Pinging @YaLTeR, in case you have any thoughts on this.
Author
Owner

@YaLTeR commented on GitHub (Oct 27, 2025):

IIRC:

  • active does not imply focus, just that it's the "active" workspace (windows are visible, etc.)
  • hidden is for like scratch workspaces that should not be displayed on the bar
  • there's no keyboard focus state
<!-- gh-comment-id:3450982954 --> @YaLTeR commented on GitHub (Oct 27, 2025): IIRC: - active does not imply focus, just that it's the "active" workspace (windows are visible, etc.) - hidden is for like scratch workspaces that should not be displayed on the bar - there's no keyboard focus state
Author
Owner

@leoVici9 commented on GitHub (Oct 27, 2025):

@JakeStanger. A.layer of ipc on top of ext-workspace-v1 does not sound like a very healthy solution even from a users perspective. I would be very happy with a solution that does not support .focused and allows me to use ironbar on a ext-workspace-v1 compliant compositor. But yeah might mean having to duplicate code and adding a switch on workspaces.

<!-- gh-comment-id:3451212490 --> @leoVici9 commented on GitHub (Oct 27, 2025): @JakeStanger. A.layer of ipc on top of ext-workspace-v1 does not sound like a very healthy solution even from a users perspective. I would be very happy with a solution that does not support .focused and allows me to use ironbar on a ext-workspace-v1 compliant compositor. But yeah might mean having to duplicate code and adding a switch on workspaces.
Author
Owner

@JakeStanger commented on GitHub (Oct 27, 2025):

Any solution that's implemented for this will be transparent for the user. I'm intending to have no additional configuration necessary. If an IPC implementation exists, it will add the additional functionality. If it doesn't, some features (namely .focused, I'm not expecting anything else currently) won't work. That ideally should be no more visible than a logged warning

<!-- gh-comment-id:3451244020 --> @JakeStanger commented on GitHub (Oct 27, 2025): Any solution that's implemented for this will be transparent for the user. I'm intending to have no additional configuration necessary. If an IPC implementation exists, it will add the additional functionality. If it doesn't, some features (namely `.focused`, I'm not expecting anything else currently) won't work. That ideally should be no more visible than a logged warning
Author
Owner

@xMAC94x commented on GitHub (Oct 29, 2025):

Hi, I am currently on pinnaclewm which depends on ext-workspace for bars. I would be very happy with a basic implementation that does not implement <workspace that has a keyboard/mouse focused window on them> for now.

And then wait for the workgroup to maybe extend the official protocol.

I will later try out your branch to confirm wheather it works or has issues.

<!-- gh-comment-id:3462922968 --> @xMAC94x commented on GitHub (Oct 29, 2025): Hi, I am currently on pinnaclewm which depends on ext-workspace for bars. I would be very happy with a basic implementation that does not implement <workspace that has a keyboard/mouse focused window on them> for now. And then wait for the workgroup to maybe extend the official protocol. I will later try out your branch to confirm wheather it works or has issues.
Author
Owner

@azertyfun commented on GitHub (Nov 20, 2025):

Any solution that's implemented for this will be transparent for the user. I'm intending to have no additional configuration necessary. If an IPC implementation exists, it will add the additional functionality. If it doesn't, some features (namely .focused, I'm not expecting anything else currently) won't work. That ideally should be no more visible than a logged warning

Yeah I agree with that approach. Better to collate whichever sources information exist than not have any at all.

What's the status of the feat/ext-workspaces branch? I'd be happy to contribute since I use Hyprland and the current IPC implementation triggers race conditions sometimes (though less often than before #1197 was merged).

<!-- gh-comment-id:3556856479 --> @azertyfun commented on GitHub (Nov 20, 2025): > Any solution that's implemented for this will be transparent for the user. I'm intending to have no additional configuration necessary. If an IPC implementation exists, it will add the additional functionality. If it doesn't, some features (namely `.focused`, I'm not expecting anything else currently) won't work. That ideally should be no more visible than a logged warning Yeah I agree with that approach. Better to collate whichever sources information exist than not have any at all. What's the status of the `feat/ext-workspaces` branch? I'd be happy to contribute since I use Hyprland and the current IPC implementation triggers race conditions sometimes (though less often than before #1197 was merged).
Author
Owner

@JakeStanger commented on GitHub (Nov 20, 2025):

Currently it logs events from the workspace manager and from workspaces themselves. Workspace groups aren't implemented at all, although I'm not sure how important they are to the bar impl anyway.

None of the work required to get the information from the client into the module is done yet. If you want to pick that up, go for it, but it is a lot of work still.

<!-- gh-comment-id:3556964329 --> @JakeStanger commented on GitHub (Nov 20, 2025): Currently it logs events from the workspace manager and from workspaces themselves. Workspace groups aren't implemented at all, although I'm not sure how important they are to the bar impl anyway. None of the work required to get the information from the client into the module is done yet. If you want to pick that up, go for it, but it is a lot of work still.
Author
Owner

@Nathan22211 commented on GitHub (Dec 22, 2025):

I will note that Labwc doesn't have any kind of IPC to it, at least in mainline.

<!-- gh-comment-id:3679961062 --> @Nathan22211 commented on GitHub (Dec 22, 2025): I will note that Labwc doesn't have any kind of IPC to it, at least in mainline.
Author
Owner

@bluebyt commented on GitHub (Feb 1, 2026):

I wanted to ask about the current status of ext-workspace-v1 suppor?
I saw that ext-workspace-v1 was merged into wlroots this week, which is great news.
https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/5115

I’m planning to test the feat/ext-workspaces branch as soon as Wayfire supports it

<!-- gh-comment-id:3832193811 --> @bluebyt commented on GitHub (Feb 1, 2026): I wanted to ask about the current status of ext-workspace-v1 suppor? I saw that ext-workspace-v1 was merged into wlroots this week, which is great news. https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/5115 I’m planning to test the feat/ext-workspaces branch as soon as Wayfire supports it
Author
Owner

@JakeStanger commented on GitHub (Feb 1, 2026):

As far as I'm aware support is as detailed here:
https://wayland.app/protocols/ext-workspace-v1#compositor-support

Wlroots has support which should be great for improving support soon. 'm still holding out for Sway support before finishing the branch.

<!-- gh-comment-id:3832226376 --> @JakeStanger commented on GitHub (Feb 1, 2026): As far as I'm aware support is as detailed here: https://wayland.app/protocols/ext-workspace-v1#compositor-support Wlroots has support which should be great for improving support soon. 'm still holding out for Sway support before finishing the branch.
Author
Owner

@xMAC94x commented on GitHub (Mar 18, 2026):

Hey, I added a branch here: https://github.com/xMAC94x/ironbar/tree/xMAC94x/feat/ext-workspaces
which works for my machine. anyone wanna test it out ? It needs some finishing touch though

<!-- gh-comment-id:4083166752 --> @xMAC94x commented on GitHub (Mar 18, 2026): Hey, I added a branch here: https://github.com/xMAC94x/ironbar/tree/xMAC94x/feat/ext-workspaces which works for my machine. anyone wanna test it out ? It needs some finishing touch though
Author
Owner

@bluebyt commented on GitHub (Mar 19, 2026):

I can try it on Hyprland, but do I need to change the config files? How can I check if I’m using ext-workspace?

Later, I’m planning to use it with Wayfire, but for that I need to wait for the next release of wlroots 0.20, which will support ext-workspace

<!-- gh-comment-id:4092784159 --> @bluebyt commented on GitHub (Mar 19, 2026): I can try it on Hyprland, but do I need to change the config files? How can I check if I’m using ext-workspace? Later, I’m planning to use it with Wayfire, but for that I need to wait for the next release of wlroots 0.20, which will support ext-workspace
Author
Owner

@JakeStanger commented on GitHub (Mar 28, 2026):

If it's in a working state, feel free to open a (draft) PR. Would be good to formalise it.

<!-- gh-comment-id:4148192260 --> @JakeStanger commented on GitHub (Mar 28, 2026): If it's in a working state, feel free to open a (draft) PR. Would be good to formalise it.
Author
Owner

@JakeStanger commented on GitHub (Apr 22, 2026):

I've opened #1465 as a draft PR with @xMAC94x's commits cherry-picked in. I've given it a very quick test and it seems to do the basics fine.

It should default to ext-workspaces so no configuration needed. You can confirm by running with IRONBAR_LOG=ironbar::clients::compositor=debug and checking for:

DEBUG ironbar::clients::compositor: 136: Getting workspace client for: ext-workspace

I'm currently hoping to get 0.19.0 out fairly soon, once some more of the pressing bugs are out, followed by a 0.19.1 for more bug squashing. The aim is to then get this in early on during 0.20.0 development to give a big testing window.

<!-- gh-comment-id:4300069505 --> @JakeStanger commented on GitHub (Apr 22, 2026): I've opened #1465 as a draft PR with @xMAC94x's commits cherry-picked in. I've given it a very quick test and it seems to do the basics fine. It should default to `ext-workspaces` so no configuration needed. You can confirm by running with `IRONBAR_LOG=ironbar::clients::compositor=debug` and checking for: ``` DEBUG ironbar::clients::compositor: 136: Getting workspace client for: ext-workspace ``` I'm currently hoping to get 0.19.0 out *fairly* soon, once some more of the pressing bugs are out, followed by a 0.19.1 for more bug squashing. The aim is to then get this in early on during 0.20.0 development to give a big testing window.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
JakeStanger/ironbar#254
No description provided.