forked from talonvoice/examples
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy patheye_mon_snap.py
48 lines (40 loc) · 1.45 KB
/
eye_mon_snap.py
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
from talon import ctrl, tap, ui, eye
from talon_plugins.eye_mouse import tracker, mouse
from talon.track.geom import Point2d, Point3d, EyeFrame
main = ui.main_screen()
def is_on_main(p):
return (main.x <= p.x < main.x + main.width and
main.y <= p.y < main.y + main.height)
class MonSnap:
def __init__(self):
tap.register(tap.MMOVE, self.on_move)
tracker.register('gaze', self.on_gaze)
self.saved_mouse = None
self.main_mouse = False
self.main_gaze = False
self.restore_counter = 0
def on_gaze(self, b):
l, r = EyeFrame(b, 'Left'), EyeFrame(b, 'Right')
p = (l.gaze + r.gaze) / 2
main_gaze = -0.02 < p.x < 1.02 and -0.02 < p.y < 1.02 and bool(l or r)
if self.main_gaze and self.main_mouse and not main_gaze:
self.restore_counter += 1
if self.restore_counter > 5:
self.restore()
else:
self.restore_counter = 0
self.main_gaze = main_gaze
def restore(self):
if self.saved_mouse:
mouse.last_ctrl = self.saved_mouse
ctrl.mouse(self.saved_mouse.x, self.saved_mouse.y)
self.saved_mouse = None
self.main_gaze = False
def on_move(self, typ, e):
if typ != tap.MMOVE: return
p = Point2d(e.x, e.y)
on_main = is_on_main(p)
if not on_main:
self.saved_mouse = p
self.main_mouse = on_main
snap = MonSnap()