浏览代码

* fixed the key codes of the Shift-Key combinations in the X11 console

git-svn-id: trunk@23133 -
nickysn 12 年之前
父节点
当前提交
ca61631524

+ 1 - 40
packages/ptc/src/x11/x11dga1displayi.inc

@@ -347,45 +347,6 @@ var
     Result := False;
   end;
 
-  procedure HandleKeyEvent;
-  var
-    sym: TKeySym;
-    sym_modded: TKeySym; { modifiers like shift are taken into account here }
-    press: Boolean;
-    alt, shift, ctrl: Boolean;
-    uni: Integer;
-    key: TPTCKeyEvent;
-    buf: array [1..16] of Char;
-  begin
-    sym := XLookupKeySym(@e.xkey, 0);
-    XLookupString(@e.xkey, @buf, SizeOf(buf), @sym_modded, Nil);
-    uni := X11ConvertKeySymToUnicode(sym_modded);
-    alt := (e.xkey.state and Mod1Mask) <> 0;
-    shift := (e.xkey.state and ShiftMask) <> 0;
-    ctrl := (e.xkey.state and ControlMask) <> 0;
-    if e._type = KeyPress then
-      press := True
-    else
-      press := False;
-
-    // XK_ISO_Left_Tab is Shift-Tab
-    if sym_modded = XK_ISO_Left_Tab then
-    begin
-      sym_modded := XK_Tab;
-      uni := 9;
-      shift := True;
-    end;
-
-    key := nil;
-    case sym_modded shr 8 of
-      0: key := TPTCKeyEvent.Create(FNormalKeys[sym_modded and $FF], uni, alt, shift, ctrl, press);
-      $FF: key := TPTCKeyEvent.Create(FFunctionKeys[sym_modded and $FF], uni, alt, shift, ctrl, press);
-      else
-        key := TPTCKeyEvent.Create;
-    end;
-    FEventQueue.AddEvent(key);
-  end;
-
 begin
   NewFocusSpecified := False;
   while UsefulEventsPending do
@@ -407,7 +368,7 @@ begin
       Expose: begin
         {...}
       end;
-      KeyPress, KeyRelease: HandleKeyEvent;
+      KeyPress, KeyRelease: HandleKeyEvent(e.xkey);
       ButtonPress, ButtonRelease: begin
         {...}
       end;

+ 1 - 34
packages/ptc/src/x11/x11dga2displayi.inc

@@ -417,42 +417,9 @@ var
   var
     XDGAKeyEvent: TXDGAKeyEvent absolute e;
     XKeyEvent: TXKeyEvent;
-    sym: TKeySym;
-    sym_modded: TKeySym; { modifiers like shift are taken into account here }
-    press: Boolean;
-    alt, shift, ctrl: Boolean;
-    uni: Integer;
-    key: TPTCKeyEvent;
-    buf: array [1..16] of Char;
   begin
     XDGAKeyEventToXKeyEvent(@XDGAKeyEvent, @XKeyEvent);
-    sym := XLookupKeySym(@XKeyEvent, 0);
-    XLookupString(@XKeyEvent, @buf, SizeOf(buf), @sym_modded, nil);
-    uni := X11ConvertKeySymToUnicode(sym_modded);
-    alt := (XDGAKeyEvent.state and Mod1Mask) <> 0;
-    shift := (XDGAKeyEvent.state and ShiftMask) <> 0;
-    ctrl := (XDGAKeyEvent.state and ControlMask) <> 0;
-    if XDGAKeyEvent._type = (KeyPress + FXDGAEventBase) then
-      press := True
-    else
-      press := False;
-
-    // XK_ISO_Left_Tab is Shift-Tab
-    if sym_modded = XK_ISO_Left_Tab then
-    begin
-      sym_modded := XK_Tab;
-      uni := 9;
-      shift := True;
-    end;
-
-    key := nil;
-    case sym_modded shr 8 of
-      0: key := TPTCKeyEvent.Create(FNormalKeys[sym_modded and $FF], uni, alt, shift, ctrl, press);
-      $FF: key := TPTCKeyEvent.Create(FFunctionKeys[sym_modded and $FF], uni, alt, shift, ctrl, press);
-      else
-        key := TPTCKeyEvent.Create;
-    end;
-    FEventQueue.AddEvent(key);
+    HandleKeyEvent(XKeyEvent);
   end;
 
 begin

+ 1 - 0
packages/ptc/src/x11/x11displayd.inc

@@ -89,6 +89,7 @@ type
     function GetPitch: Integer; virtual; abstract;
     function GetFormat: IPTCFormat;
     function GetArea: IPTCArea;
+    procedure HandleKeyEvent(const e: TXKeyEvent);
   public
     constructor Create(ADisplay: PDisplay; AScreen: Integer; const AFlags: TX11Flags); virtual;
     destructor Destroy; override;

+ 54 - 0
packages/ptc/src/x11/x11displayi.inc

@@ -443,6 +443,60 @@ begin
   FNormalKeys[$FF and XK_z] := Integer(PTCKEY_Z);
 end;
 
+procedure TX11Display.HandleKeyEvent(const e: TXKeyEvent);
+var
+  sym: TKeySym;
+  sym_modded: TKeySym; { modifiers like shift are taken into account here }
+  press: Boolean;
+  alt, shift, ctrl: Boolean;
+  uni: Integer;
+  key: TPTCKeyEvent;
+  buf: array [1..16] of Char;
+begin
+  sym := XLookupKeySym(@e, 0);
+  XLookupString(@e, @buf, SizeOf(buf), @sym_modded, nil);
+//  Writeln('sym_modded = ', sym_modded);
+  uni := X11ConvertKeySymToUnicode(sym_modded);
+  alt := (e.state and Mod1Mask) <> 0;
+  shift := (e.state and ShiftMask) <> 0;
+  ctrl := (e.state and ControlMask) <> 0;
+  if e._type = KeyPress then
+    press := True
+  else
+    press := False;
+
+  // XK_ISO_Left_Tab is Shift-Tab
+  if sym_modded = XK_ISO_Left_Tab then
+  begin
+    sym_modded := XK_Tab;
+    uni := 9;
+    shift := True;
+  end;
+
+  // Hack, used for handling the code of Shift-Key combinations
+  case sym_modded shr 8 of
+    0:
+      begin
+        if FNormalKeys[sym_modded and $FF] = 0 then
+          sym_modded := sym;
+      end;
+    $FF:
+      begin
+        if FFunctionKeys[sym_modded and $FF] = 0 then
+          sym_modded := sym;
+      end;
+  end;
+
+  key := nil;
+  case sym_modded shr 8 of
+    0: key := TPTCKeyEvent.Create(FNormalKeys[sym_modded and $FF], uni, alt, shift, ctrl, press);
+    $FF: key := TPTCKeyEvent.Create(FFunctionKeys[sym_modded and $FF], uni, alt, shift, ctrl, press);
+    else
+      key := TPTCKeyEvent.Create;
+  end;
+  FEventQueue.AddEvent(key);
+end;
+
 procedure TX11Display.OpenGL_SwapBuffers;
 begin
   raise TPTCError.Create('Not in OpenGL mode');

+ 1 - 41
packages/ptc/src/x11/x11windowdisplayi.inc

@@ -430,46 +430,6 @@ var
     Result := False;
   end;
 
-  procedure HandleKeyEvent;
-  var
-    sym: TKeySym;
-    sym_modded: TKeySym; { modifiers like shift are taken into account here }
-    press: Boolean;
-    alt, shift, ctrl: Boolean;
-    uni: Integer;
-    key: TPTCKeyEvent;
-    buf: array [1..16] of Char;
-  begin
-    sym := XLookupKeySym(@e.xkey, 0);
-    XLookupString(@e.xkey, @buf, SizeOf(buf), @sym_modded, nil);
-//    Writeln('sym_modded = ', sym_modded);
-    uni := X11ConvertKeySymToUnicode(sym_modded);
-    alt := (e.xkey.state and Mod1Mask) <> 0;
-    shift := (e.xkey.state and ShiftMask) <> 0;
-    ctrl := (e.xkey.state and ControlMask) <> 0;
-    if e._type = KeyPress then
-      press := True
-    else
-      press := False;
-
-    // XK_ISO_Left_Tab is Shift-Tab
-    if sym_modded = XK_ISO_Left_Tab then
-    begin
-      sym_modded := XK_Tab;
-      uni := 9;
-      shift := True;
-    end;
-
-    key := nil;
-    case sym_modded shr 8 of
-      0: key := TPTCKeyEvent.Create(FNormalKeys[sym_modded and $FF], uni, alt, shift, ctrl, press);
-      $FF: key := TPTCKeyEvent.Create(FFunctionKeys[sym_modded and $FF], uni, alt, shift, ctrl, press);
-      else
-        key := TPTCKeyEvent.Create;
-    end;
-    FEventQueue.AddEvent(key);
-  end;
-
   procedure HandleMouseEvent;
   var
     x, y: cint;
@@ -591,7 +551,7 @@ begin
         if e.xexpose.count = 0 then
           Draw;
       end;
-      KeyPress, KeyRelease: HandleKeyEvent;
+      KeyPress, KeyRelease: HandleKeyEvent(e.xkey);
       ButtonPress, ButtonRelease, MotionNotify: HandleMouseEvent;
     end;
   end;