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

Support request: Wayland #155

Open
dynobo opened this issue Apr 24, 2020 · 7 comments
Open

Support request: Wayland #155

dynobo opened this issue Apr 24, 2020 · 7 comments

Comments

@dynobo
Copy link

dynobo commented Apr 24, 2020

General information:

  • OS name: Ubuntu
  • OS version: 20.04
  • OS architecture: 64 bits
  • Resolutions:
    • Monitor 1: 1920x1080
  • Python version: 3.8.2
  • MSS version: 5.0.0

For GNU/Linux users:

  • Display server protocol and version, if known: Wayland
  • Desktop Environment: Gnome
  • Composite Window Manager name and version: Unknown

Description of the warning/error

When running mss under Wayland, it crashs. As far as I understand from the source code, mss currently uses xlib for Linux, which seems to (unsurprisingly) not work on Wayland. It would be very cool to have wayland support implemented, as it becomes more and more popular.

Full message

Example: Executing the following snippet under X works perfectly, while under Wayland it produces an error.

Snippet:

import mss
fn = mss.mss().shot(mon=-1, output="screenshot.png")
print(fn)

Error on Wayland:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/holger/.local/lib/python3.8/site-packages/mss/factory.py", line 41, in mss
    return linux.MSS(**kwargs)
  File "/home/holger/.local/lib/python3.8/site-packages/mss/linux.py", line 226, in __init__
    self.root = self.xlib.XDefaultRootWindow(MSS.display)
  File "/home/holger/.local/lib/python3.8/site-packages/mss/linux.py", line 175, in validate
    raise ScreenShotError(err, details=details)
mss.exception.ScreenShotError: XDefaultRootWindow() failed

Other details

A lot of screenshot tools (e.g. shutter) have this issue, because screenshots seem to work completely different in Wayland (to improve security). Applications that do work are e.g.:

A proper way to do screenshots under Wayland is referenced in a flameshot issue and might help solving this in mss, too. The main statement from that issue:

The cross-platform way to take screenshots on Wayland is via xdg-desktop-portal (which also works outside of Flatpak). See https://github.com/flatpak/xdg-desktop-portal/blob/master/data/org.freedesktop.portal.Screenshot.xml

Upvote & Fund

  • We're using Polar.sh so you can upvote and help fund this issue.
  • We receive the funding once the issue is completed & confirmed by you.
  • Thank you in advance for helping prioritize & fund our backlog.
Fund with Polar
@BoboTiG
Copy link
Owner

BoboTiG commented Apr 24, 2020

Hello,

Thanks for starting the discussion :)
It would be cool to have MSS working on Wayland, I will check that when I can (PRs are still very welcome too 😃).

@BoboTiG
Copy link
Owner

BoboTiG commented Apr 26, 2020

@BoboTiG BoboTiG changed the title Implement support for Wayland DE Support request: Wayland Apr 27, 2020
@DjinNO
Copy link

DjinNO commented Sep 2, 2020

really looking fow wayland support

@surajRathi
Copy link

surajRathi commented Jun 19, 2021

Hello,

I started looking at wayland support. I have worked on a very basic (incomplete) implementation repository .

However I am getting horrible FPS (~3.5) and it pulls in two external dependencies (python-dbus and pygoobject).

There are two points of interest:

  1. I think xdg-desktop-portal seems to only give the current monitor. I do not have an external monitor. I may try with virtual outputs in the future.
  2. Flow:
    2.1. Call method Screenshot on Service org.freedesktop.portal.Desktop, with object /org/freedesktop/portal/desktop, and interface org.freedesktop.portal.Screenshot.
    This will return the path of an object: request_path
    2.2 Subscribe to a signal on Service org.freedesktop.portal.Desktop on the object request_path and interface org.freedesktop.portal.Request.
    2.3 Run the Main Loop (!!!). After a while we will receive a file path.
    2.4 Open the file and create a screenshot object.

This project (from what I understand) is supposed to be fast and no dependencies.
Further steps to be taken:

  • Monitor Support
  • Use libdbus directly and use a custom event loop. (absolutely no idea where to start from)

Concerns:

  1. The dbus event loop seems to be taking ~75% of the time (the remaining 30% being mainly reading the file from disk to a screenshot object). With this latency is xdg-desktop-portal suitable for the python-mss project?

  2. Should I add/modify the Screenshot object constructors to load images from a file more efficiently?

I have not been able to run the tests as the pygoobject dependency is causing issues. I am not that familiar with tox.

I have not made a pull request as this is very very preliminary.

Apologies if I have skipped a step or not seen another discussion.

I also just realized that I bumped a year old thread, sorry for that.

@adeliktas
Copy link

adeliktas commented Dec 26, 2021

A bump should be no issue as long as this issue is open and there is demand for wayland (or Xwayland on Gnome 40.0 in my case). I've tried the commits of surajRathi, but unfortunately receive NotImplementedError for _monitors_impl. Mss is a dependency for python-imagesearch, which i originally intended to use.
As BoboTiG commented, i'm not sure either how far this issue can be solved, because of the general design of wayland. But solving this on gnome certainly seems easier because of it's gnome-screenshot utility.

@gitagogaming
Copy link

gitagogaming commented Sep 1, 2022

I recently ran into a similar issue trying to use mss.grab on Fedora 36 and Ubuntu 22.04 LTS
On these two versions of Linux they are defaulted to wayland and after a bit of research I learned that it does not work on wayland yet.

So onto a little extra bump here to anyone that understands the issue at hand perhaps

@cactorium
Copy link

Just wanted to add a little bit in case anyone wants to try to implement it; it looks like most desktop environments have opted to support xdg-desktop-portal, which exposes a Screencasting API, which provides a Pipewire interface to the screencast: https://docs.flatpak.org/en/latest/portal-api-reference.html#gdbus-org.freedesktop.portal.ScreenCast It looks like there's some talk in python-pillow to use this in case that provides some more useful resources: python-pillow/Pillow#6392

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

No branches or pull requests

7 participants