Browse Source

* ptcpas keyboard handling improvements for macOS and X11

Nikolay Nikolov 3 years ago
parent
commit
b00fdb7205

+ 1 - 0
packages/ptc/examples/keyboard3.pp

@@ -147,6 +147,7 @@ begin
     PTCKEY_BACKQUOTE    : Result := 'PTCKEY_BACKQUOTE';
     PTCKEY_BACKQUOTE    : Result := 'PTCKEY_BACKQUOTE';
     PTCKEY_QUOTE        : Result := 'PTCKEY_QUOTE';
     PTCKEY_QUOTE        : Result := 'PTCKEY_QUOTE';
     PTCKEY_COMMAND      : Result := 'PTCKEY_COMMAND';
     PTCKEY_COMMAND      : Result := 'PTCKEY_COMMAND';
+    PTCKEY_FUNCTION     : Result := 'PTCKEY_FUNCTION';
     else
     else
       Result := '';
       Result := '';
   end;
   end;

+ 91 - 6
packages/ptc/src/cocoa/cocoaconsolei.inc

@@ -246,7 +246,7 @@ begin
     40:  exit(PTCKEY_K);
     40:  exit(PTCKEY_K);
     37:  exit(PTCKEY_L);
     37:  exit(PTCKEY_L);
     41:  exit(PTCKEY_SEMICOLON);
     41:  exit(PTCKEY_SEMICOLON);
-    39:  exit(0);  // '
+    39:  exit(PTCKEY_QUOTE);
     42:  exit(PTCKEY_BACKSLASH);
     42:  exit(PTCKEY_BACKSLASH);
     50:  exit(PTCKEY_BACKQUOTE);
     50:  exit(PTCKEY_BACKQUOTE);
     6:   exit(PTCKEY_Z);
     6:   exit(PTCKEY_Z);
@@ -288,6 +288,7 @@ begin
     119: exit(PTCKEY_END);
     119: exit(PTCKEY_END);
     116: exit(PTCKEY_PAGEUP);
     116: exit(PTCKEY_PAGEUP);
     121: exit(PTCKEY_PAGEDOWN);
     121: exit(PTCKEY_PAGEDOWN);
+    63:  exit(PTCKEY_FUNCTION);
     117: exit(PTCKEY_DELETE);
     117: exit(PTCKEY_DELETE);
     56,                       // Left Shift
     56,                       // Left Shift
     60:  exit(PTCKEY_SHIFT);  // Right Shift
     60:  exit(PTCKEY_SHIFT);  // Right Shift
@@ -308,8 +309,8 @@ begin
     89:  exit(PTCKEY_NUMPAD7);
     89:  exit(PTCKEY_NUMPAD7);
     91:  exit(PTCKEY_NUMPAD8);
     91:  exit(PTCKEY_NUMPAD8);
     92:  exit(PTCKEY_NUMPAD9);
     92:  exit(PTCKEY_NUMPAD9);
-    71:  exit(0);  // Clear (Num Lock???)
-    81:  exit(0);  // numpad '='
+    71:  exit(PTCKEY_CLEAR);  // Clear (in place of Num Lock)
+    81:  exit(PTCKEY_EQUALS);  // numpad '='
     75:  exit(PTCKEY_DIVIDE);
     75:  exit(PTCKEY_DIVIDE);
     67:  exit(PTCKEY_MULTIPLY);
     67:  exit(PTCKEY_MULTIPLY);
     78:  exit(PTCKEY_SUBTRACT);
     78:  exit(PTCKEY_SUBTRACT);
@@ -343,7 +344,7 @@ begin
   LOG('cocoa key event ' + Method + ' type=' + IntToStr(evtype) + ' keyCode=' + IntToStr(kcode) + ' modifierFlags=' + IntToStr(modflags));
   LOG('cocoa key event ' + Method + ' type=' + IntToStr(evtype) + ' keyCode=' + IntToStr(kcode) + ' modifierFlags=' + IntToStr(modflags));
   Result := False;
   Result := False;
   Code := TranslateKeyCode(kcode);
   Code := TranslateKeyCode(kcode);
-  Unicode := 0;
+  Unicode := -1;
   if Assigned(Characters) and (Characters.length = 1) then
   if Assigned(Characters) and (Characters.length = 1) then
     Unicode := Characters.characterAtIndex(0);
     Unicode := Characters.characterAtIndex(0);
   ModifierKeys := [];
   ModifierKeys := [];
@@ -355,6 +356,15 @@ begin
     Include(ModifierKeys, pmkControl);
     Include(ModifierKeys, pmkControl);
   if (modflags and NSCommandKeyMask) <> 0 then
   if (modflags and NSCommandKeyMask) <> 0 then
     Include(ModifierKeys, pmkCommand);
     Include(ModifierKeys, pmkCommand);
+  if (modflags and NSNumericPadKeyMask) <> 0 then
+    Include(ModifierKeys, pmkNumPadKey);
+  if (modflags and NSFunctionKeyMask) <> 0 then
+    Include(ModifierKeys, pmkFunction);
+  if (kcode = 54) or    { Right Command key }
+     (kcode = 60) or    { Right Shift }
+     (kcode = 61) or    { Right Option (Alt) key }
+     (kcode = 62) then  { Right Ctrl }
+    Include(ModifierKeys, pmkRightKey);
   case evtype of
   case evtype of
     NSKeyDown: Press := True;
     NSKeyDown: Press := True;
     NSKeyUp: Press := False;
     NSKeyUp: Press := False;
@@ -372,6 +382,8 @@ begin
                 ptc event queue }
                 ptc event queue }
               PressAndRelease := True;
               PressAndRelease := True;
             end;
             end;
+          PTCKEY_FUNCTION:
+            Press := pmkFunction in ModifierKeys;
         else
         else
           begin
           begin
             LOG('Unknown NSFlagsChanged key code');
             LOG('Unknown NSFlagsChanged key code');
@@ -380,13 +392,86 @@ begin
         end;
         end;
       end;
       end;
   end;
   end;
+  case Code of
+    PTCKEY_UP,
+    PTCKEY_DOWN,
+    PTCKEY_LEFT,
+    PTCKEY_RIGHT:
+      begin
+        Exclude(ModifierKeys, pmkNumPadKey);
+        Unicode := -1;
+      end;
+    PTCKEY_ENTER:
+      begin
+        if pmkControl in ModifierKeys then
+        begin
+          if not (pmkAlt in ModifierKeys) and
+             not (pmkShift in ModifierKeys) then
+            Unicode := $0A
+          else
+            Unicode := -1;
+        end
+        else
+          Unicode := $0D;
+      end;
+    PTCKEY_BACKSPACE:
+      begin
+        if pmkControl in ModifierKeys then
+        begin
+          if not (pmkAlt in ModifierKeys) and
+             not (pmkShift in ModifierKeys) then
+            Unicode := $7F
+          else
+            Unicode := -1;
+        end
+        else
+          Unicode := $08;
+      end;
+    PTCKEY_TAB:
+      begin
+        if not (pmkControl in ModifierKeys) and
+           not (pmkAlt in ModifierKeys) and
+           not (pmkCommand in ModifierKeys) then
+          Unicode := 9
+        else
+          Unicode := -1;
+      end;
+    PTCKEY_DELETE,
+    PTCKEY_PAGEUP,
+    PTCKEY_PAGEDOWN,
+    PTCKEY_HOME,
+    PTCKEY_END,
+    PTCKEY_CLEAR,
+    PTCKEY_F1,
+    PTCKEY_F2,
+    PTCKEY_F3,
+    PTCKEY_F4,
+    PTCKEY_F5,
+    PTCKEY_F6,
+    PTCKEY_F7,
+    PTCKEY_F8,
+    PTCKEY_F9,
+    PTCKEY_F10,
+    PTCKEY_F11,
+    PTCKEY_F12,
+    PTCKEY_F13,
+    PTCKEY_F14,
+    PTCKEY_F15,
+    PTCKEY_F16,
+    PTCKEY_F17,
+    PTCKEY_F18,
+    PTCKEY_F19:
+      Unicode := -1;
+  end;
   if PressAndRelease then
   if PressAndRelease then
   begin
   begin
     FEventQueue.AddEvent(TPTCKeyEventFactory.CreateNew(Code, Unicode, ModifierKeys, True));
     FEventQueue.AddEvent(TPTCKeyEventFactory.CreateNew(Code, Unicode, ModifierKeys, True));
-    FEventQueue.AddEvent(TPTCKeyEventFactory.CreateNew(Code, Unicode, ModifierKeys, False));
+    FEventQueue.AddEvent(TPTCKeyEventFactory.CreateNew(Code, -1, ModifierKeys, False));
   end
   end
+  else if Press then
+    FEventQueue.AddEvent(TPTCKeyEventFactory.CreateNew(Code, Unicode, ModifierKeys, True))
   else
   else
-    FEventQueue.AddEvent(TPTCKeyEventFactory.CreateNew(Code, Unicode, ModifierKeys, Press));
+    FEventQueue.AddEvent(TPTCKeyEventFactory.CreateNew(Code, -1, ModifierKeys, False));
 end;
 end;
 
 
 function TCocoaConsole.HandleCocoaMouseEvent(theEvent: NSEvent;
 function TCocoaConsole.HandleCocoaMouseEvent(theEvent: NSEvent;

+ 2 - 1
packages/ptc/src/core/keyeventd.inc

@@ -37,7 +37,7 @@ type
     pmkCapsLockActive, pmkCapsLockPressed,
     pmkCapsLockActive, pmkCapsLockPressed,
     pmkScrollLockActive, pmkScrollLockPressed,
     pmkScrollLockActive, pmkScrollLockPressed,
     pmkRightKey, pmkNumPadKey, pmkDeadKey,
     pmkRightKey, pmkNumPadKey, pmkDeadKey,
-    pmkCommand);
+    pmkCommand, pmkFunction);
   TPTCModifierKeys = set of TPTCModifierKey;
   TPTCModifierKeys = set of TPTCModifierKey;
   IPTCKeyEvent = interface(IPTCEvent)
   IPTCKeyEvent = interface(IPTCEvent)
     ['{9BD1CD41-1DF6-4392-99DC-885EADB6D85A}']
     ['{9BD1CD41-1DF6-4392-99DC-885EADB6D85A}']
@@ -216,3 +216,4 @@ const
   PTCKEY_F33          = $115;
   PTCKEY_F33          = $115;
   PTCKEY_F34          = $116;
   PTCKEY_F34          = $116;
   PTCKEY_F35          = $117;
   PTCKEY_F35          = $117;
+  PTCKEY_FUNCTION     = $118;  { the 'fn' key on Apple keyboards }

+ 2 - 1
packages/ptc/src/x11/x11displayi.inc

@@ -546,7 +546,8 @@ begin
   if sym_modded = XK_ISO_Left_Tab then
   if sym_modded = XK_ISO_Left_Tab then
   begin
   begin
     sym_modded := XK_Tab;
     sym_modded := XK_Tab;
-    uni := 9;
+    if press then
+      uni := 9;
     Include(modkeys, pmkShift);
     Include(modkeys, pmkShift);
   end;
   end;