interaction.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. import sys
  2. from os.path import dirname, join
  3. sys.path.insert(0, join(dirname(__file__), 'python-xlib'))
  4. import time
  5. from random import randint
  6. from Xlib import display, X, XK, ext
  7. from PIL import Image
  8. WINDOW_WIDTH = 1600
  9. WINDOW_HEIGHT = 900
  10. BOARD_X = 367
  11. BOARD_Y = 129
  12. BOARD_WIDTH = 420
  13. BOARD_HEIGHT = 638
  14. KEY_DELAY = 14 # milliseconds
  15. disp = display.Display()
  16. def find_window(name):
  17. def traverse(window):
  18. if window.get_wm_name() == name:
  19. return window
  20. for child in window.query_tree().children:
  21. win = traverse(child)
  22. if win:
  23. return win
  24. return traverse(disp.screen().root)
  25. def get_exapunks_window():
  26. win = find_window('EXAPUNKS')
  27. assert win, 'EXAPUNKS window not found'
  28. geo = win.get_geometry()
  29. assert geo.width == WINDOW_WIDTH
  30. assert geo.height == WINDOW_HEIGHT
  31. return win
  32. def focus_window(window):
  33. window.set_input_focus(X.RevertToNone, X.CurrentTime)
  34. window.raise_window()
  35. disp.sync()
  36. def screenshot_board(window):
  37. raw = window.get_image(BOARD_X, BOARD_Y, BOARD_WIDTH, BOARD_HEIGHT,
  38. X.ZPixmap, 0xffffffff)
  39. dim = BOARD_WIDTH, BOARD_HEIGHT
  40. im = Image.frombytes('RGB', dim, raw.data, 'raw', 'BGRX')
  41. return im.convert('HSV')
  42. def press_keys(window, keys):
  43. assert disp.has_extension('XTEST')
  44. for key in keys:
  45. keysym = XK.string_to_keysym(key)
  46. keycode = disp.keysym_to_keycode(keysym)
  47. ext.xtest.fake_input(disp, X.KeyPress, keycode)
  48. disp.sync()
  49. time.sleep(KEY_DELAY / 1000)
  50. ext.xtest.fake_input(disp, X.KeyRelease, keycode)
  51. disp.sync()
  52. time.sleep(KEY_DELAY / 1000)
  53. def listen_keys(handlers):
  54. from pynput import keyboard
  55. def handler(keycode):
  56. key = str(keycode).replace('\'', '')
  57. if key in handlers:
  58. handlers[key]()
  59. keyboard.Listener(on_release=handler).start()
  60. if __name__ == '__main__':
  61. win = get_exapunks_window()
  62. win.raise_window()
  63. old_focus = disp.get_input_focus()
  64. disp.set_input_focus(win, X.RevertToParent, X.CurrentTime)
  65. #press_keys(win, 'aaaj')
  66. #while True:
  67. # press_keys(win, 'djkj' * 7)
  68. # press_keys(win, 'ajkj' * 7)
  69. while True:
  70. press_keys(win, 'adjk'[randint(0, 3)])
  71. disp.set_input_focus(old_focus.focus, X.RevertToParent, X.CurrentTime)
  72. disp.sync()