Browse Source

Update zgl_keyboard.pas

Seenkao 3 years ago
parent
commit
7ed1abd1ac
1 changed files with 112 additions and 61 deletions
  1. 112 61
      Zengl_SRC/src/zgl_keyboard.pas

+ 112 - 61
Zengl_SRC/src/zgl_keyboard.pas

@@ -21,7 +21,7 @@
  *  3. This notice may not be removed or altered from any
  *     source distribution.
 
- !!! modification from Serge 24.02.2022
+ !!! modification from Serge 30.05.2022
 }
 unit zgl_keyboard;
 
@@ -170,8 +170,10 @@ const
   K_F11        = $57;
   K_F12        = $58;
 
+  // основные события происходящие между интервалами очистки клавиатуры
   KA_DOWN      = 0;
   KA_UP        = 1;
+  // события происходящие только при нажатии/отжатии клавиш
   KT_DOWN      = 2;
   KT_UP        = 3;
 
@@ -192,25 +194,34 @@ const
   keyboardScrollLock     = $00004000;
   keyboardScrollLockDown = $00008000;
 
-// Rus: внутренняя работа с клавиатурой для всех систем, не надо трогать эти процедуры
-procedure keyboardDown(keyCode: Byte);
-procedure keyboardUp(keyCode: Byte);
+// Rus: внутренняя работа с клавиатурой для всех систем, не надо трогать эту процедуру.
+// Eng: internal work with the keyboard for all systems, do not touch this procedure.
+procedure keyboardDown(keyCode: LongWord);
+// Rus: внутренняя работа с клавиатурой для всех систем, не надо трогать эту процедуру.
+// Eng: internal work with the keyboard for all systems, do not touch this procedure.
+procedure keyboardUp(keyCode: LongWord);
 
 {$IfDef LIBRARY_COMPILE}
-// Rus: опрос, нажата клавиша или нет, в данный момент времени
-function  key_Down(KeyCode: Byte): Boolean; {$IfDef USE_INLINE}inline;{$EndIf}
-// Rus: опрос, отжата клавиша или нетб в данный момент времени
-function  key_Up(KeyCode: Byte): Boolean; {$IfDef USE_INLINE}inline;{$EndIf}
-
-function  key_Press(KeyCode: Byte): Boolean; {$IfDef USE_INLINE}inline;{$EndIf}
+// Rus: опрос, нажата клавиша или нет, в данный момент времени.
+// Eng: polling whether a key is pressed or not, at a given time.
+function  key_Down(KeyCode: LongWord): Boolean; {$IfDef USE_INLINE}inline;{$EndIf}
+// Rus: опрос, отжата клавиша или нет в данный момент времени.
+// Eng: polling whether a key is released or not at a given time.
+function  key_Up(KeyCode: LongWord): Boolean; {$IfDef USE_INLINE}inline;{$EndIf}
+// Rus: опрос, удержана ли клавиша.
+// Eng: Polling if a key is held down.
+function  key_Press(KeyCode: LongWord): Boolean; {$IfDef USE_INLINE}inline;{$EndIf}
 
 // Rus: вернёт код последней нажатой/отжатой (НЕ УПРАВЛЯЮЩЕЙ!) клавиши
 //      KeyAction = или KA_DOWN или KA_UP
-function  key_Last(KeyAction: Byte): Byte; {$IfDef USE_INLINE}inline;{$EndIf}
+// Eng: will return the code of the last pressed/released (NOT CONTROL!) key
+//      KeyAction = either KA_DOWN or KA_UP
+function  key_Last(KeyAction: LongWord): LongWord; {$IfDef USE_INLINE}inline;{$EndIf}
 {$EndIf}
 
 {$IfDef OLD_METHODS}
-// Rus: старые способы использования поля ввода 3-я демка
+// Rus: старые способы использования поля ввода 3-я демка.
+// Eng: old ways to use the input field 3rd demo.
 procedure key_BeginReadText(const Text: UTF8String; MaxSymbols: Integer = -1);
 procedure key_UpdateReadText(const Text: UTF8String; MaxSymbols: Integer = -1);
 function  key_GetText: UTF8String; {$IfDef FPC}inline;{$EndIf}
@@ -220,10 +231,16 @@ procedure key_InputText(const Text: UTF8String);
 function _key_GetText: PAnsiChar;
 {$EndIf}
 
-// Rus: очистка состояний клавиатуры. Прописано в рабочем коде. Может быть нужно в крайних случаях.
+// Rus: очистка состояний клавиатуры. Прописано в рабочем коде. Если вы сами не
+//      подменяете инициализацию - zgl_Reg(SYS_APP_INIT, ...), то вам не нужно
+//      её использовать.
+// Eng: clearing keyboard states. Registered in the working code. If you don't
+//      change the initialization yourself - zgl_Reg(SYS_APP_INIT, ...), then
+//      you don't need to use it.
 procedure key_ClearState;
 // Rus: возвращает код символа из кода клавиатуры. Только латиница.
-function scancode_to_utf8(ScanCode: Byte): Byte;
+// Eng: returns the character code from the keyboard code. Only Latin.
+function scancode_to_utf8(ScanCode: LongWord): LongWord;
 
 // Rus: Установка начальной задержки (при начальном нажатии) при зажатии клавиши.
 // Eng: Sets the initial delay (when initially pressed) when the key is pressed.
@@ -234,7 +251,7 @@ procedure setKey_BeginRepeat(delay: Double); {$IfDef USE_INLINE}inline;{$EndIf}
 // Eng: Setting the delay when pressing a key.
 //     This delay cannot be more than half of the initial delay.
 procedure setKey_Repeat(delay: Double);
-
+{$IfNDef MOBILE}
 {$IfDef USE_VKEYBOARD}
 // Rus: Установка задержки отключения виртуальной клавиатуры
 //     (защита от одновременной работы клавиатуры и виртуальной клавиатуры)
@@ -245,19 +262,19 @@ procedure setKey_Repeat(delay: Double);
 //     Works for non-control keys.
 //     (Ctrl, Shif, Alt, Win/Command, CapsLock, ScrollLock, NumLock)
 procedure setTimeLockVK(delay: Double); {$IfDef FPC}inline;{$EndIf}
-{$EndIf}
+{$EndIf}{$EndIf}
 
 {$IFDEF USE_X11}
-function xkey_to_scancode(XKey, KeyCode: Integer): Byte;
+function xkey_to_scancode(XKey, KeyCode: Integer): LongWord;
 {$IfDef OLD_METHODS}
 function Xutf8LookupString(ic: PXIC; event: PXKeyPressedEvent; buffer_return: PAnsiChar; bytes_buffer: Integer; keysym_return: PKeySym; status_return: PStatus): integer; cdecl; external;
 {$EndIf}
 {$ENDIF}
 {$IFDEF WINDOWS}
-function winkey_to_scancode(WinKey: Integer): Byte;
+function winkey_to_scancode(WinKey: Integer): LongWord;
 {$ENDIF}
 {$IFDEF MACOSX}
-function mackey_to_scancode(MacKey: Integer): Byte;
+function mackey_to_scancode(MacKey: Integer): LongWord;
 {$ENDIF}
 {$IFDEF iOS}
 type
@@ -278,7 +295,7 @@ var
   keysCanText : Boolean;
   keysMax     : Integer;
   {$EndIf}
-  keysLast    : array[0..3] of Byte;
+  keysLast    : array[0..3] of LongWord;
 
   mouseToKey: Boolean = false;
 
@@ -291,31 +308,42 @@ var
   keysTextFrame  : CGRect;
   keysTextChanged: Boolean;
   {$ENDIF}
-  // длительность задержки, для повтора ввода клавиши
+  // Rus: длительность задержки, для повтора ввода клавиши.
+  // Eng:
   keyDownRepeat: Double;
-  // зажата клавиша (производится ли повторение?)
+  // Rus: зажата клавиша (производится ли повторение?).
+  // Eng:
   keyBoolRepeat: Boolean;
-  // начальная задержка - удержание кнопки клавиатуры
+  // Rus: начальная задержка - удержание кнопки клавиатуры.
+  // Eng:
   beginKeyDelay: Double = 500;
-  // задержка при постоянном удержании кнопки клавиатуры
+  // Rus: задержка при постоянном удержании кнопки клавиатуры.
+  // Eng:
   repeatKeyDelay: Double = 60;
-  // установленная рабочая задержка, для кнопки клавиатуры
+  // Rus: установленная рабочая задержка, для кнопки клавиатуры.
+  // Eng:
   keyDelayWork: Double = 500;
+  {$IfNDef MOBILE}
   {$IfDef USE_VKEYBOARD}
-  // блокирует виртуальную клавиатуру
+  // Rus: блокирует виртуальную клавиатуру.
+  // Eng:
   lockVirtualKeyboard: Boolean = False;
-  // оповещает, что надо блокировать виртуальную клавиатуру
+  // Rus: оповещает, что надо блокировать виртуальную клавиатуру.
+  // Eng:
 //  prevLockVK: Boolean = False;
-  // общее время блокировки виртуальной клавиатуры
+  // Rus: общее время блокировки виртуальной клавиатуры.
+  // Eng:
   timeLockVK: Double = 400;
-  // установка отсчёта времени отхода блокировки виртуальной клавиатуры
+  // Rus: установка отсчёта времени отхода блокировки виртуальной клавиатуры.
+  // Eng:
   startTimeLockVK: Double;
-  {$EndIf}
-  // флаги для работы с клавиатурой
-  // для понимания, управляющие клавиши не могут быть "последними"-нажатыми
-  // а если управляющие клавиши сработали, то часть их отображается в флагах,
-  // как сработавшие и как произошедшее событие
-  // эти флаги можно включить, при запуске программы и опросе системы.
+  {$EndIf}{$EndIf}
+  //Rus: флаги для работы с клавиатурой.
+  //     для понимания: управляющие клавиши не могут быть "последними"-нажатыми
+  //     а если управляющие клавиши сработали, то часть их отображается в флагах,
+  //     как сработавшие и как произошедшее событие
+  //     эти флаги можно включить, при запуске программы и опросе системы.
+  // Eng:
   keybFlags   : Cardinal;
   PkeybFlags  : PCardinal = @keybFlags;
 
@@ -333,10 +361,9 @@ uses
   {$EndIf}
   zgl_timers;
 
-procedure keyboardDown(keyCode: Byte);
-var
-  Pk: PLongWord;
+procedure keyboardDown(keyCode: LongWord);
 begin
+  {$IfNDef MOBILE}
   {$If not(defined( WINDOWS) or defined(LINUX))}
   // грёбанный ситуэйшн... опять долбанные переводы, при нажатии определённых клавиш
   if (keybFlags and keyboardNumLock) > 0 then
@@ -357,7 +384,7 @@ begin
       end;
     end;
   end;
-  {$IfEnd}
+  {$IfEnd}{$EndIf}
 
   keysDown[KeyCode] := TRUE;
   keysUp[KeyCode] := FALSE;
@@ -370,32 +397,32 @@ begin
     keysPress   [KeyCode] := TRUE;
     keysCanPress[KeyCode] := FALSE;
   end;
-  Pk := @keybFlags;
+//  Pk := @keybFlags;
   case KeyCode of
     K_PAUSE: ;
     K_INSERT:   PkeybFlags^ := PkeybFlags^ or keyboardInsertDown;
     {$IfNDef MAC_COCOA}
     K_CTRL_L, K_CTRL_R:
       begin
-        Pk^ := Pk^ or keyboardCtrl;
+        PkeybFlags^ := PkeybFlags^ or keyboardCtrl;
         keysDown[K_CTRL] := True;
         keysUp  [K_CTRL] := False;
       end;
     K_ALT_L, K_ALT_R:
       begin
-        Pk^ := Pk^ or keyboardAlt;
+        PkeybFlags^ := PkeybFlags^ or keyboardAlt;
         keysDown[K_ALT] := True;
         keysUp  [K_ALT] := False;
       end;
     K_SHIFT_L, K_SHIFT_R:
       begin
-        Pk^ := Pk^ or keyboardShift;
+        PkeybFlags^ := PkeybFlags^ or keyboardShift;
         keysDown[K_SHIFT] := True;
         keysUp  [K_SHIFT] := False;
       end;
     K_SUPER_L, K_SUPER_R:
       begin
-        Pk^ := Pk^ or keyboardCommand;
+        PkeybFlags^ := PkeybFlags^ or keyboardCommand;
         keysDown[K_SUPER] := True;
         keysUp  [K_SUPER] := False;
       end;
@@ -408,6 +435,7 @@ begin
   else
     begin
       keysLast[KA_DOWN] := KeyCode;
+      {$IfNDef MOBILE}
       {$IfDef USE_VKEYBOARD}
       if not mouseToKey then
       begin
@@ -415,15 +443,18 @@ begin
         lockVirtualKeyboard := True;
         startTimeLockVK := timer_GetTicks;
       end;
-      {$EndIf}
+      {$EndIf}{$EndIf}
     end;
   end;
 
   keysLast[KT_UP] := 0;
 end;
 
-procedure keyboardUp(keyCode: Byte);
+procedure keyboardUp(keyCode: LongWord);
+var
+  _flag: Boolean;
 begin
+  {$IfNDef MOBILE}
   {$If not(defined( WINDOWS) or defined(LINUX))}
   // грёбанный ситуэшн... опять долбанные переводы, при нажатии определённых клавиш
   if (keybFlags and keyboardNumLock) > 0 then
@@ -444,10 +475,11 @@ begin
       end;
     end;
   end;
-  {$IfEnd}
+  {$IfEnd}{$EndIf}
 
   if keysLast[KT_UP] = KeyCode then
     exit;
+
   keysDown[KeyCode] := FALSE;
   keysUp  [KeyCode] := TRUE;
 
@@ -467,7 +499,12 @@ begin
                   PkeybFlags^ := PkeybFlags^ xor keyboardCapsDown xor keyboardCaps;
     K_CTRL_R, K_CTRL_L:
       begin
-        if (keysCanPress[K_CTRL_L]) and (keysCanPress[K_CTRL_R]) then
+        if keyCode = K_CTRL_R then
+          _flag := keysCanPress[K_CTRL_L]
+        else
+          _flag := keysCanPress[K_CTRL_R];
+
+        if _flag then
         begin
           PkeybFlags^ := PkeybFlags^ and ($FFFFFFFF - keyboardCtrl);
           keysDown[K_CTRL] := FALSE;
@@ -476,7 +513,11 @@ begin
       end;
     K_ALT_L, K_ALT_R:
       begin
-        if (keysCanPress[K_ALT_L]) and (keysCanPress[K_ALT_R]) then
+        if keyCode = K_ALT_R then
+          _flag := keysCanPress[K_ALT_L]
+        else
+          _flag := keysCanPress[K_ALT_R];
+        if _flag then
         begin
           PkeybFlags^ := PkeybFlags^ and ($FFFFFFFF - keyboardAlt);
           keysDown[K_ALT] := FALSE;
@@ -485,7 +526,11 @@ begin
       end;
     K_SHIFT_L, K_SHIFT_R:
       begin
-        if (keysCanPress[K_SHIFT_L]) and (keysCanPress[K_SHIFT_R]) then
+        if keyCode = K_SHIFT_R then
+          _flag := keysCanPress[K_SHIFT_L]
+        else
+          _flag := keysCanPress[K_SHIFT_R];
+        if _flag then
         begin
           PkeybFlags^ := PkeybFlags^ and ($FFFFFFFF - keyboardShift);
           keysDown[K_SHIFT] := FALSE;
@@ -494,7 +539,11 @@ begin
       end;
     K_SUPER_R, K_SUPER_L:
       begin
-        if (keysCanPress[K_SUPER_L]) and (keysCanPress[K_SUPER_R]) then
+        if keyCode = K_SUPER_R then
+          _flag := keysCanPress[K_SUPER_L]
+        else
+          _flag := keysCanPress[K_SUPER_R];
+        if _flag then
         begin
           PkeybFlags^ := PkeybFlags^ and ($FFFFFFFF - keyboardCommand);
           keysDown[K_SUPER] := FALSE;
@@ -506,6 +555,7 @@ begin
     begin
       keysLast[KA_UP] := KeyCode;
       keysLast[KT_UP] := KeyCode;
+      {$IfNDef MOBILE}
       {$IfDef USE_VKEYBOARD}
       if not mouseToKey then
       begin
@@ -513,7 +563,7 @@ begin
         lockVirtualKeyboard := True;
         startTimeLockVK := timer_GetTicks;
       end;
-      {$EndIf}
+      {$EndIf}{$EndIf}
     end;
   end;
 
@@ -526,22 +576,22 @@ begin
 end;
 
 {$IfDef LIBRARY_COMPILE}
-function key_Down(KeyCode: Byte): Boolean;
+function key_Down(KeyCode: LongWord): Boolean;
 begin
   Result := keysDown[KeyCode];
 end;
 
-function key_Up(KeyCode: Byte): Boolean;
+function key_Up(KeyCode: LongWord): Boolean;
 begin
   Result := keysUp[KeyCode];
 end;
 
-function key_Press(KeyCode: Byte): Boolean;
+function key_Press(KeyCode: LongWord): Boolean;
 begin
   Result := keysPress[KeyCode];
 end;
 
-function key_Last(KeyAction: Byte): Byte;
+function key_Last(KeyAction: LongWord): LongWord;
 begin
   Result := keysLast[KeyAction];
 end;
@@ -649,7 +699,7 @@ begin
   keyBoolRepeat := False;
 end;
 
-function scancode_to_utf8(ScanCode: Byte): Byte;
+function scancode_to_utf8(ScanCode: LongWord): LongWord;
 begin
   Result := 0;
   case ScanCode of
@@ -779,12 +829,13 @@ begin
     repeatKeyDelay := beginKeyDelay / 2;
 end;
 
+{$IfNDef MOBILE}
 {$IfDef USE_VKEYBOARD}
 procedure setTimeLockVK(delay: Double);
 begin
   timeLockVK := delay;
 end;
-{$EndIf}
+{$EndIf}{$EndIf}
 
 {$IfDef OLD_METHODS}
 procedure key_InputText(const Text: UTF8String);
@@ -819,7 +870,7 @@ end;
 
 {$IFDEF USE_X11}
 // Most of scancodes can be get via simple trick.
-function xkey_to_scancode(XKey, KeyCode: Integer): Byte;
+function xkey_to_scancode(XKey, KeyCode: Integer): LongWord;
 begin
   case XKey of
     XK_Pause:        Result := K_PAUSE;
@@ -870,7 +921,7 @@ end;
 {$ENDIF}
 
 {$IFDEF WINDOWS}
-function winkey_to_scancode(WinKey: Integer): Byte;
+function winkey_to_scancode(WinKey: Integer): LongWord;
 begin
   case WinKey of
     $26: Result := K_UP;
@@ -891,7 +942,7 @@ end;
 {$ENDIF}
 
 {$IFDEF MACOSX}
-function mackey_to_scancode(MacKey: Integer): Byte;
+function mackey_to_scancode(MacKey: Integer): LongWord;
 begin
   case MacKey of
     $71: Result := K_PAUSE;