OLD | NEW |
(Empty) | |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #if !defined(__has_feature) || !__has_feature(objc_arc) |
| 6 #error "This file requires ARC support." |
| 7 #endif |
| 8 |
| 9 #import "remoting/ios/key_input.h" |
| 10 #import "remoting/ios/key_map_us.h" |
| 11 |
| 12 @interface KeyInput (Private) |
| 13 - (void)transmitAppropriateKeyCode:(NSString*)text; |
| 14 - (void)transmitKeyCode:(NSInteger)keyCode needShift:(bool)needShift; |
| 15 @end |
| 16 |
| 17 @implementation KeyInput |
| 18 |
| 19 @synthesize delegate = _delegate; |
| 20 |
| 21 // Override UIKeyInput::UITextInputTraits property |
| 22 - (UIKeyboardType)keyboardType { |
| 23 return UIKeyboardTypeAlphabet; |
| 24 } |
| 25 |
| 26 // Override UIView::UIResponder, when this interface is the first responder |
| 27 // on-screen keyboard input will create events for Chromoting keyboard input |
| 28 - (BOOL)canBecomeFirstResponder { |
| 29 return YES; |
| 30 } |
| 31 |
| 32 // Override UIView::UIResponder |
| 33 // Keyboard was dismissed |
| 34 - (BOOL)resignFirstResponder { |
| 35 BOOL wasFirstResponder = self.isFirstResponder; |
| 36 BOOL didResignFirstReponder = |
| 37 [super resignFirstResponder]; // I'm not sure that this returns YES when |
| 38 // first responder was resigned, but for |
| 39 // now I don't actually need to know what |
| 40 // the return from super means. |
| 41 if (wasFirstResponder) { |
| 42 [_delegate keyboardDismissed]; |
| 43 } |
| 44 |
| 45 return didResignFirstReponder; |
| 46 } |
| 47 |
| 48 // @protocol UIKeyInput, Send backspace |
| 49 - (void)deleteBackward { |
| 50 [self transmitKeyCode:kKeyCodeUS[kBackspaceIndex] needShift:false]; |
| 51 } |
| 52 |
| 53 // @protocol UIKeyInput, Assume this is a text input |
| 54 - (BOOL)hasText { |
| 55 return YES; |
| 56 } |
| 57 |
| 58 // @protocol UIKeyInput, Translate inserted text to key presses, one char at a |
| 59 // time |
| 60 - (void)insertText:(NSString*)text { |
| 61 [self transmitAppropriateKeyCode:text]; |
| 62 } |
| 63 |
| 64 - (void)ctrlAltDel { |
| 65 if (_delegate) { |
| 66 [_delegate keyboardActionKeyCode:kKeyCodeUS[kCtrlIndex] isKeyDown:YES]; |
| 67 [_delegate keyboardActionKeyCode:kKeyCodeUS[kAltIndex] isKeyDown:YES]; |
| 68 [_delegate keyboardActionKeyCode:kKeyCodeUS[kDelIndex] isKeyDown:YES]; |
| 69 [_delegate keyboardActionKeyCode:kKeyCodeUS[kDelIndex] isKeyDown:NO]; |
| 70 [_delegate keyboardActionKeyCode:kKeyCodeUS[kAltIndex] isKeyDown:NO]; |
| 71 [_delegate keyboardActionKeyCode:kKeyCodeUS[kCtrlIndex] isKeyDown:NO]; |
| 72 } |
| 73 } |
| 74 |
| 75 // When inserting multiple characters, process them one at a time. |text| is as |
| 76 // it was output on the device. The shift key is not naturally presented in the |
| 77 // input stream, and must be inserted by inspecting each char and considering |
| 78 // that if the key was input on a traditional keyboard that the character would |
| 79 // have required a shift. Assume caps lock does not exist. |
| 80 - (void)transmitAppropriateKeyCode:(NSString*)text { |
| 81 for (int i = 0; i < [text length]; ++i) { |
| 82 NSInteger charToSend = [text characterAtIndex:i]; |
| 83 |
| 84 if (charToSend <= kKeyboardKeyMaxUS) { |
| 85 [self transmitKeyCode:kKeyCodeUS[charToSend] |
| 86 needShift:kIsShiftRequiredUS[charToSend]]; |
| 87 } |
| 88 } |
| 89 } |
| 90 |
| 91 // |charToSend| is as it was output on the device. Some call this a |
| 92 // 'key press'. For Chromoting this must be transferred as a key down (press |
| 93 // down with a finger), followed by a key up (finger is removed from the |
| 94 // keyboard) |
| 95 // |
| 96 // The delivery may be an upper case or special character. Chromoting is just |
| 97 // interested in the button that was pushed, so to create an upper case |
| 98 // character, first send a shift press, then the button, then release shift |
| 99 - (void)transmitKeyCode:(NSInteger)keyCode needShift:(bool)needShift { |
| 100 if (keyCode > 0 && _delegate) { |
| 101 if (needShift) { |
| 102 [_delegate keyboardActionKeyCode:kKeyCodeUS[kShiftIndex] isKeyDown:YES]; |
| 103 } |
| 104 [_delegate keyboardActionKeyCode:keyCode isKeyDown:YES]; |
| 105 [_delegate keyboardActionKeyCode:keyCode isKeyDown:NO]; |
| 106 if (needShift) { |
| 107 [_delegate keyboardActionKeyCode:kKeyCodeUS[kShiftIndex] isKeyDown:NO]; |
| 108 } |
| 109 } |
| 110 } |
| 111 @end |
OLD | NEW |