123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- {
- This file is part of the Free Pascal run time library.
- Copyright (c) 1999-2000 by Florian Klaempfl
- member of the Free Pascal development team
- Keyboard unit for OS/2
- 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.
- **********************************************************************}
- unit Keyboard;
- interface
- {$i keybrdh.inc}
- implementation
- uses
- KbdCalls, DosCalls;
- {$i keyboard.inc}
- const
- DefaultKeyboard = 0;
- Handle: word = DefaultKeyboard;
- procedure SysInitKeyboard;
- var
- K: TKbdInfo;
- begin
- if KbdGetFocus (IO_Wait, DefaultKeyboard) = No_Error then
- begin
- if KbdOpen (Handle) <> No_Error then
- Handle := DefaultKeyboard;
- KbdFlushBuffer (Handle);
- KbdFreeFocus (DefaultKeyboard);
- KbdGetFocus (IO_Wait, Handle);
- K.cb := SizeOf (K);
- KbdGetStatus (K, Handle);
- K.fsMask := $14;
- KbdSetStatus (K, Handle);
- end;
- end;
- procedure SysDoneKeyboard;
- begin
- KbdFreeFocus (Handle);
- if KbdGetFocus (IO_Wait, DefaultKeyboard) = No_Error then
- begin
- KbdClose (Handle);
- Handle := DefaultKeyboard;
- KbdFreeFocus (DefaultKeyboard);
- end;
- end;
- function SysGetKeyEvent: TKeyEvent;
- var
- K: TKbdKeyInfo;
- begin
- KbdGetFocus (IO_Wait, Handle);
- while (KbdCharIn (K, IO_NoWait, Handle) <> No_Error)
- or (K.fbStatus and $41 <> $40) do
- DosSleep (5);
- with K do
- begin
- if (byte (chChar) = $E0) and (fbStatus and 2 <> 0) then chChar := #0;
- SysGetKeyEvent := cardinal ($0300 or fsState and $F) shl 16 or
- cardinal (byte (chScan)) shl 8 or byte (chChar);
- end;
- end;
- function SysPollKeyEvent: TKeyEvent;
- var
- K: TKbdKeyInfo;
- Key : TKeyEvent;
- begin
- Key:=0;
- KbdGetFocus (IO_NoWait, Handle);
- if (KbdPeek (K, Handle) <> No_Error) or
- (K.fbStatus and $40 = 0) then
- FillChar (K, SizeOf (K), 0)
- else
- with K do
- begin
- if (byte (chChar) = $E0) and (fbStatus and 2 <> 0) then
- chChar := #0;
- Key:= cardinal ($0300 or fsState and $F) shl 16 or
- cardinal (byte (chScan)) shl 8 or byte (chChar);
- end;
- if (Key and $FFFF)=0 then
- Key := 0;
- SysPollKeyEvent:=Key;
- end;
- function SysGetShiftState: Byte;
- var
- K: TKbdInfo;
- begin
- KbdGetFocus (IO_NoWait, Handle);
- K.cb := SizeOf (K);
- if KbdGetStatus (K, Handle) = No_Error then
- SysGetShiftState := (K.fsState and $F)
- else
- SysGetShiftState := 0;
- end;
- Const
- SysKeyboardDriver : TKeyboardDriver = (
- InitDriver : @SysInitKeyBoard;
- DoneDriver : @SysDoneKeyBoard;
- GetKeyevent : @SysGetKeyEvent;
- PollKeyEvent : @SysPollKeyEvent;
- GetShiftState : @SysGetShiftState;
- TranslateKeyEvent : Nil;
- TranslateKeyEventUnicode : Nil;
- );
- begin
- SetKeyBoardDriver(SysKeyBoardDriver);
- SetKbdCtrlBreakHandler;
- end.
|