From 0d1f9bd856ad77e948e8d431d591bb6b614c4c51 Mon Sep 17 00:00:00 2001 From: sekelsenmat Date: Sat, 12 Sep 2015 07:37:40 +0000 Subject: [PATCH] cocoa: Implements key up/pressed/down for TEdit, but only keyDown is not ideal due to cocoa limitations git-svn-id: trunk@49817 - --- lcl/interfaces/cocoa/cocoaprivate.pp | 32 +++++++++++++++++++++++++- lcl/interfaces/cocoa/cocoawscommon.pas | 12 ++++++---- 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/lcl/interfaces/cocoa/cocoaprivate.pp b/lcl/interfaces/cocoa/cocoaprivate.pp index 61ab1b5ae2..99b678afa4 100644 --- a/lcl/interfaces/cocoa/cocoaprivate.pp +++ b/lcl/interfaces/cocoa/cocoaprivate.pp @@ -50,7 +50,7 @@ type function MouseUpDownEvent(Event: NSEvent): Boolean; procedure MouseClick; function MouseMove(Event: NSEvent): Boolean; - function KeyEvent(Event: NSEvent): Boolean; + function KeyEvent(Event: NSEvent; AForceAsKeyDown: Boolean = False): Boolean; function scrollWheel(Event: NSEvent): Boolean; // size, pos events procedure frameDidChange; @@ -247,6 +247,9 @@ type procedure lclClearCallback; override; procedure resetCursorRects; override; function lclIsHandle: Boolean; override; + // key + //procedure keyDown(event: NSEvent); override; -> keyDown doesn't work in NSTextField + procedure keyUp(event: NSEvent); override; end; { TCocoaSecureTextField } @@ -262,6 +265,9 @@ type function resignFirstResponder: Boolean; override; procedure resetCursorRects; override; function lclIsHandle: Boolean; override; + // key + //procedure keyDown(event: NSEvent); override; -> keyDown doesn't work in NSTextField + procedure keyUp(event: NSEvent); override; end; @@ -1862,6 +1868,18 @@ begin inherited resetCursorRects; end; +procedure TCocoaTextField.keyUp(event: NSEvent); +begin + if Assigned(callback) then + begin + // NSTextField doesn't provide keyDown, so emulate it here + callback.KeyEvent(event, True); + // keyUp now + callback.KeyEvent(event); + end; + inherited keyUp(event); +end; + { TCocoaTextView } function TCocoaTextView.lclIsHandle: Boolean; @@ -1990,6 +2008,18 @@ begin inherited resetCursorRects; end; +procedure TCocoaSecureTextField.keyUp(event: NSEvent); +begin + if Assigned(callback) then + begin + // NSTextField doesn't provide keyDown, so emulate it here + callback.KeyEvent(event, True); + // keyUp now + callback.KeyEvent(event); + end; + inherited keyUp(event); +end; + { TCocoaCustomControl } function TCocoaCustomControl.lclIsHandle: Boolean; diff --git a/lcl/interfaces/cocoa/cocoawscommon.pas b/lcl/interfaces/cocoa/cocoawscommon.pas index 61fb34ce40..3d2bcdd7b1 100644 --- a/lcl/interfaces/cocoa/cocoawscommon.pas +++ b/lcl/interfaces/cocoa/cocoawscommon.pas @@ -51,7 +51,7 @@ type function GetTarget: TObject; function GetCallbackObject: TObject; function MouseUpDownEvent(Event: NSEvent): Boolean; virtual; - function KeyEvent(Event: NSEvent): Boolean; virtual; + function KeyEvent(Event: NSEvent; AForceAsKeyDown: Boolean = False): Boolean; virtual; procedure MouseClick; virtual; function MouseMove(Event: NSEvent): Boolean; virtual; function scrollWheel(Event: NSEvent): Boolean; virtual; @@ -280,7 +280,7 @@ begin end; -function TLCLCommonCallback.KeyEvent(Event: NSEvent): Boolean; +function TLCLCommonCallback.KeyEvent(Event: NSEvent; AForceAsKeyDown: Boolean): Boolean; var UTF8VKCharacter: TUTF8Char; // char without modifiers, used for VK_ key value UTF8Character: TUTF8Char; // char to send via IntfUtf8KeyPress @@ -290,7 +290,7 @@ var VKKeyCode: word; // VK_ code IsSysKey: Boolean; // Is alt (option) key down? KeyData: PtrInt; // Modifiers (ctrl, alt, mouse buttons...) - + eventType: NSEventType; (* Mac keycodes handling is not so straight. For an explanation, see @@ -631,7 +631,11 @@ var end; begin - case Event.type_ of + eventType := Event.type_; + if AForceAsKeyDown then + eventType := NSKeyDown; + + case eventType of NSKeyDown: begin if not TranslateMacKeyCode then