浏览代码

* patch by Nikolay Nikolov to support Alt-Tab and Ctrl-Tab on the linux console, resolves #19247

git-svn-id: trunk@18225 -
florian 14 年之前
父节点
当前提交
c32bc3a22a
共有 1 个文件被更改,包括 24 次插入5 次删除
  1. 24 5
      rtl/unix/keyboard.pp

+ 24 - 5
rtl/unix/keyboard.pp

@@ -742,7 +742,7 @@ type  key_sequence=packed record
         st:string[7];
       end;
 
-const key_sequences:array[0..276] of key_sequence=(
+const key_sequences:array[0..277] of key_sequence=(
        (char:0;scan:kbAltA;st:#27'A'),
        (char:0;scan:kbAltA;st:#27'a'),
        (char:0;scan:kbAltB;st:#27'B'),
@@ -982,6 +982,7 @@ const key_sequences:array[0..276] of key_sequence=(
        (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}
@@ -1432,6 +1433,7 @@ begin {main}
         { Handle Ctrl-<x>, but not AltGr-<x> }
         if ((SState and kbCtrl)<>0) and ((SState and kbAlt) = 0)  then
           case MyScan of
+            kbShiftTab: MyScan := kbCtrlTab;
             kbHome..kbDel : { cArrow }
               MyScan:=CtrlArrow[MyScan];
             kbF1..KbF10 : { cF1-cF10 }
@@ -1442,6 +1444,7 @@ begin {main}
         { Handle Alt-<x>, but not AltGr }
         else if ((SState and kbAlt)<>0) and ((SState and kbCtrl) = 0) then
           case MyScan of
+            kbShiftTab: MyScan := kbAltTab;
             kbHome..kbDel : { AltArrow }
               MyScan:=AltArrow[MyScan];
             kbF1..KbF10 : { aF1-aF10 }
@@ -1520,11 +1523,27 @@ begin {main}
     if not again then
       begin
         MyScan:=EvalScan(ord(MyChar));
-        if ((SState and kbAlt)<>0) and ((SState and kbCtrl) = 0) then
+        if ((SState and kbCtrl)<>0) and ((SState and kbAlt) = 0) then
           begin
-            if MyScan in [$02..$0D] then
-              inc(MyScan,$76);
-            MyChar:=chr(0);
+            if MyChar=#9 then
+              begin
+                MyChar:=#0;
+                MyScan:=kbCtrlTab;
+              end;
+          end
+        else if ((SState and kbAlt)<>0) and ((SState and kbCtrl) = 0) then
+          begin
+            if MyChar=#9 then
+              begin
+                MyChar:=#0;
+                MyScan:=kbAltTab;
+              end
+            else
+              begin
+                if MyScan in [$02..$0D] then
+                  inc(MyScan,$76);
+                MyChar:=chr(0);
+              end;
           end
         else if (SState and kbShift)<>0 then
           if MyChar=#9 then