keyboard.inc 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. {
  2. $Id$
  3. This file is part of the Free Pascal run time library.
  4. Copyright (c) 1999-2000 by the Free Pascal development team
  5. See the file COPYING.FPC, included in this distribution,
  6. for details about the copyright.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. **********************************************************************}
  11. var
  12. PendingKeyEvent : TKeyEvent;
  13. procedure PutKeyEvent(KeyEvent: TKeyEvent);
  14. begin
  15. PendingKeyEvent := KeyEvent;
  16. end;
  17. function GetKeyEventFlags(KeyEvent: TKeyEvent): Byte;
  18. begin
  19. GetKeyEventFlags := (KeyEvent and $FF000000) shr 24;
  20. end;
  21. function GetKeyEventChar(KeyEvent: TKeyEvent): Char;
  22. begin
  23. if KeyEvent and $03000000 = $00000000 then
  24. GetKeyEventChar := Chr(KeyEvent and $000000FF)
  25. else
  26. GetKeyEventChar := #0;
  27. end;
  28. function GetKeyEventUniCode(KeyEvent: TKeyEvent): Word;
  29. begin
  30. if KeyEvent and $03000000 = $01000000 then
  31. GetKeyEventUniCode := KeyEvent and $0000FFFF
  32. else
  33. GetKeyEventUniCode := 0;
  34. end;
  35. function GetKeyEventCode(KeyEvent: TKeyEvent): Word;
  36. begin
  37. GetKeyEventCode := KeyEvent and $0000FFFF
  38. end;
  39. function GetKeyEventShiftState(KeyEvent: TKeyEvent): Byte;
  40. begin
  41. GetKeyEventShiftState := (KeyEvent and $00FF0000) shr 16;
  42. end;
  43. function IsFunctionKey(KeyEvent: TKeyEvent): Boolean;
  44. begin
  45. IsFunctionKey := KeyEvent and $03000000 = $02000000;
  46. end;
  47. Var
  48. KeyBoardInitialized : Boolean;
  49. CurrentKeyboardDriver : TKeyboardDriver;
  50. procedure InitKeyboard;
  51. begin
  52. If Not KeyboardInitialized then
  53. begin
  54. If Assigned(CurrentKeyBoardDriver.InitDriver) Then
  55. CurrentKeyBoardDriver.InitDriver();
  56. KeyboardInitialized:=True;
  57. end;
  58. end;
  59. procedure DoneKeyboard;
  60. begin
  61. If KeyboardInitialized then
  62. begin
  63. If Assigned(CurrentKeyBoardDriver.DoneDriver) Then
  64. CurrentKeyBoardDriver.DoneDriver();
  65. KeyboardInitialized:=False;
  66. end;
  67. end;
  68. function GetKeyEvent: TKeyEvent;
  69. begin
  70. if PendingKeyEvent<>0 then
  71. begin
  72. GetKeyEvent:=PendingKeyEvent;
  73. PendingKeyEvent:=0;
  74. exit;
  75. end;
  76. If Assigned(CurrentKeyBoardDriver.GetKeyEvent) Then
  77. GetKeyEvent:=CurrentKeyBoardDriver.GetKeyEvent()
  78. else
  79. GetKeyEvent:=0;
  80. end;
  81. function PollKeyEvent: TKeyEvent;
  82. begin
  83. if PendingKeyEvent<>0 then
  84. exit(PendingKeyEvent);
  85. If Assigned(CurrentKeyBoardDriver.PollKeyEvent) Then
  86. begin
  87. PollKeyEvent:=CurrentKeyBoardDriver.PollKeyEvent();
  88. // PollKeyEvent:=PendingKeyEvent;
  89. // Must be done inside every keyboard specific
  90. // PollKeyEvent procedure
  91. // to avoid problems if that procedure is called directly PM
  92. end
  93. else
  94. PollKeyEvent:=0;
  95. end;
  96. Function SetKeyboardDriver (Const Driver : TKeyboardDriver) : Boolean;
  97. begin
  98. If Not KeyBoardInitialized then
  99. CurrentKeyBoardDriver:=Driver;
  100. SetKeyboardDriver:=Not KeyBoardInitialized;
  101. end;
  102. Procedure GetKeyboardDriver (Var Driver : TKeyboardDriver);
  103. begin
  104. Driver:=CurrentKeyBoardDriver;
  105. end;
  106. function PollShiftStateEvent: TKeyEvent;
  107. begin
  108. If Assigned(CurrentKeyBoardDriver.GetShiftState) then
  109. PollShiftStateEvent:=CurrentKeyBoardDriver.GetShiftState() shl 16
  110. else
  111. PollShiftStateEvent:=0;
  112. end;
  113. function DefaultTranslateKeyEventUniCode(KeyEvent: TKeyEvent): TKeyEvent;
  114. begin
  115. DefaultTranslateKeyEventUniCode:=KeyEvent;
  116. ErrorCode:=errKbdNotImplemented;
  117. end;
  118. function TranslateKeyEventUniCode(KeyEvent: TKeyEvent): TKeyEvent;
  119. begin
  120. if Assigned(CurrentKeyBoardDriver.TranslateKeyEventUnicode) then
  121. TranslateKeyEventUnicode:=CurrentKeyBoardDriver.TranslateKeyEventUnicode(KeyEvent)
  122. else
  123. TranslateKeyEventUnicode:=DefaultTranslateKeyEventUnicode(KeyEvent);
  124. end;
  125. type
  126. TTranslationEntry = packed record
  127. Min, Max: Byte;
  128. Offset: Word;
  129. end;
  130. const
  131. TranslationTableEntries = 12;
  132. TranslationTable: array [1..TranslationTableEntries] of TTranslationEntry =
  133. ((Min: $3B; Max: $44; Offset: kbdF1), { function keys F1-F10 }
  134. (Min: $54; Max: $5D; Offset: kbdF1), { Shift fn keys F1-F10 }
  135. (Min: $5E; Max: $67; Offset: kbdF1), { Ctrl fn keys F1-F10 }
  136. (Min: $68; Max: $71; Offset: kbdF1), { Alt fn keys F1-F10 }
  137. (Min: $85; Max: $86; Offset: kbdF11), { function keys F11-F12 }
  138. (Min: $87; Max: $88; Offset: kbdF11), { Shift+function keys F11-F12 }
  139. (Min: $89; Max: $8A; Offset: kbdF11), { Ctrl+function keys F11-F12 }
  140. (Min: $8B; Max: $8C; Offset: kbdF11), { Alt+function keys F11-F12 }
  141. (Min: $47; Max: $49; Offset: kbdHome), { Keypad keys kbdHome-kbdPgUp }
  142. (Min: $4B; Max: $4D; Offset: kbdLeft), { Keypad keys kbdLeft-kbdRight }
  143. (Min: $4F; Max: $51; Offset: kbdEnd), { Keypad keys kbdEnd-kbdPgDn }
  144. (Min: $52; Max: $53; Offset: kbdInsert));
  145. function DefaultTranslateKeyEvent(KeyEvent: TKeyEvent): TKeyEvent;
  146. var
  147. I: Integer;
  148. ScanCode: Byte;
  149. begin
  150. if KeyEvent and $03000000 = $03000000 then
  151. begin
  152. if KeyEvent and $000000FF <> 0 then
  153. begin
  154. DefaultTranslateKeyEvent := KeyEvent and $00FFFFFF;
  155. exit;
  156. end
  157. else
  158. begin
  159. { This is a function key }
  160. ScanCode := (KeyEvent and $0000FF00) shr 8;
  161. for I := 1 to TranslationTableEntries do
  162. begin
  163. if (TranslationTable[I].Min <= ScanCode) and (ScanCode <= TranslationTable[I].Max) then
  164. begin
  165. DefaultTranslateKeyEvent := $02000000 + (KeyEvent and $00FF0000) +
  166. Byte(ScanCode - TranslationTable[I].Min) + TranslationTable[I].Offset;
  167. exit;
  168. end;
  169. end;
  170. end;
  171. end;
  172. DefaultTranslateKeyEvent := KeyEvent;
  173. end;
  174. function TranslateKeyEvent(KeyEvent: TKeyEvent): TKeyEvent;
  175. begin
  176. if Assigned(CurrentKeyBoardDriver.TranslateKeyEvent) then
  177. TranslateKeyEvent:=CurrentKeyBoardDriver.TranslateKeyEvent(KeyEvent)
  178. else
  179. TranslateKeyEvent:=DefaultTranslateKeyEvent(KeyEvent);
  180. end;
  181. { ---------------------------------------------------------------------
  182. KeyEvent to String representation section.
  183. ---------------------------------------------------------------------}
  184. Procedure AddToString (Var S : String; Const A : String);
  185. begin
  186. If Length(S)=0 then
  187. S:=A
  188. else
  189. S:=S+' '+A;
  190. end;
  191. Function IntToStr(Int : Longint) : String;
  192. begin
  193. Str(Int,IntToStr);
  194. end;
  195. Function ShiftStateToString(KeyEvent : TKeyEvent; UseLeftRight : Boolean) : String;
  196. Var
  197. S : Integer;
  198. T : String;
  199. begin
  200. S:=GetKeyEventShiftState(KeyEvent);
  201. T:='';
  202. If (S and kbShift)<>0 then
  203. begin
  204. if UseLeftRight then
  205. case (S and kbShift) of
  206. kbShift : AddToString(T,SLeftRight[1]+' '+SAnd+' '+SLeftRight[2]);
  207. kbLeftShift : AddToString(T,SLeftRight[1]);
  208. kbRightShift : AddToString(T,SLeftRight[2]);
  209. end;
  210. AddToString(T,SShift[1]);
  211. end;
  212. If (S and kbCtrl)<>0 Then
  213. AddToString(T,SShift[2]);
  214. If (S and kbAlt)<>0 Then
  215. AddToString(T,SShift[3]);
  216. ShiftStateToString:=T;
  217. end;
  218. Function FunctionKeyName (KeyCode : Word) : String;
  219. begin
  220. If ((KeyCode-KbdF1)<$1F) Then
  221. FunctionKeyName:='F'+IntToStr((KeyCode-KbdF1+1))
  222. else
  223. begin
  224. If (KeyCode-kbdHome)<($2F-$1F) then
  225. FunctionKeyName:=SKeyPad[(KeyCode-kbdHome)]
  226. else
  227. FunctionKeyName:=SUnknownFunctionKey + IntToStr(KeyCode);
  228. end;
  229. end;
  230. Function KeyEventToString(KeyEvent : TKeyEvent) : String;
  231. Var
  232. T : String;
  233. begin
  234. T:=ShiftStateToString(KeyEvent,False);
  235. Case GetKeyEventFlags(KeyEvent) of
  236. kbASCII : AddToString(T,GetKeyEventChar(KeyEvent));
  237. kbUniCode : AddToString(T,SUniCodeChar+IntToStr(GetKeyEventUniCode(Keyevent)));
  238. kbFnKey : AddToString(T,FunctionKeyName(GetKeyEventCode(KeyEvent)));
  239. // Not good, we need a GetKeyEventScanCode function !!
  240. kbPhys : AddToString(T,SScanCode+IntToStr(KeyEvent and $ffff));
  241. end;
  242. KeyEventToString:=T;
  243. end;
  244. {
  245. $Log$
  246. Revision 1.8 2003-11-03 09:42:28 marco
  247. * Peter's Cardinal<->Longint fixes patch
  248. Revision 1.7 2002/09/07 15:07:45 peter
  249. * old logs removed and tabs fixed
  250. }