Index: src/OGKEvent.h ================================================================== --- src/OGKEvent.h +++ src/OGKEvent.h @@ -42,10 +42,16 @@ @interface OGKKeyPressEvent: OGKKeyboardEvent @end @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; @end Index: src/OGKEvent.m ================================================================== --- src/OGKEvent.m +++ src/OGKEvent.m @@ -40,10 +40,30 @@ @implementation OGKKeyPressEvent @end @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 { return of_point(event.mouse.x, event.mouse.y); Index: src/OGKEventQueue.h ================================================================== --- src/OGKEventQueue.h +++ src/OGKEventQueue.h @@ -31,10 +31,12 @@ wasClosed: (OGKCloseEvent*)event; - (void)keyWasPressed: (OGKKeyPressEvent*)event 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 display: (OGKDisplay*)display; - (void)mouseButtonWasReleased: (OGKMouseButtonReleasedEvent*)event Index: src/OGKEventQueue.m ================================================================== --- src/OGKEventQueue.m +++ src/OGKEventQueue.m @@ -104,10 +104,26 @@ (OGKKeyReleaseEvent*)event; [delegate keyWasReleased: keyReleaseEvent 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]); Index: tests/TestMain.m ================================================================== --- tests/TestMain.m +++ tests/TestMain.m @@ -35,10 +35,23 @@ - (void)keyWasPressed: (OGKKeyPressEvent*)event 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: tint = ogk_color(1, 0.5, 0.5, 0); break; @@ -61,16 +74,10 @@ running = NO; break; } } -- (void)keyWasReleased: (OGKKeyReleaseEvent*)event - display: (OGKDisplay*)display -{ - of_log(@"Released: %d", event.keycode); -} - - (void)mouseWasMoved: (OGKMouseMovedEvent*)event display: (OGKDisplay*)display { of_log(@"Mouse moved: X=%.f(%.f) Y=%.f(%.f) WX=%.f(%.f) WY=%.f(%.f)", event.cursor.x, event.deltaCursor.x,