KeyboardHandleriOS.m 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. #ifdef __OBJC__
  2. #import <UIKit/UIKit.h>
  3. #endif
  4. #import "KeyboardHandleriOS.h"
  5. #include <allegro5/allegro.h>
  6. #include <allegro5/allegro_iphone_objc.h>
  7. @interface KeyboardHandleriOS()
  8. {
  9. ALLEGRO_EVENT_SOURCE *event_source;
  10. ALLEGRO_DISPLAY *current_display;
  11. }
  12. @end
  13. @implementation KeyboardHandleriOS
  14. - (id)init {
  15. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidHide:) name:UIKeyboardDidHideNotification object:nil];
  16. self = [self initWithFrame:CGRectMake(-100, -100, 0, 0)];
  17. event_source = NULL;
  18. current_display = al_get_current_display();
  19. UIView* v = al_iphone_get_view(current_display);
  20. [v addSubview:self];
  21. return self;
  22. }
  23. - (void)setCustomKeyboardEventSource:(ALLEGRO_EVENT_SOURCE *)ev_src {
  24. event_source = ev_src;
  25. }
  26. - (UIKeyboardType) keyboardType
  27. {
  28. return UIKeyboardTypeASCIICapable;
  29. }
  30. - (UITextAutocorrectionType) autocorrectionType
  31. {
  32. return UITextAutocorrectionTypeNo;
  33. }
  34. -(BOOL)canBecomeFirstResponder {
  35. return YES;
  36. }
  37. - (void)deleteBackward {
  38. if (!event_source) {
  39. NSLog(@"deleteBackward(): No event source found, not sending events");
  40. return;
  41. }
  42. ALLEGRO_EVENT *event_down = (ALLEGRO_EVENT*)calloc(1, sizeof(ALLEGRO_EVENT));
  43. ALLEGRO_EVENT *event_up = (ALLEGRO_EVENT*)calloc(1, sizeof(ALLEGRO_EVENT));
  44. event_down->type = ALLEGRO_EVENT_KEY_DOWN;
  45. event_down->keyboard.display = current_display;
  46. event_down->keyboard.keycode = ALLEGRO_KEY_BACKSPACE;
  47. event_up->type = ALLEGRO_EVENT_KEY_UP;
  48. event_up->keyboard.display = current_display;
  49. event_up->keyboard.keycode = ALLEGRO_KEY_BACKSPACE;
  50. al_emit_user_event(event_source, event_down, NULL);
  51. al_emit_user_event(event_source, event_up, NULL);
  52. free(event_down);
  53. free(event_up);
  54. }
  55. - (BOOL)hasText {
  56. return YES;
  57. }
  58. - (void)insertText:(NSString *)text
  59. {
  60. if (!event_source) {
  61. NSLog(@"insertText(): No event source found, not sending events");
  62. return;
  63. }
  64. ALLEGRO_EVENT *event_down = (ALLEGRO_EVENT*)calloc(1, sizeof(ALLEGRO_EVENT));
  65. ALLEGRO_EVENT *event_up = (ALLEGRO_EVENT*)calloc(1, sizeof(ALLEGRO_EVENT));
  66. if([text isEqualToString:@"\n"])
  67. {
  68. event_down->type = ALLEGRO_EVENT_KEY_DOWN;
  69. event_down->keyboard.display = current_display;
  70. event_down->keyboard.keycode = ALLEGRO_KEY_ENTER;
  71. event_up->type = ALLEGRO_EVENT_KEY_UP;
  72. event_up->keyboard.display = current_display;
  73. event_up->keyboard.keycode = ALLEGRO_KEY_ENTER;
  74. al_emit_user_event(event_source, event_down, NULL);
  75. al_emit_user_event(event_source, event_up, NULL);
  76. [self hide];
  77. //m_kb->setDonePressed();
  78. }
  79. else {
  80. event_down->type = ALLEGRO_EVENT_KEY_CHAR;
  81. event_down->keyboard.display = current_display;
  82. event_down->keyboard.unichar = [text characterAtIndex:0];
  83. // doesn't matter what keycode is, nuklear backend ignores it as long as it
  84. // isn't a special key
  85. event_down->keyboard.keycode = ALLEGRO_KEY_A;
  86. al_emit_user_event(event_source, event_down, NULL);
  87. }
  88. free(event_down);
  89. free(event_up);
  90. }
  91. -(void)show {
  92. NSLog(@"Should be showing!");
  93. [self performSelectorOnMainThread:@selector(becomeFirstResponder) withObject:nil waitUntilDone:YES];
  94. }
  95. -(void)hide {
  96. NSLog(@"Should be hiding!");
  97. [self performSelectorOnMainThread:@selector(resignFirstResponder) withObject:nil waitUntilDone:YES];
  98. }
  99. - (void)keyboardDidHide:(NSNotification *)notification {
  100. NSLog(@"keyboardDidHide called");
  101. }
  102. -(void)dealloc {
  103. [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardDidHideNotification object:nil];
  104. }
  105. @end