| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- import sys
- from os.path import dirname, join
- sys.path.insert(0, join(dirname(__file__), 'python-xlib'))
- import time
- from random import randint
- from Xlib import display, X, XK, ext
- WINDOW_WIDTH = 1600
- WINDOW_HEIGHT = 900
- BOARD_X = 367
- BOARD_Y = 129
- BOARD_WIDTH = 420
- BOARD_HEIGHT = 638
- KEY_DELAY = 14 # milliseconds
- disp = display.Display()
- def find_window(name):
- def traverse(window):
- if window.get_wm_name() == name:
- return window
- for child in window.query_tree().children:
- win = traverse(child)
- if win:
- return win
- return traverse(disp.screen().root)
- def get_exapunks_window():
- win = find_window('EXAPUNKS')
- assert win, 'EXAPUNKS window not found'
- geo = win.get_geometry()
- assert geo.width == WINDOW_WIDTH
- assert geo.height == WINDOW_HEIGHT
- return win
- def focus_window(window):
- window.set_input_focus(X.RevertToNone, X.CurrentTime)
- window.raise_window()
- disp.sync()
- def screenshot_board(window):
- im = window.get_image(BOARD_X, BOARD_Y, BOARD_WIDTH, BOARD_HEIGHT,
- X.ZPixmap, 0xffffffff)
- return BoardImage(im.data)
- def press_keys(window, keys):
- assert disp.has_extension('XTEST')
- for key in keys:
- keysym = XK.string_to_keysym(key)
- keycode = disp.keysym_to_keycode(keysym)
- ext.xtest.fake_input(disp, X.KeyPress, keycode)
- disp.sync()
- time.sleep(KEY_DELAY / 1000)
- ext.xtest.fake_input(disp, X.KeyRelease, keycode)
- disp.sync()
- time.sleep(KEY_DELAY / 1000)
- def rgb2hsv(r, g, b):
- r /= 255
- g /= 255
- b /= 255
- cmax = max(r, g, b)
- cmin = min(r, g, b)
- diff = cmax - cmin
- if cmax == cmin:
- h = 0
- elif cmax == r:
- h = (60 * ((g - b) / diff) + 360) % 360
- elif cmax == g:
- h = (60 * ((b - r) / diff) + 120) % 360
- elif cmax == b:
- h = (60 * ((r - g) / diff) + 240) % 360
- h = int(h * 256 / 360)
- s = 0 if cmax == 0 else int(diff * 256 / cmax)
- v = int(cmax * 256)
- return h, s, v
- class BoardImage:
- def __init__(self, data):
- self.data = data
- def getpixel(self, xy):
- x, y = xy
- i = (y * BOARD_WIDTH + x) * 4
- b, g, r = self.data[i:i + 3]
- return rgb2hsv(r, g, b)
- if __name__ == '__main__':
- win = get_exapunks_window()
- win.raise_window()
- old_focus = disp.get_input_focus()
- disp.set_input_focus(win, X.RevertToParent, X.CurrentTime)
- #press_keys(win, 'aaaj')
- #while True:
- # press_keys(win, 'djkj' * 7)
- # press_keys(win, 'ajkj' * 7)
- while True:
- press_keys(win, 'adjk'[randint(0, 3)])
- disp.set_input_focus(old_focus.focus, X.RevertToParent, X.CurrentTime)
- disp.sync()
|