From 08e5d21da89d3af36f7dfbc54d48d25d10391548 Mon Sep 17 00:00:00 2001 From: florian Date: Fri, 6 Apr 2007 20:38:24 +0000 Subject: [PATCH] + keypressed for windows, resolves #8637 git-svn-id: trunk@7064 - --- rtl/win/keyboard.pp | 180 +++++++++++++++++++++++--------------------- 1 file changed, 93 insertions(+), 87 deletions(-) diff --git a/rtl/win/keyboard.pp b/rtl/win/keyboard.pp index 7b3d398086..24f7929714 100644 --- a/rtl/win/keyboard.pp +++ b/rtl/win/keyboard.pp @@ -25,6 +25,8 @@ var {$i keybrdh.inc} +function KeyPressed:Boolean; + implementation { WARNING: Keyboard-Drivers (i.e. german) will only work under WinNT. @@ -59,6 +61,10 @@ var HasAltGr : Boolean = false; +function KeyPressed:Boolean; +begin + KeyPressed:=PollKeyEvent<>0; +end; procedure incqueueindex(var l : longint); @@ -145,95 +151,95 @@ var altc : char; addThis: boolean; begin - with ir.Event.KeyEvent do - begin - { key up events are ignored (except alt) } - if bKeyDown then - begin - EnterCriticalSection (lockVar); - for i:=1 to wRepeatCount do - begin - addThis := true; - if (dwControlKeyState and LEFT_ALT_PRESSED <> 0) or - (dwControlKeyState and RIGHT_ALT_PRESSED <> 0) then {alt pressed} - if ((wVirtualKeyCode >= $60) and (wVirtualKeyCode <= $69)) or - ((dwControlKeyState and ENHANCED_KEY = 0) and - (wVirtualKeyCode in [$C{VK_CLEAR generated by keypad 5}, - $21 {VK_PRIOR (PgUp) 9}, - $22 {VK_NEXT (PgDown) 3}, - $23 {VK_END 1}, - $24 {VK_HOME 7}, - $25 {VK_LEFT 4}, - $26 {VK_UP 8}, - $27 {VK_RIGHT 6}, - $28 {VK_DOWN 2}, - $2D {VK_INSERT 0}])) then {0..9 on NumBlock} - begin - if length (altNumBuffer) = 3 then - delete (altNumBuffer,1,1); - case wVirtualKeyCode of - $60..$69 : altc:=char (wVirtualKeyCode-48); - $c : altc:='5'; - $21 : altc:='9'; - $22 : altc:='3'; - $23 : altc:='1'; - $24 : altc:='7'; - $25 : altc:='4'; - $26 : altc:='8'; - $27 : altc:='6'; - $28 : altc:='2'; - $2D : altc:='0'; - end; - altNumBuffer := altNumBuffer + altc; - altNumActive := true; - addThis := false; - end else - begin - altNumActive := false; - altNumBuffer := ''; - end; - if addThis then - begin - keyboardeventqueue[nextfreekeyevent]:= - ir.Event.KeyEvent; - incqueueindex(nextfreekeyevent); - end; - end; - - lastShiftState := transShiftState (dwControlKeyState); {save it for PollShiftStateEvent} - SetEvent (newKeyEvent); {event that a new key is available} - LeaveCriticalSection (lockVar); - end - else - begin - lastShiftState := transShiftState (dwControlKeyState); {save it for PollShiftStateEvent} - {for alt-number we have to look for alt-key release} - if altNumActive then + with ir.Event.KeyEvent do + begin + { key up events are ignored (except alt) } + if bKeyDown then + begin + EnterCriticalSection (lockVar); + for i:=1 to wRepeatCount do + begin + addThis := true; + if (dwControlKeyState and LEFT_ALT_PRESSED <> 0) or + (dwControlKeyState and RIGHT_ALT_PRESSED <> 0) then {alt pressed} + if ((wVirtualKeyCode >= $60) and (wVirtualKeyCode <= $69)) or + ((dwControlKeyState and ENHANCED_KEY = 0) and + (wVirtualKeyCode in [$C{VK_CLEAR generated by keypad 5}, + $21 {VK_PRIOR (PgUp) 9}, + $22 {VK_NEXT (PgDown) 3}, + $23 {VK_END 1}, + $24 {VK_HOME 7}, + $25 {VK_LEFT 4}, + $26 {VK_UP 8}, + $27 {VK_RIGHT 6}, + $28 {VK_DOWN 2}, + $2D {VK_INSERT 0}])) then {0..9 on NumBlock} begin - if (wVirtualKeyCode = $12) then {alt-released} - begin - if altNumBuffer <> '' then {numbers with alt pressed?} - begin - Val (altNumBuffer, c, i); - if (i = 0) and (c <= 255) then {valid number?} - begin {add to queue} - fillchar (ir, sizeof (ir), 0); - bKeyDown := true; - AsciiChar := char (c); - {and add to queue} - EnterCriticalSection (lockVar); - keyboardeventqueue[nextfreekeyevent]:=ir.Event.KeyEvent; - incqueueindex(nextfreekeyevent); - SetEvent (newKeyEvent); {event that a new key is available} - LeaveCriticalSection (lockVar); - end; - end; - altNumActive := false; {clear alt-buffer} - altNumBuffer := ''; - end; + if length (altNumBuffer) = 3 then + delete (altNumBuffer,1,1); + case wVirtualKeyCode of + $60..$69 : altc:=char (wVirtualKeyCode-48); + $c : altc:='5'; + $21 : altc:='9'; + $22 : altc:='3'; + $23 : altc:='1'; + $24 : altc:='7'; + $25 : altc:='4'; + $26 : altc:='8'; + $27 : altc:='6'; + $28 : altc:='2'; + $2D : altc:='0'; + end; + altNumBuffer := altNumBuffer + altc; + altNumActive := true; + addThis := false; + end else + begin + altNumActive := false; + altNumBuffer := ''; end; - end; - end; + if addThis then + begin + keyboardeventqueue[nextfreekeyevent]:= + ir.Event.KeyEvent; + incqueueindex(nextfreekeyevent); + end; + end; + + lastShiftState := transShiftState (dwControlKeyState); {save it for PollShiftStateEvent} + SetEvent (newKeyEvent); {event that a new key is available} + LeaveCriticalSection (lockVar); + end + else + begin + lastShiftState := transShiftState (dwControlKeyState); {save it for PollShiftStateEvent} + {for alt-number we have to look for alt-key release} + if altNumActive then + begin + if (wVirtualKeyCode = $12) then {alt-released} + begin + if altNumBuffer <> '' then {numbers with alt pressed?} + begin + Val (altNumBuffer, c, i); + if (i = 0) and (c <= 255) then {valid number?} + begin {add to queue} + fillchar (ir, sizeof (ir), 0); + bKeyDown := true; + AsciiChar := char (c); + {and add to queue} + EnterCriticalSection (lockVar); + keyboardeventqueue[nextfreekeyevent]:=ir.Event.KeyEvent; + incqueueindex(nextfreekeyevent); + SetEvent (newKeyEvent); {event that a new key is available} + LeaveCriticalSection (lockVar); + end; + end; + altNumActive := false; {clear alt-buffer} + altNumBuffer := ''; + end; + end; + end; + end; end; procedure CheckAltGr;