X11Client is C extension that manages X11 windows/events.
It can be handy if you want to controll some programs running in Xvfb.
- Xlib
- Xtst
- Xext
gem install x11_client
- X11Client.new(display) - create new client for given display
- X11Client#open_display - explicit open display
- X11Client#close_display - explicit close display
- X11Client#sync - sync display
- X11Client#start(&block) - block execution and yield event attributes for each new event.
- X11Client#stop - stop blocking loop
- X11Client#root_window_id - returns root window id in decimal.
- X11Client#root_window - returns root window attributes hash.
- X11Client#get_window(window_id) - returns window attributes hash or nil for given window_id.
- X11Client#get_window(window_id) - returns window name for given window_id.
- X11Client#mousemove(x,y) - move mouse pointer to (x,y) coordinates.
- X11Client#mousedown(button) - down mouse buton
- X11Client#mouseup(buton) - up mouse button
- X11Client#mouseclick(button) - mousedown and mouseup
- X11Client#keydown(key) - press a key
- X11Client#keyup(key) - release a key
- X11Client#key(key) - press and release a key
- 1 - left
- 2 - right
- 3 - middle
- 4 - wheel up
- 5 - wheel down
- XK_Return
- XK_Escape
- XK_Left
- XK_Up
- XK_Page_Up
- XK_F1
- XK_Shift_L
- XK_Control_R
- XK_Meta_L
- XK_Alt_R
- XK_Super_L
- XK_Hyper_R
- XK_space
- XK_A
- XK_z
- ...
See X11 keysym list
Keysym list is generated from /usr/include/X11
sources with rake update_keysym
- id - window id
- root_id - root window id
- x - X coordinate
- y - Y coordinate
- width - window width
- height - window height
- border_width - window border width
- state - window state
- shown
- hidden
- unmapped
Supported events:
- CreateWindowEvent
- DestroyWindowEvent
- MapEvent
- UnmapEvent
- VisibilityEvent
- type
- window_id
- parent_id
- x
- y
- width
- height
- border_width
- type
- window_id
- type
- window_id
- type
- window_id
- type
- window_id
- state:
- unobscured
- partially_obscured
- fully_unobscured
client = X11Client.new(":0")
client.start do |event|
case event['type']
when 'CreateWindowEvent'
window = client.get_window(event["window_id"])
next unless window
case window['class']
when /skype/i
case window['name']
when /End User License Agreement/i
# Accept Skype Aggreement
client.mousemove(window['x'] + 500, window['y'] + 340)
client.sync
sleep(1)
client.mouseclick(1)
client.stop
end
end
end
end
$ sudo pacman -S xorg-xwininfo
$ bundle install
$ bundle exec rspec spec