interaction.py 2.3 KB

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