Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Wayland support #20

Open
WilliamImm opened this issue Mar 3, 2024 · 9 comments
Open

Wayland support #20

WilliamImm opened this issue Mar 3, 2024 · 9 comments
Labels

Comments

@WilliamImm
Copy link

I'm looking to use a Wayland-based DE/compositor in the future over X11, and I'm what barriers there would be to using HUDKit on Wayland. Has this been tested?

For context, IINACT recommends HUDKit for overlays on Linux, and I want to make sure this works as well without having to go and use an X11-based environment.

@anko
Copy link
Owner

anko commented Mar 4, 2024

It "should" work in theory, but I haven't gotten it to work in my rudimentary tests. (I don't use Wayland day-to-day.)

All of the windowing operations in hudkit use GTK3 currently, which has a Wayland backend in addition to X11, and doesn't document having any relevant platform limitations. But it seems there are many undocumented limitations, because running hudkit in weston-x11 (Wayland within X11), doesn't work: no visual, but mysteriously no errors either. I haven't debugged it further than that, because there is no obvious starting point and I don't know enough about Wayland to guess.

Perhaps the limitation is in weston, and a proper full Wayland desktop would work? I haven't tested one. If you want to test it, you should be able to run the example as per the readme, without changes. If it doesn't work, try export GDK_BACKEND=wayland first, to make extra sure the Wayland backend is used.

Technical notes on feasibility of future upgrade to GTK4

It seems the idiomatic way to make an overlay window on Wayland, as used by https://github.com/francma/wob, is an unstable Wayland protocol feature "wlr-layer-shell-unstable-v1". I don't know if there are alternatives, or what GTK3/GTK4 use to implement e.g. gdk_window_set_override_redirect or gtk_window_set_keep_above.

I would really rather rely on GTK than add platform-specific code paths. If GTK says it has a Wayland backend, but can't actually do the same thing on Wayland as on X11, that's a GTK limitation that should be fixed in GTK.

Currently-unstable webkitgtk-6.0 might have better Wayland support through GTK4. Migrating to that would take some effort and it also means migrating from GTK3 to GTK4. We can't migrate to GTK4 separately; each WebKit version depends on a specific GTK version.

I would like to stick to the stable WebKit API for ease of maintenance; the previous unstable webkitgtk-5.x never became stable for example, and many distros don't package it anymore. I would be open to starting a migration effort on a separate branch though, since the GTK4 API is stable even if the corresponding WebKit isn't yet, and I'd expect most of the migration to be GTK changes rather than WebKit.

@WilliamImm
Copy link
Author

WilliamImm commented Mar 5, 2024

I can test w/ a few representative examples of Wayland envs: KDE Plasma & Sway (wlroots-based compositor). Enough to see what might be needed, or might not be needed (hopefully).

Gimme a little and I'll set it up.

@cptn-cosmo
Copy link

Screenshot_20240412_153658

For me it generally seems to work on wayland (KDE Plasma 6 in this case) but the position is off, which might be due to my displays using different resolutions and I don't understand how i can make the overlay window smaller and move it to sa specific location, which would be my usecase to use it as a DPS meter overlay for the game...

anko added a commit that referenced this issue Apr 15, 2024
The GTK documentation on `gtk_window_move` [1] state this:

> Asks the window manager to move window to the given position. Window
> managers are free to ignore this; most window managers ignore requests
> for initial window positions (instead using a user-defined placement
> algorithm) and honor requests after the window has already been shown.

That may be what causes the overlay to the positioned wrong in #18 and
#20 (comment). In any
case, it should do no harm to make sure.

[1]: https://docs.gtk.org/gtk3/method.Window.move.html
@anko
Copy link
Owner

anko commented Apr 15, 2024

@cptn-cosmo Thanks for testing this. I am pleasantly surprised that it works even that well. I want to fix that bug and support your use-case.

The detected monitor coordinates shown in the top-left debug information look correct to me, so the fault must be with how the overlay is being positioned. It is positioned based on the same monitor coordinates though, which are correct…

My first suspicion is that something else moves the window after it positions itself. I remembered reading in GTK docs that some window managers ignore window move requests until after the window becomes visible, instead doing their own "smart" window positioning. So I added (024bfb6), which tries to reposition the window correctly again after the window becomes visible.

Could you test again with that change included? It's on the master branch.

@anko anko added the bug label Apr 15, 2024
@Crosant
Copy link

Crosant commented May 17, 2024

Screenshot_20240412_153658

For me it generally seems to work on wayland (KDE Plasma 6 in this case) but the position is off, which might be due to my displays using different resolutions and I don't understand how i can make the overlay window smaller and move it to sa specific location, which would be my usecase to use it as a DPS meter overlay for the game...

Same problem for me on two monitors with the same resolution, so that is not the problem, also happens with 024bfb6 applied

@redeven
Copy link

redeven commented May 29, 2024

wayland (KDE Plasma 6 in this case)

Not sure if it's just a KDE Wayland specific issue, but there's a KDE specific workaround, you can just add a Window Rule for hudkit. These settings spawn it at the top-left corner as expected, and make sure it stays as an overlay on top of everything else, doesn't have a border or titlebar, and it doesn't show up on the taskbar or when alt+tabbing.

image

@anko anko changed the title Add support for Wayland (if needed) Wayland support May 30, 2024
anko added a commit that referenced this issue May 30, 2024
@xxcrabx
Copy link

xxcrabx commented Jul 2, 2024

I'm also using Wayland and trying to make this work for IINACT but I seem to run in a very different issue. The run.sh seems to open and I don't get any errors but the blue overlay doesn't appear and after quite some time of waiting it just opens a web inspector that crashes after a few seconds. I know there's no "official" Wayland support but I wanted to add my experience since I've got a different result.
image

@Helios747
Copy link

Helios747 commented Jul 9, 2024

I have a different issue as well. I can get the overlay to act as an overlay using the rules @redeven posted, but I can't click on any button in the overlay, like allowing audio access. On FFXIV raiding overlays I also can't click the settings buttons on them.

Additionally, I can't figure out how to resize or position any of the overlays. For example, DPS meters for FFXIV are stuck taking up the whole screen and I can't figure out how to make it smaller.

More people are going to come looking for wayland support as multiple major distros are now defaulting to it on all GPUs.

@mgunyho
Copy link

mgunyho commented Jul 27, 2024

Hi, I just tried the example on Sway with a multi-monitor setup, and there are a few issues:

  • Mouse clicks and keyboard events are not passed through to any windows underneath
  • All of the monitor outlines are on the same monitor. Hudkit just opens a window that is the size of the largest monitor, and everything is inside that. All of the x and y coordinates are zero:
    file:///tmp/hudkit-test/page.html:91:28: CONSOLE LOG [
      {
        "name": "0x0BCA",
        "x": 0,
        "y": 0,
        "width": 1128,
        "height": 752
      },
      {
        "name": "BenQ 241W",
        "x": 0,
        "y": 0,
        "width": 1920,
        "height": 1200
      },
      {
        "name": "ASUS PA238",
        "x": 0,
        "y": 0,
        "width": 1920,
        "height": 1080
      }
    ]
    
  • One of my monitors (asus PA238) is in portrait orientation, but hudkit doesn't recognize this

Here's a screenshot showing my screen layout and how hudkit opens (when launching from the central monitor):

image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

8 participants