screenshare/venv/lib/python3.12/site-packages/pyscreenshot/plugins/gnome_dbus.py
2024-11-29 18:15:30 +00:00

80 lines
2.4 KiB
Python

import logging
from pyscreenshot.plugins.backend import UNKNOWN_VERSION, CBackend
from pyscreenshot.tempexport import read_func_img
log = logging.getLogger(__name__)
class GnomeDBusError(Exception):
pass
class GnomeDBusWrapper(CBackend):
name = "gnome_dbus"
is_subprocess = True
def grab(self, bbox=None):
im = read_func_img(self._grab_to_file, bbox)
return im
def _grab_to_file(self, filename, bbox=None):
has_jeepney = False
try:
# from jeepney import new_method_call
from jeepney.io.blocking import open_dbus_connection # type: ignore
from jeepney.wrappers import MessageGenerator # type: ignore
from jeepney.wrappers import new_method_call
has_jeepney = True
except ImportError:
pass
if not has_jeepney:
raise GnomeDBusError("jeepney library is missing")
class Screenshot(MessageGenerator):
interface = "org.gnome.Shell.Screenshot"
def __init__(
self,
object_path="/org/gnome/Shell/Screenshot",
bus_name="org.gnome.Shell.Screenshot",
):
super().__init__(object_path=object_path, bus_name=bus_name)
def Screenshot(self, include_cursor, flash, filename):
return new_method_call(
self, "Screenshot", "bbs", (include_cursor, flash, filename)
)
def ScreenshotArea(self, x, y, width, height, flash, filename):
return new_method_call(
self,
"ScreenshotArea",
"iiiibs",
(x, y, width, height, flash, filename),
)
# https://jeepney.readthedocs.io/en/latest/integrate.html
connection = open_dbus_connection(bus="SESSION")
dbscr = Screenshot()
if bbox:
msg = dbscr.ScreenshotArea(
bbox[0],
bbox[1],
bbox[2] - bbox[0],
bbox[3] - bbox[1],
False,
filename,
)
else:
msg = dbscr.Screenshot(False, False, filename)
reply = connection.send_and_get_reply(msg)
result = reply.body[0]
if not result:
raise GnomeDBusError("dbus error: %s %s" % (msg, result))
def backend_version(self):
return UNKNOWN_VERSION