Improvements for Textmode ide
1) current ide (of fpc 3.3.1) has problems with second compilations. Resolve issue with this patch tdef_nil_for_ide_fpc331.patch
2) add missing xterm escape string sequences keyboard_add_escape_keys_unix_fpc331.patch
3) fpc 3.2.3  add missing xterm escape string sequences keyboard_add_escape_keys_unix_fixes32.patch
Also make sure shift state of escaped keys is transferred to TKeyEvent.
4) kb_scancode_updates.patch safe to apply after keyboard_add_escape_keys_unix_xxx.patch
Some scancode have been bogus for a good reason. I suggest to fix some of them, and be more consistent among all platforms.
Patched file keyscan.inc is in active use only by unix/keyboard.pp
Drivers unit in FV, have internal fix ups, it's fine to make those changes.
5) make Ctrl+Enter shortcut key possible in unix/linux xterm: ctrl_enter_xterm_unix_keyboard.diff
patch is as good for fpc 3.3.1 as for fixes 3.2
Apply patch and make entry in xterm configuration file .Xresources

xterm*VT100.Translations: #override \
    Ctrl <KeyPress> Return: string(0x0a)

 
diff -ru a/packages/rtl-console/src/inc/keyscan.inc b/packages/rtl-console/src/inc/keyscan.inc
--- a/packages/rtl-console/src/inc/keyscan.inc	2024-05-09 00:13:05.000000000 +0000
+++ b/packages/rtl-console/src/inc/keyscan.inc	2024-05-28 07:03:45.682436000 +0000
@@ -4,12 +4,8 @@
    kbAltEsc      = $01;  {Alt+Esc = scancode 01, ascii code 0.}
    kbEsc         = $01;  {Esc     = scancode 01, ascii code 27.}
    kbAltSpace    = $02;
-   kbCtrlIns     = $04;
-   kbShiftIns    = $05;
-   kbCtrlDel     = $06;
-   kbShiftDel    = $07;
-   kbAltBack     = $08;
    kbAltShiftBack= $09;
+   kbAltBack     = $0E;
    kbShiftTab    = $0F;
    kbAltQ        = $10;
    kbAltW        = $11;
@@ -68,7 +64,9 @@
    kbDown        = $50;
    kbPgDn        = $51;
    kbIns         = $52;
+   kbShiftIns    = $52;  { Differs from kbIns only by shift state }
    kbDel         = $53;
+   kbShiftDel    = $53;  { Differs from kbDel only by shift state }
    kbShiftF1     = $54;
    kbShiftF2     = $55;
    kbShiftF3     = $56;
@@ -131,6 +129,8 @@
    kbCtrlCenter  = $8F;
    kbCtrlGreyPlus= $90;
    kbCtrlDown    = $91;
+   kbCtrlIns     = $92;
+   kbCtrlDel     = $93;
    kbCtrlTab     = $94;
    kbAltHome     = $97;
    kbAltUp       = $98;
diff -ru a/packages/rtl-console/src/unix/keyboard.pp b/packages/rtl-console/src/unix/keyboard.pp
--- a/packages/rtl-console/src/unix/keyboard.pp	2023-01-19 15:42:50.438798000 +0000
+++ b/packages/rtl-console/src/unix/keyboard.pp	2024-05-27 23:54:54.113784131 +0000
@@ -39,6 +39,7 @@
     char : byte;
     ScanValue : byte;
     CharValue : byte;
+    ShiftValue : byte;
     SpecialHandler : Tprocedure;
   end;
 
@@ -76,7 +77,7 @@
 const
   KeyBufferSize = 20;
 var
-  KeyBuffer : Array[0..KeyBufferSize-1] of Char;
+  KeyBuffer : Array[0..KeyBufferSize-1] of record ch: Char; sh :byte end;
   KeyPut,
   KeySend   : longint;
 
@@ -92,18 +93,18 @@
 {$i keyscan.inc}
 
 {Some internal only scancodes}
-const KbShiftUp    = $f0;
-      KbShiftLeft  = $f1;
-      KbShiftRight = $f2;
-      KbShiftDown  = $f3;
-      KbShiftHome  = $f4;
-      KbShiftEnd   = $f5;
-      KbCtrlShiftUp    = $f6;
-      KbCtrlShiftDown  = $f7;
-      KbCtrlShiftRight = $f8;
-      KbCtrlShiftLeft  = $f9;
-      KbCtrlShiftHome  = $fa;
-      KbCtrlShiftEnd   = $fb;
+const kbAltCenter = kbCenter;
+      kbShiftCenter = kbCenter;
+
+      KbShiftUp    = KbUp;
+      KbShiftLeft  = KbLeft;
+      KbShiftRight = KbRight;
+      KbShiftDown  = KbDown;
+      KbShiftHome  = KbHome;
+      KbShiftEnd   = kbEnd;
+      kbShiftPgUp = kbPgUp;
+      kbShiftPgDn = kbPgDn;
+
 
       double_esc_hack_enabled : boolean = false;
 
@@ -412,7 +413,7 @@
     InTail:=0;
 end;
 
-procedure PushKey(Ch:char);
+procedure PushKey(Ch:char;aShift:byte);
 var
   Tmp : Longint;
 begin
@@ -421,17 +422,22 @@
   If KeyPut>=KeyBufferSize Then
    KeyPut:=0;
   If KeyPut<>KeySend Then
-   KeyBuffer[Tmp]:=Ch
+  begin
+   KeyBuffer[Tmp].ch:=Ch;
+   KeyBuffer[Tmp].sh:=aShift;
+  end
   Else
    KeyPut:=Tmp;
 End;
 
 
-function PopKey:char;
+function PopKey(var aShift:byte):char;
 begin
+  aShift:=0;
   If KeyPut<>KeySend Then
    begin
-     PopKey:=KeyBuffer[KeySend];
+     PopKey:=KeyBuffer[KeySend].ch;
+     aShift:=KeyBuffer[KeySend].sh;
      Inc(KeySend);
      If KeySend>=KeyBufferSize Then
       KeySend:=0;
@@ -441,10 +447,10 @@
 End;
 
 
-procedure PushExt(b:byte);
+procedure PushExt(b:byte;sh:byte);
 begin
-  PushKey(#0);
-  PushKey(chr(b));
+  PushKey(#0,sh);
+  PushKey(chr(b),0);
 end;
 
 
@@ -742,7 +748,7 @@
     Pa^.Child:=newPtree;
 end;
 
-function DoAddSequence(const St : String; AChar,AScan :byte) : PTreeElement;
+function DoAddSequence(const St : String; AChar,AScan, AShift :byte) : PTreeElement;
 var
   CurPTree,NPT : PTreeElement;
   c : byte;
@@ -803,9 +809,12 @@
             Writeln(system.stderr,'Scan was ',ScanValue,' now ',AScan);
           if (CharValue<>AChar) then
             Writeln(system.stderr,'Char was ',chr(CharValue),' now ',chr(AChar));
+          if (ShiftValue<>AShift) then
+            Writeln(system.stderr,'Char was ',chr(ShiftValue),' now ',chr(AShift));
 {$endif DEBUG}
           ScanValue:=AScan;
           CharValue:=AChar;
+          ShiftValue:=AShift;
         end;
     end
   else with CurPTree^ do
@@ -813,6 +822,7 @@
       CanBeTerminal:=True;
       ScanValue:=AScan;
       CharValue:=AChar;
+      ShiftValue:=AShift;
     end;
   DoAddSequence:=CurPTree;
 end;
@@ -820,7 +830,7 @@
 
 procedure AddSequence(const St : String; AChar,AScan :byte);inline;
 begin
-  DoAddSequence(St,AChar,AScan);
+  DoAddSequence(St,AChar,AScan,0);
 end;
 
 { Returns the Child that as c as char if it exists }
@@ -841,7 +851,7 @@
 var
   NPT : PTreeElement;
 begin
-  NPT:=DoAddSequence(St,0,0);
+  NPT:=DoAddSequence(St,0,0,0);
   NPT^.SpecialHandler:=Proc;
   AddSpecialSequence:=NPT;
 end;
@@ -884,330 +894,442 @@
 
 type  key_sequence=packed record
         char,scan:byte;
+        shift:byte;
         st:string[7];
       end;
 
-const key_sequences:array[0..297] of key_sequence=(
-       (char:0;scan:kbAltA;st:#27'A'),
-       (char:0;scan:kbAltA;st:#27'a'),
-       (char:0;scan:kbAltB;st:#27'B'),
-       (char:0;scan:kbAltB;st:#27'b'),
-       (char:0;scan:kbAltC;st:#27'C'),
-       (char:0;scan:kbAltC;st:#27'c'),
-       (char:0;scan:kbAltD;st:#27'D'),
-       (char:0;scan:kbAltD;st:#27'd'),
-       (char:0;scan:kbAltE;st:#27'E'),
-       (char:0;scan:kbAltE;st:#27'e'),
-       (char:0;scan:kbAltF;st:#27'F'),
-       (char:0;scan:kbAltF;st:#27'f'),
-       (char:0;scan:kbAltG;st:#27'G'),
-       (char:0;scan:kbAltG;st:#27'g'),
-       (char:0;scan:kbAltH;st:#27'H'),
-       (char:0;scan:kbAltH;st:#27'h'),
-       (char:0;scan:kbAltI;st:#27'I'),
-       (char:0;scan:kbAltI;st:#27'i'),
-       (char:0;scan:kbAltJ;st:#27'J'),
-       (char:0;scan:kbAltJ;st:#27'j'),
-       (char:0;scan:kbAltK;st:#27'K'),
-       (char:0;scan:kbAltK;st:#27'k'),
-       (char:0;scan:kbAltL;st:#27'L'),
-       (char:0;scan:kbAltL;st:#27'l'),
-       (char:0;scan:kbAltM;st:#27'M'),
-       (char:0;scan:kbAltM;st:#27'm'),
-       (char:0;scan:kbAltN;st:#27'N'),
-       (char:0;scan:kbAltN;st:#27'n'),
-       (char:0;scan:kbAltO;st:#27'O'),
-       (char:0;scan:kbAltO;st:#27'o'),
-       (char:0;scan:kbAltP;st:#27'P'),
-       (char:0;scan:kbAltP;st:#27'p'),
-       (char:0;scan:kbAltQ;st:#27'Q'),
-       (char:0;scan:kbAltQ;st:#27'q'),
-       (char:0;scan:kbAltR;st:#27'R'),
-       (char:0;scan:kbAltR;st:#27'r'),
-       (char:0;scan:kbAltS;st:#27'S'),
-       (char:0;scan:kbAltS;st:#27's'),
-       (char:0;scan:kbAltT;st:#27'T'),
-       (char:0;scan:kbAltT;st:#27't'),
-       (char:0;scan:kbAltU;st:#27'U'),
-       (char:0;scan:kbAltU;st:#27'u'),
-       (char:0;scan:kbAltV;st:#27'V'),
-       (char:0;scan:kbAltV;st:#27'v'),
-       (char:0;scan:kbAltW;st:#27'W'),
-       (char:0;scan:kbAltW;st:#27'w'),
-       (char:0;scan:kbAltX;st:#27'X'),
-       (char:0;scan:kbAltX;st:#27'x'),
-       (char:0;scan:kbAltY;st:#27'Y'),
-       (char:0;scan:kbAltY;st:#27'y'),
-       (char:0;scan:kbAltZ;st:#27'Z'),
-       (char:0;scan:kbAltZ;st:#27'z'),
-       (char:0;scan:kbAltMinus;st:#27'-'),
-       (char:0;scan:kbAltEqual;st:#27'='),
-       (char:0;scan:kbAlt0;st:#27'0'),
-       (char:0;scan:kbAlt1;st:#27'1'),
-       (char:0;scan:kbAlt2;st:#27'2'),
-       (char:0;scan:kbAlt3;st:#27'3'),
-       (char:0;scan:kbAlt4;st:#27'4'),
-       (char:0;scan:kbAlt5;st:#27'5'),
-       (char:0;scan:kbAlt6;st:#27'6'),
-       (char:0;scan:kbAlt7;st:#27'7'),
-       (char:0;scan:kbAlt8;st:#27'8'),
-       (char:0;scan:kbAlt9;st:#27'9'),
-
-       (char:0;scan:kbF1;st:#27'[[A'),           {linux,konsole,xterm}
-       (char:0;scan:kbF2;st:#27'[[B'),           {linux,konsole,xterm}
-       (char:0;scan:kbF3;st:#27'[[C'),           {linux,konsole,xterm}
-       (char:0;scan:kbF4;st:#27'[[D'),           {linux,konsole,xterm}
-       (char:0;scan:kbF5;st:#27'[[E'),           {linux,konsole}
-       (char:0;scan:kbF1;st:#27'[11~'),          {Eterm,rxvt}
-       (char:0;scan:kbF2;st:#27'[12~'),          {Eterm,rxvt}
-       (char:0;scan:kbF3;st:#27'[13~'),          {Eterm,rxvt}
-       (char:0;scan:kbF4;st:#27'[14~'),          {Eterm,rxvt}
-       (char:0;scan:kbF5;st:#27'[15~'),          {xterm,Eterm,gnome,rxvt}
-       (char:0;scan:kbF6;st:#27'[17~'),          {linux,xterm,Eterm,konsole,gnome,rxvt}
-       (char:0;scan:kbF7;st:#27'[18~'),          {linux,xterm,Eterm,konsole,gnome,rxvt}
-       (char:0;scan:kbF8;st:#27'[19~'),          {linux,xterm,Eterm,konsole,gnome,rxvt}
-       (char:0;scan:kbF9;st:#27'[20~'),          {linux,xterm,Eterm,konsole,gnome,rxvt}
-       (char:0;scan:kbF10;st:#27'[21~'),         {linux,xterm,Eterm,konsole,gnome,rxvt}
-       (char:0;scan:kbF11;st:#27'[23~'),         {linux,xterm,Eterm,konsole,gnome,rxvt}
-       (char:0;scan:kbF12;st:#27'[24~'),         {linux,xterm,Eterm,konsole,gnome,rxvt}
-       (char:0;scan:kbF1;st:#27'[M'),            {FreeBSD}
-       (char:0;scan:kbF2;st:#27'[N'),            {FreeBSD}
-       (char:0;scan:kbF3;st:#27'[O'),            {FreeBSD}
-       (char:0;scan:kbF4;st:#27'[P'),            {FreeBSD}
-       (char:0;scan:kbF5;st:#27'[Q'),            {FreeBSD}
-       (char:0;scan:kbF6;st:#27'[R'),            {FreeBSD}
-       (char:0;scan:kbF7;st:#27'[S'),            {FreeBSD}
-       (char:0;scan:kbF8;st:#27'[T'),            {FreeBSD}
-       (char:0;scan:kbF9;st:#27'[U'),            {FreeBSD}
-       (char:0;scan:kbF10;st:#27'[V'),           {FreeBSD}
-       (char:0;scan:kbF11;st:#27'[W'),           {FreeBSD}
-       (char:0;scan:kbF12;st:#27'[X'),           {FreeBSD}
-       (char:0;scan:kbF1;st:#27'OP'),            {vt100,gnome,konsole}
-       (char:0;scan:kbF2;st:#27'OQ'),            {vt100,gnome,konsole}
-       (char:0;scan:kbF3;st:#27'OR'),            {vt100,gnome,konsole}
-       (char:0;scan:kbF4;st:#27'OS'),            {vt100,gnome,konsole}
-       (char:0;scan:kbF5;st:#27'Ot'),            {vt100}
-       (char:0;scan:kbF6;st:#27'Ou'),            {vt100}
-       (char:0;scan:kbF7;st:#27'Ov'),            {vt100}
-       (char:0;scan:kbF8;st:#27'Ol'),            {vt100}
-       (char:0;scan:kbF9;st:#27'Ow'),            {vt100}
-       (char:0;scan:kbF10;st:#27'Ox'),           {vt100}
-       (char:0;scan:kbF11;st:#27'Oy'),           {vt100}
-       (char:0;scan:kbF12;st:#27'Oz'),           {vt100}
-       (char:0;scan:kbEsc;st:#27'[0~'),          {if linux keyboard patched, escape
-                                                  returns this}
-       (char:0;scan:kbIns;st:#27'[2~'),          {linux,Eterm,rxvt}
-       (char:0;scan:kbDel;st:#27'[3~'),          {linux,Eterm,rxvt}
-       (char:0;scan:kbHome;st:#27'[1~'),         {linux}
-       (char:0;scan:kbHome;st:#27'[7~'),         {Eterm,rxvt}
-       (char:0;scan:kbHome;st:#27'[H'),          {FreeBSD}
-       (char:0;scan:kbHome;st:#27'OH'),          {some xterm configurations}
-       (char:0;scan:kbEnd;st:#27'[4~'),          {linux,Eterm}
-       (char:0;scan:kbEnd;st:#27'[8~'),          {rxvt}
-       (char:0;scan:kbEnd;st:#27'[F'),           {FreeBSD}
-       (char:0;scan:kbEnd;st:#27'OF'),           {some xterm configurations}
-       (char:0;scan:kbPgUp;st:#27'[5~'),         {linux,Eterm,rxvt}
-       (char:0;scan:kbPgUp;st:#27'[I'),          {FreeBSD}
-       (char:0;scan:kbPgDn;st:#27'[6~'),         {linux,Eterm,rxvt}
-       (char:0;scan:kbPgDn;st:#27'[G'),          {FreeBSD}
-       (char:0;scan:kbUp;st:#27'[A'),            {linux,FreeBSD,rxvt}
-       (char:0;scan:kbDown;st:#27'[B'),          {linux,FreeBSD,rxvt}
-       (char:0;scan:kbRight;st:#27'[C'),         {linux,FreeBSD,rxvt}
-       (char:0;scan:kbLeft;st:#27'[D'),          {linux,FreeBSD,rxvt}
-       (char:0;scan:kbUp;st:#27'OA'),            {xterm}
-       (char:0;scan:kbDown;st:#27'OB'),          {xterm}
-       (char:0;scan:kbRight;st:#27'OC'),         {xterm}
-       (char:0;scan:kbLeft;st:#27'OD'),          {xterm}
+const key_sequences:array[0..380] of key_sequence=(
+       (char:0;scan:kbAltA;shift:kbAlt;st:#27'A'),
+       (char:0;scan:kbAltA;shift:kbAlt;st:#27'a'),
+       (char:0;scan:kbAltB;shift:kbAlt;st:#27'B'),
+       (char:0;scan:kbAltB;shift:kbAlt;st:#27'b'),
+       (char:0;scan:kbAltC;shift:kbAlt;st:#27'C'),
+       (char:0;scan:kbAltC;shift:kbAlt;st:#27'c'),
+       (char:0;scan:kbAltD;shift:kbAlt;st:#27'D'),
+       (char:0;scan:kbAltD;shift:kbAlt;st:#27'd'),
+       (char:0;scan:kbAltE;shift:kbAlt;st:#27'E'),
+       (char:0;scan:kbAltE;shift:kbAlt;st:#27'e'),
+       (char:0;scan:kbAltF;shift:kbAlt;st:#27'F'),
+       (char:0;scan:kbAltF;shift:kbAlt;st:#27'f'),
+       (char:0;scan:kbAltG;shift:kbAlt;st:#27'G'),
+       (char:0;scan:kbAltG;shift:kbAlt;st:#27'g'),
+       (char:0;scan:kbAltH;shift:kbAlt;st:#27'H'),
+       (char:0;scan:kbAltH;shift:kbAlt;st:#27'h'),
+       (char:0;scan:kbAltI;shift:kbAlt;st:#27'I'),
+       (char:0;scan:kbAltI;shift:kbAlt;st:#27'i'),
+       (char:0;scan:kbAltJ;shift:kbAlt;st:#27'J'),
+       (char:0;scan:kbAltJ;shift:kbAlt;st:#27'j'),
+       (char:0;scan:kbAltK;shift:kbAlt;st:#27'K'),
+       (char:0;scan:kbAltK;shift:kbAlt;st:#27'k'),
+       (char:0;scan:kbAltL;shift:kbAlt;st:#27'L'),
+       (char:0;scan:kbAltL;shift:kbAlt;st:#27'l'),
+       (char:0;scan:kbAltM;shift:kbAlt;st:#27'M'),
+       (char:0;scan:kbAltM;shift:kbAlt;st:#27'm'),
+       (char:0;scan:kbAltN;shift:kbAlt;st:#27'N'),
+       (char:0;scan:kbAltN;shift:kbAlt;st:#27'n'),
+       (char:0;scan:kbAltO;shift:kbAlt;st:#27'O'),
+       (char:0;scan:kbAltO;shift:kbAlt;st:#27'o'),
+       (char:0;scan:kbAltP;shift:kbAlt;st:#27'P'),
+       (char:0;scan:kbAltP;shift:kbAlt;st:#27'p'),
+       (char:0;scan:kbAltQ;shift:kbAlt;st:#27'Q'),
+       (char:0;scan:kbAltQ;shift:kbAlt;st:#27'q'),
+       (char:0;scan:kbAltR;shift:kbAlt;st:#27'R'),
+       (char:0;scan:kbAltR;shift:kbAlt;st:#27'r'),
+       (char:0;scan:kbAltS;shift:kbAlt;st:#27'S'),
+       (char:0;scan:kbAltS;shift:kbAlt;st:#27's'),
+       (char:0;scan:kbAltT;shift:kbAlt;st:#27'T'),
+       (char:0;scan:kbAltT;shift:kbAlt;st:#27't'),
+       (char:0;scan:kbAltU;shift:kbAlt;st:#27'U'),
+       (char:0;scan:kbAltU;shift:kbAlt;st:#27'u'),
+       (char:0;scan:kbAltV;shift:kbAlt;st:#27'V'),
+       (char:0;scan:kbAltV;shift:kbAlt;st:#27'v'),
+       (char:0;scan:kbAltW;shift:kbAlt;st:#27'W'),
+       (char:0;scan:kbAltW;shift:kbAlt;st:#27'w'),
+       (char:0;scan:kbAltX;shift:kbAlt;st:#27'X'),
+       (char:0;scan:kbAltX;shift:kbAlt;st:#27'x'),
+       (char:0;scan:kbAltY;shift:kbAlt;st:#27'Y'),
+       (char:0;scan:kbAltY;shift:kbAlt;st:#27'y'),
+       (char:0;scan:kbAltZ;shift:kbAlt;st:#27'Z'),
+       (char:0;scan:kbAltZ;shift:kbAlt;st:#27'z'),
+       (char:0;scan:kbAltMinus;shift:kbAlt;st:#27'-'),
+       (char:0;scan:kbAltEqual;shift:kbAlt;st:#27'='),
+       (char:0;scan:kbAlt0;shift:kbAlt;st:#27'0'),
+       (char:0;scan:kbAlt1;shift:kbAlt;st:#27'1'),
+       (char:0;scan:kbAlt2;shift:kbAlt;st:#27'2'),
+       (char:0;scan:kbAlt3;shift:kbAlt;st:#27'3'),
+       (char:0;scan:kbAlt4;shift:kbAlt;st:#27'4'),
+       (char:0;scan:kbAlt5;shift:kbAlt;st:#27'5'),
+       (char:0;scan:kbAlt6;shift:kbAlt;st:#27'6'),
+       (char:0;scan:kbAlt7;shift:kbAlt;st:#27'7'),
+       (char:0;scan:kbAlt8;shift:kbAlt;st:#27'8'),
+       (char:0;scan:kbAlt9;shift:kbAlt;st:#27'9'),
+
+       (char:0;scan:kbF1;shift:0;st:#27'[[A'),                   {linux,konsole,xterm}
+       (char:0;scan:kbF2;shift:0;st:#27'[[B'),                   {linux,konsole,xterm}
+       (char:0;scan:kbF3;shift:0;st:#27'[[C'),                   {linux,konsole,xterm}
+       (char:0;scan:kbF4;shift:0;st:#27'[[D'),                   {linux,konsole,xterm}
+       (char:0;scan:kbF5;shift:0;st:#27'[[E'),                   {linux,konsole}
+       (char:0;scan:kbF1;shift:0;st:#27'[11~'),                  {Eterm,rxvt}
+       (char:0;scan:kbF2;shift:0;st:#27'[12~'),                  {Eterm,rxvt}
+       (char:0;scan:kbF3;shift:0;st:#27'[13~'),                  {Eterm,rxvt}
+       (char:0;scan:kbF4;shift:0;st:#27'[14~'),                  {Eterm,rxvt}
+       (char:0;scan:kbF5;shift:0;st:#27'[15~'),                  {xterm,Eterm,gnome,rxvt}
+       (char:0;scan:kbF6;shift:0;st:#27'[17~'),                  {linux,xterm,Eterm,konsole,gnome,rxvt}
+       (char:0;scan:kbF7;shift:0;st:#27'[18~'),                  {linux,xterm,Eterm,konsole,gnome,rxvt}
+       (char:0;scan:kbF8;shift:0;st:#27'[19~'),                  {linux,xterm,Eterm,konsole,gnome,rxvt}
+       (char:0;scan:kbF9;shift:0;st:#27'[20~'),                  {linux,xterm,Eterm,konsole,gnome,rxvt}
+       (char:0;scan:kbF10;shift:0;st:#27'[21~'),                 {linux,xterm,Eterm,konsole,gnome,rxvt}
+       (char:0;scan:kbF11;shift:0;st:#27'[23~'),                 {linux,xterm,Eterm,konsole,gnome,rxvt}
+       (char:0;scan:kbF12;shift:0;st:#27'[24~'),                 {linux,xterm,Eterm,konsole,gnome,rxvt}
+       (char:0;scan:kbF1;shift:0;st:#27'[M'),                    {FreeBSD}
+       (char:0;scan:kbF2;shift:0;st:#27'[N'),                    {FreeBSD}
+       (char:0;scan:kbF3;shift:0;st:#27'[O'),                    {FreeBSD}
+       (char:0;scan:kbF4;shift:0;st:#27'[P'),                    {FreeBSD}
+       (char:0;scan:kbF5;shift:0;st:#27'[Q'),                    {FreeBSD}
+       (char:0;scan:kbF6;shift:0;st:#27'[R'),                    {FreeBSD}
+       (char:0;scan:kbF7;shift:0;st:#27'[S'),                    {FreeBSD}
+       (char:0;scan:kbF8;shift:0;st:#27'[T'),                    {FreeBSD}
+       (char:0;scan:kbF9;shift:0;st:#27'[U'),                    {FreeBSD}
+       (char:0;scan:kbF10;shift:0;st:#27'[V'),                   {FreeBSD}
+       (char:0;scan:kbF11;shift:0;st:#27'[W'),                   {FreeBSD}
+       (char:0;scan:kbF12;shift:0;st:#27'[X'),                   {FreeBSD}
+       (char:0;scan:kbF1;shift:0;st:#27'OP'),                    {vt100,gnome,konsole}
+       (char:0;scan:kbF2;shift:0;st:#27'OQ'),                    {vt100,gnome,konsole}
+       (char:0;scan:kbF3;shift:0;st:#27'OR'),                    {vt100,gnome,konsole}
+       (char:0;scan:kbF4;shift:0;st:#27'OS'),                    {vt100,gnome,konsole}
+       (char:0;scan:kbF5;shift:0;st:#27'Ot'),                    {vt100}
+       (char:0;scan:kbF6;shift:0;st:#27'Ou'),                    {vt100}
+       (char:0;scan:kbF7;shift:0;st:#27'Ov'),                    {vt100}
+       (char:0;scan:kbF8;shift:0;st:#27'Ol'),                    {vt100}
+       (char:0;scan:kbF9;shift:0;st:#27'Ow'),                    {vt100}
+       (char:0;scan:kbF10;shift:0;st:#27'Ox'),                   {vt100}
+       (char:0;scan:kbF11;shift:0;st:#27'Oy'),                   {vt100}
+       (char:0;scan:kbF12;shift:0;st:#27'Oz'),                   {vt100}
+       (char:27;scan:kbEsc;shift:0;st:#27'[0~'),                 {if linux keyboard patched, escape
+                                                                   returns this}
+       (char:0;scan:kbIns;shift:0;st:#27'[2~'),                  {linux,Eterm,rxvt}
+       (char:0;scan:kbDel;shift:0;st:#27'[3~'),                  {linux,Eterm,rxvt}
+       (char:0;scan:kbHome;shift:0;st:#27'[1~'),                 {linux}
+       (char:0;scan:kbHome;shift:0;st:#27'[7~'),                 {Eterm,rxvt}
+       (char:0;scan:kbHome;shift:0;st:#27'[H'),                  {FreeBSD}
+       (char:0;scan:kbHome;shift:0;st:#27'OH'),                  {some xterm configurations}
+       (char:0;scan:kbEnd;shift:0;st:#27'[4~'),                  {linux,Eterm}
+       (char:0;scan:kbEnd;shift:0;st:#27'[8~'),                  {rxvt}
+       (char:0;scan:kbEnd;shift:0;st:#27'[F'),                   {FreeBSD}
+       (char:0;scan:kbEnd;shift:0;st:#27'OF'),                   {some xterm configurations}
+       (char:0;scan:kbPgUp;shift:0;st:#27'[5~'),                 {linux,Eterm,rxvt}
+       (char:0;scan:kbPgUp;shift:0;st:#27'[I'),                  {FreeBSD}
+       (char:0;scan:kbPgDn;shift:0;st:#27'[6~'),                 {linux,Eterm,rxvt}
+{$ifdef FREEBSD}
+       (char:0;scan:kbPgDn;shift:0;st:#27'[G'),                  {FreeBSD, conflicts with linux.
+                                                                   Note: new FreeBSD versions seem
+                                                                   to use xterm-like sequences, so
+                                                                   this one is not needed for them.
+                                                                   Todo: resolve conflicting sequences
+                                                                   according to the TERM variable,
+                                                                   instead of using IFDEFs, this way
+                                                                   it'll work over SSH across platforms
+                                                                   too.}
+{$else FREEBSD}
+       (char:0;scan:kbCenter;shift:0;st:#27'[G'),                {linux}
+{$endif FREEBSD}
+       (char:0;scan:kbCenter;shift:0;st:#27'[E'),                {xterm,gnome3}
+       (char:0;scan:kbUp;shift:0;st:#27'[A'),                    {linux,FreeBSD,rxvt}
+       (char:0;scan:kbDown;shift:0;st:#27'[B'),                  {linux,FreeBSD,rxvt}
+       (char:0;scan:kbRight;shift:0;st:#27'[C'),                 {linux,FreeBSD,rxvt}
+       (char:0;scan:kbLeft;shift:0;st:#27'[D'),                  {linux,FreeBSD,rxvt}
+       (char:0;scan:kbUp;shift:0;st:#27'OA'),                    {xterm}
+       (char:0;scan:kbDown;shift:0;st:#27'OB'),                  {xterm}
+       (char:0;scan:kbRight;shift:0;st:#27'OC'),                 {xterm}
+       (char:0;scan:kbLeft;shift:0;st:#27'OD'),                  {xterm}
 (* Already recognized above as F11!
-       (char:0;scan:kbShiftF1;st:#27'[23~'),     {rxvt}
-       (char:0;scan:kbShiftF2;st:#27'[24~'),     {rxvt}
+       (char:0;scan:kbShiftF1;shift:kbShift;st:#27'[23~'),     {rxvt}
+       (char:0;scan:kbShiftF2;shift:kbShift;st:#27'[24~'),     {rxvt}
 *)
-       (char:0;scan:kbShiftF3;st:#27'[25~'),     {linux,rxvt}
-       (char:0;scan:kbShiftF4;st:#27'[26~'),     {linux,rxvt}
-       (char:0;scan:kbShiftF5;st:#27'[28~'),     {linux,rxvt}
-       (char:0;scan:kbShiftF6;st:#27'[29~'),     {linux,rxvt}
-       (char:0;scan:kbShiftF7;st:#27'[31~'),     {linux,rxvt}
-       (char:0;scan:kbShiftF8;st:#27'[32~'),     {linux,rxvt}
-       (char:0;scan:kbShiftF9;st:#27'[33~'),     {linux,rxvt}
-       (char:0;scan:kbShiftF10;st:#27'[34~'),    {linux,rxvt}
-       (char:0;scan:kbShiftF11;st:#27'[23$'),    {rxvt}
-       (char:0;scan:kbShiftF12;st:#27'[24$'),    {rxvt}
-       (char:0;scan:kbShiftF1;st:#27'[11;2~'),   {konsole in vt420pc mode}
-       (char:0;scan:kbShiftF2;st:#27'[12;2~'),   {konsole in vt420pc mode}
-       (char:0;scan:kbShiftF3;st:#27'[13;2~'),   {konsole in vt420pc mode}
-       (char:0;scan:kbShiftF4;st:#27'[14;2~'),   {konsole in vt420pc mode}
-       (char:0;scan:kbShiftF5;st:#27'[15;2~'),   {xterm}
-       (char:0;scan:kbShiftF6;st:#27'[17;2~'),   {xterm}
-       (char:0;scan:kbShiftF7;st:#27'[18;2~'),   {xterm}
-       (char:0;scan:kbShiftF8;st:#27'[19;2~'),   {xterm}
-       (char:0;scan:kbShiftF9;st:#27'[20;2~'),   {xterm}
-       (char:0;scan:kbShiftF10;st:#27'[21;2~'),  {xterm}
-       (char:0;scan:kbShiftF11;st:#27'[23;2~'),  {xterm}
-       (char:0;scan:kbShiftF12;st:#27'[24;2~'),  {xterm}
-       (char:0;scan:kbShiftF1;st:#27'O2P'),      {konsole,xterm}
-       (char:0;scan:kbShiftF2;st:#27'O2Q'),      {konsole,xterm}
-       (char:0;scan:kbShiftF3;st:#27'O2R'),      {konsole,xterm}
-       (char:0;scan:kbShiftF4;st:#27'O2S'),      {konsole,xterm}
-       (char:0;scan:kbShiftF1;st:#27'[1;2P'),    {xterm,gnome3}
-       (char:0;scan:kbShiftF2;st:#27'[1;2Q'),    {xterm,gnome3}
-       (char:0;scan:kbShiftF3;st:#27'[1;2R'),    {xterm,gnome3}
-       (char:0;scan:kbShiftF4;st:#27'[1;2S'),    {xterm,gnome3}
-       (char:0;scan:kbCtrlF1;st:#27'O5P'),       {konsole,xterm}
-       (char:0;scan:kbCtrlF2;st:#27'O5Q'),       {konsole,xterm}
-       (char:0;scan:kbCtrlF3;st:#27'O5R'),       {konsole,xterm}
-       (char:0;scan:kbCtrlF4;st:#27'O5S'),       {konsole,xterm}
-       (char:0;scan:kbCtrlF1;st:#27'[1;5P'),     {xterm,gnome3}
-       (char:0;scan:kbCtrlF2;st:#27'[1;5Q'),     {xterm,gnome3}
-       (char:0;scan:kbCtrlF3;st:#27'[1;5R'),     {xterm,gnome3}
-       (char:0;scan:kbCtrlF4;st:#27'[1;5S'),     {xterm,gnome3}
-       (char:0;scan:kbCtrlF1;st:#27'[11;5~'),    {none, but expected}
-       (char:0;scan:kbCtrlF2;st:#27'[12;5~'),    {none, but expected}
-       (char:0;scan:kbCtrlF3;st:#27'[13;5~'),    {none, but expected}
-       (char:0;scan:kbCtrlF4;st:#27'[14;5~'),    {none, but expected}
-       (char:0;scan:kbCtrlF5;st:#27'[15;5~'),    {xterm}
-       (char:0;scan:kbCtrlF6;st:#27'[17;5~'),    {xterm}
-       (char:0;scan:kbCtrlF7;st:#27'[18;5~'),    {xterm}
-       (char:0;scan:kbCtrlF8;st:#27'[19;5~'),    {xterm}
-       (char:0;scan:kbCtrlF9;st:#27'[20;5~'),    {xterm}
-       (char:0;scan:kbCtrlF10;st:#27'[21;5~'),   {xterm}
-       (char:0;scan:kbCtrlF11;st:#27'[23;5~'),   {xterm}
-       (char:0;scan:kbCtrlF12;st:#27'[24;5~'),   {xterm}
-       (char:0;scan:kbCtrlF1;st:#27'[11^'),      {rxvt}
-       (char:0;scan:kbCtrlF2;st:#27'[12^'),      {rxvt}
-       (char:0;scan:kbCtrlF3;st:#27'[13^'),      {rxvt}
-       (char:0;scan:kbCtrlF4;st:#27'[14^'),      {rxvt}
-       (char:0;scan:kbCtrlF5;st:#27'[15^'),      {rxvt}
-       (char:0;scan:kbCtrlF6;st:#27'[17^'),      {rxvt}
-       (char:0;scan:kbCtrlF7;st:#27'[18^'),      {rxvt}
-       (char:0;scan:kbCtrlF8;st:#27'[19^'),      {rxvt}
-       (char:0;scan:kbCtrlF9;st:#27'[20^'),      {rxvt}
-       (char:0;scan:kbCtrlF10;st:#27'[21^'),     {rxvt}
-       (char:0;scan:kbCtrlF11;st:#27'[23^'),     {rxvt}
-       (char:0;scan:kbCtrlF12;st:#27'[24^'),     {rxvt}
-       (char:0;scan:kbShiftIns;st:#27'[2;2~'),   {should be the code, but shift+ins
-                                                  is paste X clipboard in many
-                                                  terminal emulators :(}
-       (char:0;scan:kbShiftDel;st:#27'[3;2~'),   {xterm,konsole}
-       (char:0;scan:kbCtrlIns;st:#27'[2;5~'),    {xterm}
-       (char:0;scan:kbCtrlDel;st:#27'[3;5~'),    {xterm}
-       (char:0;scan:kbShiftDel;st:#27'[3$'),     {rxvt}
-       (char:0;scan:kbCtrlIns;st:#27'[2^'),      {rxvt}
-       (char:0;scan:kbCtrlDel;st:#27'[3^'),      {rxvt}
-       (char:0;scan:kbAltF1;st:#27#27'[[A'),
-       (char:0;scan:kbAltF2;st:#27#27'[[B'),
-       (char:0;scan:kbAltF3;st:#27#27'[[C'),
-       (char:0;scan:kbAltF4;st:#27#27'[[D'),
-       (char:0;scan:kbAltF5;st:#27#27'[[E'),
-       (char:0;scan:kbAltF1;st:#27#27'[11~'),    {rxvt}
-       (char:0;scan:kbAltF2;st:#27#27'[12~'),    {rxvt}
-       (char:0;scan:kbAltF3;st:#27#27'[13~'),    {rxvt}
-       (char:0;scan:kbAltF4;st:#27#27'[14~'),    {rxvt}
-       (char:0;scan:kbAltF5;st:#27#27'[15~'),    {rxvt}
-       (char:0;scan:kbAltF6;st:#27#27'[17~'),    {rxvt}
-       (char:0;scan:kbAltF7;st:#27#27'[18~'),    {rxvt}
-       (char:0;scan:kbAltF8;st:#27#27'[19~'),    {rxvt}
-       (char:0;scan:kbAltF9;st:#27#27'[20~'),    {rxvt}
-       (char:0;scan:kbAltF10;st:#27#27'[21~'),   {rxvt}
-       (char:0;scan:kbAltF11;st:#27#27'[23~'),   {rxvt}
-       (char:0;scan:kbAltF12;st:#27#27'[24~'),   {rxvt}
-       (char:0;scan:kbAltF1;st:#27#27'OP'),      {xterm}
-       (char:0;scan:kbAltF2;st:#27#27'OQ'),      {xterm}
-       (char:0;scan:kbAltF3;st:#27#27'OR'),      {xterm}
-       (char:0;scan:kbAltF4;st:#27#27'OS'),      {xterm}
-       (char:0;scan:kbAltF5;st:#27#27'Ot'),      {xterm}
-       (char:0;scan:kbAltF6;st:#27#27'Ou'),      {xterm}
-       (char:0;scan:kbAltF7;st:#27#27'Ov'),      {xterm}
-       (char:0;scan:kbAltF8;st:#27#27'Ol'),      {xterm}
-       (char:0;scan:kbAltF9;st:#27#27'Ow'),      {xterm}
-       (char:0;scan:kbAltF10;st:#27#27'Ox'),     {xterm}
-       (char:0;scan:kbAltF11;st:#27#27'Oy'),     {xterm}
-       (char:0;scan:kbAltF12;st:#27#27'Oz'),     {xterm}
-       (char:0;scan:kbAltF1;st:#27'[1;3P'),      {xterm,gnome3}
-       (char:0;scan:kbAltF2;st:#27'[1;3Q'),      {xterm,gnome3}
-       (char:0;scan:kbAltF3;st:#27'[1;3R'),      {xterm,gnome3}
-       (char:0;scan:kbAltF4;st:#27'[1;3S'),      {xterm,gnome3}
-       (char:0;scan:kbAltF1;st:#27'O3P'),        {xterm on FreeBSD}
-       (char:0;scan:kbAltF2;st:#27'O3Q'),        {xterm on FreeBSD}
-       (char:0;scan:kbAltF3;st:#27'O3R'),        {xterm on FreeBSD}
-       (char:0;scan:kbAltF4;st:#27'O3S'),        {xterm on FreeBSD}
-       (char:0;scan:kbAltF5;st:#27'[15;3~'),     {xterm on FreeBSD}
-       (char:0;scan:kbAltF6;st:#27'[17;3~'),     {xterm on FreeBSD}
-       (char:0;scan:kbAltF7;st:#27'[18;3~'),     {xterm on FreeBSD}
-       (char:0;scan:kbAltF8;st:#27'[19;3~'),     {xterm on FreeBSD}
-       (char:0;scan:kbAltF9;st:#27'[20;3~'),     {xterm on FreeBSD}
-       (char:0;scan:kbAltF10;st:#27'[21;3~'),    {xterm on FreeBSD}
-       (char:0;scan:kbAltF11;st:#27'[23;3~'),    {xterm on FreeBSD}
-       (char:0;scan:kbAltF12;st:#27'[24;3~'),    {xterm on FreeBSD}
-
-       (char:0;scan:kbShiftTab;st:#27#9),        {linux - 'Meta_Tab'}
-       (char:0;scan:kbShiftTab;st:#27'[Z'),
-       (char:0;scan:kbShiftUp;st:#27'[1;2A'),    {xterm}
-       (char:0;scan:kbShiftDown;st:#27'[1;2B'),  {xterm}
-       (char:0;scan:kbShiftRight;st:#27'[1;2C'), {xterm}
-       (char:0;scan:kbShiftLeft;st:#27'[1;2D'),  {xterm}
-       (char:0;scan:kbShiftUp;st:#27'[a'),       {rxvt}
-       (char:0;scan:kbShiftDown;st:#27'[b'),     {rxvt}
-       (char:0;scan:kbShiftRight;st:#27'[c'),    {rxvt}
-       (char:0;scan:kbShiftLeft;st:#27'[d'),     {rxvt}
-       (char:0;scan:kbShiftEnd;st:#27'[1;2F'),   {xterm}
-       (char:0;scan:kbShiftEnd;st:#27'[8$'),     {rxvt}
-       (char:0;scan:kbShiftHome;st:#27'[1;2H'),  {xterm}
-       (char:0;scan:kbShiftHome;st:#27'[7$'),    {rxvt}
-
-       (char:0;scan:KbCtrlShiftUp;st:#27'[1;6A'),    {xterm}
-       (char:0;scan:KbCtrlShiftDown;st:#27'[1;6B'),  {xterm}
-       (char:0;scan:KbCtrlShiftRight;st:#27'[1;6C'), {xterm, xfce4}
-       (char:0;scan:KbCtrlShiftLeft;st:#27'[1;6D'),  {xterm, xfce4}
-       (char:0;scan:KbCtrlShiftHome;st:#27'[1;6H'),  {xterm}
-       (char:0;scan:KbCtrlShiftEnd;st:#27'[1;6F'),   {xterm}
-
-       (char:0;scan:kbCtrlPgDn;st:#27'[6;5~'),   {xterm}
-       (char:0;scan:kbCtrlPgUp;st:#27'[5;5~'),   {xterm}
-       (char:0;scan:kbCtrlUp;st:#27'[1;5A'),     {xterm}
-       (char:0;scan:kbCtrlDown;st:#27'[1;5B'),   {xterm}
-       (char:0;scan:kbCtrlRight;st:#27'[1;5C'),  {xterm}
-       (char:0;scan:kbCtrlLeft;st:#27'[1;5D'),   {xterm}
-       (char:0;scan:kbCtrlUp;st:#27'[Oa'),       {rxvt}
-       (char:0;scan:kbCtrlDown;st:#27'[Ob'),     {rxvt}
-       (char:0;scan:kbCtrlRight;st:#27'[Oc'),    {rxvt}
-       (char:0;scan:kbCtrlLeft;st:#27'[Od'),     {rxvt}
-       (char:0;scan:kbCtrlEnd;st:#27'[1;5F'),    {xterm}
-       (char:0;scan:kbCtrlEnd;st:#27'[8^'),      {rxvt}
-       (char:0;scan:kbCtrlHome;st:#27'[1;5H'),   {xterm}
-       (char:0;scan:kbCtrlHome;st:#27'[7^'),     {rxvt}
-
-       (char:0;scan:kbAltUp;st:#27#27'[A'),      {rxvt}
-       (char:0;scan:kbAltDown;st:#27#27'[B'),    {rxvt}
-       (char:0;scan:kbAltLeft;st:#27#27'[D'),    {rxvt}
-       (char:0;scan:kbAltRight;st:#27#27'[C'),   {rxvt}
+(* These seem to be shifted. Probably something changed with linux's default keymaps.
+       (char:0;scan:kbShiftF3;shift:kbShift;st:#27'[25~'),     {linux,rxvt}
+       (char:0;scan:kbShiftF4;shift:kbShift;st:#27'[26~'),     {linux,rxvt}
+       (char:0;scan:kbShiftF5;shift:kbShift;st:#27'[28~'),     {linux,rxvt}
+       (char:0;scan:kbShiftF6;shift:kbShift;st:#27'[29~'),     {linux,rxvt}
+       (char:0;scan:kbShiftF7;shift:kbShift;st:#27'[31~'),     {linux,rxvt}
+       (char:0;scan:kbShiftF8;shift:kbShift;st:#27'[32~'),     {linux,rxvt}
+       (char:0;scan:kbShiftF9;shift:kbShift;st:#27'[33~'),     {linux,rxvt}
+       (char:0;scan:kbShiftF10;shift:kbShift;st:#27'[34~'),    {linux,rxvt}*)
+       (char:0;scan:kbShiftF1;shift:kbShift;st:#27'[25~'),     {linux}
+       (char:0;scan:kbShiftF2;shift:kbShift;st:#27'[26~'),     {linux}
+       (char:0;scan:kbShiftF3;shift:kbShift;st:#27'[28~'),     {linux}
+       (char:0;scan:kbShiftF4;shift:kbShift;st:#27'[29~'),     {linux}
+       (char:0;scan:kbShiftF5;shift:kbShift;st:#27'[31~'),     {linux}
+       (char:0;scan:kbShiftF6;shift:kbShift;st:#27'[32~'),     {linux}
+       (char:0;scan:kbShiftF7;shift:kbShift;st:#27'[33~'),     {linux}
+       (char:0;scan:kbShiftF8;shift:kbShift;st:#27'[34~'),     {linux}
+       (char:0;scan:kbShiftF11;shift:kbShift;st:#27'[23$'),    {rxvt}
+       (char:0;scan:kbShiftF12;shift:kbShift;st:#27'[24$'),    {rxvt}
+       (char:0;scan:kbShiftF1;shift:kbShift;st:#27'[11;2~'),   {konsole in vt420pc mode}
+       (char:0;scan:kbShiftF2;shift:kbShift;st:#27'[12;2~'),   {konsole in vt420pc mode}
+       (char:0;scan:kbShiftF3;shift:kbShift;st:#27'[13;2~'),   {konsole in vt420pc mode}
+       (char:0;scan:kbShiftF4;shift:kbShift;st:#27'[14;2~'),   {konsole in vt420pc mode}
+       (char:0;scan:kbShiftF5;shift:kbShift;st:#27'[15;2~'),   {xterm}
+       (char:0;scan:kbShiftF6;shift:kbShift;st:#27'[17;2~'),   {xterm}
+       (char:0;scan:kbShiftF7;shift:kbShift;st:#27'[18;2~'),   {xterm}
+       (char:0;scan:kbShiftF8;shift:kbShift;st:#27'[19;2~'),   {xterm}
+       (char:0;scan:kbShiftF9;shift:kbShift;st:#27'[20;2~'),   {xterm}
+       (char:0;scan:kbShiftF10;shift:kbShift;st:#27'[21;2~'),  {xterm}
+       (char:0;scan:kbShiftF11;shift:kbShift;st:#27'[23;2~'),  {xterm}
+       (char:0;scan:kbShiftF12;shift:kbShift;st:#27'[24;2~'),  {xterm}
+       (char:0;scan:kbShiftF1;shift:kbShift;st:#27'O2P'),      {konsole,xterm}
+       (char:0;scan:kbShiftF2;shift:kbShift;st:#27'O2Q'),      {konsole,xterm}
+       (char:0;scan:kbShiftF3;shift:kbShift;st:#27'O2R'),      {konsole,xterm}
+       (char:0;scan:kbShiftF4;shift:kbShift;st:#27'O2S'),      {konsole,xterm}
+       (char:0;scan:kbShiftF1;shift:kbShift;st:#27'[1;2P'),    {xterm,gnome3}
+       (char:0;scan:kbShiftF2;shift:kbShift;st:#27'[1;2Q'),    {xterm,gnome3}
+       (char:0;scan:kbShiftF3;shift:kbShift;st:#27'[1;2R'),    {xterm,gnome3}
+       (char:0;scan:kbShiftF4;shift:kbShift;st:#27'[1;2S'),    {xterm,gnome3}
+       (char:0;scan:kbCtrlF1;shift:kbCtrl;st:#27'O5P'),        {konsole,xterm}
+       (char:0;scan:kbCtrlF2;shift:kbCtrl;st:#27'O5Q'),        {konsole,xterm}
+       (char:0;scan:kbCtrlF3;shift:kbCtrl;st:#27'O5R'),        {konsole,xterm}
+       (char:0;scan:kbCtrlF4;shift:kbCtrl;st:#27'O5S'),        {konsole,xterm}
+       (char:0;scan:kbCtrlF1;shift:kbCtrl;st:#27'[1;5P'),      {xterm,gnome3}
+       (char:0;scan:kbCtrlF2;shift:kbCtrl;st:#27'[1;5Q'),      {xterm,gnome3}
+       (char:0;scan:kbCtrlF3;shift:kbCtrl;st:#27'[1;5R'),      {xterm,gnome3}
+       (char:0;scan:kbCtrlF4;shift:kbCtrl;st:#27'[1;5S'),      {xterm,gnome3}
+       (char:0;scan:kbCtrlF1;shift:kbCtrl;st:#27'[11;5~'),     {none, but expected}
+       (char:0;scan:kbCtrlF2;shift:kbCtrl;st:#27'[12;5~'),     {none, but expected}
+       (char:0;scan:kbCtrlF3;shift:kbCtrl;st:#27'[13;5~'),     {none, but expected}
+       (char:0;scan:kbCtrlF4;shift:kbCtrl;st:#27'[14;5~'),     {none, but expected}
+       (char:0;scan:kbCtrlF5;shift:kbCtrl;st:#27'[15;5~'),     {xterm}
+       (char:0;scan:kbCtrlF6;shift:kbCtrl;st:#27'[17;5~'),     {xterm}
+       (char:0;scan:kbCtrlF7;shift:kbCtrl;st:#27'[18;5~'),     {xterm}
+       (char:0;scan:kbCtrlF8;shift:kbCtrl;st:#27'[19;5~'),     {xterm}
+       (char:0;scan:kbCtrlF9;shift:kbCtrl;st:#27'[20;5~'),     {xterm}
+       (char:0;scan:kbCtrlF10;shift:kbCtrl;st:#27'[21;5~'),    {xterm}
+       (char:0;scan:kbCtrlF11;shift:kbCtrl;st:#27'[23;5~'),    {xterm}
+       (char:0;scan:kbCtrlF12;shift:kbCtrl;st:#27'[24;5~'),    {xterm}
+       (char:0;scan:kbCtrlF1;shift:kbCtrl;st:#27'[11^'),       {rxvt}
+       (char:0;scan:kbCtrlF2;shift:kbCtrl;st:#27'[12^'),       {rxvt}
+       (char:0;scan:kbCtrlF3;shift:kbCtrl;st:#27'[13^'),       {rxvt}
+       (char:0;scan:kbCtrlF4;shift:kbCtrl;st:#27'[14^'),       {rxvt}
+       (char:0;scan:kbCtrlF5;shift:kbCtrl;st:#27'[15^'),       {rxvt}
+       (char:0;scan:kbCtrlF6;shift:kbCtrl;st:#27'[17^'),       {rxvt}
+       (char:0;scan:kbCtrlF7;shift:kbCtrl;st:#27'[18^'),       {rxvt}
+       (char:0;scan:kbCtrlF8;shift:kbCtrl;st:#27'[19^'),       {rxvt}
+       (char:0;scan:kbCtrlF9;shift:kbCtrl;st:#27'[20^'),       {rxvt}
+       (char:0;scan:kbCtrlF10;shift:kbCtrl;st:#27'[21^'),      {rxvt}
+       (char:0;scan:kbCtrlF11;shift:kbCtrl;st:#27'[23^'),      {rxvt}
+       (char:0;scan:kbCtrlF12;shift:kbCtrl;st:#27'[24^'),      {rxvt}
+       (char:0;scan:kbShiftIns;shift:kbShift;st:#27'[2;2~'),   {should be the code, but shift+ins
+                                                                   is paste X clipboard in many
+                                                                   terminal emulators :(}
+       (char:0;scan:kbShiftDel;shift:kbShift;st:#27'[3;2~'),   {xterm,konsole}
+       (char:0;scan:kbCtrlIns;shift:kbCtrl;st:#27'[2;5~'),     {xterm}
+       (char:0;scan:kbCtrlDel;shift:kbCtrl;st:#27'[3;5~'),     {xterm}
+       (char:0;scan:kbShiftDel;shift:kbShift;st:#27'[3$'),     {rxvt}
+       (char:0;scan:kbCtrlIns;shift:kbCtrl;st:#27'[2^'),       {rxvt}
+       (char:0;scan:kbCtrlDel;shift:kbCtrl;st:#27'[3^'),       {rxvt}
+       (char:0;scan:kbAltF1;shift:kbAlt;st:#27#27'[[A'),
+       (char:0;scan:kbAltF2;shift:kbAlt;st:#27#27'[[B'),
+       (char:0;scan:kbAltF3;shift:kbAlt;st:#27#27'[[C'),
+       (char:0;scan:kbAltF4;shift:kbAlt;st:#27#27'[[D'),
+       (char:0;scan:kbAltF5;shift:kbAlt;st:#27#27'[[E'),
+       (char:0;scan:kbAltF1;shift:kbAlt;st:#27#27'[11~'),      {rxvt}
+       (char:0;scan:kbAltF2;shift:kbAlt;st:#27#27'[12~'),      {rxvt}
+       (char:0;scan:kbAltF3;shift:kbAlt;st:#27#27'[13~'),      {rxvt}
+       (char:0;scan:kbAltF4;shift:kbAlt;st:#27#27'[14~'),      {rxvt}
+       (char:0;scan:kbAltF5;shift:kbAlt;st:#27#27'[15~'),      {rxvt}
+       (char:0;scan:kbAltF6;shift:kbAlt;st:#27#27'[17~'),      {rxvt}
+       (char:0;scan:kbAltF7;shift:kbAlt;st:#27#27'[18~'),      {rxvt}
+       (char:0;scan:kbAltF8;shift:kbAlt;st:#27#27'[19~'),      {rxvt}
+       (char:0;scan:kbAltF9;shift:kbAlt;st:#27#27'[20~'),      {rxvt}
+       (char:0;scan:kbAltF10;shift:kbAlt;st:#27#27'[21~'),     {rxvt}
+       (char:0;scan:kbAltF11;shift:kbAlt;st:#27#27'[23~'),     {rxvt}
+       (char:0;scan:kbAltF12;shift:kbAlt;st:#27#27'[24~'),     {rxvt}
+       (char:0;scan:kbAltF1;shift:kbAlt;st:#27#27'OP'),        {xterm}
+       (char:0;scan:kbAltF2;shift:kbAlt;st:#27#27'OQ'),        {xterm}
+       (char:0;scan:kbAltF3;shift:kbAlt;st:#27#27'OR'),        {xterm}
+       (char:0;scan:kbAltF4;shift:kbAlt;st:#27#27'OS'),        {xterm}
+       (char:0;scan:kbAltF5;shift:kbAlt;st:#27#27'Ot'),        {xterm}
+       (char:0;scan:kbAltF6;shift:kbAlt;st:#27#27'Ou'),        {xterm}
+       (char:0;scan:kbAltF7;shift:kbAlt;st:#27#27'Ov'),        {xterm}
+       (char:0;scan:kbAltF8;shift:kbAlt;st:#27#27'Ol'),        {xterm}
+       (char:0;scan:kbAltF9;shift:kbAlt;st:#27#27'Ow'),        {xterm}
+       (char:0;scan:kbAltF10;shift:kbAlt;st:#27#27'Ox'),       {xterm}
+       (char:0;scan:kbAltF11;shift:kbAlt;st:#27#27'Oy'),       {xterm}
+       (char:0;scan:kbAltF12;shift:kbAlt;st:#27#27'Oz'),       {xterm}
+       (char:0;scan:kbAltF1;shift:kbAlt;st:#27'[1;3P'),        {xterm,gnome3}
+       (char:0;scan:kbAltF2;shift:kbAlt;st:#27'[1;3Q'),        {xterm,gnome3}
+       (char:0;scan:kbAltF3;shift:kbAlt;st:#27'[1;3R'),        {xterm,gnome3}
+       (char:0;scan:kbAltF4;shift:kbAlt;st:#27'[1;3S'),        {xterm,gnome3}
+       (char:0;scan:kbAltF1;shift:kbAlt;st:#27'O3P'),          {xterm on FreeBSD}
+       (char:0;scan:kbAltF2;shift:kbAlt;st:#27'O3Q'),          {xterm on FreeBSD}
+       (char:0;scan:kbAltF3;shift:kbAlt;st:#27'O3R'),          {xterm on FreeBSD}
+       (char:0;scan:kbAltF4;shift:kbAlt;st:#27'O3S'),          {xterm on FreeBSD}
+       (char:0;scan:kbAltF5;shift:kbAlt;st:#27'[15;3~'),       {xterm on FreeBSD}
+       (char:0;scan:kbAltF6;shift:kbAlt;st:#27'[17;3~'),       {xterm on FreeBSD}
+       (char:0;scan:kbAltF7;shift:kbAlt;st:#27'[18;3~'),       {xterm on FreeBSD}
+       (char:0;scan:kbAltF8;shift:kbAlt;st:#27'[19;3~'),       {xterm on FreeBSD}
+       (char:0;scan:kbAltF9;shift:kbAlt;st:#27'[20;3~'),       {xterm on FreeBSD}
+       (char:0;scan:kbAltF10;shift:kbAlt;st:#27'[21;3~'),      {xterm on FreeBSD}
+       (char:0;scan:kbAltF11;shift:kbAlt;st:#27'[23;3~'),      {xterm on FreeBSD}
+       (char:0;scan:kbAltF12;shift:kbAlt;st:#27'[24;3~'),      {xterm on FreeBSD}
+
+       (char:0;scan:kbCtrlF1;shift:kbCtrl or kbShift;st:#27'[1;6P'),      {xterm,gnome3}
+       (char:0;scan:kbCtrlF2;shift:kbCtrl or kbShift;st:#27'[1;6Q'),      {xterm,gnome3}
+       (char:0;scan:kbCtrlF3;shift:kbCtrl or kbShift;st:#27'[1;6R'),      {xterm,gnome3}
+       (char:0;scan:kbCtrlF4;shift:kbCtrl or kbShift;st:#27'[1;6S'),      {xterm,gnome3}
+       (char:0;scan:kbCtrlF5;shift:kbCtrl or kbShift;st:#27'[15;6~'),     {xterm}
+       (char:0;scan:kbCtrlF6;shift:kbCtrl or kbShift;st:#27'[17;6~'),     {xterm}
+       (char:0;scan:kbCtrlF7;shift:kbCtrl or kbShift;st:#27'[18;6~'),     {xterm}
+       (char:0;scan:kbCtrlF8;shift:kbCtrl or kbShift;st:#27'[19;6~'),     {xterm}
+       (char:0;scan:kbCtrlF9;shift:kbCtrl or kbShift;st:#27'[20;6~'),     {xterm}
+       (char:0;scan:kbCtrlF10;shift:kbCtrl or kbShift;st:#27'[21;6~'),    {xterm}
+       (char:0;scan:kbCtrlF11;shift:kbCtrl or kbShift;st:#27'[23;6~'),    {xterm}
+       (char:0;scan:kbCtrlF12;shift:kbCtrl or kbShift;st:#27'[24;6~'),    {xterm}
+
+       (char:0;scan:kbAltF1;shift:kbShift or kbAlt;st:#27'[1;4P'),        {xterm}
+       (char:0;scan:kbAltF2;shift:kbShift or kbAlt;st:#27'[1;4Q'),        {xterm}
+       (char:0;scan:kbAltF3;shift:kbShift or kbAlt;st:#27'[1;4R'),        {xterm}
+       (char:0;scan:kbAltF4;shift:kbShift or kbAlt;st:#27'[1;4S'),        {xterm}
+       (char:0;scan:kbAltF5;shift:kbShift or kbAlt;st:#27'[15;4~'),       {xterm}
+       (char:0;scan:kbAltF6;shift:kbShift or kbAlt;st:#27'[17;4~'),       {xterm}
+       (char:0;scan:kbAltF7;shift:kbShift or kbAlt;st:#27'[18;4~'),       {xterm}
+       (char:0;scan:kbAltF8;shift:kbShift or kbAlt;st:#27'[19;4~'),       {xterm}
+       (char:0;scan:kbAltF9;shift:kbShift or kbAlt;st:#27'[20;4~'),       {xterm}
+       (char:0;scan:kbAltF10;shift:kbShift or kbAlt;st:#27'[21;4~'),      {xterm}
+       (char:0;scan:kbAltF11;shift:kbShift or kbAlt;st:#27'[23;4~'),      {xterm}
+       (char:0;scan:kbAltF12;shift:kbShift or kbAlt;st:#27'[24;4~'),      {xterm}
+
+       (char:0;scan:kbAltF1;shift:kbCtrl or kbShift or kbAlt;st:#27'[1;8P'),        {xterm}
+       (char:0;scan:kbAltF2;shift:kbCtrl or kbShift or kbAlt;st:#27'[1;8Q'),        {xterm}
+       (char:0;scan:kbAltF3;shift:kbCtrl or kbShift or kbAlt;st:#27'[1;8R'),        {xterm}
+       (char:0;scan:kbAltF4;shift:kbCtrl or kbShift or kbAlt;st:#27'[1;8S'),        {xterm}
+       (char:0;scan:kbAltF5;shift:kbCtrl or kbShift or kbAlt;st:#27'[15;8~'),       {xterm}
+       (char:0;scan:kbAltF6;shift:kbCtrl or kbShift or kbAlt;st:#27'[17;8~'),       {xterm}
+       (char:0;scan:kbAltF7;shift:kbCtrl or kbShift or kbAlt;st:#27'[18;8~'),       {xterm}
+       (char:0;scan:kbAltF8;shift:kbCtrl or kbShift or kbAlt;st:#27'[19;8~'),       {xterm}
+       (char:0;scan:kbAltF9;shift:kbCtrl or kbShift or kbAlt;st:#27'[20;8~'),       {xterm}
+       (char:0;scan:kbAltF10;shift:kbCtrl or kbShift or kbAlt;st:#27'[21;8~'),      {xterm}
+       (char:0;scan:kbAltF11;shift:kbCtrl or kbShift or kbAlt;st:#27'[23;8~'),      {xterm}
+       (char:0;scan:kbAltF12;shift:kbCtrl or kbShift or kbAlt;st:#27'[24;8~'),      {xterm}
+
+       (char:0;scan:kbShiftTab;shift:kbShift;st:#27#9),        {linux - 'Meta_Tab'}
+       (char:0;scan:kbShiftTab;shift:kbShift;st:#27'[Z'),
+       (char:0;scan:kbShiftUp;shift:kbShift;st:#27'[1;2A'),    {xterm}
+       (char:0;scan:kbShiftDown;shift:kbShift;st:#27'[1;2B'),  {xterm}
+       (char:0;scan:kbShiftRight;shift:kbShift;st:#27'[1;2C'), {xterm}
+       (char:0;scan:kbShiftLeft;shift:kbShift;st:#27'[1;2D'),  {xterm}
+       (char:0;scan:kbShiftCenter;shift:kbShift;st:#27'[1;2E'),{xterm}
+       (char:0;scan:kbShiftPgUp;shift:kbShift;st:#27'[5;2~'),  {fpterm, xterm-compatible sequence (but xterm uses shift+pgup/pgdn for scrollback)}
+       (char:0;scan:kbShiftPgDn;shift:kbShift;st:#27'[6;2~'),  {fpterm, xterm-compatible sequence (but xterm uses shift+pgup/pgdn for scrollback)}
+       (char:0;scan:kbShiftUp;shift:kbShift;st:#27'[a'),       {rxvt}
+       (char:0;scan:kbShiftDown;shift:kbShift;st:#27'[b'),     {rxvt}
+       (char:0;scan:kbShiftRight;shift:kbShift;st:#27'[c'),    {rxvt}
+       (char:0;scan:kbShiftLeft;shift:kbShift;st:#27'[d'),     {rxvt}
+       (char:0;scan:kbShiftEnd;shift:kbShift;st:#27'[1;2F'),   {xterm}
+       (char:0;scan:kbShiftEnd;shift:kbShift;st:#27'[8$'),     {rxvt}
+       (char:0;scan:kbShiftHome;shift:kbShift;st:#27'[1;2H'),  {xterm}
+       (char:0;scan:kbShiftHome;shift:kbShift;st:#27'[7$'),    {rxvt}
+
+       (char:0;scan:KbCtrlUp;shift:kbCtrl or kbShift;st:#27'[1;6A'),    {xterm}
+       (char:0;scan:KbCtrlDown;shift:kbCtrl or kbShift;st:#27'[1;6B'),  {xterm}
+       (char:0;scan:KbCtrlRight;shift:kbCtrl or kbShift;st:#27'[1;6C'), {xterm, xfce4}
+       (char:0;scan:KbCtrlLeft;shift:kbCtrl or kbShift;st:#27'[1;6D'),  {xterm, xfce4}
+       (char:0;scan:KbCtrlCenter;shift:kbCtrl or kbShift;st:#27'[1;6E'),{xterm}
+       (char:0;scan:KbCtrlHome;shift:kbCtrl or kbShift;st:#27'[1;6H'),  {xterm}
+       (char:0;scan:KbCtrlEnd;shift:kbCtrl or kbShift;st:#27'[1;6F'),   {xterm}
+       (char:0;scan:KbCtrlIns;shift:kbCtrl or kbShift;st:#27'[2;6~'),   {xterm}
+       (char:0;scan:KbCtrlDel;shift:kbCtrl or kbShift;st:#27'[3;6~'),   {xterm}
+       (char:0;scan:kbCtrlPgUp;shift:kbCtrl or kbShift;st:#27'[5;6~'),  {fpterm, xterm-compatible sequence (but xterm uses shift+pgup/pgdn for scrollback)}
+       (char:0;scan:kbCtrlPgDn;shift:kbCtrl or kbShift;st:#27'[6;6~'),  {fpterm, xterm-compatible sequence (but xterm uses shift+pgup/pgdn for scrollback)}
+
+       (char:0;scan:kbCtrlPgDn;shift:kbCtrl;st:#27'[6;5~'),    {xterm}
+       (char:0;scan:kbCtrlPgUp;shift:kbCtrl;st:#27'[5;5~'),    {xterm}
+       (char:0;scan:kbCtrlUp;shift:kbCtrl;st:#27'[1;5A'),      {xterm}
+       (char:0;scan:kbCtrlDown;shift:kbCtrl;st:#27'[1;5B'),    {xterm}
+       (char:0;scan:kbCtrlRight;shift:kbCtrl;st:#27'[1;5C'),   {xterm}
+       (char:0;scan:kbCtrlLeft;shift:kbCtrl;st:#27'[1;5D'),    {xterm}
+       (char:0;scan:kbCtrlCenter;shift:kbCtrl;st:#27'[1;5E'),  {xterm}
+       (char:0;scan:kbCtrlUp;shift:kbCtrl;st:#27'[Oa'),        {rxvt}
+       (char:0;scan:kbCtrlDown;shift:kbCtrl;st:#27'[Ob'),      {rxvt}
+       (char:0;scan:kbCtrlRight;shift:kbCtrl;st:#27'[Oc'),     {rxvt}
+       (char:0;scan:kbCtrlLeft;shift:kbCtrl;st:#27'[Od'),      {rxvt}
+       (char:0;scan:kbCtrlEnd;shift:kbCtrl;st:#27'[1;5F'),     {xterm}
+       (char:0;scan:kbCtrlEnd;shift:kbCtrl;st:#27'[8^'),       {rxvt}
+       (char:0;scan:kbCtrlHome;shift:kbCtrl;st:#27'[1;5H'),    {xterm}
+       (char:0;scan:kbCtrlHome;shift:kbCtrl;st:#27'[7^'),      {rxvt}
+
+       (char:0;scan:kbAltUp;shift:kbAlt;st:#27#27'[A'),        {rxvt}
+       (char:0;scan:kbAltDown;shift:kbAlt;st:#27#27'[B'),      {rxvt}
+       (char:0;scan:kbAltLeft;shift:kbAlt;st:#27#27'[D'),      {rxvt}
+       (char:0;scan:kbAltRight;shift:kbAlt;st:#27#27'[C'),     {rxvt}
 {$ifdef HAIKU}
-       (char:0;scan:kbAltUp;st:#27#27'OA'),
-       (char:0;scan:kbAltDown;st:#27#27'OB'),
-       (char:0;scan:kbAltRight;st:#27#27'OC'),
+       (char:0;scan:kbAltUp;shift:kbAlt;st:#27#27'OA'),
+       (char:0;scan:kbAltDown;shift:kbAlt;st:#27#27'OB'),
+       (char:0;scan:kbAltRight;shift:kbAlt;st:#27#27'OC'),
 {$else}
-       (char:0;scan:kbAltUp;st:#27'OA'),
-       (char:0;scan:kbAltDown;st:#27'OB'),
-       (char:0;scan:kbAltRight;st:#27'OC'),
+       (char:0;scan:kbAltUp;shift:kbAlt;st:#27'OA'),
+       (char:0;scan:kbAltDown;shift:kbAlt;st:#27'OB'),
+       (char:0;scan:kbAltRight;shift:kbAlt;st:#27'OC'),
 {$endif}
-       (char:0;scan:kbAltLeft;st:#27#27'OD'),
-       (char:0;scan:kbAltPgUp;st:#27#27'[5~'),   {rxvt}
-       (char:0;scan:kbAltPgDn;st:#27#27'[6~'),   {rxvt}
-       (char:0;scan:kbAltEnd;st:#27#27'[4~'),
-       (char:0;scan:kbAltEnd;st:#27#27'[8~'),    {rxvt}
-       (char:0;scan:kbAltHome;st:#27#27'[1~'),
-       (char:0;scan:kbAltHome;st:#27#27'[7~'),   {rxvt}
-       (char:0;scan:kbAltIns;st:#27#27'[2~'),    {rxvt}
-       (char:0;scan:kbAltDel;st:#27#27'[3~'),    {rxvt}
+       (char:0;scan:kbAltLeft;shift:kbAlt;st:#27#27'OD'),
+       (char:0;scan:kbAltPgUp;shift:kbAlt;st:#27#27'[5~'),     {rxvt}
+       (char:0;scan:kbAltPgDn;shift:kbAlt;st:#27#27'[6~'),     {rxvt}
+       (char:0;scan:kbAltEnd;shift:kbAlt;st:#27#27'[4~'),
+       (char:0;scan:kbAltEnd;shift:kbAlt;st:#27#27'[8~'),      {rxvt}
+       (char:0;scan:kbAltHome;shift:kbAlt;st:#27#27'[1~'),
+       (char:0;scan:kbAltHome;shift:kbAlt;st:#27#27'[7~'),     {rxvt}
+       (char:0;scan:kbAltIns;shift:kbAlt;st:#27#27'[2~'),      {rxvt}
+       (char:0;scan:kbAltDel;shift:kbAlt;st:#27#27'[3~'),      {rxvt}
+
+       (char:0;scan:KbAltUp;shift:kbAlt;st:#27'[1;3A'),        {xterm}
+       (char:0;scan:KbAltDown;shift:kbAlt;st:#27'[1;3B'),      {xterm}
+       (char:0;scan:KbAltRight;shift:kbAlt;st:#27'[1;3C'),     {xterm}
+       (char:0;scan:KbAltLeft;shift:kbAlt;st:#27'[1;3D'),      {xterm}
+       (char:0;scan:KbAltCenter;shift:kbAlt;st:#27'[1;3E'),    {xterm}
+       (char:0;scan:KbAltHome;shift:kbAlt;st:#27'[1;3H'),      {xterm}
+       (char:0;scan:KbAltEnd;shift:kbAlt;st:#27'[1;3F'),       {xterm}
+       (char:0;scan:KbAltIns;shift:kbAlt;st:#27'[2;3~'),       {xterm}
+       (char:0;scan:KbAltDel;shift:kbAlt;st:#27'[3;3~'),       {xterm}
+       (char:0;scan:kbAltPgUp;shift:kbAlt;st:#27'[5;3~'),      {xterm}
+       (char:0;scan:kbAltPgDn;shift:kbAlt;st:#27'[6;3~'),      {xterm}
+
+       (char:0;scan:KbAltUp;shift:kbShift or kbAlt;st:#27'[1;4A'),      {xterm}
+       (char:0;scan:KbAltDown;shift:kbShift or kbAlt;st:#27'[1;4B'),    {xterm}
+       (char:0;scan:KbAltRight;shift:kbShift or kbAlt;st:#27'[1;4C'),   {xterm}
+       (char:0;scan:KbAltLeft;shift:kbShift or kbAlt;st:#27'[1;4D'),    {xterm}
+       (char:0;scan:kbAltCenter;shift:kbShift or kbAlt;st:#27'[1;4E'),  {xterm}
+       (char:0;scan:KbAltHome;shift:kbShift or kbAlt;st:#27'[1;4H'),    {xterm}
+       (char:0;scan:KbAltEnd;shift:kbShift or kbAlt;st:#27'[1;4F'),     {xterm}
+       (char:0;scan:KbAltIns;shift:kbShift or kbAlt;st:#27'[2;4~'),     {xterm}
+       (char:0;scan:KbAltDel;shift:kbShift or kbAlt;st:#27'[3;4~'),     {xterm}
+       (char:0;scan:kbAltPgUp;shift:kbShift or kbAlt;st:#27'[5;4~'),    {xterm}
+       (char:0;scan:kbAltPgDn;shift:kbShift or kbAlt;st:#27'[6;4~'),    {xterm}
+
+       (char:0;scan:KbAltIns;shift:kbCtrl or kbAlt;st:#27'[2;7~'),     {xterm}
+       (char:0;scan:KbAltDel;shift:kbCtrl or kbAlt;st:#27'[3;7~'),     {xterm, Del on numpad}
+       (char:0;scan:kbAltPgUp;shift:kbCtrl or kbAlt;st:#27'[5;7~'),    {xterm}
+       (char:0;scan:kbAltPgDn;shift:kbCtrl or kbAlt;st:#27'[6;7~'),    {xterm}
+
+       (char:0;scan:KbAltUp;shift:kbCtrl or kbShift or kbAlt;st:#27'[1;8A'),      {xterm}
+       (char:0;scan:KbAltDown;shift:kbCtrl or kbShift or kbAlt;st:#27'[1;8B'),    {xterm}
+       (char:0;scan:KbAltRight;shift:kbCtrl or kbShift or kbAlt;st:#27'[1;8C'),   {xterm}
+       (char:0;scan:KbAltLeft;shift:kbCtrl or kbShift or kbAlt;st:#27'[1;8D'),    {xterm}
+       (char:0;scan:kbAltCenter;shift:kbCtrl or kbShift or kbAlt;st:#27'[1;8E'),  {xterm}
+       (char:0;scan:KbAltHome;shift:kbCtrl or kbShift or kbAlt;st:#27'[1;8H'),    {xterm}
+       (char:0;scan:KbAltEnd;shift:kbCtrl or kbShift or kbAlt;st:#27'[1;8F'),     {xterm}
+       (char:0;scan:KbAltIns;shift:kbCtrl or kbShift or kbAlt;st:#27'[2;8~'),     {xterm}
+       (char:0;scan:KbAltDel;shift:kbCtrl or kbShift or kbAlt;st:#27'[3;8~'),     {xterm}
+       (char:0;scan:kbAltPgUp;shift:kbCtrl or kbShift or kbAlt;st:#27'[5;8~'),    {xterm}
+       (char:0;scan:kbAltPgDn;shift:kbCtrl or kbShift or kbAlt;st:#27'[6;8~'),    {xterm}
 
   { xterm default values }
   { xterm alternate default values }
   { ignored sequences }
-       (char:0;scan:0;st:#27'[?1;0c'),
-       (char:0;scan:0;st:#27'[?1l'),
-       (char:0;scan:0;st:#27'[?1h'),
-       (char:0;scan:0;st:#27'[?1;2c'),
-       (char:0;scan:0;st:#27'[?7l'),
-       (char:0;scan:0;st:#27'[?7h')
+       (char:0;scan:0;shift:0;st:#27'[?1;0c'),
+       (char:0;scan:0;shift:0;st:#27'[?1l'),
+       (char:0;scan:0;shift:0;st:#27'[?1h'),
+       (char:0;scan:0;shift:0;st:#27'[?1;2c'),
+       (char:0;scan:0;shift:0;st:#27'[?7l'),
+       (char:0;scan:0;shift:0;st:#27'[?7h')
       );
 
 procedure LoadDefaultSequences;
@@ -1221,28 +1343,29 @@
   if copy(fpgetenv('TERM'),1,4)='cons' then
     begin
       {FreeBSD is until now only terminal that uses it for delete.}
-      DoAddSequence(#127,0,kbDel);        {Delete}
-      DoAddSequence(#27#127,0,kbAltDel);  {Alt+delete}
+      DoAddSequence(#127,0,kbDel,0);        {Delete}
+      DoAddSequence(#27#127,0,kbAltDel,kbAlt);  {Alt+delete}
     end
   else
     begin
-      DoAddSequence(#127,8,0);            {Backspace}
-      DoAddSequence(#27#127,0,kbAltBack); {Alt+backspace}
+      DoAddSequence(#127,8,0,0);            {Backspace}
+      DoAddSequence(#27#127,0,kbAltBack,kbAlt); {Alt+backspace}
     end;
   { all Esc letter }
   for i:=low(key_sequences) to high(key_sequences) do
     with key_sequences[i] do
-      DoAddSequence(st,char,scan);
+      DoAddSequence(st,char,scan,shift);
 end;
 
 function RawReadKey:char;
 var
   fdsin    : tfdSet;
+  lose: byte;
 begin
   {Check Buffer first}
   if KeySend<>KeyPut then
    begin
-     RawReadKey:=PopKey;
+     RawReadKey:=PopKey(lose);
      exit;
    end;
   {Wait for Key}
@@ -1279,7 +1402,7 @@
 end;
 
 
-function ReadKey(var IsAlt : boolean):char;
+function ReadKey(var IsAlt : byte):char;
 var
   ch       : char;
   fdsin    : tfdSet;
@@ -1293,15 +1416,15 @@
         i : byte;
       begin
         for i:=0 to arrayind-1 do
-          PushKey(store[i]);
+          PushKey(store[i],0);
       end;
 
 begin
-  IsAlt:=false;
+  IsAlt:=0;
 {Check Buffer first}
   if KeySend<>KeyPut then
    begin
-     ReadKey:=PopKey;
+     ReadKey:=PopKey(IsAlt);
      exit;
    end;
 {Wait for Key}
@@ -1314,7 +1437,7 @@
   ch:=ttyRecvChar;
   NPT:=RootTree[ch];
   if not assigned(NPT) then
-    PushKey(ch)
+    PushKey(ch,0)
   else
     begin
       fpFD_ZERO(fdsin);
@@ -1379,12 +1502,13 @@
           if assigned(NPT^.SpecialHandler) then
             begin
               NPT^.SpecialHandler;
-              PushExt(0);
+              PushExt(0,0);
             end
           else if NPT^.CharValue<>0 then
-            PushKey(chr(NPT^.CharValue))
+            PushKey(chr(NPT^.CharValue),NPT^.ShiftValue)
           else if NPT^.ScanValue<>0 then
-            PushExt(NPT^.ScanValue);
+            PushExt(NPT^.ScanValue,NPT^.ShiftValue);
+
         end
       else
         RestoreArray;
@@ -1393,7 +1517,7 @@
        writeln(f);
 {$endif logging}
 
-  ReadKey:=PopKey;
+  ReadKey:=PopKey(IsAlt);
 End;
 
 {$ifdef linux}
@@ -1566,15 +1690,11 @@
    (kbAltHome,kbAltUp,kbAltPgUp,kbNoKey,kbAltLeft,
     kbCenter,kbAltRight,kbAltGrayPlus,kbAltEnd,
     kbAltDown,kbAltPgDn,kbAltIns,kbAltDel);
-  ShiftArrow : array [kbShiftUp..kbShiftEnd] of byte =
-   (kbUp,kbLeft,kbRight,kbDown,kbHome,kbEnd);
-  CtrlShiftArrow : array [kbCtrlShiftUp..kbCtrlShiftEnd] of byte =
-   (kbCtrlUp,kbCtrlDown,kbCtrlRight,kbCtrlLeft,kbCtrlHome,kbCtrlEnd);
-
 var
   MyScan:byte;
   MyChar : char;
-  EscUsed,AltPrefixUsed,CtrlPrefixUsed,ShiftPrefixUsed,IsAlt,Again : boolean;
+  EscUsed,AltPrefixUsed,CtrlPrefixUsed,ShiftPrefixUsed,Again : boolean;
+  IsAlt:byte;
   SState:byte;
 
 begin {main}
@@ -1590,8 +1710,8 @@
   AltPrefixUsed:=false;
   ShiftPrefixUsed:=false;
   EscUsed:=false;
-  if IsAlt then
-    SState:=SState or kbAlt;
+  if IsAlt<>0 then
+    SState:=SState or IsAlt;
   repeat
     again:=false;
     if Mychar=#0 then
@@ -1630,18 +1750,6 @@
             kbF11..KbF12 : { sF11-sF12 }
               MyScan:=MyScan+kbShiftF11-kbF11;
           end;
-        if myscan in [kbShiftUp..kbCtrlShiftEnd] then
-          begin
-            if myscan <= kbShiftEnd then
-            begin
-               myscan:=ShiftArrow[myscan];
-               sstate:=sstate or kbshift;
-            end else
-            begin
-               myscan:=CtrlShiftArrow[myscan];
-               sstate:=sstate or kbshift or kbCtrl;
-            end;
-          end;
         if myscan=kbAltBack then
           sstate:=sstate or kbalt;
         if (MyChar<>#0) or (MyScan<>0) or (SState<>0) then
@@ -1732,8 +1840,8 @@
       begin
         MyChar:=Readkey(IsAlt);
         MyScan:=ord(MyChar);
-        if IsAlt then
-          SState:=SState or kbAlt;
+        if IsAlt<> 0then
+          SState:=SState or IsAlt;
       end;
     until not Again;
   if (MyChar<>#0) or (MyScan<>0) or (SState<>0) then
diff -ru a/packages/rtl-console/src/unix/keyboard.pp b/packages/rtl-console/src/unix/keyboard.pp
--- a/packages/rtl-console/src/unix/keyboard.pp	2024-05-09 00:13:05.000000000 +0000
+++ b/packages/rtl-console/src/unix/keyboard.pp	2024-05-27 18:16:38.119777000 +0000
@@ -103,22 +103,98 @@
 {$i keyscan.inc}
 
 {Some internal only scancodes}
-const KbShiftUp    = $f0;
-      KbShiftLeft  = $f1;
-      KbShiftRight = $f2;
-      KbShiftDown  = $f3;
-      KbShiftHome  = $f4;
-      KbShiftEnd   = $f5;
-      KbShiftPgUp  = $f6;
-      KbShiftPgDn  = $f7;
-      KbCtrlShiftUp    = $f8;
-      KbCtrlShiftDown  = $f9;
-      KbCtrlShiftRight = $fa;
-      KbCtrlShiftLeft  = $fb;
-      KbCtrlShiftHome  = $fc;
-      KbCtrlShiftEnd   = $fd;
-      KbCtrlShiftPgUp  = $fe;
-      KbCtrlShiftPgDn  = $ff;
+const
+      KbAltCenter = KbCenter;  {there is no true scancode for Alt+Center (Numpad "5") reusing Shift+Center}
+      { aliases of scancodes }
+      KbShiftUp     = KbUp;
+      KbShiftLeft   = KbLeft;
+      KbShiftRight  = KbRight;
+      KbShiftDown   = KbDown;
+      KbShiftCenter = KbCenter;
+      KbShiftHome   = KbHome;
+      KbShiftEnd    = KbEnd;
+      KbShiftPgUp   = KbPgUp;
+      KbShiftPgDn   = KbPgDn;
+
+      KbCtrlShiftUp     = KbCtrlUp;
+      KbCtrlShiftDown   = KbCtrlDown;
+      KbCtrlShiftRight  = KbCtrlRight;
+      KbCtrlShiftLeft   = KbCtrlLeft;
+      KbCtrlShiftCenter = KbCtrlCenter;
+      KbCtrlShiftHome   = KbCtrlHome;
+      KbCtrlShiftEnd    = KbCtrlEnd;
+      KbCtrlShiftIns    = kbCtrlIns;
+      KbCtrlShiftDel    = kbCtrlDel;
+      KbCtrlShiftPgUp   = KbCtrlPgUp;
+      KbCtrlShiftPgDn   = KbCtrlPgDn;
+
+      KbShiftAltUp      = KbAltUp;
+      KbShiftAltDown    = KbAltDown;
+      KbShiftAltRight   = KbAltRight;
+      KbShiftAltLeft    = KbAltLeft;
+      KbShiftAltCenter  = KbAltCenter;
+      KbShiftAltHome    = KbAltHome;
+      KbShiftAltEnd     = KbAltEnd;
+      KbShiftAltIns     = KbAltIns;
+      KbShiftAltDel     = KbAltDel;
+      kbShiftAltPgUp    = KbAltPgUp;
+      kbShiftAltPgDn    = KbAltPgDn;
+
+      KbCtrlAltIns      = KbAltIns;
+      KbCtrlAltDel      = KbAltDel;
+      kbCtrlAltPgUp     = KbAltPgUp;
+      kbCtrlAltPgDn     = KbAltPgDn;
+
+      KbCtrlShiftAltUp      = KbAltUp;
+      KbCtrlShiftAltDown    = KbAltDown;
+      KbCtrlShiftAltRight   = KbAltRight;
+      KbCtrlShiftAltLeft    = KbAltLeft;
+      kbCtrlShiftAltCenter  = KbAltCenter;
+      KbCtrlShiftAltHome    = KbAltHome;
+      KbCtrlShiftAltEnd     = KbAltEnd;
+      KbCtrlShiftAltIns     = KbAltIns;
+      KbCtrlShiftAltDel     = KbAltDel;
+      kbCtrlShiftAltPgUp    = KbAltPgUp;
+      kbCtrlShiftAltPgDn    = KbAltPgDn;
+
+      kbCtrlShiftF1     = kbCtrlF1;
+      kbCtrlShiftF2     = kbCtrlF2;
+      kbCtrlShiftF3     = kbCtrlF3;
+      kbCtrlShiftF4     = kbCtrlF4;
+      kbCtrlShiftF5     = kbCtrlF5;
+      kbCtrlShiftF6     = kbCtrlF6;
+      kbCtrlShiftF7     = kbCtrlF7;
+      kbCtrlShiftF8     = kbCtrlF8;
+      kbCtrlShiftF9     = kbCtrlF9;
+      kbCtrlShiftF10    = kbCtrlF10;
+      kbCtrlShiftF11    = kbCtrlF11;
+      kbCtrlShiftF12    = kbCtrlF12;
+
+      kbShiftAltF1      = kbAltF1;
+      kbShiftAltF2      = kbAltF2;
+      kbShiftAltF3      = kbAltF3;
+      kbShiftAltF4      = kbAltF4;
+      kbShiftAltF5      = kbAltF5;
+      kbShiftAltF6      = kbAltF6;
+      kbShiftAltF7      = kbAltF7;
+      kbShiftAltF8      = kbAltF8;
+      kbShiftAltF9      = kbAltF9;
+      kbShiftAltF10     = kbAltF10;
+      kbShiftAltF11     = kbAltF11;
+      kbShiftAltF12     = kbAltF12;
+
+      kbCtrlShiftAltF1  = kbAltF1;
+      kbCtrlShiftAltF2  = kbAltF2;
+      kbCtrlShiftAltF3  = kbAltF3;
+      kbCtrlShiftAltF4  = kbAltF4;
+      kbCtrlShiftAltF5  = kbAltF5;
+      kbCtrlShiftAltF6  = kbAltF6;
+      kbCtrlShiftAltF7  = kbAltF7;
+      kbCtrlShiftAltF8  = kbAltF8;
+      kbCtrlShiftAltF9  = kbAltF9;
+      kbCtrlShiftAltF10 = kbAltF10;
+      kbCtrlShiftAltF11 = kbAltF11;
+      kbCtrlShiftAltF12 = kbAltF12;
 
       double_esc_hack_enabled : boolean = false;
 
@@ -899,7 +976,7 @@
         st:string[7];
       end;
 
-const key_sequences:array[0..302] of key_sequence=(
+const key_sequences:array[0..380] of key_sequence=(
        (AnsiChar:0;scan:kbAltA;shift:[essAlt];st:#27'A'),
        (AnsiChar:0;scan:kbAltA;shift:[essAlt];st:#27'a'),
        (AnsiChar:0;scan:kbAltB;shift:[essAlt];st:#27'B'),
@@ -1173,12 +1250,52 @@
        (AnsiChar:0;scan:kbAltF11;shift:[essAlt];st:#27'[23;3~'),      {xterm on FreeBSD}
        (AnsiChar:0;scan:kbAltF12;shift:[essAlt];st:#27'[24;3~'),      {xterm on FreeBSD}
 
+       (AnsiChar:0;scan:kbCtrlShiftF1;shift:[essCtrl,essShift];st:#27'[1;6P'),      {xterm,gnome3}
+       (AnsiChar:0;scan:kbCtrlShiftF2;shift:[essCtrl,essShift];st:#27'[1;6Q'),      {xterm,gnome3}
+       (AnsiChar:0;scan:kbCtrlShiftF3;shift:[essCtrl,essShift];st:#27'[1;6R'),      {xterm,gnome3}
+       (AnsiChar:0;scan:kbCtrlShiftF4;shift:[essCtrl,essShift];st:#27'[1;6S'),      {xterm,gnome3}
+       (AnsiChar:0;scan:kbCtrlShiftF5;shift:[essCtrl,essShift];st:#27'[15;6~'),     {xterm}
+       (AnsiChar:0;scan:kbCtrlShiftF6;shift:[essCtrl,essShift];st:#27'[17;6~'),     {xterm}
+       (AnsiChar:0;scan:kbCtrlShiftF7;shift:[essCtrl,essShift];st:#27'[18;6~'),     {xterm}
+       (AnsiChar:0;scan:kbCtrlShiftF8;shift:[essCtrl,essShift];st:#27'[19;6~'),     {xterm}
+       (AnsiChar:0;scan:kbCtrlShiftF9;shift:[essCtrl,essShift];st:#27'[20;6~'),     {xterm}
+       (AnsiChar:0;scan:kbCtrlShiftF10;shift:[essCtrl,essShift];st:#27'[21;6~'),    {xterm}
+       (AnsiChar:0;scan:kbCtrlShiftF11;shift:[essCtrl,essShift];st:#27'[23;6~'),    {xterm}
+       (AnsiChar:0;scan:kbCtrlShiftF12;shift:[essCtrl,essShift];st:#27'[24;6~'),    {xterm}
+
+       (AnsiChar:0;scan:kbShiftAltF1;shift:[essShift,essAlt];st:#27'[1;4P'),        {xterm}
+       (AnsiChar:0;scan:kbShiftAltF2;shift:[essShift,essAlt];st:#27'[1;4Q'),        {xterm}
+       (AnsiChar:0;scan:kbShiftAltF3;shift:[essShift,essAlt];st:#27'[1;4R'),        {xterm}
+       (AnsiChar:0;scan:kbShiftAltF4;shift:[essShift,essAlt];st:#27'[1;4S'),        {xterm}
+       (AnsiChar:0;scan:kbShiftAltF5;shift:[essShift,essAlt];st:#27'[15;4~'),       {xterm}
+       (AnsiChar:0;scan:kbShiftAltF6;shift:[essShift,essAlt];st:#27'[17;4~'),       {xterm}
+       (AnsiChar:0;scan:kbShiftAltF7;shift:[essShift,essAlt];st:#27'[18;4~'),       {xterm}
+       (AnsiChar:0;scan:kbShiftAltF8;shift:[essShift,essAlt];st:#27'[19;4~'),       {xterm}
+       (AnsiChar:0;scan:kbShiftAltF9;shift:[essShift,essAlt];st:#27'[20;4~'),       {xterm}
+       (AnsiChar:0;scan:kbShiftAltF10;shift:[essShift,essAlt];st:#27'[21;4~'),      {xterm}
+       (AnsiChar:0;scan:kbShiftAltF11;shift:[essShift,essAlt];st:#27'[23;4~'),      {xterm}
+       (AnsiChar:0;scan:kbShiftAltF12;shift:[essShift,essAlt];st:#27'[24;4~'),      {xterm}
+
+       (AnsiChar:0;scan:kbCtrlShiftAltF1;shift:[essCtrl,essShift,essAlt];st:#27'[1;8P'),        {xterm}
+       (AnsiChar:0;scan:kbCtrlShiftAltF2;shift:[essCtrl,essShift,essAlt];st:#27'[1;8Q'),        {xterm}
+       (AnsiChar:0;scan:kbCtrlShiftAltF3;shift:[essCtrl,essShift,essAlt];st:#27'[1;8R'),        {xterm}
+       (AnsiChar:0;scan:kbCtrlShiftAltF4;shift:[essCtrl,essShift,essAlt];st:#27'[1;8S'),        {xterm}
+       (AnsiChar:0;scan:kbCtrlShiftAltF5;shift:[essCtrl,essShift,essAlt];st:#27'[15;8~'),       {xterm}
+       (AnsiChar:0;scan:kbCtrlShiftAltF6;shift:[essCtrl,essShift,essAlt];st:#27'[17;8~'),       {xterm}
+       (AnsiChar:0;scan:kbCtrlShiftAltF7;shift:[essCtrl,essShift,essAlt];st:#27'[18;8~'),       {xterm}
+       (AnsiChar:0;scan:kbCtrlShiftAltF8;shift:[essCtrl,essShift,essAlt];st:#27'[19;8~'),       {xterm}
+       (AnsiChar:0;scan:kbCtrlShiftAltF9;shift:[essCtrl,essShift,essAlt];st:#27'[20;8~'),       {xterm}
+       (AnsiChar:0;scan:kbCtrlShiftAltF10;shift:[essCtrl,essShift,essAlt];st:#27'[21;8~'),      {xterm}
+       (AnsiChar:0;scan:kbCtrlShiftAltF11;shift:[essCtrl,essShift,essAlt];st:#27'[23;8~'),      {xterm}
+       (AnsiChar:0;scan:kbCtrlShiftAltF12;shift:[essCtrl,essShift,essAlt];st:#27'[24;8~'),      {xterm}
+
        (AnsiChar:0;scan:kbShiftTab;shift:[essShift];st:#27#9),        {linux - 'Meta_Tab'}
        (AnsiChar:0;scan:kbShiftTab;shift:[essShift];st:#27'[Z'),
        (AnsiChar:0;scan:kbShiftUp;shift:[essShift];st:#27'[1;2A'),    {xterm}
        (AnsiChar:0;scan:kbShiftDown;shift:[essShift];st:#27'[1;2B'),  {xterm}
        (AnsiChar:0;scan:kbShiftRight;shift:[essShift];st:#27'[1;2C'), {xterm}
        (AnsiChar:0;scan:kbShiftLeft;shift:[essShift];st:#27'[1;2D'),  {xterm}
+       (AnsiChar:0;scan:kbShiftCenter;shift:[essShift];st:#27'[1;2E'),{xterm}
        (AnsiChar:0;scan:kbShiftPgUp;shift:[essShift];st:#27'[5;2~'),  {fpterm, xterm-compatible sequence (but xterm uses shift+pgup/pgdn for scrollback)}
        (AnsiChar:0;scan:kbShiftPgDn;shift:[essShift];st:#27'[6;2~'),  {fpterm, xterm-compatible sequence (but xterm uses shift+pgup/pgdn for scrollback)}
        (AnsiChar:0;scan:kbShiftUp;shift:[essShift];st:#27'[a'),       {rxvt}
@@ -1194,8 +1311,11 @@
        (AnsiChar:0;scan:KbCtrlShiftDown;shift:[essCtrl,essShift];st:#27'[1;6B'),  {xterm}
        (AnsiChar:0;scan:KbCtrlShiftRight;shift:[essCtrl,essShift];st:#27'[1;6C'), {xterm, xfce4}
        (AnsiChar:0;scan:KbCtrlShiftLeft;shift:[essCtrl,essShift];st:#27'[1;6D'),  {xterm, xfce4}
+       (AnsiChar:0;scan:KbCtrlShiftCenter;shift:[essCtrl,essShift];st:#27'[1;6E'),{xterm}
        (AnsiChar:0;scan:KbCtrlShiftHome;shift:[essCtrl,essShift];st:#27'[1;6H'),  {xterm}
        (AnsiChar:0;scan:KbCtrlShiftEnd;shift:[essCtrl,essShift];st:#27'[1;6F'),   {xterm}
+       (AnsiChar:0;scan:KbCtrlShiftIns;shift:[essCtrl,essShift];st:#27'[2;6~'),   {xterm}
+       (AnsiChar:0;scan:KbCtrlShiftDel;shift:[essCtrl,essShift];st:#27'[3;6~'),   {xterm}
        (AnsiChar:0;scan:kbCtrlShiftPgUp;shift:[essCtrl,essShift];st:#27'[5;6~'),  {fpterm, xterm-compatible sequence (but xterm uses shift+pgup/pgdn for scrollback)}
        (AnsiChar:0;scan:kbCtrlShiftPgDn;shift:[essCtrl,essShift];st:#27'[6;6~'),  {fpterm, xterm-compatible sequence (but xterm uses shift+pgup/pgdn for scrollback)}
 
@@ -1205,6 +1325,7 @@
        (AnsiChar:0;scan:kbCtrlDown;shift:[essCtrl];st:#27'[1;5B'),    {xterm}
        (AnsiChar:0;scan:kbCtrlRight;shift:[essCtrl];st:#27'[1;5C'),   {xterm}
        (AnsiChar:0;scan:kbCtrlLeft;shift:[essCtrl];st:#27'[1;5D'),    {xterm}
+       (AnsiChar:0;scan:kbCtrlCenter;shift:[essCtrl];st:#27'[1;5E'),  {xterm}
        (AnsiChar:0;scan:kbCtrlUp;shift:[essCtrl];st:#27'[Oa'),        {rxvt}
        (AnsiChar:0;scan:kbCtrlDown;shift:[essCtrl];st:#27'[Ob'),      {rxvt}
        (AnsiChar:0;scan:kbCtrlRight;shift:[essCtrl];st:#27'[Oc'),     {rxvt}
@@ -1237,6 +1358,47 @@
        (AnsiChar:0;scan:kbAltIns;shift:[essAlt];st:#27#27'[2~'),      {rxvt}
        (AnsiChar:0;scan:kbAltDel;shift:[essAlt];st:#27#27'[3~'),      {rxvt}
 
+       (AnsiChar:0;scan:KbAltUp;shift:[essAlt];st:#27'[1;3A'),        {xterm}
+       (AnsiChar:0;scan:KbAltDown;shift:[essAlt];st:#27'[1;3B'),      {xterm}
+       (AnsiChar:0;scan:KbAltRight;shift:[essAlt];st:#27'[1;3C'),     {xterm}
+       (AnsiChar:0;scan:KbAltLeft;shift:[essAlt];st:#27'[1;3D'),      {xterm}
+       (AnsiChar:0;scan:KbAltCenter;shift:[essAlt];st:#27'[1;3E'),    {xterm}
+       (AnsiChar:0;scan:KbAltHome;shift:[essAlt];st:#27'[1;3H'),      {xterm}
+       (AnsiChar:0;scan:KbAltEnd;shift:[essAlt];st:#27'[1;3F'),       {xterm}
+       (AnsiChar:0;scan:KbAltIns;shift:[essAlt];st:#27'[2;3~'),       {xterm}
+       (AnsiChar:0;scan:KbAltDel;shift:[essAlt];st:#27'[3;3~'),       {xterm}
+       (AnsiChar:0;scan:kbAltPgUp;shift:[essAlt];st:#27'[5;3~'),      {xterm}
+       (AnsiChar:0;scan:kbAltPgDn;shift:[essAlt];st:#27'[6;3~'),      {xterm}
+
+       (AnsiChar:0;scan:KbShiftAltUp;shift:[essShift,essAlt];st:#27'[1;4A'),      {xterm}
+       (AnsiChar:0;scan:KbShiftAltDown;shift:[essShift,essAlt];st:#27'[1;4B'),    {xterm}
+       (AnsiChar:0;scan:KbShiftAltRight;shift:[essShift,essAlt];st:#27'[1;4C'),   {xterm}
+       (AnsiChar:0;scan:KbShiftAltLeft;shift:[essShift,essAlt];st:#27'[1;4D'),    {xterm}
+       (AnsiChar:0;scan:kbShiftAltCenter;shift:[essShift,essAlt];st:#27'[1;4E'),  {xterm}
+       (AnsiChar:0;scan:KbShiftAltHome;shift:[essShift,essAlt];st:#27'[1;4H'),    {xterm}
+       (AnsiChar:0;scan:KbShiftAltEnd;shift:[essShift,essAlt];st:#27'[1;4F'),     {xterm}
+       (AnsiChar:0;scan:KbShiftAltIns;shift:[essShift,essAlt];st:#27'[2;4~'),     {xterm}
+       (AnsiChar:0;scan:KbShiftAltDel;shift:[essShift,essAlt];st:#27'[3;4~'),     {xterm}
+       (AnsiChar:0;scan:kbShiftAltPgUp;shift:[essShift,essAlt];st:#27'[5;4~'),    {xterm}
+       (AnsiChar:0;scan:kbShiftAltPgDn;shift:[essShift,essAlt];st:#27'[6;4~'),    {xterm}
+
+       (AnsiChar:0;scan:KbCtrlAltIns;shift:[essCtrl,essAlt];st:#27'[2;7~'),     {xterm}
+       (AnsiChar:0;scan:KbCtrlAltDel;shift:[essCtrl,essAlt];st:#27'[3;7~'),     {xterm, Del on numpad}
+       (AnsiChar:0;scan:kbCtrlAltPgUp;shift:[essCtrl,essAlt];st:#27'[5;7~'),    {xterm}
+       (AnsiChar:0;scan:kbCtrlAltPgDn;shift:[essCtrl,essAlt];st:#27'[6;7~'),    {xterm}
+
+       (AnsiChar:0;scan:KbCtrlShiftAltUp;shift:[essCtrl,essShift,essAlt];st:#27'[1;8A'),      {xterm}
+       (AnsiChar:0;scan:KbCtrlShiftAltDown;shift:[essCtrl,essShift,essAlt];st:#27'[1;8B'),    {xterm}
+       (AnsiChar:0;scan:KbCtrlShiftAltRight;shift:[essCtrl,essShift,essAlt];st:#27'[1;8C'),   {xterm}
+       (AnsiChar:0;scan:KbCtrlShiftAltLeft;shift:[essCtrl,essShift,essAlt];st:#27'[1;8D'),    {xterm}
+       (AnsiChar:0;scan:kbCtrlShiftAltCenter;shift:[essCtrl,essShift,essAlt];st:#27'[1;8E'),  {xterm}
+       (AnsiChar:0;scan:KbCtrlShiftAltHome;shift:[essCtrl,essShift,essAlt];st:#27'[1;8H'),    {xterm}
+       (AnsiChar:0;scan:KbCtrlShiftAltEnd;shift:[essCtrl,essShift,essAlt];st:#27'[1;8F'),     {xterm}
+       (AnsiChar:0;scan:KbCtrlShiftAltIns;shift:[essCtrl,essShift,essAlt];st:#27'[2;8~'),     {xterm}
+       (AnsiChar:0;scan:KbCtrlShiftAltDel;shift:[essCtrl,essShift,essAlt];st:#27'[3;8~'),     {xterm}
+       (AnsiChar:0;scan:kbCtrlShiftAltPgUp;shift:[essCtrl,essShift,essAlt];st:#27'[5;8~'),    {xterm}
+       (AnsiChar:0;scan:kbCtrlShiftAltPgDn;shift:[essCtrl,essShift,essAlt];st:#27'[6;8~'),    {xterm}
+
   { xterm default values }
   { xterm alternate default values }
   { ignored sequences }
@@ -1636,6 +1833,7 @@
               k.AsciiChar := chr(NPT^.CharValue);
               k.UnicodeChar := WideChar(NPT^.CharValue);
               k.VirtualScanCode := (NPT^.ScanValue shl 8) or Ord(k.AsciiChar);
+              k.ShiftState:=k.ShiftState+NPT^.ShiftValue;
               PushKey(k);
             end;
         end
@@ -1763,13 +1963,8 @@
     kbCtrlDown,kbCtrlPgDn,kbCtrlIns,kbCtrlDel);
   AltArrow : array [kbHome..kbDel] of byte =
    (kbAltHome,kbAltUp,kbAltPgUp,kbNoKey,kbAltLeft,
-    kbCenter,kbAltRight,kbAltGrayPlus,kbAltEnd,
+    kbAltCenter,kbAltRight,kbAltGrayPlus,kbAltEnd,
     kbAltDown,kbAltPgDn,kbAltIns,kbAltDel);
-  ShiftArrow : array [kbShiftUp..kbShiftPgDn] of byte =
-   (kbUp,kbLeft,kbRight,kbDown,kbHome,kbEnd,kbPgUp,kbPgDn);
-  CtrlShiftArrow : array [kbCtrlShiftUp..kbCtrlShiftPgDn] of byte =
-   (kbCtrlUp,kbCtrlDown,kbCtrlRight,kbCtrlLeft,kbCtrlHome,kbCtrlEnd,kbCtrlPgUp,kbCtrlPgDn);
-
 var
   MyScan:byte;
   MyChar : AnsiChar;
@@ -1830,18 +2028,6 @@
             kbF11..KbF12 : { sF11-sF12 }
               MyScan:=MyScan+kbShiftF11-kbF11;
           end;
-        if myscan in [kbShiftUp..kbCtrlShiftPgDn] then
-          begin
-            if myscan <= kbShiftPgDn then
-            begin
-               myscan:=ShiftArrow[myscan];
-               Include(sstate, essShift);
-            end else
-            begin
-               myscan:=CtrlShiftArrow[myscan];
-               sstate:=sstate + [essShift, essCtrl];
-            end;
-          end;
         if myscan=kbAltBack then
           Include(sstate, essAlt);
         if (MyChar<>#0) or (MyUniChar<>WideChar(0)) or (MyScan<>0) or (SState<>[]) then

diff -ru a/packages/rtl-console/src/unix/keyboard.pp b/packages/rtl-console/src/unix/keyboard.pp
--- a/packages/rtl-console/src/unix/keyboard.pp	2023-01-19 15:42:50.438798000 +0000
+++ b/packages/rtl-console/src/unix/keyboard.pp	2024-05-27 15:57:58.919861124 +0000
@@ -1536,6 +1536,7 @@
      case b of
       $08:EvalScan:=$0E; { backspace }
       $09:EvalScan:=$0F; { TAB }
+      $0A:EvalScan:=$1C; { LF }
       $0D:EvalScan:=$1C; { CR }
       $1B:EvalScan:=$01; { esc }
       $40:EvalScan:=$03; { @ }
diff -ru a/compiler/parser.pas b/compiler/parser.pas
--- a/compiler/parser.pas	2024-05-09 00:13:05.000000000 +0000
+++ b/compiler/parser.pas	2024-05-25 00:36:17.477438402 +0000
@@ -278,6 +278,8 @@
              unloaded_units.free;
              unloaded_units:=nil;
            end;
+         { Set default types to nil. At this point they are not valid class pointers. }
+         set_default_types_nil;
 
          { if there was an error in the scanner, the scanner is
            still assinged }
diff -ru a/compiler/symdef.pas b/compiler/symdef.pas
--- a/compiler/symdef.pas	2024-05-09 00:13:05.000000000 +0000
+++ b/compiler/symdef.pas	2024-05-25 01:40:44.230016407 +0000
@@ -1398,6 +1398,7 @@
     procedure get_tabledef(prefix:tinternaltypeprefix;countdef,elementdef:tdef;count:longint;packrecords:shortint;out recdef:trecorddef;out arrdef:tarraydef);
 
     function fileinfo_of_typesym_in_def(def:tdef;sym:tsym;out filepos:tfileposinfo):boolean;
+    procedure set_default_types_nil;
 
 implementation
 
@@ -9575,5 +9576,177 @@
 {$endif}
       end;
 
+    procedure set_default_types_nil;
+    begin
+    { set default types to nil }
+       voidpointertype:=nil;           { pointer for Void-pointeddef }
+       charpointertype:=nil;           { pointer for Char-pointeddef }
+       widecharpointertype:=nil;       { pointer for WideChar-pointeddef }
+       voidcodepointertype:=nil;       { pointer to code; corresponds to System.CodePointer }
+       voidstackpointertype:=nil;      { the pointer type used for accessing parameters and local vars on the stack }
+       parentfpvoidpointertype:=nil;   { void pointer with the size of the hidden parentfp parameter, passed to nested functions }
+{$ifdef x86}
+       voidnearpointertype:=nil;
+       voidnearcspointertype:=nil;
+       voidneardspointertype:=nil;
+       voidnearsspointertype:=nil;
+       voidnearespointertype:=nil;
+       voidnearfspointertype:=nil;
+       voidneargspointertype:=nil;
+  {$ifdef i8086}
+       voidfarpointertype:=nil;
+       voidhugepointertype:=nil;
+       charnearpointertype:=nil;
+       charfarpointertype:=nil;
+       charhugepointertype:=nil;
+       bytefarpointertype:=nil;        { used for Mem[] }
+       wordfarpointertype:=nil;        { used for MemW[] }
+       longintfarpointertype:=nil;     { used for MemL[] }
+  {$endif i8086}
+{$endif x86}
+{$ifdef wasm}
+       wasmvoidexternreftype:=nil;
+{$endif wasm}
+       cundefinedtype:=nil;
+       cformaltype:=nil;               { unique formal definition }
+       ctypedformaltype:=nil;          { unique typed formal definition }
+       voidtype:=nil;                  { Void (procedure) }
+       cansichartype:=nil;             { Char }
+       cwidechartype:=nil;             { WideChar }
+       cchartype:=nil;                 { either cansichartype or cwidechartype. Do not free }
+       pasbool1type:=nil;              { boolean type }
+       pasbool8type:=nil;
+       pasbool16type:=nil;
+       pasbool32type:=nil;
+       pasbool64type:=nil;
+       bool8type:=nil;
+       bool16type:=nil;
+       bool32type:=nil;
+       bool64type:=nil;                { implement me }
+{$ifdef llvm}
+       llvmbool1type:=nil;             { LLVM i1 type }
+{$endif llvm}
+       u8inttype:=nil;                 { 8-Bit unsigned integer }
+       s8inttype:=nil;                 { 8-Bit signed integer }
+       u16inttype:=nil;                { 16-Bit unsigned integer }
+       s16inttype:=nil;                { 16-Bit signed integer }
+       u24inttype:=nil;                { 24-Bit unsigned integer }
+       s24inttype:=nil;                { 24-Bit signed integer }
+       u32inttype:=nil;                { 32-Bit unsigned integer }
+       s32inttype:=nil;                { 32-Bit signed integer }
+       u40inttype:=nil;                { 40-Bit unsigned integer }
+       s40inttype:=nil;                { 40-Bit signed integer }
+       u48inttype:=nil;                { 48-Bit unsigned integer }
+       s48inttype:=nil;                { 48-Bit signed integer }
+       u56inttype:=nil;                { 56-Bit unsigned integer }
+       s56inttype:=nil;                { 56-Bit signed integer }
+       u64inttype:=nil;                { 64-bit unsigned integer }
+       s64inttype:=nil;                { 64-bit signed integer }
+       u128inttype:=nil;               { 128-bit unsigned integer }
+       s128inttype:=nil;               { 128-bit signed integer }
+       s32floattype:=nil;              { 32 bit floating point number }
+       s64floattype:=nil;              { 64 bit floating point number }
+       s80floattype:=nil;              { 80 bit floating point number }
+       sc80floattype:=nil;             { 80 bit floating point number but stored like in C }
+       s64currencytype:=nil;           { pointer to a currency type }
+       cshortstringtype:=nil;          { pointer to type of short string const   }
+       clongstringtype:=nil;           { pointer to type of long string const   }
+       cansistringtype:=nil;           { pointer to type of ansi string const  }
+       cwidestringtype:=nil;           { pointer to type of wide string const  }
+       cunicodestringtype:=nil;
+       openshortstringtype:=nil;       { pointer to type of an open shortstring,
+                                    needed for readln() }
+       openchararraytype:=nil;         { pointer to type of an open array of char,
+                                    needed for readln() }
+       cfiletype:=nil;                 { get the same definition for all file }
+                                  { used for stabs }
+       methodpointertype:=nil;         { typecasting of methodpointers to extract self }
+       nestedprocpointertype:=nil;     { typecasting of nestedprocpointers to extract parentfp }
+       hresultdef:=nil;
+       typekindtype:=nil;              { def of TTypeKind for correct handling of GetTypeKind parameters }
+       { we use only one variant def for every variant class }
+       cvarianttype:=nil;
+       colevarianttype:=nil;
+       { default integer type, normally s32inttype on 32 bit systems and s64bittype on 64 bit systems }
+       sinttype:=nil;
+       uinttype:=nil;
+       { integer types corresponding to OS_SINT/OS_INT }
+       ossinttype:=nil;
+       osuinttype:=nil;
+       { integer types corresponding to the ALU size, sizeof(aint) and the ALUSInt/ALUUInt types in the system unit }
+       alusinttype:=nil;
+       aluuinttype:=nil;
+       { integer types corresponding to SizeInt and SizeUInt for the target platform }
+       sizeuinttype:=nil;
+       sizesinttype:=nil;
+       { unsigned and signed ord type with the same size as a pointer }
+       ptruinttype:=nil;
+       ptrsinttype:=nil;
+       { unsigned and signed ord type with the same size as a codepointer }
+       codeptruinttype:=nil;
+       codeptrsinttype:=nil;
+       { several types to simulate more or less C++ objects for GDB }
+       vmttype:=nil;
+       vmtarraytype:=nil;
+       { type of classrefs, used for stabs }
+       pvmttype:=nil;
+       { return type of the setjmp function }
+       exceptionreasontype:=nil;
+
+       class_tobject:=nil;
+       class_tcustomattribute:=nil;
+       interface_iunknown:=nil;
+       interface_idispatch:=nil;
+       rec_tguid:=nil;
+       rec_jmp_buf:=nil;
+       rec_exceptaddr:=nil;
+       objc_metaclasstype:=nil;
+       objc_superclasstype:=nil;
+       objc_idtype:=nil;
+       objc_seltype:=nil;
+       objc_objecttype:=nil;
+       { base type of @protocol(protocolname) Objective-C statements }
+       objc_protocoltype:=nil;
+       { helper types for for-in "fast enumeration" support in Objective-C 2.0 }
+       objc_fastenumeration:=nil;
+       objc_fastenumerationstate:=nil;
+
+{$ifdef llvm}
+       { llvm types }
+       { a unique def to identify any kind of metadata }
+       llvm_metadatatype:=nil;
+{$endif llvm}
+
+       { Java base types }
+       { java.lang.Object }
+       java_jlobject:=nil;
+       { java.lang.Throwable }
+       java_jlthrowable:=nil;
+       { FPC base type for records }
+       java_fpcbaserecordtype:=nil;
+       { java.lang.String }
+       java_jlstring:=nil;
+       { java.lang.Enum }
+       java_jlenum:=nil;
+       { java.util.EnumSet }
+       java_juenumset:=nil;
+       { java.util.BitSet }
+       java_jubitset:=nil;
+       { FPC java implementation of ansistrings }
+       java_ansistring:=nil;
+       { FPC java implementation of shortstrings }
+       java_shortstring:=nil;
+       { FPC java procvar base class }
+       java_procvarbase:=nil;
+
+       { x86 vector types }
+       x86_m64type:=nil;
+       x86_m128type:=nil;
+       x86_m128dtype:=nil;
+       x86_m128itype:=nil;
+       x86_m256type:=nil;
+       x86_m256dtype:=nil;
+       x86_m256itype:=nil;
+    end;
 
 end.
diff -ru a/compiler/symtable.pas b/compiler/symtable.pas
--- a/compiler/symtable.pas	2024-05-09 00:13:05.000000000 +0000
+++ b/compiler/symtable.pas	2024-05-25 01:39:37.721249657 +0000
@@ -5055,19 +5055,6 @@
        { unit aliases }
        unitaliases:=TFPHashObjectList.create;
 {$endif}
-       { set some global vars to nil, might be important for the ide }
-       class_tobject:=nil;
-       class_tcustomattribute:=nil;
-       interface_iunknown:=nil;
-       interface_idispatch:=nil;
-       rec_tguid:=nil;
-       rec_jmp_buf:=nil;
-       rec_exceptaddr:=nil;
-       objc_metaclasstype:=nil;
-       objc_superclasstype:=nil;
-       objc_idtype:=nil;
-       objc_seltype:=nil;
-       objc_objecttype:=nil;
        dupnr:=0;
      end;
 
_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel

Reply via email to