Browse Source

+ added functions GetEnhancedKeyEvent and PollEnhancedKeyEvent and implemented
default fallbacks, which revert to calling GetKeyEvent and PollKeyEvent for
drivers that don't support the enhanced functions

git-svn-id: branches/unicodekvm@40086 -

nickysn 6 years ago
parent
commit
b6f0fa055f

+ 47 - 0
packages/rtl-console/src/inc/keyboard.inc

@@ -154,6 +154,53 @@ begin
     TranslateKeyEventUnicode:=DefaultTranslateKeyEventUnicode(KeyEvent);
     TranslateKeyEventUnicode:=DefaultTranslateKeyEventUnicode(KeyEvent);
 end;
 end;
 
 
+function ConvertToEnhancedKeyEvent(KeyEvent: TKeyEvent): TEnhancedKeyEvent;
+begin
+  FillChar(ConvertToEnhancedKeyEvent,SizeOf(ConvertToEnhancedKeyEvent),0);
+  if KeyEvent=0 then
+    exit;
+  ConvertToEnhancedKeyEvent.ShiftState:=GetKeyEventShiftState(KeyEvent);
+  case GetKeyEventFlags(KeyEvent) of
+    kbASCII:
+      ConvertToEnhancedKeyEvent.AsciiChar:=GetKeyEventChar(KeyEvent);
+    kbUniCode:
+      ConvertToEnhancedKeyEvent.UnicodeChar:=WideChar(GetKeyEventUniCode(KeyEvent));
+    kbFnKey:
+      ConvertToEnhancedKeyEvent.VirtualKeyCode:=GetKeyEventCode(KeyEvent);
+    kbPhys:
+      // Not good, we need a GetKeyEventScanCode function !!
+      ConvertToEnhancedKeyEvent.VirtualScanCode:=KeyEvent and $ffff;
+  end;
+  { todo: set ConvertToEnhancedKeyEvent.Flags }
+  { todo: attempt to set AsciiChar and WideChar if they are missing }
+end;
+
+function DefaultGetEnhancedKeyEvent: TEnhancedKeyEvent;
+begin
+  DefaultGetEnhancedKeyEvent:=ConvertToEnhancedKeyEvent(GetKeyEvent);
+end;
+
+function GetEnhancedKeyEvent: TEnhancedKeyEvent;
+begin
+  if Assigned(CurrentKeyBoardDriver.GetEnhancedKeyEvent) then
+    GetEnhancedKeyEvent:=CurrentKeyBoardDriver.GetEnhancedKeyEvent()
+  else
+    GetEnhancedKeyEvent:=DefaultGetEnhancedKeyEvent;
+end;
+
+function DefaultPollEnhancedKeyEvent: TEnhancedKeyEvent;
+begin
+  DefaultPollEnhancedKeyEvent:=ConvertToEnhancedKeyEvent(PollKeyEvent);
+end;
+
+function PollEnhancedKeyEvent: TEnhancedKeyEvent;
+begin
+  if Assigned(CurrentKeyBoardDriver.PollEnhancedKeyEvent) then
+    PollEnhancedKeyEvent:=CurrentKeyBoardDriver.PollEnhancedKeyEvent()
+  else
+    PollEnhancedKeyEvent:=DefaultPollEnhancedKeyEvent;
+end;
+
 type
 type
   TTranslationEntry = packed record
   TTranslationEntry = packed record
     Min, Max: Byte;
     Min, Max: Byte;

+ 6 - 0
packages/rtl-console/src/inc/keybrdh.inc

@@ -210,3 +210,9 @@ Function FunctionKeyName (KeyCode : Word) : String;
 Function KeyEventToString(KeyEvent : TKeyEvent) : String;
 Function KeyEventToString(KeyEvent : TKeyEvent) : String;
 { Returns a string representation of the pressed key }
 { Returns a string representation of the pressed key }
 
 
+function GetEnhancedKeyEvent: TEnhancedKeyEvent;
+{ Returns the last keyevent, and waits for one if not available }
+
+function PollEnhancedKeyEvent: TEnhancedKeyEvent;
+{ Checks if a keyevent is available, and returns it if one is found. If no
+  event is pending, it returns 0 }