1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-12-22 22:13:35 +02:00
vcmi/client/ios/GameChatKeyboardHandler.m
2023-01-22 15:37:48 +03:00

71 lines
1.8 KiB
Objective-C

/*
* GameChatKeyboardHandler.m, part of VCMI engine
*
* Authors: listed in file AUTHORS in main folder
*
* License: GNU General Public License v2.0 or later
* Full text of license available in license.txt file, in main folder
*
*/
#import "GameChatKeyboardHandler.h"
static int watchReturnKey(void * userdata, SDL_Event * event);
@interface GameChatKeyboardHandler ()
@property (nonatomic) BOOL wasChatMessageSent;
@end
@implementation GameChatKeyboardHandler
+ (void)sendKeyEventWithKeyCode:(SDL_KeyCode)keyCode
{
SDL_Event keyEvent;
keyEvent.key = (SDL_KeyboardEvent){
.type = SDL_KEYDOWN,
.state = SDL_PRESSED,
.keysym.sym = keyCode,
};
SDL_PushEvent(&keyEvent);
}
- (instancetype)init {
self = [super init];
__auto_type notificationCenter = NSNotificationCenter.defaultCenter;
[notificationCenter addObserver:self selector:@selector(textDidBeginEditing:) name:UITextFieldTextDidBeginEditingNotification object:nil];
[notificationCenter addObserver:self selector:@selector(textDidEndEditing:) name:UITextFieldTextDidEndEditingNotification object:nil];
return self;
}
#pragma mark - Notifications
- (void)textDidBeginEditing:(NSNotification *)n {
self.wasChatMessageSent = NO;
// watch for pressing Return to ignore sending Escape key after keyboard is closed
SDL_AddEventWatch(watchReturnKey, (__bridge void *)self);
}
- (void)textDidEndEditing:(NSNotification *)n {
// discard chat message
if(!self.wasChatMessageSent)
[[self class] sendKeyEventWithKeyCode:SDLK_ESCAPE];
}
@end
static int watchReturnKey(void * userdata, SDL_Event * event)
{
if(event->type == SDL_KEYDOWN && event->key.keysym.scancode == SDL_SCANCODE_RETURN)
{
__auto_type self = (__bridge GameChatKeyboardHandler *)userdata;
self.wasChatMessageSent = YES;
SDL_DelEventWatch(watchReturnKey, userdata);
}
return 1;
}