mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-10-31 03:11:39 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			306 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			306 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| {
 | |
|     $Id$
 | |
|     This file is part of the Free Pascal run time library.
 | |
|     Copyright (c) 1999-2000 by the Free Pascal development team
 | |
| 
 | |
|     See the file COPYING.FPC, included in this distribution,
 | |
|     for details about the copyright.
 | |
| 
 | |
|     This program is distributed in the hope that it will be useful,
 | |
|     but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 | |
| 
 | |
|  **********************************************************************}
 | |
| 
 | |
| var
 | |
|   PendingKeyEvent : TKeyEvent;
 | |
| 
 | |
| procedure PutKeyEvent(KeyEvent: TKeyEvent);
 | |
| begin
 | |
|   PendingKeyEvent := KeyEvent;
 | |
| end;
 | |
| 
 | |
| function GetKeyEventFlags(KeyEvent: TKeyEvent): Byte;
 | |
| begin
 | |
|   GetKeyEventFlags := (KeyEvent and $FF000000) shr 24;
 | |
| end;
 | |
| 
 | |
| function GetKeyEventChar(KeyEvent: TKeyEvent): Char;
 | |
| begin
 | |
|   if KeyEvent and $03000000 = $00000000 then
 | |
|     GetKeyEventChar := Chr(KeyEvent and $000000FF)
 | |
|    else
 | |
|     GetKeyEventChar := #0;
 | |
| end;
 | |
| 
 | |
| function GetKeyEventUniCode(KeyEvent: TKeyEvent): Word;
 | |
| begin
 | |
|   if KeyEvent and $03000000 = $01000000 then
 | |
|     GetKeyEventUniCode := KeyEvent and $0000FFFF
 | |
|    else
 | |
|     GetKeyEventUniCode := 0;
 | |
| end;
 | |
| 
 | |
| function GetKeyEventCode(KeyEvent: TKeyEvent): Word;
 | |
| begin
 | |
|   GetKeyEventCode := KeyEvent and $0000FFFF
 | |
| end;
 | |
| 
 | |
| function GetKeyEventShiftState(KeyEvent: TKeyEvent): Byte;
 | |
| begin
 | |
|   GetKeyEventShiftState := (KeyEvent and $00FF0000) shr 16;
 | |
| end;
 | |
| 
 | |
| function IsFunctionKey(KeyEvent: TKeyEvent): Boolean;
 | |
| begin
 | |
|   IsFunctionKey := KeyEvent and $03000000 = $02000000;
 | |
| end;
 | |
| 
 | |
| Var
 | |
|   KeyBoardInitialized : Boolean;
 | |
|   CurrentKeyboardDriver : TKeyboardDriver;
 | |
| 
 | |
| procedure InitKeyboard;
 | |
| 
 | |
| begin
 | |
|   If Not KeyboardInitialized then
 | |
|     begin
 | |
|     If Assigned(CurrentKeyBoardDriver.InitDriver) Then
 | |
|       CurrentKeyBoardDriver.InitDriver();
 | |
|     KeyboardInitialized:=True;
 | |
|     end;
 | |
| end;
 | |
| 
 | |
| procedure DoneKeyboard;
 | |
| 
 | |
| begin
 | |
|   If KeyboardInitialized then
 | |
|     begin
 | |
|     If Assigned(CurrentKeyBoardDriver.DoneDriver) Then
 | |
|       CurrentKeyBoardDriver.DoneDriver();
 | |
|     KeyboardInitialized:=False;
 | |
|     end;
 | |
| end;
 | |
| 
 | |
| 
 | |
| function GetKeyEvent: TKeyEvent;
 | |
| 
 | |
| begin
 | |
|   if PendingKeyEvent<>0 then
 | |
|     begin
 | |
|     GetKeyEvent:=PendingKeyEvent;
 | |
|     PendingKeyEvent:=0;
 | |
|     exit;
 | |
|     end;
 | |
|   If Assigned(CurrentKeyBoardDriver.GetKeyEvent) Then
 | |
|     GetKeyEvent:=CurrentKeyBoardDriver.GetKeyEvent()
 | |
|   else
 | |
|     GetKeyEvent:=0;
 | |
| end;
 | |
| 
 | |
| function PollKeyEvent: TKeyEvent;
 | |
| 
 | |
| begin
 | |
|   if PendingKeyEvent<>0 then
 | |
|    exit(PendingKeyEvent);
 | |
|   If Assigned(CurrentKeyBoardDriver.PollKeyEvent) Then
 | |
|     begin
 | |
|     PollKeyEvent:=CurrentKeyBoardDriver.PollKeyEvent();
 | |
|     // PollKeyEvent:=PendingKeyEvent;
 | |
|     // Must be done inside every keyboard specific
 | |
|     // PollKeyEvent procedure
 | |
|     // to avoid problems if that procedure is called directly PM
 | |
|     end
 | |
|   else
 | |
|     PollKeyEvent:=0;
 | |
| end;
 | |
| 
 | |
| Function SetKeyboardDriver (Const Driver : TKeyboardDriver) : Boolean;
 | |
| 
 | |
| begin
 | |
|   If Not KeyBoardInitialized then
 | |
|     CurrentKeyBoardDriver:=Driver;
 | |
|   SetKeyboardDriver:=Not KeyBoardInitialized;
 | |
| end;
 | |
| 
 | |
| Procedure GetKeyboardDriver (Var Driver : TKeyboardDriver);
 | |
| 
 | |
| begin
 | |
|   Driver:=CurrentKeyBoardDriver;
 | |
| end;
 | |
| 
 | |
| function PollShiftStateEvent: TKeyEvent;
 | |
| 
 | |
| begin
 | |
|   If Assigned(CurrentKeyBoardDriver.GetShiftState) then
 | |
|     PollShiftStateEvent:=CurrentKeyBoardDriver.GetShiftState() shl 16
 | |
|   else
 | |
|     PollShiftStateEvent:=0;
 | |
| end;
 | |
| 
 | |
| function DefaultTranslateKeyEventUniCode(KeyEvent: TKeyEvent): TKeyEvent;
 | |
| 
 | |
| begin
 | |
|   DefaultTranslateKeyEventUniCode:=KeyEvent;
 | |
|   ErrorCode:=errKbdNotImplemented;
 | |
| end;
 | |
| 
 | |
| 
 | |
| function TranslateKeyEventUniCode(KeyEvent: TKeyEvent): TKeyEvent;
 | |
| 
 | |
| begin
 | |
|   if Assigned(CurrentKeyBoardDriver.TranslateKeyEventUnicode) then
 | |
|     TranslateKeyEventUnicode:=CurrentKeyBoardDriver.TranslateKeyEventUnicode(KeyEvent)
 | |
|   else
 | |
|     TranslateKeyEventUnicode:=DefaultTranslateKeyEventUnicode(KeyEvent);
 | |
| end;
 | |
| 
 | |
| type
 | |
|   TTranslationEntry = packed record
 | |
|     Min, Max: Byte;
 | |
|     Offset: Word;
 | |
|   end;
 | |
| const
 | |
|   TranslationTableEntries = 12;
 | |
|   TranslationTable: array [1..TranslationTableEntries] of TTranslationEntry =
 | |
|     ((Min: $3B; Max: $44; Offset: kbdF1),   { function keys F1-F10 }
 | |
|      (Min: $54; Max: $5D; Offset: kbdF1),   { Shift fn keys F1-F10 }
 | |
|      (Min: $5E; Max: $67; Offset: kbdF1),   { Ctrl fn keys F1-F10 }
 | |
|      (Min: $68; Max: $71; Offset: kbdF1),   { Alt fn keys F1-F10 }
 | |
|      (Min: $85; Max: $86; Offset: kbdF11),  { function keys F11-F12 }
 | |
|      (Min: $87; Max: $88; Offset: kbdF11),  { Shift+function keys F11-F12 }
 | |
|      (Min: $89; Max: $8A; Offset: kbdF11),  { Ctrl+function keys F11-F12 }
 | |
|      (Min: $8B; Max: $8C; Offset: kbdF11),  { Alt+function keys F11-F12 }
 | |
|      (Min: $47; Max: $49; Offset: kbdHome), { Keypad keys kbdHome-kbdPgUp }
 | |
|      (Min: $4B; Max: $4D; Offset: kbdLeft), { Keypad keys kbdLeft-kbdRight }
 | |
|      (Min: $4F; Max: $51; Offset: kbdEnd),  { Keypad keys kbdEnd-kbdPgDn }
 | |
|      (Min: $52; Max: $53; Offset: kbdInsert));
 | |
| 
 | |
| 
 | |
| function DefaultTranslateKeyEvent(KeyEvent: TKeyEvent): TKeyEvent;
 | |
| 
 | |
| var
 | |
|   I: Integer;
 | |
|   ScanCode: Byte;
 | |
| begin
 | |
|   if KeyEvent and $03000000 = $03000000 then
 | |
|    begin
 | |
|      if KeyEvent and $000000FF <> 0 then
 | |
|       begin
 | |
|         DefaultTranslateKeyEvent := KeyEvent and $00FFFFFF;
 | |
|         exit;
 | |
|       end
 | |
|      else
 | |
|       begin
 | |
|         { This is a function key }
 | |
|         ScanCode := (KeyEvent and $0000FF00) shr 8;
 | |
|         for I := 1 to TranslationTableEntries do
 | |
|          begin
 | |
|            if (TranslationTable[I].Min <= ScanCode) and (ScanCode <= TranslationTable[I].Max) then
 | |
|             begin
 | |
|               DefaultTranslateKeyEvent := $02000000 + (KeyEvent and $00FF0000) +
 | |
|                 Byte(ScanCode - TranslationTable[I].Min) + TranslationTable[I].Offset;
 | |
|               exit;
 | |
|             end;
 | |
|          end;
 | |
|       end;
 | |
|    end;
 | |
|   DefaultTranslateKeyEvent := KeyEvent;
 | |
| end;
 | |
| 
 | |
| function TranslateKeyEvent(KeyEvent: TKeyEvent): TKeyEvent;
 | |
| 
 | |
| begin
 | |
|   if Assigned(CurrentKeyBoardDriver.TranslateKeyEvent) then
 | |
|     TranslateKeyEvent:=CurrentKeyBoardDriver.TranslateKeyEvent(KeyEvent)
 | |
|   else
 | |
|     TranslateKeyEvent:=DefaultTranslateKeyEvent(KeyEvent);
 | |
| end;
 | |
| 
 | |
| { ---------------------------------------------------------------------
 | |
|     KeyEvent to String representation section.
 | |
|   ---------------------------------------------------------------------}
 | |
| 
 | |
| Procedure AddToString (Var S : String; Const A : String);
 | |
| 
 | |
| begin
 | |
|   If Length(S)=0 then
 | |
|     S:=A
 | |
|   else
 | |
|     S:=S+' '+A;
 | |
| end;
 | |
| 
 | |
| Function IntToStr(Int : Longint) : String;
 | |
| 
 | |
| begin
 | |
|   Str(Int,IntToStr);
 | |
| end;
 | |
| 
 | |
| Function ShiftStateToString(KeyEvent : TKeyEvent; UseLeftRight : Boolean) : String;
 | |
| 
 | |
| Var
 | |
|   S : Integer;
 | |
|   T : String;
 | |
| 
 | |
| begin
 | |
|   S:=GetKeyEventShiftState(KeyEvent);
 | |
|   T:='';
 | |
|   If (S and kbShift)<>0 then
 | |
|     begin
 | |
|     if UseLeftRight then
 | |
|       case (S and kbShift) of
 | |
|         kbShift      : AddToString(T,SLeftRight[1]+' '+SAnd+' '+SLeftRight[2]);
 | |
|         kbLeftShift  : AddToString(T,SLeftRight[1]);
 | |
|         kbRightShift : AddToString(T,SLeftRight[2]);
 | |
|       end;
 | |
|     AddToString(T,SShift[1]);
 | |
|     end;
 | |
|   If (S and kbCtrl)<>0 Then
 | |
|     AddToString(T,SShift[2]);
 | |
|   If (S and kbAlt)<>0 Then
 | |
|     AddToString(T,SShift[3]);
 | |
|   ShiftStateToString:=T;
 | |
| end;
 | |
| 
 | |
| Function FunctionKeyName (KeyCode : Word) : String;
 | |
| 
 | |
| begin
 | |
|   If ((KeyCode-KbdF1)<$1F) Then
 | |
|     FunctionKeyName:='F'+IntToStr((KeyCode-KbdF1+1))
 | |
|   else
 | |
|     begin
 | |
|     If (KeyCode-kbdHome)<($2F-$1F) then
 | |
|       FunctionKeyName:=SKeyPad[(KeyCode-kbdHome)]
 | |
|     else
 | |
|       FunctionKeyName:=SUnknownFunctionKey + IntToStr(KeyCode);
 | |
|     end;
 | |
| end;
 | |
| 
 | |
| Function KeyEventToString(KeyEvent : TKeyEvent) : String;
 | |
| 
 | |
| Var
 | |
|   T : String;
 | |
| 
 | |
| begin
 | |
|   T:=ShiftStateToString(KeyEvent,False);
 | |
|   Case GetKeyEventFlags(KeyEvent) of
 | |
|     kbASCII   : AddToString(T,GetKeyEventChar(KeyEvent));
 | |
|     kbUniCode : AddToString(T,SUniCodeChar+IntToStr(GetKeyEventUniCode(Keyevent)));
 | |
|     kbFnKey   : AddToString(T,FunctionKeyName(GetKeyEventCode(KeyEvent)));
 | |
|                 // Not good, we need a GetKeyEventScanCode function !!
 | |
|     kbPhys    : AddToString(T,SScanCode+IntToStr(KeyEvent and $ffff));
 | |
|   end;
 | |
|   KeyEventToString:=T;
 | |
| end;
 | |
| 
 | |
| {
 | |
|   $Log$
 | |
|   Revision 1.8  2003-11-03 09:42:28  marco
 | |
|    * Peter's Cardinal<->Longint fixes patch
 | |
| 
 | |
|   Revision 1.7  2002/09/07 15:07:45  peter
 | |
|     * old logs removed and tabs fixed
 | |
| 
 | |
| }
 | |
| 
 | 
