-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathmouse.lua
More file actions
117 lines (104 loc) · 3.89 KB
/
Copy pathmouse.lua
File metadata and controls
117 lines (104 loc) · 3.89 KB
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
local mouse = hs.mouse
local geometry = hs.geometry
local event = hs.eventtap.event
local eventTypes = event.types
local size = geometry.size
local point = geometry.point
function mouse.point()
return point(mouse.getAbsolutePosition())
end
local function swipe(from, to, window, seconds, tickDistance)
seconds = seconds or 0.2
tickDistance = tickDistance or 20
from = point(from)
to = point(to)
ticks = from:distance(to) / tickDistance
local vector = from:vector(to)
local xPerTick = vector.x / ticks
local yPerTick = vector.y / ticks
local secondsPerTick = seconds / ticks
local currentPoint = from:copy()
-- TODO: posting events to the app doesn't seem to work as expected
window:focus()
event.newMouseEvent(eventTypes.leftMouseDown, currentPoint):post()
local dragger = hs.timer.doWhile(
function()
return geometry.inside(
currentPoint,
geometry.rect({x1 = from.x, y1 = from.y, x2 = to.x, y2 = to.y})
)
end,
function()
currentPoint:move(xPerTick, yPerTick)
event.newMouseEvent(eventTypes.leftMouseDragged, currentPoint):post()
end,
secondsPerTick
)
hs.timer.waitWhile(
function()
return dragger:running()
end,
function()
event.newMouseEvent(eventTypes.leftMouseUp, currentPoint):post()
end,
secondsPerTick
)
return dragger
end
local function window(applicationHint)
local app = hs.application.open(applicationHint)
return app:focusedWindow()
end
function mouse.swipeRight(applicationHint, relativeStart, swipeDistance, seconds, tickDistance)
local window = window(applicationHint)
local frame = window:frame()
local sections = 5
local sectionDistance = frame.w / sections
swipeDistance = swipeDistance or sectionDistance * (sections - 2)
relativeStart = relativeStart or {}
local x = relativeStart.x or frame.x + sectionDistance
local y = relativeStart.y or frame.center.y
local absoluteStart = point(x, y)
local absoluteEnd = absoluteStart + point(swipeDistance, 0)
return swipe(absoluteStart, absoluteEnd, window, seconds, tickDistance)
end
function mouse.swipeLeft(applicationHint, relativeStart, swipeDistance, seconds, tickDistance)
local window = window(applicationHint)
local frame = window:frame()
local sections = 5
local sectionDistance = frame.w / sections
swipeDistance = swipeDistance or sectionDistance * (sections - 2)
relativeStart = relativeStart or {}
local x = relativeStart.x or frame.x2 - sectionDistance
local y = relativeStart.y or frame.center.y
local absoluteStart = point(x, y)
local absoluteEnd = absoluteStart + point(-swipeDistance, 0)
return swipe(absoluteStart, absoluteEnd, window, seconds, tickDistance)
end
function mouse.swipeUp(applicationHint, relativeStart, swipeDistance, seconds, tickDistance)
local window = window(applicationHint)
local frame = window:frame()
local sections = 4
local sectionDistance = frame.h / sections
swipeDistance = swipeDistance or sectionDistance * (sections - 2)
relativeStart = relativeStart or {}
local x = relativeStart.x or frame.center.x
local y = relativeStart.y or frame.y2 - sectionDistance
local absoluteStart = point(x, y)
local absoluteEnd = absoluteStart + point(0, -swipeDistance)
return swipe(absoluteStart, absoluteEnd, window, seconds, tickDistance)
end
function mouse.swipeDown(applicationHint, relativeStart, swipeDistance, seconds, tickDistance)
local window = window(applicationHint)
local frame = window:frame()
local sections = 4
local sectionDistance = frame.h / sections
swipeDistance = swipeDistance or sectionDistance * (sections - 2)
relativeStart = relativeStart or {}
local x = relativeStart.x or frame.center.x
local y = relativeStart.y or frame.y + sectionDistance
local absoluteStart = point(x, y)
local absoluteEnd = absoluteStart + point(0, swipeDistance)
return swipe(absoluteStart, absoluteEnd, window, seconds, tickDistance)
end
return mouse