hotkeys 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGES ADDED
@@ -0,0 +1 @@
1
+ None yet!
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source :rubygems
2
+
3
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,17 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ hotkeys (0.1.0)
5
+
6
+ GEM
7
+ remote: http://rubygems.org/
8
+ specs:
9
+ rake (0.9.1)
10
+
11
+ PLATFORMS
12
+ ruby
13
+
14
+ DEPENDENCIES
15
+ bundler (~> 1.0.0)
16
+ hotkeys!
17
+ rake
data/LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (C) 2011 by Robert Lowe <rob[!]iblargz.com>
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,42 @@
1
+ HotKeys
2
+ =====
3
+
4
+ A simple gem which allows you to bind global hot keys with macruby
5
+
6
+ 1. `gem install hotkeys`
7
+ 2. `macruby examples/simple.rb`
8
+
9
+ Usage example:
10
+ `macruby examples/simple.rb`
11
+
12
+ require File.dirname(__FILE__) + '/lib/hotkeys'
13
+
14
+ # Delegate method called when the app finished loading
15
+ def applicationDidFinishLaunching(notification)
16
+ @hotkeys = HotKeys.new
17
+
18
+ @hotkeys.addHotString("R+COMMAND") do
19
+ puts "LOL MACRUBY RUNS"
20
+ end
21
+
22
+ # Seriously for a second; For some reason a global hotkey or at least
23
+ # the way I've got it to working blocks the keystroke. Which I guess is normal?
24
+ #
25
+ # Maybe I'll hack around that with system events for a bypass option, it wouldn't
26
+ # be elegate, but this is new territory anywho
27
+ #
28
+ @hotkeys.addHotString("S+COMMAND") do
29
+ puts "NO SAVING FOR YOU, LOL" # Trolled myself with this for longer than I should of
30
+ end
31
+ end
32
+
33
+ # We are delegating the application to self so the script will know when
34
+ # it finished loading
35
+ NSApplication.sharedApplication.delegate = self
36
+ NSApplication.sharedApplication.run
37
+
38
+ Todo
39
+ =====
40
+ * Clean up shortcut.m
41
+
42
+ # Copyright (C) 2011 by Robert Lowe <rob[!]iblargz.com> - MIT
data/Rakefile ADDED
@@ -0,0 +1,40 @@
1
+ require 'rake/clean'
2
+ require 'rake/testtask'
3
+ require 'fileutils'
4
+ require 'date'
5
+
6
+ require 'lib/hotkeys/version.rb'
7
+
8
+ # task :default => :test
9
+ # task :spec => :test
10
+
11
+ # PACKAGING ============================================================
12
+
13
+ if defined?(Gem)
14
+ # Load the gemspec using the same limitations as github
15
+ def spec
16
+ require 'rubygems' unless defined? Gem::Specification
17
+ @spec ||= eval(File.read('hotkeys.gemspec'))
18
+ end
19
+
20
+ def package(ext='')
21
+ "pkg/hotkeys-#{spec.version}" + ext
22
+ end
23
+
24
+ desc 'Build packages'
25
+ task :package => %w[.gem].map {|e| package(e)}
26
+
27
+ desc 'Build and install as local gem'
28
+ task :install => package('.gem') do
29
+ `gem install #{package('.gem')}`
30
+ end
31
+
32
+ directory 'pkg/'
33
+ CLOBBER.include('pkg')
34
+
35
+ file package('.gem') => %w[pkg/ hotkeys.gemspec] + spec.files do |f|
36
+ `gem build hotkeys.gemspec`
37
+ mv File.basename(f.name), f.name
38
+ end
39
+
40
+ end
data/hotkeys.gemspec ADDED
@@ -0,0 +1,41 @@
1
+ require 'lib/hotkeys/version'
2
+
3
+ Gem::Specification.new do |s|
4
+ s.specification_version = 2 if s.respond_to? :specification_version=
5
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
6
+
7
+ s.name = %q{hotkeys}
8
+ s.version = "#{Hotkeys::Version::STRING}"
9
+ s.authors = ["Rob Lowe"]
10
+ s.date = %q{2011-06-08}
11
+ s.description = %q{A simple gem which allows you to bind global hot keys with macruby}
12
+ s.email = %q{rob@iblargz.com}
13
+ s.extra_rdoc_files = [
14
+ "LICENSE",
15
+ "CHANGES",
16
+ "README.md"
17
+ ]
18
+ s.files = [
19
+ "Gemfile",
20
+ "Gemfile.lock",
21
+ "LICENSE",
22
+ "README.md",
23
+ "Rakefile",
24
+ "hotkeys.gemspec",
25
+ "lib/hotkeys.rb",
26
+ "lib/hotkeys/version.rb",
27
+ "lib/hotkeys/support.rb",
28
+ "lib/hotkeys/support/bridgesupport/Events.bridgesupport",
29
+ "lib/hotkeys/support/bundles/shortcut.bundle",
30
+ "lib/hotkeys/support/bundles/shortcut.m",
31
+ "lib/hotkeys/support/keys.rb"
32
+ ]
33
+ s.homepage = %q{http://github.com/RobertLowe/hotkeys}
34
+ s.licenses = ["MIT"]
35
+ s.require_paths = ["lib"]
36
+ s.rubygems_version = %q{1.4.2}
37
+ s.summary = %q{A simple gem which allows you to bind global hot keys with macruby}
38
+
39
+ s.add_development_dependency(%q<rake>, [">= 0"])
40
+ s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
41
+ end
@@ -0,0 +1,259 @@
1
+ <?xml version='1.0'?>
2
+ <!DOCTYPE signatures SYSTEM "file://localhost/System/Library/DTDs/BridgeSupport.dtd">
3
+ <signatures version='0.9'>
4
+ <depends_on path='/System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/CommonPanels.framework'/>
5
+ <depends_on path='/System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/Help.framework'/>
6
+ <depends_on path='/System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/HIToolbox.framework'/>
7
+ <depends_on path='/System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/ImageCapture.framework'/>
8
+ <depends_on path='/System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/Ink.framework'/>
9
+ <depends_on path='/System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/OpenScripting.framework'/>
10
+ <depends_on path='/System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/Print.framework'/>
11
+ <depends_on path='/System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/SecurityHI.framework'/>
12
+ <depends_on path='/System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/SpeechRecognition.framework'/>
13
+ <depends_on path='/System/Library/Frameworks/ApplicationServices.framework'/>
14
+ <enum name='activMask' value='256'/>
15
+ <enum name='activateEvt' value='8'/>
16
+ <enum name='activeFlag' value='1'/>
17
+ <enum name='activeFlagBit' value='0'/>
18
+ <enum name='adbAddrMask' value='16711680'/>
19
+ <enum name='alphaLock' value='1024'/>
20
+ <enum name='alphaLockBit' value='10'/>
21
+ <enum name='app1Evt' value='12'/>
22
+ <enum name='app1Mask' value='4096'/>
23
+ <enum name='app2Evt' value='13'/>
24
+ <enum name='app2Mask' value='8192'/>
25
+ <enum name='app3Evt' value='14'/>
26
+ <enum name='app3Mask' value='16384'/>
27
+ <enum name='app4Evt' value='15'/>
28
+ <enum name='app4Mask' value='32768'/>
29
+ <enum name='autoKey' value='5'/>
30
+ <enum name='autoKeyMask' value='32'/>
31
+ <enum name='btnState' value='128'/>
32
+ <enum name='btnStateBit' value='7'/>
33
+ <enum name='charCodeMask' value='255'/>
34
+ <enum name='cmdKey' value='256'/>
35
+ <enum name='cmdKeyBit' value='8'/>
36
+ <enum name='controlKey' value='4096'/>
37
+ <enum name='controlKeyBit' value='12'/>
38
+ <enum name='diskEvt' value='7'/>
39
+ <enum name='diskMask' value='128'/>
40
+ <enum name='driverEvt' value='11'/>
41
+ <enum name='driverMask' value='2048'/>
42
+ <enum name='everyEvent' value='65535'/>
43
+ <enum name='highLevelEventMask' value='1024'/>
44
+ <enum name='kAppleLogoCharCode' value='20'/>
45
+ <enum name='kAppleLogoUnicode' value='63743'/>
46
+ <enum name='kBackspaceCharCode' value='8'/>
47
+ <enum name='kBellCharCode' value='7'/>
48
+ <enum name='kBulletCharCode' value='165'/>
49
+ <enum name='kBulletUnicode' value='8226'/>
50
+ <enum name='kCheckCharCode' value='18'/>
51
+ <enum name='kCheckUnicode' value='10003'/>
52
+ <enum name='kClearCharCode' value='27'/>
53
+ <enum name='kCommandCharCode' value='17'/>
54
+ <enum name='kCommandUnicode' value='8984'/>
55
+ <enum name='kControlUnicode' value='8963'/>
56
+ <enum name='kDeleteCharCode' value='127'/>
57
+ <enum name='kDiamondCharCode' value='19'/>
58
+ <enum name='kDiamondUnicode' value='9670'/>
59
+ <enum name='kDownArrowCharCode' value='31'/>
60
+ <enum name='kEndCharCode' value='4'/>
61
+ <enum name='kEnterCharCode' value='3'/>
62
+ <enum name='kEscapeCharCode' value='27'/>
63
+ <enum name='kFormFeedCharCode' value='12'/>
64
+ <enum name='kFunctionKeyCharCode' value='16'/>
65
+ <enum name='kHelpCharCode' value='5'/>
66
+ <enum name='kHighLevelEvent' value='23'/>
67
+ <enum name='kHomeCharCode' value='1'/>
68
+ <enum name='kLeftArrowCharCode' value='28'/>
69
+ <enum name='kLineFeedCharCode' value='10'/>
70
+ <enum name='kNonBreakingSpaceCharCode' value='202'/>
71
+ <enum name='kNullCharCode' value='0'/>
72
+ <enum name='kOptionUnicode' value='8997'/>
73
+ <enum name='kPageDownCharCode' value='12'/>
74
+ <enum name='kPageUpCharCode' value='11'/>
75
+ <enum name='kPencilLeftUnicode' value='63490'/>
76
+ <enum name='kPencilUnicode' value='9998'/>
77
+ <enum name='kReturnCharCode' value='13'/>
78
+ <enum name='kRightArrowCharCode' value='29'/>
79
+ <enum name='kShiftUnicode' value='8679'/>
80
+ <enum name='kSpaceCharCode' value='32'/>
81
+ <enum name='kTabCharCode' value='9'/>
82
+ <enum name='kUpArrowCharCode' value='30'/>
83
+ <enum name='kVK_ANSI_0' value='29'/>
84
+ <enum name='kVK_ANSI_1' value='18'/>
85
+ <enum name='kVK_ANSI_2' value='19'/>
86
+ <enum name='kVK_ANSI_3' value='20'/>
87
+ <enum name='kVK_ANSI_4' value='21'/>
88
+ <enum name='kVK_ANSI_5' value='23'/>
89
+ <enum name='kVK_ANSI_6' value='22'/>
90
+ <enum name='kVK_ANSI_7' value='26'/>
91
+ <enum name='kVK_ANSI_8' value='28'/>
92
+ <enum name='kVK_ANSI_9' value='25'/>
93
+ <enum name='kVK_ANSI_A' value='0'/>
94
+ <enum name='kVK_ANSI_B' value='11'/>
95
+ <enum name='kVK_ANSI_Backslash' value='42'/>
96
+ <enum name='kVK_ANSI_C' value='8'/>
97
+ <enum name='kVK_ANSI_Comma' value='43'/>
98
+ <enum name='kVK_ANSI_D' value='2'/>
99
+ <enum name='kVK_ANSI_E' value='14'/>
100
+ <enum name='kVK_ANSI_Equal' value='24'/>
101
+ <enum name='kVK_ANSI_F' value='3'/>
102
+ <enum name='kVK_ANSI_G' value='5'/>
103
+ <enum name='kVK_ANSI_Grave' value='50'/>
104
+ <enum name='kVK_ANSI_H' value='4'/>
105
+ <enum name='kVK_ANSI_I' value='34'/>
106
+ <enum name='kVK_ANSI_J' value='38'/>
107
+ <enum name='kVK_ANSI_K' value='40'/>
108
+ <enum name='kVK_ANSI_Keypad0' value='82'/>
109
+ <enum name='kVK_ANSI_Keypad1' value='83'/>
110
+ <enum name='kVK_ANSI_Keypad2' value='84'/>
111
+ <enum name='kVK_ANSI_Keypad3' value='85'/>
112
+ <enum name='kVK_ANSI_Keypad4' value='86'/>
113
+ <enum name='kVK_ANSI_Keypad5' value='87'/>
114
+ <enum name='kVK_ANSI_Keypad6' value='88'/>
115
+ <enum name='kVK_ANSI_Keypad7' value='89'/>
116
+ <enum name='kVK_ANSI_Keypad8' value='91'/>
117
+ <enum name='kVK_ANSI_Keypad9' value='92'/>
118
+ <enum name='kVK_ANSI_KeypadClear' value='71'/>
119
+ <enum name='kVK_ANSI_KeypadDecimal' value='65'/>
120
+ <enum name='kVK_ANSI_KeypadDivide' value='75'/>
121
+ <enum name='kVK_ANSI_KeypadEnter' value='76'/>
122
+ <enum name='kVK_ANSI_KeypadEquals' value='81'/>
123
+ <enum name='kVK_ANSI_KeypadMinus' value='78'/>
124
+ <enum name='kVK_ANSI_KeypadMultiply' value='67'/>
125
+ <enum name='kVK_ANSI_KeypadPlus' value='69'/>
126
+ <enum name='kVK_ANSI_L' value='37'/>
127
+ <enum name='kVK_ANSI_LeftBracket' value='33'/>
128
+ <enum name='kVK_ANSI_M' value='46'/>
129
+ <enum name='kVK_ANSI_Minus' value='27'/>
130
+ <enum name='kVK_ANSI_N' value='45'/>
131
+ <enum name='kVK_ANSI_O' value='31'/>
132
+ <enum name='kVK_ANSI_P' value='35'/>
133
+ <enum name='kVK_ANSI_Period' value='47'/>
134
+ <enum name='kVK_ANSI_Q' value='12'/>
135
+ <enum name='kVK_ANSI_Quote' value='39'/>
136
+ <enum name='kVK_ANSI_R' value='15'/>
137
+ <enum name='kVK_ANSI_RightBracket' value='30'/>
138
+ <enum name='kVK_ANSI_S' value='1'/>
139
+ <enum name='kVK_ANSI_Semicolon' value='41'/>
140
+ <enum name='kVK_ANSI_Slash' value='44'/>
141
+ <enum name='kVK_ANSI_T' value='17'/>
142
+ <enum name='kVK_ANSI_U' value='32'/>
143
+ <enum name='kVK_ANSI_V' value='9'/>
144
+ <enum name='kVK_ANSI_W' value='13'/>
145
+ <enum name='kVK_ANSI_X' value='7'/>
146
+ <enum name='kVK_ANSI_Y' value='16'/>
147
+ <enum name='kVK_ANSI_Z' value='6'/>
148
+ <enum name='kVK_CapsLock' value='57'/>
149
+ <enum name='kVK_Command' value='55'/>
150
+ <enum name='kVK_Control' value='59'/>
151
+ <enum name='kVK_Delete' value='51'/>
152
+ <enum name='kVK_DownArrow' value='125'/>
153
+ <enum name='kVK_End' value='119'/>
154
+ <enum name='kVK_Escape' value='53'/>
155
+ <enum name='kVK_F1' value='122'/>
156
+ <enum name='kVK_F10' value='109'/>
157
+ <enum name='kVK_F11' value='103'/>
158
+ <enum name='kVK_F12' value='111'/>
159
+ <enum name='kVK_F13' value='105'/>
160
+ <enum name='kVK_F14' value='107'/>
161
+ <enum name='kVK_F15' value='113'/>
162
+ <enum name='kVK_F16' value='106'/>
163
+ <enum name='kVK_F17' value='64'/>
164
+ <enum name='kVK_F18' value='79'/>
165
+ <enum name='kVK_F19' value='80'/>
166
+ <enum name='kVK_F2' value='120'/>
167
+ <enum name='kVK_F20' value='90'/>
168
+ <enum name='kVK_F3' value='99'/>
169
+ <enum name='kVK_F4' value='118'/>
170
+ <enum name='kVK_F5' value='96'/>
171
+ <enum name='kVK_F6' value='97'/>
172
+ <enum name='kVK_F7' value='98'/>
173
+ <enum name='kVK_F8' value='100'/>
174
+ <enum name='kVK_F9' value='101'/>
175
+ <enum name='kVK_ForwardDelete' value='117'/>
176
+ <enum name='kVK_Function' value='63'/>
177
+ <enum name='kVK_Help' value='114'/>
178
+ <enum name='kVK_Home' value='115'/>
179
+ <enum name='kVK_ISO_Section' value='10'/>
180
+ <enum name='kVK_JIS_Eisu' value='102'/>
181
+ <enum name='kVK_JIS_Kana' value='104'/>
182
+ <enum name='kVK_JIS_KeypadComma' value='95'/>
183
+ <enum name='kVK_JIS_Underscore' value='94'/>
184
+ <enum name='kVK_JIS_Yen' value='93'/>
185
+ <enum name='kVK_LeftArrow' value='123'/>
186
+ <enum name='kVK_Mute' value='74'/>
187
+ <enum name='kVK_Option' value='58'/>
188
+ <enum name='kVK_PageDown' value='121'/>
189
+ <enum name='kVK_PageUp' value='116'/>
190
+ <enum name='kVK_Return' value='36'/>
191
+ <enum name='kVK_RightArrow' value='124'/>
192
+ <enum name='kVK_RightControl' value='62'/>
193
+ <enum name='kVK_RightOption' value='61'/>
194
+ <enum name='kVK_RightShift' value='60'/>
195
+ <enum name='kVK_Shift' value='56'/>
196
+ <enum name='kVK_Space' value='49'/>
197
+ <enum name='kVK_Tab' value='48'/>
198
+ <enum name='kVK_UpArrow' value='126'/>
199
+ <enum name='kVK_VolumeDown' value='73'/>
200
+ <enum name='kVK_VolumeUp' value='72'/>
201
+ <enum name='kVerticalTabCharCode' value='11'/>
202
+ <enum name='keyCodeMask' value='65280'/>
203
+ <enum name='keyDown' value='3'/>
204
+ <enum name='keyDownMask' value='8'/>
205
+ <enum name='keyUp' value='4'/>
206
+ <enum name='keyUpMask' value='16'/>
207
+ <enum name='mDownMask' value='2'/>
208
+ <enum name='mUpMask' value='4'/>
209
+ <enum name='mouseDown' value='1'/>
210
+ <enum name='mouseMovedMessage' value='250'/>
211
+ <enum name='mouseUp' value='2'/>
212
+ <enum name='networkEvt' value='10'/>
213
+ <enum name='networkMask' value='1024'/>
214
+ <enum name='nullEvent' value='0'/>
215
+ <enum name='optionKey' value='2048'/>
216
+ <enum name='optionKeyBit' value='11'/>
217
+ <enum name='osEvt' value='15'/>
218
+ <enum name='osEvtMessageMask' value='-16777216'/>
219
+ <enum name='osMask' value='32768'/>
220
+ <enum name='resumeFlag' value='1'/>
221
+ <enum name='rightControlKey' value='32768'/>
222
+ <enum name='rightControlKeyBit' value='15'/>
223
+ <enum name='rightOptionKey' value='16384'/>
224
+ <enum name='rightOptionKeyBit' value='14'/>
225
+ <enum name='rightShiftKey' value='8192'/>
226
+ <enum name='rightShiftKeyBit' value='13'/>
227
+ <enum name='shiftKey' value='512'/>
228
+ <enum name='shiftKeyBit' value='9'/>
229
+ <enum name='suspendResumeMessage' value='1'/>
230
+ <enum name='updateEvt' value='6'/>
231
+ <enum name='updateMask' value='64'/>
232
+ <function name='Button'>
233
+ <retval type='B'/>
234
+ </function>
235
+ <function name='FlushEvents'>
236
+ <arg type='S'/>
237
+ <arg type='S'/>
238
+ </function>
239
+ <function name='GetKeys'>
240
+ <arg type='[4{BigEndianUInt32=I}]'/>
241
+ </function>
242
+ <function name='IsCmdChar'>
243
+ <arg type='^{EventRecord=SLI{Point=ss}S}'/>
244
+ <arg type='s'/>
245
+ <retval type='B'/>
246
+ </function>
247
+ <function name='LMGetKbdLast'>
248
+ <retval type='C'/>
249
+ </function>
250
+ <function name='LMGetKbdType'>
251
+ <retval type='C'/>
252
+ </function>
253
+ <function name='LMGetKeyRepThresh'>
254
+ <retval type='s'/>
255
+ </function>
256
+ <function name='LMGetKeyThresh'>
257
+ <retval type='s'/>
258
+ </function>
259
+ </signatures>
@@ -0,0 +1,104 @@
1
+ // Copyright (C) 2011 by Robert Lowe <rob[!]iblargz.com>
2
+ //
3
+ // Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ // of this software and associated documentation files (the "Software"), to deal
5
+ // in the Software without restriction, including without limitation the rights
6
+ // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ // copies of the Software, and to permit persons to whom the Software is
8
+ // furnished to do so, subject to the following conditions:
9
+ //
10
+ // The above copyright notice and this permission notice shall be included in
11
+ // all copies or substantial portions of the Software.
12
+ //
13
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ // THE SOFTWARE.
20
+ //
21
+ // shortcut.m
22
+ //
23
+ // Credits to chapados for putting some of this together some time ago
24
+ // https://gist.github.com/114521
25
+ //
26
+ // I was only able to hack this a small bit to get it working with macruby
27
+ // If anyone is able to kick my butt in Objective+C/MacRuby, please do it, I could learn from you!
28
+ //
29
+ // It's pretty ugly.
30
+ //
31
+ // TODO:
32
+ // * Unregister binded keys!
33
+ // * Handle signatures?
34
+ //
35
+ // compile:
36
+ // gcc shortcut.m -o shortcut.bundle -g -framework Foundation -framework Carbon -framework Cocoa -dynamiclib -fobjc-gc -arch i386 -arch x86_64
37
+
38
+ #import <Foundation/Foundation.h>
39
+ #import <Cocoa/Cocoa.h>
40
+ #import <Carbon/Carbon.h>
41
+
42
+ @interface Shortcut : NSObject
43
+ {
44
+ id delegate;
45
+ }
46
+ @property (assign) id delegate;
47
+ - (int) addShortcut: (int)code withKeyModifier:(int)modifier;
48
+ - (void) hotkeyWasPressed: (NSString*)hotKeyID;
49
+ @end
50
+ OSStatus myHotKeyHandler(EventHandlerCallRef nextHandler, EventRef anEvent, void *userData);
51
+
52
+
53
+ @implementation Shortcut
54
+ @synthesize delegate;
55
+
56
+ OSStatus myHotKeyHandler(EventHandlerCallRef nextHandler, EventRef anEvent, void *userData)
57
+ {
58
+ if ( userData != NULL ) {
59
+ id delegate = (id)userData;
60
+ if ( delegate ) {
61
+ EventHotKeyID myHotKeyID;
62
+ GetEventParameter(anEvent, kEventParamDirectObject, typeEventHotKeyID,NULL,
63
+ sizeof(myHotKeyID),NULL,&myHotKeyID);
64
+
65
+ NSString* ObjectiveFail = [NSString stringWithFormat:@"%i", myHotKeyID.id];
66
+
67
+ [delegate hotkeyWasPressed: ObjectiveFail]; // I don't why but macruby get crashy when I returned an int so, whatever, to_i that sh-t.
68
+ }
69
+ }
70
+ return noErr;
71
+ }
72
+
73
+ - (int) addShortcut: (int)code withKeyModifier:(int)modifier
74
+ {
75
+ static UInt32 _id = 0;
76
+
77
+ EventHotKeyRef myHotKeyRef;
78
+ EventHotKeyID myHotKeyID;
79
+
80
+ EventTypeSpec eventType;
81
+ eventType.eventClass=kEventClassKeyboard;
82
+ eventType.eventKind=kEventHotKeyPressed;
83
+
84
+ EventTargetRef eventTarget = (EventTargetRef) GetEventMonitorTarget(); //GetApplicationEventTarget()?
85
+
86
+ myHotKeyID.signature='mhk1';
87
+ myHotKeyID.id=_id++;
88
+
89
+ if ( delegate == nil )
90
+ delegate = self;
91
+
92
+ InstallEventHandler(eventTarget, &myHotKeyHandler, 1, &eventType, (void *)delegate, NULL);
93
+ RegisterEventHotKey(code, modifier, myHotKeyID, eventTarget, 0, &myHotKeyRef);
94
+
95
+ return (int)myHotKeyID.id;
96
+ }
97
+
98
+ - (void) hotkeyWasPressed: (NSString*)hotKeyID {
99
+ NSLog(@"Shh, you shouldn't see me!");
100
+ };
101
+
102
+ @end
103
+
104
+ void Init_shortcut(void) {}
@@ -0,0 +1,188 @@
1
+ # Copyright (C) 2011 by Robert Lowe <rob[!]iblargz.com>
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ # of this software and associated documentation files (the "Software"), to deal
5
+ # in the Software without restriction, including without limitation the rights
6
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ # copies of the Software, and to permit persons to whom the Software is
8
+ # furnished to do so, subject to the following conditions:
9
+ #
10
+ # The above copyright notice and this permission notice shall be included in
11
+ # all copies or substantial portions of the Software.
12
+ #
13
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ # THE SOFTWARE.
20
+
21
+ load_bridge_support_file File.dirname(__FILE__) + '/bridgesupport/Events.bridgesupport'
22
+
23
+ class HotKeys
24
+ module Support
25
+ class Keys
26
+
27
+ # Returns an array with [keyCode, keyModifier]
28
+ #
29
+ # Examples:
30
+ # Keys.parse("A")
31
+ # => [0, 0]
32
+ # Keys.parse("A+COMMAND")
33
+ # => [0, 256]
34
+ # Keys.parse("A+COMMAND+OPTION")
35
+ # => [0, 2304]
36
+ # Keys.parse("B+COMMAND+OPTION+SHIFT")
37
+ # => [11, 2816]
38
+ #
39
+ # Note: A is literally 0 on the virtual keyboard, these virtual mappings are dumb-founding
40
+ # Why they couldn't simply be ASCII or Unicode; what the sh-t steve?
41
+ #
42
+ def self.parse(keyString)
43
+ keyModifiers = HotKeys::Support::Keys::Mappings.select {|key, value| key =~ /Key$/ }
44
+ keyCodes = HotKeys::Support::Keys::Mappings.select {|key, value| !(key =~ /Key$/) }
45
+
46
+ keyModifiersRegexPart = keyModifiers.map {|key, value| key.gsub(/Key$/, "")}.join("|")
47
+ keyModifiers = keyModifiers.map {|key, value| {key.gsub(/Key$/, "").to_s.downcase => value}}.inject({}) {|retval,hash| retval.merge(hash) }
48
+ keyCodesRegexPart = keyCodes.map {|key, value| key }.join("|")
49
+ keyCodes = keyCodes.map {|key, value| {key.to_s.downcase => value}}.inject({}) {|retval,hash| retval.merge(hash) }
50
+
51
+ keyRegexString = "(#{keyCodesRegexPart})[\+]?(#{keyModifiersRegexPart})?[\+]?(#{keyModifiersRegexPart})?[\+]?(#{keyModifiersRegexPart})?"
52
+ matchData = Regexp.new(keyRegexString, true).match(keyString)
53
+
54
+ if matchData && matchData[1] && keyCodes[matchData[1].downcase]
55
+ [
56
+ keyCodes[matchData[1].downcase],
57
+ ((matchData[2]) ? keyModifiers[matchData[2].downcase] : 0) +
58
+ ((matchData[3]) ? keyModifiers[matchData[3].downcase] : 0) +
59
+ ((matchData[4]) ? keyModifiers[matchData[4].downcase] : 0)
60
+ ]
61
+ else
62
+ raise "Cannot parse hotkey #{keyString}. /#{keyRegexString}/i"
63
+ end
64
+ end
65
+
66
+ # This doesn't map all the virtual keyboard keys, just the "useful" ones,
67
+ # submit an issue on github if you think it should include more
68
+ Mappings = {
69
+ :ControlKey => ControlKey,
70
+ :OptionKey => OptionKey,
71
+ :CommandKey => CmdKey,
72
+ :ShiftKey => ShiftKey,
73
+ :RightOptionKey => RightOptionKey,
74
+ :RightControlKey => RightControlKey,
75
+ :RightShiftKey => RightShiftKey,
76
+ :Num0 => KVK_ANSI_0,
77
+ :Num1 => KVK_ANSI_1,
78
+ :Num2 => KVK_ANSI_2,
79
+ :Num3 => KVK_ANSI_3,
80
+ :Num4 => KVK_ANSI_4,
81
+ :Num5 => KVK_ANSI_5,
82
+ :Num6 => KVK_ANSI_6,
83
+ :Num7 => KVK_ANSI_7,
84
+ :Num8 => KVK_ANSI_8,
85
+ :Num9 => KVK_ANSI_9,
86
+ :Keypad0 => KVK_ANSI_Keypad0,
87
+ :Keypad1 => KVK_ANSI_Keypad1,
88
+ :Keypad2 => KVK_ANSI_Keypad2,
89
+ :Keypad3 => KVK_ANSI_Keypad3,
90
+ :Keypad4 => KVK_ANSI_Keypad4,
91
+ :Keypad5 => KVK_ANSI_Keypad5,
92
+ :Keypad6 => KVK_ANSI_Keypad6,
93
+ :Keypad7 => KVK_ANSI_Keypad7,
94
+ :Keypad8 => KVK_ANSI_Keypad8,
95
+ :Keypad9 => KVK_ANSI_Keypad9,
96
+ :KeypadClear => KVK_ANSI_KeypadClear,
97
+ :KeypadDecimal => KVK_ANSI_KeypadDecimal,
98
+ :KeypadDivide => KVK_ANSI_KeypadDivide,
99
+ :KeypadEnter => KVK_ANSI_KeypadEnter,
100
+ :KeypadEquals => KVK_ANSI_KeypadEquals,
101
+ :KeypadMinus => KVK_ANSI_KeypadMinus,
102
+ :KeypadMultiply => KVK_ANSI_KeypadMultiply,
103
+ :KeypadPlus => KVK_ANSI_KeypadPlus,
104
+ :A => KVK_ANSI_A,
105
+ :B => KVK_ANSI_B,
106
+ :C => KVK_ANSI_C,
107
+ :D => KVK_ANSI_D,
108
+ :E => KVK_ANSI_E,
109
+ :F => KVK_ANSI_F,
110
+ :G => KVK_ANSI_G,
111
+ :H => KVK_ANSI_H,
112
+ :I => KVK_ANSI_I,
113
+ :J => KVK_ANSI_J,
114
+ :K => KVK_ANSI_K,
115
+ :L => KVK_ANSI_L,
116
+ :M => KVK_ANSI_M,
117
+ :N => KVK_ANSI_N,
118
+ :O => KVK_ANSI_O,
119
+ :P => KVK_ANSI_P,
120
+ :Q => KVK_ANSI_Q,
121
+ :R => KVK_ANSI_R,
122
+ :S => KVK_ANSI_S,
123
+ :T => KVK_ANSI_T,
124
+ :U => KVK_ANSI_U,
125
+ :V => KVK_ANSI_V,
126
+ :W => KVK_ANSI_W,
127
+ :X => KVK_ANSI_X,
128
+ :Y => KVK_ANSI_Y,
129
+ :Z => KVK_ANSI_Z,
130
+ :F1 => KVK_F1,
131
+ :F2 => KVK_F2,
132
+ :F3 => KVK_F3,
133
+ :F4 => KVK_F4,
134
+ :F5 => KVK_F5,
135
+ :F6 => KVK_F6,
136
+ :F7 => KVK_F7,
137
+ :F8 => KVK_F8,
138
+ :F9 => KVK_F9,
139
+ :F10 => KVK_F10,
140
+ :F11 => KVK_F11,
141
+ :F12 => KVK_F12,
142
+ :F13 => KVK_F13,
143
+ :F14 => KVK_F14,
144
+ :F15 => KVK_F15,
145
+ :F16 => KVK_F16,
146
+ :F17 => KVK_F17,
147
+ :F18 => KVK_F18,
148
+ :F19 => KVK_F19,
149
+ :F20 => KVK_F20,
150
+ :Space => KVK_Space,
151
+ :Tab => KVK_Tab,
152
+ :Return => KVK_Return,
153
+ :Minus => KVK_ANSI_Minus,
154
+ :Equal => KVK_ANSI_Equal,
155
+ :Backslash => KVK_ANSI_Backslash,
156
+ :Slash => KVK_ANSI_Slash,
157
+ :LeftBracket => KVK_ANSI_LeftBracket,
158
+ :RightBracket => KVK_ANSI_RightBracket,
159
+ :Comma => KVK_ANSI_Comma,
160
+ :Period => KVK_ANSI_Period,
161
+ :Semicolon => KVK_ANSI_Semicolon,
162
+ :Quote => KVK_ANSI_Quote,
163
+ :Function => KVK_Function,
164
+ :Home => KVK_Home,
165
+ :PageUp => KVK_PageUp,
166
+ :PageDown => KVK_PageDown,
167
+ :End => KVK_End,
168
+ :ForwardDelete => KVK_ForwardDelete,
169
+ :Delete => KVK_Delete,
170
+ :CapsLock => KVK_CapsLock,
171
+ :LeftArrow => KVK_LeftArrow,
172
+ :UpArrow => KVK_UpArrow,
173
+ :DownArrow => KVK_DownArrow,
174
+ :RightArrow => KVK_RightArrow,
175
+ :Escape => KVK_Escape,
176
+ :Grave => KVK_ANSI_Grave,
177
+ :Help => KVK_Help,
178
+ :VolumeDown => KVK_VolumeDown,
179
+ :VolumeUp => KVK_VolumeUp,
180
+ :Mute => KVK_Mute,
181
+ :KeyDown => KeyDown,
182
+ :KeyUp => KeyUp,
183
+ :MouseDown => MouseDown,
184
+ :MouseUp => MouseUp
185
+ }
186
+ end
187
+ end
188
+ end
@@ -0,0 +1,25 @@
1
+ # Copyright (C) 2011 by Robert Lowe <rob[!]iblargz.com>
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ # of this software and associated documentation files (the "Software"), to deal
5
+ # in the Software without restriction, including without limitation the rights
6
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ # copies of the Software, and to permit persons to whom the Software is
8
+ # furnished to do so, subject to the following conditions:
9
+ #
10
+ # The above copyright notice and this permission notice shall be included in
11
+ # all copies or substantial portions of the Software.
12
+ #
13
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ # THE SOFTWARE.
20
+
21
+ class HotKeys
22
+ module Support
23
+ autoload :Keys, 'hotkeys/support/keys'
24
+ end
25
+ end
@@ -0,0 +1,30 @@
1
+ # Copyright (C) 2011 by Robert Lowe <rob[!]iblargz.com>
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ # of this software and associated documentation files (the "Software"), to deal
5
+ # in the Software without restriction, including without limitation the rights
6
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ # copies of the Software, and to permit persons to whom the Software is
8
+ # furnished to do so, subject to the following conditions:
9
+ #
10
+ # The above copyright notice and this permission notice shall be included in
11
+ # all copies or substantial portions of the Software.
12
+ #
13
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ # THE SOFTWARE.
20
+
21
+ class Hotkeys
22
+ module Version
23
+ MAJOR = 0
24
+ MINOR = 1
25
+ PATCH = 0
26
+ BUILD = nil
27
+
28
+ STRING = [MAJOR, MINOR, PATCH, BUILD].compact.join('.')
29
+ end
30
+ end
data/lib/hotkeys.rb ADDED
@@ -0,0 +1,54 @@
1
+ # Copyright (C) 2011 by Robert Lowe <rob[!]iblargz.com>
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ # of this software and associated documentation files (the "Software"), to deal
5
+ # in the Software without restriction, including without limitation the rights
6
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ # copies of the Software, and to permit persons to whom the Software is
8
+ # furnished to do so, subject to the following conditions:
9
+ #
10
+ # The above copyright notice and this permission notice shall be included in
11
+ # all copies or substantial portions of the Software.
12
+ #
13
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ # THE SOFTWARE.
20
+ unless RUBY_ENGINE =~ /macruby/
21
+ raise NotImplementedError, "Hotkeys only runs on macruby! ;)"
22
+ end
23
+
24
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
25
+
26
+ framework 'AppKit'
27
+ framework 'Carbon'
28
+ framework 'Cocoa'
29
+
30
+ # required here, beause we subclass this sucker right away.
31
+ require File.dirname(__FILE__) + '/hotkeys/support/bundles/shortcut'
32
+
33
+ class HotKeys < Shortcut
34
+ autoload :Version, 'hotkeys/version'
35
+ autoload :Support, 'hotkeys/support'
36
+
37
+ def initialize(delegation=nil)
38
+ self.delegate = delegation || self
39
+ end
40
+
41
+ def hotkeyWasPressed(key)
42
+ @keys[key.to_i].call
43
+ end
44
+
45
+ def addHotString(keyString, &block)
46
+ args = HotKeys::Support::Keys.parse(keyString)
47
+
48
+ @keys ||= []
49
+ key = self.send(:"addShortcut:withKeyModifier", *args)
50
+ @keys[key] = block
51
+ end
52
+
53
+ end
54
+
metadata ADDED
@@ -0,0 +1,96 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hotkeys
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.1.0
6
+ platform: ruby
7
+ authors:
8
+ - Rob Lowe
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-06-08 00:00:00 -04:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rake
17
+ prerelease: false
18
+ requirement: !ruby/object:Gem::Requirement
19
+ none: false
20
+ requirements:
21
+ - - '>='
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ type: :development
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - '>='
29
+ - !ruby/object:Gem::Version
30
+ version: "0"
31
+ - !ruby/object:Gem::Dependency
32
+ name: bundler
33
+ prerelease: false
34
+ requirement: !ruby/object:Gem::Requirement
35
+ none: false
36
+ requirements:
37
+ - - ~>
38
+ - !ruby/object:Gem::Version
39
+ version: 1.0.0
40
+ type: :development
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ~>
45
+ - !ruby/object:Gem::Version
46
+ version: 1.0.0
47
+ description: A simple gem which allows you to bind global hot keys with macruby
48
+ email: rob@iblargz.com
49
+ executables: []
50
+ extensions: []
51
+ extra_rdoc_files:
52
+ - LICENSE
53
+ - CHANGES
54
+ - README.md
55
+ files:
56
+ - Gemfile
57
+ - Gemfile.lock
58
+ - LICENSE
59
+ - README.md
60
+ - Rakefile
61
+ - hotkeys.gemspec
62
+ - lib/hotkeys.rb
63
+ - lib/hotkeys/version.rb
64
+ - lib/hotkeys/support.rb
65
+ - lib/hotkeys/support/bridgesupport/Events.bridgesupport
66
+ - lib/hotkeys/support/bundles/shortcut.bundle
67
+ - lib/hotkeys/support/bundles/shortcut.m
68
+ - lib/hotkeys/support/keys.rb
69
+ - CHANGES
70
+ has_rdoc: true
71
+ homepage: http://github.com/RobertLowe/hotkeys
72
+ licenses:
73
+ - MIT
74
+ post_install_message:
75
+ rdoc_options: []
76
+ require_paths:
77
+ - lib
78
+ required_ruby_version: !ruby/object:Gem::Requirement
79
+ none: false
80
+ requirements:
81
+ - - '>='
82
+ - !ruby/object:Gem::Version
83
+ version: "0"
84
+ required_rubygems_version: !ruby/object:Gem::Requirement
85
+ none: false
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: "0"
90
+ requirements: []
91
+ rubyforge_project:
92
+ rubygems_version: 1.4.2
93
+ signing_key:
94
+ specification_version: 2
95
+ summary: A simple gem which allows you to bind global hot keys with macruby
96
+ test_files: []