-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpointer.rb
174 lines (133 loc) · 4.53 KB
/
pointer.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
require 'uinput/device'
class VirtualPointer
attr_reader :device, :device_abs, :device_mt, :display
def initialize(display=":0")
@display = display
end
def create_devices
# puts "create " + @display.to_s
display = @display
## Absolute pointer
@device_abs = Uinput::Device.new do
self.name = "Virtual absolute device on " + display
self.type = LinuxInput::BUS_VIRTUAL
self.add_event(:EV_SYN)
self.add_event(:EV_KEY)
self.add_key(:BTN_TOUCH)
self.add_event(:EV_ABS)
self.add_abs(:ABS_X, 0,0,2048)
self.add_abs(:ABS_Y, 0,0,2048)
self.add_abs_event(:ABS_X)
self.add_abs_event(:ABS_Y)
self.set_prop(:INPUT_PROP_POINTER)
self.set_prop(:INPUT_PROP_DIRECT)
end
## MultiTouch pointer
@device_mt = Uinput::Device.new do
self.name = "Virtual multitouch device on " + display
self.type = LinuxInput::BUS_VIRTUAL
self.add_event(:EV_SYN)
self.add_event(:EV_KEY)
# self.add_key(:BTN_TOUCH)
self.add_event(:EV_ABS)
self.add_event(:EV_REL)
self.add_abs(:ABS_MT_SLOT, 0, 0, 10) ## 10 points
self.add_abs(:ABS_MT_POSITION_X, 0,0, 2048)
self.add_abs(:ABS_MT_POSITION_Y, 0,0, 2048)
self.add_abs(:ABS_MT_TRACKING_ID, 0,0, 65535)
# self.add_abs(:ABS_MT_TOUCH_MAJOR, 0,0,15)
# self.add_abs(:ABS_MT_PRESSURE, 0,0, 255)
self.add_abs_event(:ABS_MT_SLOT)
self.add_abs_event(:ABS_MT_POSITION_X)
self.add_abs_event(:ABS_MT_POSITION_Y)
self.add_abs_event(:ABS_MT_TRACKING_ID)
# self.add_abs_event(:ABS_MT_TOUCH_MAJOR)
# self.add_abs_event(:ABS_MT_PRESSURE)
self.set_prop(:INPUT_PROP_POINTER)
self.set_prop(:INPUT_PROP_DIRECT)
end
@device = Uinput::Device.new do
self.name = "Virtual mouse device on " + display
self.type = LinuxInput::BUS_VIRTUAL
# self.add_key(:KEY_A)
self.add_event(:EV_REL)
self.add_event(:EV_KEY)
self.add_event(:EV_SYN)
## Test with ABS
self.add_event(:EV_ABS)
self.add_event(:ABS_X)
self.add_event(:ABS_Y)
self.add_key(:BTN_LEFT)
self.add_key(:BTN_RIGHT)
self.add_rel_event(:REL_X)
self.add_rel_event(:REL_Y)
end
end
# def id ## Not reliable
# return @device.dev_path.split("event")[1].to_i
# end
def name; "Virtual mouse device on #{@display}"; end
def name_abs; "Virtual absolute device on #{@display}"; end
def name_mt; "Virtual multitouch device on #{@display}"; end
def names ; [name, name_abs, name_mt] ; end
def delete
@device.destroy
@device_abs.destroy
@device_mt.destroy
end
def press_left(press)
v = press ? 0 : 1
@device.send_event(:EV_KEY, :BTN_LEFT, v)
@device.send_event(:EV_SYN, :SYN_REPORT)
end
def press_right(press)
v = press ? 0 : 1
@device.send_event(:EV_KEY, :BTN_RIGHT, v)
@device.send_event(:EV_SYN, :SYN_REPORT)
end
def move(x,y)
@device.send_event(:EV_REL, :REL_X, x)
@device.send_event(:EV_REL, :REL_Y, y)
@device.send_event(:EV_SYN, :SYN_REPORT)
end
def press_abs(x,y)
@device_abs.send_event(:EV_KEY, :BTN_TOUCH , 1)
@device_abs.send_event(:EV_ABS, :ABS_X , x)
@device_abs.send_event(:EV_ABS, :ABS_Y , y)
@device_abs.send_event(:EV_SYN, :SYN_REPORT)
end
def move_abs(x,y)
@device_abs.send_event(:EV_ABS, :ABS_X , x)
@device_abs.send_event(:EV_ABS, :ABS_Y , y)
@device_abs.send_event(:EV_SYN, :SYN_REPORT)
end
def release_abs
@device_abs.send_event(:EV_KEY, :BTN_TOUCH , 0)
@device_abs.send_event(:EV_SYN, :SYN_REPORT)
end
def press_abs_mt(x,y, id, slot)
@device_mt.send_event(:EV_ABS, :ABS_MT_SLOT, slot)
@device_mt.send_event(:EV_ABS, :ABS_MT_TRACKING_ID, id)
@device_mt.send_event(:EV_ABS, :ABS_MT_POSITION_X, x)
@device_mt.send_event(:EV_ABS, :ABS_MT_POSITION_Y, y)
@device_mt.send_event(:EV_SYN, :SYN_REPORT)
end
def move_abs_mt(x,y, slot)
@device_mt.send_event(:EV_ABS, :ABS_MT_SLOT, slot)
@device_mt.send_event(:EV_ABS, :ABS_MT_POSITION_X, x)
@device_mt.send_event(:EV_ABS, :ABS_MT_POSITION_Y, y)
@device_mt.send_event(:EV_SYN, :SYN_REPORT)
end
def release_abs_mt(slot)
@device_mt.send_event(:EV_ABS, :ABS_MT_SLOT, 0)
@device_mt.send_event(:EV_ABS, :ABS_MT_TRACKING_ID, -1)
@device_mt.send_event(:EV_SYN, :SYN_REPORT)
end
def release_abs_mt_purge
(0...10).each {|i| release_abs_mt(i) }
end
def unload_on(display)
end
def load_on(display)
end
end