mirror of
https://github.com/vcmi/vcmi.git
synced 2024-12-26 22:57:00 +02:00
71 lines
1.8 KiB
Objective-C
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;
|
|
}
|