102 lines
3.2 KiB
Python
102 lines
3.2 KiB
Python
|
|
#!/usr/bin/env python3
|
||
|
|
"""Take a screenshot of the HCIE iced app window using XDG portal or xdotool+import."""
|
||
|
|
import subprocess
|
||
|
|
import sys
|
||
|
|
import time
|
||
|
|
|
||
|
|
def try_portal_screenshot():
|
||
|
|
"""Try org.freedesktop.portal.Screenshot via dbus."""
|
||
|
|
try:
|
||
|
|
result = subprocess.run(
|
||
|
|
['gdbus', 'call', '--session', '--dest', 'org.freedesktop.portal.Desktop',
|
||
|
|
'--object-path', '/org/freedesktop/portal/desktop',
|
||
|
|
'--method', 'org.freedesktop.portal.Screenshot.Screenshot',
|
||
|
|
'', '{}'],
|
||
|
|
capture_output=True, text=True, timeout=5
|
||
|
|
)
|
||
|
|
if result.returncode == 0:
|
||
|
|
return True
|
||
|
|
except Exception:
|
||
|
|
pass
|
||
|
|
return False
|
||
|
|
|
||
|
|
def try_import_screenshot(output):
|
||
|
|
"""Try ImageMagick import."""
|
||
|
|
try:
|
||
|
|
subprocess.run(['import', '-window', 'root', output], timeout=10)
|
||
|
|
return True
|
||
|
|
except Exception:
|
||
|
|
return False
|
||
|
|
|
||
|
|
def try_xdg_screenshot(output):
|
||
|
|
"""Try gnome-screenshot or xfce4-screenshooter."""
|
||
|
|
for cmd in [['gnome-screenshot', '-f', output],
|
||
|
|
['xfce4-screenshooter', '-f', '-s', output]]:
|
||
|
|
try:
|
||
|
|
subprocess.run(cmd, timeout=10)
|
||
|
|
import os
|
||
|
|
if os.path.exists(output) and os.path.getsize(output) > 0:
|
||
|
|
return True
|
||
|
|
except Exception:
|
||
|
|
continue
|
||
|
|
return False
|
||
|
|
|
||
|
|
def try_xdotool_import(output):
|
||
|
|
"""Use xdotool to find window and import."""
|
||
|
|
try:
|
||
|
|
result = subprocess.run(['xdotool', 'search', '--name', 'HCIE'],
|
||
|
|
capture_output=True, text=True, timeout=5)
|
||
|
|
wid = result.stdout.strip().split('\n')[0]
|
||
|
|
if wid:
|
||
|
|
subprocess.run(['import', '-window', wid, output], timeout=10)
|
||
|
|
import os
|
||
|
|
if os.path.exists(output) and os.path.getsize(output) > 0:
|
||
|
|
return True
|
||
|
|
except Exception:
|
||
|
|
pass
|
||
|
|
return False
|
||
|
|
|
||
|
|
def try_grim_screenshot(output):
|
||
|
|
"""Try grim for Wayland."""
|
||
|
|
try:
|
||
|
|
subprocess.run(['grim', output], timeout=10)
|
||
|
|
import os
|
||
|
|
if os.path.exists(output) and os.path.getsize(output) > 0:
|
||
|
|
return True
|
||
|
|
except Exception:
|
||
|
|
pass
|
||
|
|
return False
|
||
|
|
|
||
|
|
def try_spectacle_screenshot(output):
|
||
|
|
"""Try spectacle for KDE Wayland."""
|
||
|
|
try:
|
||
|
|
subprocess.run(['spectacle', '--nonotify', '-f', output], timeout=10)
|
||
|
|
import os
|
||
|
|
if os.path.exists(output) and os.path.getsize(output) > 0:
|
||
|
|
return True
|
||
|
|
except Exception:
|
||
|
|
pass
|
||
|
|
return False
|
||
|
|
|
||
|
|
if __name__ == '__main__':
|
||
|
|
output = sys.argv[1] if len(sys.argv) > 1 else '/tmp/hcie_screenshot.png'
|
||
|
|
|
||
|
|
methods = [
|
||
|
|
("grim (Wayland)", try_grim_screenshot),
|
||
|
|
("spectacle (KDE)", try_spectacle_screenshot),
|
||
|
|
("import (ImageMagick)", try_import_screenshot),
|
||
|
|
("xdotool+import", try_xdotool_import),
|
||
|
|
("gnome-screenshot/xfce4", try_xdg_screenshot),
|
||
|
|
]
|
||
|
|
|
||
|
|
for name, method in methods:
|
||
|
|
print(f"Trying {name}...")
|
||
|
|
if method(output):
|
||
|
|
import os
|
||
|
|
if os.path.exists(output) and os.path.getsize(output) > 0:
|
||
|
|
print(f"SUCCESS: Screenshot saved to {output}")
|
||
|
|
sys.exit(0)
|
||
|
|
|
||
|
|
print("FAILED: No screenshot method worked")
|
||
|
|
sys.exit(1)
|