Forked Enjoy, mouse movement
[enjoyable.git] / KeyInputTextView.m
1 //
2 // KeyInputTextField.m
3 // Enjoy
4 //
5 // Created by Sam McCall on 5/05/09.
6 //
7
8 @implementation KeyInputTextView
9
10 @synthesize descr, hasKey;
11
12 -(id) init {
13 if(self = [super init]) {
14 setEnabled: NO;
15 }
16 return self;
17 }
18
19 -(void) clear {
20 [self setString: [NSString string]];
21 vk = -1;
22 hasKey = NO;
23 descr = NULL;
24 }
25
26 -(NSString*) stringForKeyCode: (int) keycode {
27 switch(keycode) {
28 case 0x7a : return @"F1";
29 case 0x78 : return @"F2";
30 case 0x63 : return @"F3";
31 case 0x76 : return @"F4";
32 case 0x60 : return @"F5";
33 case 0x61 : return @"F6";
34 case 0x62 : return @"F7";
35 case 0x64 : return @"F8";
36 case 0x65 : return @"F9";
37 case 0x6d : return @"F10";
38 case 0x67 : return @"F11";
39 case 0x6f : return @"F12";
40 case 0x69 : return @"F13";
41 case 0x6b : return @"F14";
42 case 0x71 : return @"F15";
43 case 0x6a : return @"F16";
44 case 0x40 : return @"F17";
45 case 0x4f : return @"F18";
46 case 0x50 : return @"F19";
47
48 case 0x35 : return @"Esc";
49 case 0x32 : return @"`";
50
51 case 0x12 : return @"1";
52 case 0x13 : return @"2";
53 case 0x14 : return @"3";
54 case 0x15 : return @"4";
55 case 0x17 : return @"5";
56 case 0x16 : return @"6";
57 case 0x1a : return @"7";
58 case 0x1c : return @"8";
59 case 0x19 : return @"9";
60 case 0x1d : return @"0";
61 case 0x1b : return @"-";
62 case 0x18 : return @"=";
63
64 case 0x3f : return @"Fn";
65 case 0x39 : return @"Caps Lock";
66 case 0x38 : return @"Left Shift";
67 case 0x3b : return @"Left Control";
68 case 0x3a : return @"Left Option";
69 case 0x37 : return @"Left Command";
70 case 0x36 : return @"Right Command";
71 case 0x3d : return @"Right Option";
72 case 0x3e : return @"Right Control";
73 case 0x3c : return @"Right Shift";
74
75 case 0x73 : return @"Home";
76 case 0x74 : return @"Page Up";
77 case 0x75 : return @"Delete";
78 case 0x77 : return @"End";
79 case 0x79 : return @"Page Down";
80
81 case 0x30 : return @"Tab";
82 case 0x33 : return @"Backspace";
83 case 0x24 : return @"Return";
84 case 0x31 : return @"Space";
85
86 case 0x0c : return @"Q";
87 case 0x0d : return @"W";
88 case 0x0e : return @"E";
89 case 0x0f : return @"R";
90 case 0x11 : return @"T";
91 case 0x10 : return @"Y";
92 case 0x20 : return @"U";
93 case 0x22 : return @"I";
94 case 0x1f : return @"O";
95 case 0x23 : return @"P";
96 case 0x21 : return @"[";
97 case 0x1e : return @"]";
98 case 0x2a : return @"\\";
99 case 0x00 : return @"A";
100 case 0x01 : return @"S";
101 case 0x02 : return @"D";
102 case 0x03 : return @"F";
103 case 0x05 : return @"G";
104 case 0x04 : return @"H";
105 case 0x26 : return @"J";
106 case 0x28 : return @"K";
107 case 0x25 : return @"L";
108 case 0x29 : return @";";
109 case 0x27 : return @"'";
110 case 0x06 : return @"Z";
111 case 0x07 : return @"X";
112 case 0x08 : return @"C";
113 case 0x09 : return @"V";
114 case 0x0b : return @"B";
115 case 0x2d : return @"N";
116 case 0x2e : return @"M";
117 case 0x2b : return @",";
118 case 0x2f : return @".";
119 case 0x2c : return @"/";
120
121 case 0x47 : return @"Clear";
122 case 0x51 : return @"Keypad =";
123 case 0x4b : return @"Keypad /";
124 case 0x43 : return @"Keypad *";
125 case 0x59 : return @"Keypad 7";
126 case 0x5b : return @"Keypad 8";
127 case 0x5c : return @"Keypad 9";
128 case 0x4e : return @"Keypad -";
129 case 0x56 : return @"Keypad 4";
130 case 0x57 : return @"Keypad 5";
131 case 0x58 : return @"Keypad 6";
132 case 0x45 : return @"Keypad +";
133 case 0x53 : return @"Keypad 1";
134 case 0x54 : return @"Keypad 2";
135 case 0x55 : return @"Keypad 3";
136 case 0x52 : return @"Keypad 0";
137 case 0x41 : return @"Keypad .";
138 case 0x4c : return @"Enter";
139
140 case 0x7e : return @"Up";
141 case 0x7d : return @"Down";
142 case 0x7b : return @"Left";
143 case 0x7c : return @"Right";
144 }
145 return [[NSString alloc] initWithFormat: @"Key 0x%x",keycode];
146 }
147
148 -(BOOL) acceptsFirstResponder {
149 return enabled;
150 }
151
152 -(BOOL) becomeFirstResponder {
153 [self setBackgroundColor: [NSColor selectedTextBackgroundColor]];
154 return YES;
155 }
156
157 -(BOOL) resignFirstResponder {
158 [self setBackgroundColor: [NSColor textBackgroundColor]];
159 return YES;
160 }
161
162 -(void) pressed:(int) keycode {
163 [self setVk: keycode];
164 [[self window] makeFirstResponder: nil];
165 [targetController keyChanged];
166 }
167
168 -(void) setVk: (int) key {
169 vk=key;
170 hasKey = YES;
171 descr = [self stringForKeyCode: key];
172 [self setString: descr];
173 }
174 -(int) vk {
175 return vk;
176 }
177
178 - (void)keyDown:(NSEvent *)evt {
179 if([evt isARepeat])
180 return;
181 [self pressed: [evt keyCode]];
182 }
183
184 -(void) flagsChanged:(NSEvent*)evt {
185 // XXX sometimes it's key up
186 [self pressed: [evt keyCode]];
187 }
188
189 -(void) setEnabled: (BOOL) newEnabled {
190 enabled = newEnabled;
191 if(!newEnabled && [window firstResponder] == self)
192 [window makeFirstResponder: NULL];
193
194
195 if(enabled) {
196 if([window firstResponder] == self)
197 [self setBackgroundColor: [NSColor selectedTextBackgroundColor]];
198 else
199 [self setBackgroundColor: [NSColor textBackgroundColor]];
200 } else {
201 [self setBackgroundColor: [NSColor textBackgroundColor]];
202 }
203 }
204 -(BOOL) enabled {
205 return enabled;
206 }
207
208
209 @end