diff --git a/src/OGKEvent.h b/src/OGKEvent.h index d0a39c9..eac6dde 100644 --- a/src/OGKEvent.h +++ b/src/OGKEvent.h @@ -45,6 +45,12 @@ @interface OGKKeyReleaseEvent: OGKKeyboardEvent @end +@interface OGKCharacterTypedEvent: OGKKeyboardEvent +@property (readonly, assign) of_unichar_t character; +@property (readonly, assign) unsigned modifiers; +@property (readonly, assign) BOOL repeated; +@end + @interface OGKMouseEvent: OGKEvent @property (readonly, assign) of_point_t cursor; @property (readonly, assign) of_point_t wheel; diff --git a/src/OGKEvent.m b/src/OGKEvent.m index 3767009..b06b649 100644 --- a/src/OGKEvent.m +++ b/src/OGKEvent.m @@ -43,6 +43,26 @@ @implementation OGKKeyReleaseEvent @end +@implementation OGKCharacterTypedEvent +- (of_unichar_t)character +{ + if (event.keyboard.unichar < 1) + return 0xFFFD; + + return event.keyboard.unichar; +} + +- (unsigned)modifiers +{ + return event.keyboard.modifiers; +} + +- (BOOL)repeated +{ + return event.keyboard.repeat; +} +@end + @implementation OGKMouseEvent - (of_point_t)cursor { diff --git a/src/OGKEventQueue.h b/src/OGKEventQueue.h index d355575..1369488 100644 --- a/src/OGKEventQueue.h +++ b/src/OGKEventQueue.h @@ -33,6 +33,8 @@ display: (OGKDisplay*)display; - (void)keyWasReleased: (OGKKeyReleaseEvent*)event display: (OGKDisplay*)display; +- (void)characterWasTyped: (OGKCharacterTypedEvent*)event + display: (OGKDisplay*)display; - (void)mouseWasMoved: (OGKMouseMovedEvent*)event display: (OGKDisplay*)display; - (void)mouseButtonWasPressed: (OGKMouseButtonPressedEvent*)event diff --git a/src/OGKEventQueue.m b/src/OGKEventQueue.m index 4b355fb..327772e 100644 --- a/src/OGKEventQueue.m +++ b/src/OGKEventQueue.m @@ -107,6 +107,22 @@ static int mouse_retain_count = 0; display: display]; } + break; + case ALLEGRO_EVENT_KEY_CHAR: + object_setClass(event, [OGKCharacterTypedEvent class]); + + if ([delegate respondsToSelector: + @selector(characterWasTyped:display:)]) { + OGKDisplay *display = [OGKDisplay + OGK_displayForAllegroDisplay: + allegroEvent->keyboard.display]; + OGKCharacterTypedEvent *characterTypedEvent = + (OGKCharacterTypedEvent*)event; + + [delegate characterWasTyped: characterTypedEvent + display: display]; + } + break; case ALLEGRO_EVENT_MOUSE_AXES: object_setClass(event, [OGKMouseMovedEvent class]); diff --git a/tests/TestMain.m b/tests/TestMain.m index 35ec6af..6122b43 100644 --- a/tests/TestMain.m +++ b/tests/TestMain.m @@ -37,6 +37,19 @@ OF_APPLICATION_DELEGATE(TestMain) display: (OGKDisplay*)display { of_log(@"Pressed: %d", event.keycode); +} + +- (void)keyWasReleased: (OGKKeyReleaseEvent*)event + display: (OGKDisplay*)display +{ + of_log(@"Released: %d", event.keycode); +} + +- (void)characterWasTyped: (OGKCharacterTypedEvent*)event + display: (OGKDisplay*)display +{ + of_log(@"Character typed: %u (keycode=%d, modifiers=%d, repeated=%d)", + event.character, event.keycode, event.modifiers, event.repeated); switch (event.keycode) { case OGK_KEY_R: @@ -63,12 +76,6 @@ OF_APPLICATION_DELEGATE(TestMain) } } -- (void)keyWasReleased: (OGKKeyReleaseEvent*)event - display: (OGKDisplay*)display -{ - of_log(@"Released: %d", event.keycode); -} - - (void)mouseWasMoved: (OGKMouseMovedEvent*)event display: (OGKDisplay*)display {