-
Notifications
You must be signed in to change notification settings - Fork 35
/
Copy pathNDHotKeyEvent_QSMods.m
101 lines (78 loc) · 3.08 KB
/
NDHotKeyEvent_QSMods.m
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
//
// NDHotKeyEvent_QSMods.m
// Quicksilver
//
// Created by Alcor on 8/16/04.
// Copyright 2004 Blacktree. All rights reserved.
//
#import "NDHotKeyEvent_QSMods.h"
typedef int CGSConnection;
typedef enum {
CGSGlobalHotKeyEnable = 0,
CGSGlobalHotKeyDisable = 1,
} CGSGlobalHotKeyOperatingMode;
extern CGSConnection _CGSDefaultConnection(void);
extern CGError CGSSetGlobalHotKeyOperatingMode(CGSConnection connection,
CGSGlobalHotKeyOperatingMode mode);
/*
* cocoaModifierFlagsToCarbonModifierFlags()
*/
unsigned int carbonModifierFlagsToCocoaModifierFlags( unsigned int aModifierFlags )
{
unsigned int theCocoaModifierFlags = 0;
if(aModifierFlags & shiftKey)
theCocoaModifierFlags |= NSShiftKeyMask;
if(aModifierFlags & controlKey)
theCocoaModifierFlags |= NSControlKeyMask;
if(aModifierFlags & optionKey)
theCocoaModifierFlags |= NSAlternateKeyMask;
if(aModifierFlags & cmdKey)
theCocoaModifierFlags |= NSCommandKeyMask;
return theCocoaModifierFlags;
}
static NSMutableDictionary *hotKeyDictionary;
@implementation QSHotKeyEvent
+ (void)initialize{
hotKeyDictionary=[[NSMutableDictionary alloc]init];
}
+ (void)disableGlobalHotKeys{
CGSConnection conn = _CGSDefaultConnection();
CGSSetGlobalHotKeyOperatingMode(conn, CGSGlobalHotKeyDisable);
}
+ (void)enableGlobalHotKeys{
CGSConnection conn = _CGSDefaultConnection();
CGSSetGlobalHotKeyOperatingMode(conn, CGSGlobalHotKeyEnable);
}
- (NSString *)identifier {
NSArray *array=[hotKeyDictionary allKeysForObject:self];
if ([array count])return [array lastObject];
return nil;
}
- (void)setIdentifier:(NSString *)anIdentifier{
[hotKeyDictionary setObject:self forKey:anIdentifier];
}
+ (QSHotKeyEvent *)hotKeyWithIdentifier:(NSString *)anIdentifier{
return [hotKeyDictionary objectForKey:anIdentifier];
}
+ (QSHotKeyEvent *)hotKeyWithDictionary:(NSDictionary *)dict{
if (![dict objectForKey:@"keyCode"])return nil;
if (![dict objectForKey:@"modifiers"])return nil;
return (QSHotKeyEvent *)[self getHotKeyForKeyCode:[[dict objectForKey:@"keyCode"]shortValue]
character:[[dict objectForKey:@"character"]characterAtIndex:0]
modifierFlags:[[dict objectForKey:@"modifiers"]unsignedIntValue]];
}
@end
@implementation NDHotKeyEvent (QSMods)
+ (NDHotKeyEvent *)getHotKeyForKeyCode:(unsigned short)aKeyCode character:(unichar)aChar carbonModifierFlags:(unsigned int)aModifierFlags{
return [self getHotKeyForKeyCode:aKeyCode character:aChar modifierFlags:carbonModifierFlagsToCocoaModifierFlags(aModifierFlags)];
}
+ (NDHotKeyEvent *)getHotKeyForKeyCode:(unsigned short)aKeyCode character:(unichar)aChar safeModifierFlags:(unsigned int)aModifierFlags{
if (aModifierFlags< (1 << (rightControlKeyBit+1))) //Carbon Modifiers
return [self getHotKeyForKeyCode:aKeyCode character:aChar carbonModifierFlags:aModifierFlags];
else
return [self getHotKeyForKeyCode:aKeyCode character:aChar modifierFlags:aModifierFlags];
}
- (BOOL)setTarget:(id)aTarget selector:(SEL)aSelector{
return [self setTarget:aTarget selectorReleased:(SEL)0 selectorPressed:aSelector];
}
@end