keyboard.pp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. {
  2. $Id$
  3. This file is part of the Free Pascal run time library.
  4. Copyright (c) 1999-2001 by the Free Pascal development team.
  5. Keyboard unit for netware
  6. See the file COPYING.FPC, included in this distribution,
  7. for details about the copyright.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. **********************************************************************}
  12. { 2001/04/16 armin: first version for netware }
  13. unit Keyboard;
  14. interface
  15. {$i keybrdh.inc}
  16. implementation
  17. {$i keyboard.inc}
  18. {$i nwsys.inc}
  19. procedure InitKeyboard;
  20. begin
  21. PendingKeyEvent := 0;
  22. end;
  23. procedure DoneKeyboard;
  24. begin
  25. end;
  26. function GetKeyEvent: TKeyEvent;
  27. var T : TKeyEvent;
  28. begin
  29. if PendingKeyEvent<>0 then
  30. begin
  31. GetKeyEvent:=PendingKeyEvent;
  32. PendingKeyEvent:=0;
  33. exit;
  34. end;
  35. T := byte(_getch);
  36. if T = 0 then
  37. T := word(_getch) shl 8;
  38. GetKeyEvent := $03000000 OR T;
  39. end;
  40. function PollKeyEvent: TKeyEvent;
  41. begin
  42. if PendingKeyEvent<>0 then
  43. exit(PendingKeyEvent);
  44. if _kbhit <> 0 then
  45. begin
  46. PendingKeyEvent := byte(_getch);
  47. if PendingKeyEvent = 0 then
  48. PendingKeyEvent := word(_getch) shl 8;
  49. PendingKeyEvent := PendingKeyEvent OR $03000000;
  50. PollKeyEvent := PendingKeyEvent;
  51. end else
  52. PollKeyEvent := 0;
  53. end;
  54. function PollShiftStateEvent: TKeyEvent;
  55. begin
  56. PollShiftStateEvent:=0;
  57. end;
  58. { Function key translation }
  59. type
  60. TTranslationEntry = packed record
  61. Min, Max: Byte;
  62. Offset: Word;
  63. end;
  64. const
  65. TranslationTableEntries = 12;
  66. TranslationTable: array [1..TranslationTableEntries] of TTranslationEntry =
  67. ((Min: $3B; Max: $44; Offset: kbdF1), { function keys F1-F10 }
  68. (Min: $54; Max: $5D; Offset: kbdF1), { Shift fn keys F1-F10 }
  69. (Min: $5E; Max: $67; Offset: kbdF1), { Ctrl fn keys F1-F10 }
  70. (Min: $68; Max: $71; Offset: kbdF1), { Alt fn keys F1-F10 }
  71. (Min: $85; Max: $86; Offset: kbdF11), { function keys F11-F12 }
  72. (Min: $87; Max: $88; Offset: kbdF11), { Shift+function keys F11-F12 }
  73. (Min: $89; Max: $8A; Offset: kbdF11), { Ctrl+function keys F11-F12 }
  74. (Min: $8B; Max: $8C; Offset: kbdF11), { Alt+function keys F11-F12 }
  75. (Min: 71; Max: 73; Offset: kbdHome), { Keypad keys kbdHome-kbdPgUp }
  76. (Min: 75; Max: 77; Offset: kbdLeft), { Keypad keys kbdLeft-kbdRight }
  77. (Min: 79; Max: 81; Offset: kbdEnd), { Keypad keys kbdEnd-kbdPgDn }
  78. (Min: $52; Max: $53; Offset: kbdInsert));
  79. function TranslateKeyEvent(KeyEvent: TKeyEvent): TKeyEvent;
  80. var
  81. I: Integer;
  82. ScanCode: Byte;
  83. begin
  84. if KeyEvent and $03000000 = $03000000 then
  85. begin
  86. if KeyEvent and $000000FF <> 0 then
  87. begin
  88. TranslateKeyEvent := KeyEvent and $00FFFFFF;
  89. exit;
  90. end
  91. else
  92. begin
  93. { This is a function key }
  94. ScanCode := (KeyEvent and $0000FF00) shr 8;
  95. for I := 1 to TranslationTableEntries do
  96. begin
  97. if (TranslationTable[I].Min <= ScanCode) and (ScanCode <= TranslationTable[I].Max) then
  98. begin
  99. TranslateKeyEvent := $02000000 + (KeyEvent and $00FF0000) +
  100. (ScanCode - TranslationTable[I].Min) + TranslationTable[I].Offset;
  101. exit;
  102. end;
  103. end;
  104. end;
  105. end;
  106. TranslateKeyEvent := KeyEvent;
  107. end;
  108. function TranslateKeyEventUniCode(KeyEvent: TKeyEvent): TKeyEvent;
  109. begin
  110. TranslateKeyEventUniCode := KeyEvent;
  111. ErrorCode:=errKbdNotImplemented;
  112. end;
  113. end.