mousetools 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. data/lib/mousetools.rb +195 -0
  2. metadata +62 -0
data/lib/mousetools.rb ADDED
@@ -0,0 +1,195 @@
1
+ require 'rubygems'
2
+ require 'ffi'
3
+
4
+ module Mouse
5
+ extend FFI::Library
6
+ ffi_lib '/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/CoreGraphics.framework/Versions/A/CoreGraphics'
7
+
8
+ class CGPoint < FFI::Struct
9
+ layout :x, :double,
10
+ :y, :double
11
+ end
12
+
13
+ # Mouse/Keyboard events
14
+ enum :CGEventType, [ :kCGEventNull, 0, # Null Event
15
+ :kCGEventLeftMouseDown, 1, # left mouse-down event
16
+ :kCGEventLeftMouseUp, 2, # left mouse-up event
17
+ :kCGEventRightMouseDown, 3, # right mouse-down event
18
+ :kCGEventRightMouseUp, 4, # right mouse-up event
19
+ :kCGEventMouseMoved, 5, # mouse-moved event
20
+ :kCGEventLeftMouseDragged, 6, # left mouse-dragged event
21
+ :kCGEventRightMouseDragged, 7, # right mouse-dragged event
22
+ :kCGEventScrollWheel, 22, # mouse scrolled event
23
+ :kCGEventOtherMouseDown, 25, # other mouse-down event
24
+ :kCGEventOtherMouseUp, 26, # other mouse-up event
25
+ :kCGEventOtherMouseDragged, 27, # other mouse-dragged event
26
+ :kCGEventKeyDown, 10, # key-down event
27
+ :kCGEventKeyUp, 11 ] # key-up down
28
+
29
+ # Mouse buttons
30
+ enum :CGMouseButton, [ :kCGMouseButtonLeft, 0,
31
+ :kCGMouseButtonRight,
32
+ :kCGMouseButtonCenter ]
33
+
34
+ # Virtual Key Codes
35
+ enum :CGKeyCode, [ :return, 0x24,
36
+ :tab, 0x30,
37
+ :space, 0x31,
38
+ :delete, 0x33,
39
+ :escape, 0x35,
40
+ :command, 0x37,
41
+ :left_shift, 0x38,
42
+ :left_option, 0x3A,
43
+ :left_control, 0x3B,
44
+ :right_shift, 0x3C,
45
+ :right_option, 0x3D,
46
+ :right_control, 0x3E,
47
+ :function, 0x3F,
48
+ :home, 0x73,
49
+ :end, 0x77,
50
+ :page_up, 0x74,
51
+ :page_down, 0x79,
52
+ :forward_delete, 0x75,
53
+ :left_arrow, 0x7B,
54
+ :right_arrow, 0x7C,
55
+ :down_arrow, 0x7D,
56
+ :up_arrow, 0x7E ]
57
+
58
+ # CGEventTapLocation
59
+ enum :CGEventTapLocation, [ :kCGHIDEventTap, 0,
60
+ :kCGSessionEventTap,
61
+ :kCGAnnotatedSessionEventTap ]
62
+
63
+ # Attach to the CGEventCreateMouseEvent function
64
+ attach_function :CGEventCreateMouseEvent, [ :pointer, :CGEventType, CGPoint.by_value, :CGMouseButton ], :pointer
65
+ attach_function :CGEventCreateKeyboardEvent, [:pointer, :CGKeyCode, :bool ], :pointer
66
+ attach_function :CGEventSetType, [:pointer, :CGEventType], :void
67
+ attach_function :CGEventPost, [ :CGEventTapLocation, :pointer], :void
68
+ attach_function :CFRelease, [:pointer], :void
69
+
70
+ end
71
+
72
+ class Mousetools
73
+
74
+ @current_coordinates
75
+ attr_accessor :current_coordinates
76
+
77
+ def initialize
78
+ @current_coordinates = Hash.new
79
+ end
80
+
81
+ def left_mouse_down(x = nil, y = nil)
82
+ raise "Coordinates not set" if (x.nil? || y.nil?) && @current_coordinates.nil?
83
+ @current_coordinates = {:x => x, :y => y} if (!x.nil? && !y.nil?)
84
+ point = Mouse::CGPoint.new
85
+ point[:x] = @current_coordinates[:x]
86
+ point[:y] = @current_coordinates[:y]
87
+ # Create the event
88
+ event = Mouse::CGEventCreateMouseEvent(nil, :kCGEventLeftMouseDown, point, :kCGMouseButtonLeft)
89
+ # Post the event
90
+ Mouse::CGEventPost(:kCGHIDEventTap, event)
91
+ # Release the event ref
92
+ Mouse::CFRelease(event)
93
+ end
94
+
95
+ def left_mouse_up(x = nil, y = nil)
96
+ raise "Coordinates not set" if (x.nil? || y.nil?) && @current_coordinates.nil?
97
+ @current_coordinates = {:x => x, :y => y} if (!x.nil? && !y.nil?)
98
+ point = Mouse::CGPoint.new
99
+ point[:x] = @current_coordinates[:x]
100
+ point[:y] = @current_coordinates[:y]
101
+ # Create the event
102
+ event = Mouse::CGEventCreateMouseEvent(nil, :kCGEventLeftMouseUp, point, :kCGMouseButtonLeft)
103
+ # Post the event
104
+ Mouse::CGEventPost(:kCGHIDEventTap, event)
105
+ # Release the event ref
106
+ Mouse::CFRelease(event)
107
+ end
108
+
109
+ def right_mouse_down(x = nil, y = nil)
110
+ raise "Coordinates not set" if (x.nil? || y.nil?) && @current_coordinates.nil?
111
+ @current_coordinates = {:x => x, :y => y} if (!x.nil? && !y.nil?)
112
+ point = Mouse::CGPoint.new
113
+ point[:x] = @current_coordinates[:x]
114
+ point[:y] = @current_coordinates[:y]
115
+ # Create the event
116
+ event = Mouse::CGEventCreateMouseEvent(nil, :kCGEventRightMouseDown, point, :kCGMouseButtonRight)
117
+ # Post the event
118
+ Mouse::CGEventPost(:kCGHIDEventTap, event)
119
+ # Release the event ref
120
+ Mouse::CFRelease(event)
121
+ end
122
+
123
+ def right_mouse_up(x = nil, y = nil)
124
+ raise "Coordinates not set" if (x.nil? || y.nil?) && @current_coordinates.nil?
125
+ @current_coordinates = {:x => x, :y => y} if (!x.nil? && !y.nil?)
126
+ point = Mouse::CGPoint.new
127
+ point[:x] = @current_coordinates[:x]
128
+ point[:y] = @current_coordinates[:y]
129
+ # Create the event
130
+ event = Mouse::CGEventCreateMouseEvent(nil, :kCGEventRightMouseUp, point, :kCGMouseButtonRight)
131
+ # Post the event
132
+ Mouse::CGEventPost(:kCGHIDEventTap, event)
133
+ # Release the event ref
134
+ Mouse::CFRelease(event)
135
+ end
136
+
137
+ def move_cursor(x = nil, y = nil)
138
+ raise "Must provide new coordinates to move the cursor" if (x.nil? || y.nil?)
139
+ point = Mouse::CGPoint.new
140
+ point[:x] = x
141
+ point[:y] = y
142
+ # Create the event
143
+ event = Mouse::CGEventCreateMouseEvent(nil, :kCGEventMouseMoved, point, :kCGMouseButtonLeft)
144
+ # Post the event
145
+ Mouse::CGEventPost(:kCGHIDEventTap, event)
146
+ @current_coordinates = {:x => x, :y => y}
147
+ # Release the event ref
148
+ Mouse::CFRelease(event)
149
+ end
150
+
151
+ def left_mouse_drag(x = nil, y = nil)
152
+ raise "Must provide new coordinates to drag the cursor" if (x.nil? || y.nil?)
153
+ point = Mouse::CGPoint.new
154
+ point[:x] = x
155
+ point[:y] = y
156
+ # Create the event
157
+ event = Mouse::CGEventCreateMouseEvent(nil, :kCGEventLeftMouseDragged, point, :kCGMouseButtonLeft)
158
+ # Post the event
159
+ Mouse::CGEventPost(:kCGHIDEventTap, event)
160
+ @current_coordinates = {:x => x, :y => y}
161
+ # Release the event ref
162
+ Mouse::CFRelease(event)
163
+ end
164
+
165
+ def right_mouse_drag(x = nil, y = nil)
166
+ raise "Must provide new coordinates to drag the cursor" if (x.nil? || y.nil?)
167
+ point = Mouse::CGPoint.new
168
+ point[:x] = x
169
+ point[:y] = y
170
+ # Create the event
171
+ event = Mouse::CGEventCreateMouseEvent(nil, :kCGEventRightMouseDragged, point, :kCGMouseButtonRight)
172
+ # Post the event
173
+ Mouse::CGEventPost(:kCGHIDEventTap, event)
174
+ @current_coordinates = {:x => x, :y => y}
175
+ # Release the event ref
176
+ Mouse::CFRelease(event)
177
+ end
178
+
179
+ def key_down(virtual_key = nil)
180
+ raise "Must provide a key" if virtual_key.nil?
181
+ keycode = virtual_key.intern
182
+ event = Mouse::CGEventCreateKeyboardEvent(nil, keycode, true)
183
+ Mouse::CGEventPost(:kCGHIDEventTap, event)
184
+ Mouse::CFRelease(event)
185
+ end
186
+
187
+ def key_up(virtual_key = nil)
188
+ raise "Must provide a key" if virtual_key.nil?
189
+ keycode = virtual_key.intern
190
+ event = Mouse::CGEventCreateKeyboardEvent(nil, keycode, false)
191
+ Mouse::CGEventPost(:kCGHIDEventTap, event)
192
+ Mouse::CFRelease(event)
193
+ end
194
+
195
+ end
metadata ADDED
@@ -0,0 +1,62 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mousetools
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 1
8
+ - 0
9
+ version: 0.1.0
10
+ platform: ruby
11
+ authors:
12
+ - Scott Larson
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2012-04-16 00:00:00 -06:00
18
+ default_executable:
19
+ dependencies: []
20
+
21
+ description: A gem that allows for basic mouse-manipulation functionality in OS X (including left/right click, dragging, key-click, etc.)
22
+ email: scottl@mozy.com
23
+ executables: []
24
+
25
+ extensions: []
26
+
27
+ extra_rdoc_files: []
28
+
29
+ files:
30
+ - lib/mousetools.rb
31
+ has_rdoc: true
32
+ homepage: http://rubygems.org/gems/mousetools
33
+ licenses: []
34
+
35
+ post_install_message:
36
+ rdoc_options: []
37
+
38
+ require_paths:
39
+ - lib
40
+ required_ruby_version: !ruby/object:Gem::Requirement
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ segments:
45
+ - 0
46
+ version: "0"
47
+ required_rubygems_version: !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ">="
50
+ - !ruby/object:Gem::Version
51
+ segments:
52
+ - 0
53
+ version: "0"
54
+ requirements: []
55
+
56
+ rubyforge_project:
57
+ rubygems_version: 1.3.6
58
+ signing_key:
59
+ specification_version: 3
60
+ summary: Mousetools for Mac
61
+ test_files: []
62
+