we_cursor.sh 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. #!/bin/bash
  2. # usage: we_cursor.sh <scene dir or scene.json/scene.pkg> <out dir> "x,y x,y ..." [settle seconds]
  3. # like we_full.sh, but warps the pointer (screen px on :98) before each grab: f<i>_<x>_<y>.png
  4. S=${WE_LIVE_DIR:-$HOME/.local/share/we_live}
  5. D=:98
  6. bash "$(dirname "$0")/we_display.sh" >/dev/null || exit 1
  7. export WINEPREFIX=$S/wineprefix DISPLAY=$D WINEDEBUG=-all DXVK_LOG_PATH=$S
  8. # Wine must only see the isolated :98, not the desktop session (wayland-0, D-Bus) in the shared runtime dir
  9. unset WAYLAND_DISPLAY WAYLAND_SOCKET DBUS_SESSION_BUS_ADDRESS; export XDG_RUNTIME_DIR=$S/run
  10. # keep Wine off the desktop's audio server (a shared /run/user/<uid>/pulse would play the wallpaper's sounds on real speakers and feed real system audio to the visualizers)
  11. export PULSE_SERVER=unix:$S/run/no-pulse PIPEWIRE_REMOTE=$S/run/no-pipewire ALSA_CONFIG_PATH=/dev/null
  12. /usr/lib/wine/wineserver -k 2>/dev/null; timeout 4 tail -f /dev/null
  13. cd $S/we28
  14. F=$1; [ -d "$F" ] && F=$F/scene.json
  15. WIN=$(echo "Z:$F" | tr '/' '\\')
  16. nohup /usr/lib/wine/wine64 wallpaper64.exe -control openWallpaper -file "$WIN" -monitor 0 -playInWindow -silent > $S/we_run_last.log 2>&1 &
  17. timeout 25 tail -f /dev/null
  18. mkdir -p "$2"
  19. python3 - "$2" "$3" "${4:-3}" "$D" <<'PY'
  20. import sys, time, mss
  21. from PIL import Image
  22. from Xlib import display
  23. from Xlib.ext import xtest
  24. d=display.Display(sys.argv[4]); root=d.screen().root
  25. def walk(w):
  26. for c in w.query_tree().children:
  27. yield c; yield from walk(c)
  28. for w in walk(root):
  29. try: n=w.get_wm_name()
  30. except Exception: n=None
  31. if n=='Wallpaper UI': w.unmap()
  32. for w in root.query_tree().children:
  33. g=w.get_geometry()
  34. if w.get_attributes().map_state==2 and min(g.width,g.height)<=20 and (g.width,g.height)!=(1,1): w.unmap()
  35. d.sync(); time.sleep(2)
  36. with mss.MSS(display=sys.argv[4]) as m:
  37. for i,p in enumerate(sys.argv[2].split()):
  38. x,y=map(int,p.split(','))
  39. # small moves first so WE sees motion events, then the target
  40. for k in range(10):
  41. xtest.fake_input(d, 6, x=x+(10-k), y=y); d.sync(); time.sleep(0.05)
  42. xtest.fake_input(d, 6, x=x, y=y); d.sync()
  43. time.sleep(float(sys.argv[3]))
  44. s=m.grab({'left':0,'top':0,'width':1920,'height':1080})
  45. Image.frombytes('RGB',s.size,s.rgb).save('%s/f%d_%d_%d.png'%(sys.argv[1],i,x,y))
  46. PY
  47. /usr/lib/wine/wineserver -k 2>/dev/null