Nuklear/demo/allegro5/KeyboardHandleriOS.m

121 lines
3.6 KiB
Objective-C

#ifdef __OBJC__
#import <UIKit/UIKit.h>
#endif
#import "KeyboardHandleriOS.h"
#include <allegro5/allegro.h>
#include <allegro5/allegro_iphone_objc.h>
@interface KeyboardHandleriOS()
{
ALLEGRO_EVENT_SOURCE *event_source;
ALLEGRO_DISPLAY *current_display;
}
@end
@implementation KeyboardHandleriOS
- (id)init {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidHide:) name:UIKeyboardDidHideNotification object:nil];
self = [self initWithFrame:CGRectMake(-100, -100, 0, 0)];
event_source = NULL;
current_display = al_get_current_display();
UIView* v = al_iphone_get_view(current_display);
[v addSubview:self];
return self;
}
- (void)setCustomKeyboardEventSource:(ALLEGRO_EVENT_SOURCE *)ev_src {
event_source = ev_src;
}
- (UIKeyboardType) keyboardType
{
return UIKeyboardTypeASCIICapable;
}
- (UITextAutocorrectionType) autocorrectionType
{
return UITextAutocorrectionTypeNo;
}
-(BOOL)canBecomeFirstResponder {
return YES;
}
- (void)deleteBackward {
if (!event_source) {
NSLog(@"deleteBackward(): No event source found, not sending events");
return;
}
ALLEGRO_EVENT *event_down = (ALLEGRO_EVENT*)calloc(1, sizeof(ALLEGRO_EVENT));
ALLEGRO_EVENT *event_up = (ALLEGRO_EVENT*)calloc(1, sizeof(ALLEGRO_EVENT));
event_down->type = ALLEGRO_EVENT_KEY_DOWN;
event_down->keyboard.display = current_display;
event_down->keyboard.keycode = ALLEGRO_KEY_BACKSPACE;
event_up->type = ALLEGRO_EVENT_KEY_UP;
event_up->keyboard.display = current_display;
event_up->keyboard.keycode = ALLEGRO_KEY_BACKSPACE;
al_emit_user_event(event_source, event_down, NULL);
al_emit_user_event(event_source, event_up, NULL);
free(event_down);
free(event_up);
}
- (BOOL)hasText {
return YES;
}
- (void)insertText:(NSString *)text
{
if (!event_source) {
NSLog(@"insertText(): No event source found, not sending events");
return;
}
ALLEGRO_EVENT *event_down = (ALLEGRO_EVENT*)calloc(1, sizeof(ALLEGRO_EVENT));
ALLEGRO_EVENT *event_up = (ALLEGRO_EVENT*)calloc(1, sizeof(ALLEGRO_EVENT));
if([text isEqualToString:@"\n"])
{
event_down->type = ALLEGRO_EVENT_KEY_DOWN;
event_down->keyboard.display = current_display;
event_down->keyboard.keycode = ALLEGRO_KEY_ENTER;
event_up->type = ALLEGRO_EVENT_KEY_UP;
event_up->keyboard.display = current_display;
event_up->keyboard.keycode = ALLEGRO_KEY_ENTER;
al_emit_user_event(event_source, event_down, NULL);
al_emit_user_event(event_source, event_up, NULL);
[self hide];
//m_kb->setDonePressed();
}
else {
event_down->type = ALLEGRO_EVENT_KEY_CHAR;
event_down->keyboard.display = current_display;
event_down->keyboard.unichar = [text characterAtIndex:0];
// doesn't matter what keycode is, nuklear backend ignores it as long as it
// isn't a special key
event_down->keyboard.keycode = ALLEGRO_KEY_A;
al_emit_user_event(event_source, event_down, NULL);
}
free(event_down);
free(event_up);
}
-(void)show {
NSLog(@"Should be showing!");
[self performSelectorOnMainThread:@selector(becomeFirstResponder) withObject:nil waitUntilDone:YES];
}
-(void)hide {
NSLog(@"Should be hiding!");
[self performSelectorOnMainThread:@selector(resignFirstResponder) withObject:nil waitUntilDone:YES];
}
- (void)keyboardDidHide:(NSNotification *)notification {
NSLog(@"keyboardDidHide called");
}
-(void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardDidHideNotification object:nil];
}
@end