Finished keyboard events on OS X.

This commit is contained in:
Pietro Gagliardi 2015-09-13 21:12:48 -04:00
parent fed92cdf34
commit 1197cf4ada
3 changed files with 175 additions and 2 deletions

View File

@ -279,7 +279,7 @@ mouseEvent(otherMouseUp)
- (int)doKeyDownUp:(NSEvent *)e up:(int)up - (int)doKeyDownUp:(NSEvent *)e up:(int)up
{ {
uiKeyEvent ke; uiAreaKeyEvent ke;
ke.Key = 0; ke.Key = 0;
ke.ExtKey = 0; ke.ExtKey = 0;

160
macarea/alt/events.m Normal file
View File

@ -0,0 +1,160 @@
// 30 march 2014
//TODO#include "uipriv_darwin.h"
#include "area.h"
/*
Mac OS X uses its own set of hardware key codes that are different from PC keyboard scancodes, but are positional (like PC keyboard scancodes). These are defined in <HIToolbox/Events.h>, a Carbon header. As far as I can tell, there's no way to include this header without either using an absolute path or linking Carbon into the program, so the constant values are used here instead.
The Cocoa docs do guarantee that -[NSEvent keyCode] results in key codes that are the same as those returned by Carbon; that is, these codes.
*/
// use uintptr_t to be safe
static const struct {
uintptr_t keycode;
char equiv;
} keycodeKeys[] = {
{ 0x00, 'a' },
{ 0x01, 's' },
{ 0x02, 'd' },
{ 0x03, 'f' },
{ 0x04, 'h' },
{ 0x05, 'g' },
{ 0x06, 'z' },
{ 0x07, 'x' },
{ 0x08, 'c' },
{ 0x09, 'v' },
{ 0x0B, 'b' },
{ 0x0C, 'q' },
{ 0x0D, 'w' },
{ 0x0E, 'e' },
{ 0x0F, 'r' },
{ 0x10, 'y' },
{ 0x11, 't' },
{ 0x12, '1' },
{ 0x13, '2' },
{ 0x14, '3' },
{ 0x15, '4' },
{ 0x16, '6' },
{ 0x17, '5' },
{ 0x18, '=' },
{ 0x19, '9' },
{ 0x1A, '7' },
{ 0x1B, '-' },
{ 0x1C, '8' },
{ 0x1D, '0' },
{ 0x1E, ']' },
{ 0x1F, 'o' },
{ 0x20, 'u' },
{ 0x21, '[' },
{ 0x22, 'i' },
{ 0x23, 'p' },
{ 0x25, 'l' },
{ 0x26, 'j' },
{ 0x27, '\'' },
{ 0x28, 'k' },
{ 0x29, ';' },
{ 0x2A, '\\' },
{ 0x2B, ',' },
{ 0x2C, '/' },
{ 0x2D, 'n' },
{ 0x2E, 'm' },
{ 0x2F, '.' },
{ 0x32, '`' },
{ 0x24, '\n' },
{ 0x30, '\t' },
{ 0x31, ' ' },
{ 0x33, '\b' },
{ 0xFFFF, 0 },
};
static const struct {
uintptr_t keycode;
uiExtKey equiv;
} keycodeExtKeys[] = {
{ 0x41, uiExtKeyNDot },
{ 0x43, uiExtKeyNMultiply },
{ 0x45, uiExtKeyNAdd },
{ 0x4B, uiExtKeyNDivide },
{ 0x4C, uiExtKeyNEnter },
{ 0x4E, uiExtKeyNSubtract },
{ 0x52, uiExtKeyN0 },
{ 0x53, uiExtKeyN1 },
{ 0x54, uiExtKeyN2 },
{ 0x55, uiExtKeyN3 },
{ 0x56, uiExtKeyN4 },
{ 0x57, uiExtKeyN5 },
{ 0x58, uiExtKeyN6 },
{ 0x59, uiExtKeyN7 },
{ 0x5B, uiExtKeyN8 },
{ 0x5C, uiExtKeyN9 },
{ 0x35, uiExtKeyEscape },
{ 0x60, uiExtKeyF5 },
{ 0x61, uiExtKeyF6 },
{ 0x62, uiExtKeyF7 },
{ 0x63, uiExtKeyF3 },
{ 0x64, uiExtKeyF8 },
{ 0x65, uiExtKeyF9 },
{ 0x67, uiExtKeyF11 },
{ 0x6D, uiExtKeyF10 },
{ 0x6F, uiExtKeyF12 },
{ 0x72, uiExtKeyInsert }, // listed as the Help key but it's in the same position on an Apple keyboard as the Insert key on a Windows keyboard; thanks to SeanieB from irc.badnik.net and Psy in irc.freenode.net/#macdev for confirming they have the same code
{ 0x73, uiExtKeyHome },
{ 0x74, uiExtKeyPageUp },
{ 0x75, uiExtKeyDelete },
{ 0x76, uiExtKeyF4 },
{ 0x77, uiExtKeyEnd },
{ 0x78, uiExtKeyF2 },
{ 0x79, uiExtKeyPageDown },
{ 0x7A, uiExtKeyF1 },
{ 0x7B, uiExtKeyLeft },
{ 0x7C, uiExtKeyRight },
{ 0x7D, uiExtKeyDown },
{ 0x7E, uiExtKeyUp },
{ 0xFFFF, 0 },
};
static const struct {
uintptr_t keycode;
uiModifiers equiv;
} keycodeModifiers[] = {
{ 0x37, uiModifierSuper }, // left command
{ 0x38, uiModifierShift }, // left shift
{ 0x3A, uiModifierAlt }, // left option
{ 0x3B, uiModifierCtrl }, // left control
{ 0x3C, uiModifierShift }, // right shift
{ 0x3D, uiModifierAlt }, // right alt
{ 0x3E, uiModifierCtrl }, // right control
// the following is not in Events.h for some reason
// thanks to Nicole and jedivulcan from irc.badnik.net
{ 0x36, uiModifierSuper }, // right command
{ 0xFFFF, 0 },
};
BOOL fromKeycode(unsigned short keycode, uiAreaKeyEvent *ke)
{
int i;
for (i = 0; keycodeKeys[i].keycode != 0xFFFF; i++)
if (keycodeKeys[i].keycode == keycode) {
ke->Key = keycodeKeys[i].equiv;
return YES;
}
for (i = 0; keycodeExtKeys[i].keycode != 0xFFFF; i++)
if (keycodeExtKeys[i].keycode == keycode) {
ke->ExtKey = keycodeExtKeys[i].equiv;
return YES;
}
return NO;
}
BOOL keycodeModifier(unsigned short keycode, uiModifiers *mod)
{
int i;
for (i = 0; keycodeModifiers[i].keycode != 0xFFFF; i++)
if (keycodeModifiers[i].keycode == keycode) {
*mod = keycodeModifiers[i].equiv;
return YES;
}
return NO;
}

View File

@ -200,6 +200,19 @@ static int handlerKeyEvent(uiAreaHandler *ah, uiArea *a, uiAreaKeyEvent *e)
@end @end
@interface testApplication : NSApplication
@end
@implementation testApplication
- (void)sendEvent:(NSEvent *)e
{
if (!sendAreaEvents(e))
[super sendEvent:e];
}
@end
int main(void) int main(void)
{ {
NSApplication *app; NSApplication *app;
@ -212,7 +225,7 @@ int main(void)
h.ah.DragBroken = handlerDragBroken; h.ah.DragBroken = handlerDragBroken;
h.ah.KeyEvent = handlerKeyEvent; h.ah.KeyEvent = handlerKeyEvent;
app = [NSApplication sharedApplication]; app = [testApplication sharedApplication];
[app setActivationPolicy:NSApplicationActivationPolicyRegular]; [app setActivationPolicy:NSApplicationActivationPolicyRegular];
[app setDelegate:[appDelegate new]]; [app setDelegate:[appDelegate new]];
[app run]; [app run];