interaction.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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. if __name__ == '__main__':
  54. win = get_exapunks_window()
  55. win.raise_window()
  56. old_focus = disp.get_input_focus()
  57. disp.set_input_focus(win, X.RevertToParent, X.CurrentTime)
  58. #press_keys(win, 'aaaj')
  59. #while True:
  60. # press_keys(win, 'djkj' * 7)
  61. # press_keys(win, 'ajkj' * 7)
  62. while True:
  63. press_keys(win, 'adjk'[randint(0, 3)])
  64. disp.set_input_focus(old_focus.focus, X.RevertToParent, X.CurrentTime)
  65. disp.sync()