DEADSOFTWARE

GUI: Make credits background darker
[d2df-sdl.git] / src / game / g_gui.pas
index d7735ab374d568a4e51cf47c543f1a2c458d7522..bc33eff23182b207e972b384473ce25778cfdf70 100644 (file)
@@ -1,4 +1,4 @@
-(* Copyright (C)  DooM 2D:Forever Developers
+(* Copyright (C)  Doom 2D: Forever Developers
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -19,7 +19,8 @@ unit g_gui;
 interface
 
 uses
-  e_graphics, e_input, e_log, g_playermodel, g_basic, MAPDEF, wadreader;
+  {$IFDEF USE_MEMPOOL}mempool,{$ENDIF}
+  e_graphics, e_input, e_log, g_playermodel, g_basic, g_touch, MAPDEF, utils;
 
 const
   MAINMENU_HEADER_COLOR: TRGB = (R:255; G:255; B:255);
@@ -82,9 +83,9 @@ type
     lParam: LongInt;
   end;
 
-  TFontType = (FONT_TEXTURE, FONT_CHAR);
+  TFontType = (Texture, Character);
 
-  TFont = class(TObject)
+  TFont = class{$IFDEF USE_MEMPOOL}(TPoolObject){$ENDIF}
   private
     ID: DWORD;
     FScale: Single;
@@ -108,7 +109,7 @@ type
   TOnChangeEvent = procedure(Sender: TGUIControl);
   TOnEnterEvent = procedure(Sender: TGUIControl);
 
-  TGUIControl = class
+  TGUIControl = class{$IFDEF USE_MEMPOOL}(TPoolObject){$ENDIF}
   private
     FX, FY: Integer;
     FEnabled: Boolean;
@@ -133,7 +134,7 @@ type
     property RightAlign: Boolean read FRightAlign write FRightAlign; // for menu
   end;
 
-  TGUIWindow = class
+  TGUIWindow = class{$IFDEF USE_MEMPOOL}(TPoolObject){$ENDIF}
   private
     FActiveControl: TGUIControl;
     FDefControl: string;
@@ -267,6 +268,7 @@ type
     FMiddleID: DWORD;
     FOnChangeEvent: TOnChangeEvent;
     FOnEnterEvent: TOnEnterEvent;
+    FInvalid: Boolean;
     procedure SetText(Text: string);
   public
     constructor Create(FontID: DWORD);
@@ -282,6 +284,7 @@ type
     property Text: string read FText write SetText;
     property Color: TRGB read FColor write FColor;
     property Font: TFont read FFont write FFont;
+    property Invalid: Boolean read FInvalid write FInvalid;
   end;
 
   TGUIKeyRead = class(TGUIControl)
@@ -378,7 +381,7 @@ type
 
   TGUIListBox = class(TGUIControl)
   private
-    FItems: SArray;
+    FItems: SSArray;
     FActiveColor: TRGB;
     FUnActiveColor: TRGB;
     FFont: TFont;
@@ -391,7 +394,7 @@ type
     FDrawScroll: Boolean;
     FOnChangeEvent: TOnChangeEvent;
 
-    procedure FSetItems(Items: SArray);
+    procedure FSetItems(Items: SSArray);
     procedure FSetIndex(aIndex: Integer);
 
   public
@@ -408,7 +411,7 @@ type
     property OnChange: TOnChangeEvent read FOnChangeEvent write FOnChangeEvent;
     property Sort: Boolean read FSort write FSort;
     property ItemIndex: Integer read FIndex write FSetIndex;
-    property Items: SArray read FItems write FSetItems;
+    property Items: SSArray read FItems write FSetItems;
     property DrawBack: Boolean read FDrawBack write FDrawBack;
     property DrawScrollBar: Boolean read FDrawScroll write FDrawScroll;
     property ActiveColor: TRGB read FActiveColor write FActiveColor;
@@ -416,7 +419,7 @@ type
     property Font: TFont read FFont write FFont;
   end;
 
-  TGUIFileListBox = class (TGUIListBox)
+  TGUIFileListBox = class(TGUIListBox)
   private
     FBasePath: String;
     FPath: String;
@@ -438,7 +441,7 @@ type
 
   TGUIMemo = class(TGUIControl)
   private
-    FLines: SArray;
+    FLines: SSArray;
     FFont: TFont;
     FStartLine: Integer;
     FWidth: Word;
@@ -542,16 +545,20 @@ function  g_GUI_Destroy(): Boolean;
 procedure g_GUI_SaveMenuPos();
 procedure g_GUI_LoadMenuPos();
 
+
 implementation
 
 uses
-  GL, GLExt, g_textures, g_sound, SysUtils,
+  {$INCLUDE ../nogl/noGLuses.inc}
+  g_textures, g_sound, SysUtils,
   g_game, Math, StrUtils, g_player, g_options,
-  g_map, g_weapons, xdynrec;
+  g_map, g_weapons, xdynrec, wadreader;
+
 
 var
   Box: Array [0..8] of DWORD;
-  Saved_Windows: SArray;
+  Saved_Windows: SSArray;
+
 
 procedure g_GUI_Init();
 begin
@@ -813,6 +820,10 @@ begin
     else
       e_Clear(GL_COLOR_BUFFER_BIT, 0.5, 0.5, 0.5);
 
+  // small hack here
+  if FName = 'AuthorsMenu' then
+    e_DarkenQuadWH(0, 0, gScreenWidth, gScreenHeight, 150);
+
   for i := 0 to High(Childs) do
     if Childs[i] <> nil then Childs[i].Draw;
 end;
@@ -824,7 +835,7 @@ begin
   if @FOnKeyDownEx <> nil then FOnKeyDownEx(self, Msg.wParam);
 
   if Msg.Msg = WM_KEYDOWN then
-    if Msg.wParam = IK_ESCAPE then
+    if (Msg.wParam = IK_ESCAPE) or (Msg.wParam = VK_ESCAPE) then
     begin
       g_GUI_HideWindow;
       Exit;
@@ -914,7 +925,7 @@ begin
   Self.Proc := aProc;
   ProcEx := nil;
 
-  FFont := TFont.Create(FontID, FONT_CHAR);
+  FFont := TFont.Create(FontID, TFontType.Character);
 
   FText := Text;
 end;
@@ -955,7 +966,7 @@ begin
   case Msg.Msg of
     WM_KEYDOWN:
       case Msg.wParam of
-        IK_RETURN, IK_KPRETURN: Click();
+        IK_RETURN, IK_KPRETURN, VK_FIRE, VK_OPEN: Click();
       end;
   end;
 end;
@@ -983,7 +994,7 @@ end;
 
 procedure TFont.Draw(X, Y: Integer; Text: string; R, G, B: Byte);
 begin
-  if FFontType = FONT_CHAR then e_CharFont_PrintEx(ID, X, Y, Text, _RGB(R, G, B), FScale)
+  if FFontType = TFontType.Character then e_CharFont_PrintEx(ID, X, Y, Text, _RGB(R, G, B), FScale)
   else e_TextureFontPrintEx(X, Y, Text, ID, R, G, B, FScale);
 end;
 
@@ -991,7 +1002,7 @@ procedure TFont.GetTextSize(Text: string; var w, h: Word);
 var
   cw, ch: Byte;
 begin
-  if FFontType = FONT_CHAR then e_CharFont_GetSize(ID, Text, w, h)
+  if FFontType = TFontType.Character then e_CharFont_GetSize(ID, Text, w, h)
   else
   begin
     e_TextureFontGetSize(ID, cw, ch);
@@ -1169,7 +1180,7 @@ begin
   case Msg.Msg of
     WM_KEYDOWN:
       case Msg.wParam of
-        IK_UP, IK_KPUP:
+        IK_UP, IK_KPUP, VK_UP:
         begin
           repeat
             Dec(FIndex);
@@ -1178,7 +1189,7 @@ begin
 
           g_Sound_PlayEx(MENU_CHANGESOUND);
         end;
-        IK_DOWN, IK_KPDOWN:
+        IK_DOWN, IK_KPDOWN, VK_DOWN:
         begin
           repeat
             Inc(FIndex);
@@ -1187,7 +1198,7 @@ begin
 
           g_Sound_PlayEx(MENU_CHANGESOUND);
         end;
-        IK_RETURN, IK_KPRETURN: if (FIndex <> -1) and FButtons[FIndex].FEnabled then FButtons[FIndex].Click;
+        IK_RETURN, IK_KPRETURN, VK_FIRE, VK_OPEN: if (FIndex <> -1) and FButtons[FIndex].FEnabled then FButtons[FIndex].Click;
       end;
   end;
 end;
@@ -1214,7 +1225,7 @@ constructor TGUILabel.Create(Text: string; FontID: DWORD);
 begin
   inherited Create();
 
-  FFont := TFont.Create(FontID, FONT_CHAR);
+  FFont := TFont.Create(FontID, TFontType.Character);
 
   FText := Text;
   FFixedLen := 0;
@@ -1264,7 +1275,7 @@ begin
   case Msg.Msg of
     WM_KEYDOWN:
       case Msg.wParam of
-        IK_RETURN, IK_KPRETURN: if @FOnClickEvent <> nil then FOnClickEvent();
+        IK_RETURN, IK_KPRETURN, VK_FIRE, VK_OPEN: if @FOnClickEvent <> nil then FOnClickEvent();
       end;
   end;
 end;
@@ -1318,7 +1329,7 @@ end;
 procedure TGUIMenu.AddText(fText: string; MaxWidth: Word);
 var
   a, i: Integer;
-  l: SArray;
+  l: SSArray;
 begin
   l := GetLines(fText, FFontID, MaxWidth);
 
@@ -1516,7 +1527,7 @@ begin
     WM_KEYDOWN:
     begin
       case Msg.wParam of
-        IK_UP, IK_KPUP:
+        IK_UP, IK_KPUP, VK_UP:
         begin
           c := 0;
           repeat
@@ -1537,7 +1548,7 @@ begin
           g_Sound_PlayEx(MENU_CHANGESOUND);
         end;
 
-        IK_DOWN, IK_KPDOWN:
+        IK_DOWN, IK_KPDOWN, VK_DOWN:
         begin
           c := 0;
           repeat
@@ -1558,13 +1569,13 @@ begin
           g_Sound_PlayEx(MENU_CHANGESOUND);
         end;
 
-        IK_LEFT, IK_RIGHT, IK_KPLEFT, IK_KPRIGHT:
+        IK_LEFT, IK_RIGHT, IK_KPLEFT, IK_KPRIGHT, VK_LEFT, VK_RIGHT:
         begin
           if FIndex <> -1 then
             if FItems[FIndex].Control <> nil then
               FItems[FIndex].Control.OnMessage(Msg);
         end;
-        IK_RETURN, IK_KPRETURN:
+        IK_RETURN, IK_KPRETURN, VK_FIRE, VK_OPEN:
         begin
           if FIndex <> -1 then
           begin
@@ -2093,14 +2104,14 @@ begin
     WM_KEYDOWN:
     begin
       case Msg.wParam of
-        IK_LEFT, IK_KPLEFT:
+        IK_LEFT, IK_KPLEFT, VK_LEFT:
           if FValue > 0 then
           begin
             Dec(FValue);
             g_Sound_PlayEx(SCROLL_SUBSOUND);
             if @FOnChangeEvent <> nil then FOnChangeEvent(Self);
           end;
-        IK_RIGHT, IK_KPRIGHT:
+        IK_RIGHT, IK_KPRIGHT, VK_RIGHT:
           if FValue < FMax then
           begin
             Inc(FValue);
@@ -2134,7 +2145,7 @@ begin
 
   FIndex := -1;
 
-  FFont := TFont.Create(FontID, FONT_CHAR);
+  FFont := TFont.Create(FontID, TFontType.Character);
 end;
 
 procedure TGUISwitch.Draw;
@@ -2177,7 +2188,7 @@ begin
   case Msg.Msg of
     WM_KEYDOWN:
       case Msg.wParam of
-        IK_RETURN, IK_RIGHT, IK_KPRETURN, IK_KPRIGHT:
+        IK_RETURN, IK_RIGHT, IK_KPRETURN, IK_KPRIGHT, VK_FIRE, VK_OPEN, VK_RIGHT:
         begin
           if FIndex < High(FItems) then
             Inc(FIndex)
@@ -2188,7 +2199,7 @@ begin
             FOnChangeEvent(Self);
         end;
 
-    IK_LEFT, IK_KPLEFT:
+    IK_LEFT, IK_KPLEFT, VK_LEFT:
       begin
         if FIndex > 0 then
           Dec(FIndex)
@@ -2214,10 +2225,11 @@ constructor TGUIEdit.Create(FontID: DWORD);
 begin
   inherited Create();
 
-  FFont := TFont.Create(FontID, FONT_CHAR);
+  FFont := TFont.Create(FontID, TFontType.Character);
 
   FMaxLength := 0;
   FWidth := 0;
+  FInvalid := false;
 
   g_Texture_Get(EDIT_LEFT, FLeftID);
   g_Texture_Get(EDIT_RIGHT, FRightID);
@@ -2227,6 +2239,7 @@ end;
 procedure TGUIEdit.Draw;
 var
   c, w, h: Word;
+  r, g, b: Byte;
 begin
   inherited;
 
@@ -2236,9 +2249,13 @@ begin
   for c := 0 to FWidth-1 do
     e_Draw(FMiddleID, FX+8+c*16, FY, 0, True, False);
 
-  FFont.Draw(FX+8, FY, FText, FColor.R, FColor.G, FColor.B);
+  r := FColor.R;
+  g := FColor.G;
+  b := FColor.B;
+  if FInvalid and (FWindow.FActiveControl <> self) then begin r := 128; g := 128; b := 128; end;
+  FFont.Draw(FX+8, FY, FText, r, g, b);
 
-  if FWindow.FActiveControl = Self then
+  if (FWindow.FActiveControl = self) then
   begin
     FFont.GetTextSize(Copy(FText, 1, FCaretPos), w, h);
     h := e_CharFont_GetMaxHeight(FFont.ID);
@@ -2289,9 +2306,9 @@ begin
           IK_DELETE: Delete(FText, FCaretPos + 1, 1);
           IK_END, IK_KPEND: FCaretPos := Length(FText);
           IK_HOME, IK_KPHOME: FCaretPos := 0;
-          IK_LEFT, IK_KPLEFT: if FCaretPos > 0 then Dec(FCaretPos);
-          IK_RIGHT, IK_KPRIGHT: if FCaretPos < Length(FText) then Inc(FCaretPos);
-          IK_RETURN, IK_KPRETURN:
+          IK_LEFT, IK_KPLEFT, VK_LEFT: if FCaretPos > 0 then Dec(FCaretPos);
+          IK_RIGHT, IK_KPRIGHT, VK_RIGHT: if FCaretPos < Length(FText) then Inc(FCaretPos);
+          IK_RETURN, IK_KPRETURN, VK_FIRE, VK_OPEN:
             with FWindow do
             begin
               if FActiveControl <> Self then
@@ -2308,6 +2325,8 @@ begin
             end;
         end;
     end;
+
+  g_Touch_ShowKeyboard(FWindow.FActiveControl = Self);
 end;
 
 procedure TGUIEdit.SetText(Text: string);
@@ -2330,7 +2349,7 @@ begin
   FKey := 0;
   FIsQuery := false;
 
-  FFont := TFont.Create(FontID, FONT_CHAR);
+  FFont := TFont.Create(FontID, TFontType.Character);
 end;
 
 procedure TGUIKeyRead.Draw;
@@ -2388,12 +2407,12 @@ begin
     case Msg of
       WM_KEYDOWN:
         case wParam of
-          IK_ESCAPE:
+          IK_ESCAPE, VK_ESCAPE:
             begin
               if FIsQuery then actDefCtl();
               FIsQuery := False;
             end;
-          IK_RETURN, IK_KPRETURN:
+          IK_RETURN, IK_KPRETURN, VK_FIRE, VK_OPEN:
             begin
               if not FIsQuery then
                 begin
@@ -2427,7 +2446,7 @@ begin
             FKey := 0;
             actDefCtl();
           end
-          else if FIsQuery and (wParam <> IK_ENTER) and (wParam <> IK_KPRETURN) then // Not <Enter
+          else if FIsQuery and (wParam <> IK_ENTER) and (wParam <> IK_KPRETURN) and (wParam <> VK_FIRE) and (wParam <> VK_OPEN) then // Not <Enter
           begin
             if e_KeyNames[wParam] <> '' then
               FKey := wParam;
@@ -2453,7 +2472,7 @@ begin
   FIsQuery := False;
 
   FFontID := FontID;
-  FFont := TFont.Create(FontID, FONT_CHAR);
+  FFont := TFont.Create(FontID, TFontType.Character);
 
   FMaxKeyNameWdt := 0;
   for a := 0 to 255 do
@@ -2511,6 +2530,7 @@ begin
     (key = IK_BACKSPACE) or
     (key = IK_LEFT) or (key = IK_RIGHT) or
     (key = IK_KPLEFT) or (key = IK_KPRIGHT) or
+    (key = VK_LEFT) or (key = VK_RIGHT) or
     false; // oops
 end;
 
@@ -2534,12 +2554,12 @@ begin
     case Msg of
       WM_KEYDOWN:
         case wParam of
-          IK_ESCAPE:
+          IK_ESCAPE, VK_ESCAPE:
             begin
               if FIsQuery then actDefCtl();
               FIsQuery := False;
             end;
-          IK_RETURN, IK_KPRETURN:
+          IK_RETURN, IK_KPRETURN, VK_FIRE, VK_OPEN:
             begin
               if not FIsQuery then
                 begin
@@ -2564,13 +2584,13 @@ begin
                 actDefCtl();
               end;
             end;
-          IK_LEFT, IK_KPLEFT:
+          IK_LEFT, IK_KPLEFT, VK_LEFT:
             if not FIsQuery then
             begin
               FKeyIdx := 0;
               actDefCtl();
             end;
-          IK_RIGHT, IK_KPRIGHT:
+          IK_RIGHT, IK_KPRIGHT, VK_RIGHT:
             if not FIsQuery then
             begin
               FKeyIdx := 1;
@@ -2585,7 +2605,7 @@ begin
             if (FKeyIdx = 0) then FKey0 := 0 else FKey1 := 0;
             actDefCtl();
           end
-          else if FIsQuery and (wParam <> IK_ENTER) and (wParam <> IK_KPRETURN) then // Not <Enter
+          else if FIsQuery and (wParam <> IK_ENTER) and (wParam <> IK_KPRETURN) and (wParam <> VK_FIRE) and (wParam <> VK_OPEN) then // Not <Enter
           begin
             if e_KeyNames[wParam] <> '' then
             begin
@@ -2810,61 +2830,68 @@ begin
   try
     map := g_Map_ParseMap(Data, Len);
   except
+    FreeMem(Data);
     map.Free();
-    raise;
+    //raise;
+    exit;
   end;
 
   FreeMem(Data);
 
-  panlist := map.field['panel'];
-  //header := GetMapHeader(map);
+  if (map = nil) then exit;
 
-  FMapSize.X := map.Width div 16;
-  FMapSize.Y := map.Height div 16;
+  try
+    panlist := map.field['panel'];
+    //header := GetMapHeader(map);
 
-  rX := Ceil(map.Width / (MAPPREVIEW_WIDTH*256.0));
-  rY := Ceil(map.Height / (MAPPREVIEW_HEIGHT*256.0));
-  FScale := max(rX, rY);
+    FMapSize.X := map.Width div 16;
+    FMapSize.Y := map.Height div 16;
 
-  FMapData := nil;
+    rX := Ceil(map.Width / (MAPPREVIEW_WIDTH*256.0));
+    rY := Ceil(map.Height / (MAPPREVIEW_HEIGHT*256.0));
+    FScale := max(rX, rY);
 
-  if (panlist <> nil) then
-  begin
-    for pan in panlist do
+    FMapData := nil;
+
+    if (panlist <> nil) then
     begin
-      if (pan.PanelType and (PANEL_WALL or PANEL_CLOSEDOOR or
-                                           PANEL_STEP or PANEL_WATER or
-                                           PANEL_ACID1 or PANEL_ACID2)) <> 0 then
+      for pan in panlist do
       begin
-        SetLength(FMapData, Length(FMapData)+1);
-        with FMapData[High(FMapData)] do
+        if (pan.PanelType and (PANEL_WALL or PANEL_CLOSEDOOR or
+                                             PANEL_STEP or PANEL_WATER or
+                                             PANEL_ACID1 or PANEL_ACID2)) <> 0 then
         begin
-          X1 := pan.X div 16;
-          Y1 := pan.Y div 16;
+          SetLength(FMapData, Length(FMapData)+1);
+          with FMapData[High(FMapData)] do
+          begin
+            X1 := pan.X div 16;
+            Y1 := pan.Y div 16;
 
-          X2 := (pan.X + pan.Width) div 16;
-          Y2 := (pan.Y + pan.Height) div 16;
+            X2 := (pan.X + pan.Width) div 16;
+            Y2 := (pan.Y + pan.Height) div 16;
 
-          X1 := Trunc(X1/FScale + 0.5);
-          Y1 := Trunc(Y1/FScale + 0.5);
-          X2 := Trunc(X2/FScale + 0.5);
-          Y2 := Trunc(Y2/FScale + 0.5);
+            X1 := Trunc(X1/FScale + 0.5);
+            Y1 := Trunc(Y1/FScale + 0.5);
+            X2 := Trunc(X2/FScale + 0.5);
+            Y2 := Trunc(Y2/FScale + 0.5);
 
-          if (X1 <> X2) or (Y1 <> Y2) then
-          begin
-            if X1 = X2 then
-              X2 := X2 + 1;
-            if Y1 = Y2 then
-              Y2 := Y2 + 1;
-          end;
+            if (X1 <> X2) or (Y1 <> Y2) then
+            begin
+              if X1 = X2 then
+                X2 := X2 + 1;
+              if Y1 = Y2 then
+                Y2 := Y2 + 1;
+            end;
 
-          PanelType := pan.PanelType;
+            PanelType := pan.PanelType;
+          end;
         end;
       end;
     end;
+  finally
+    //writeln('freeing map');
+    map.Free();
   end;
-
-  map.Free();
 end;
 
 procedure TGUIMapPreview.ClearMap();
@@ -2919,7 +2946,7 @@ constructor TGUIListBox.Create(FontID: DWORD; Width, Height: Word);
 begin
   inherited Create();
 
-  FFont := TFont.Create(FontID, FONT_CHAR);
+  FFont := TFont.Create(FontID, TFontType.Character);
 
   FWidth := Width;
   FHeight := Height;
@@ -2995,21 +3022,21 @@ begin
             FIndex := High(FItems);
             FStartLine := Max(High(FItems)-FHeight+1, 0);
           end;
-          IK_UP, IK_LEFT, IK_KPUP, IK_KPLEFT:
+          IK_UP, IK_LEFT, IK_KPUP, IK_KPLEFT, VK_LEFT:
             if FIndex > 0 then
             begin
               Dec(FIndex);
               if FIndex < FStartLine then Dec(FStartLine);
               if @FOnChangeEvent <> nil then FOnChangeEvent(Self);
             end;
-          IK_DOWN, IK_RIGHT, IK_KPDOWN, IK_KPRIGHT:
+          IK_DOWN, IK_RIGHT, IK_KPDOWN, IK_KPRIGHT, VK_RIGHT:
             if FIndex < High(FItems) then
             begin
               Inc(FIndex);
               if FIndex > FStartLine+FHeight-1 then Inc(FStartLine);
               if @FOnChangeEvent <> nil then FOnChangeEvent(Self);
             end;
-          IK_RETURN, IK_KPRETURN:
+          IK_RETURN, IK_KPRETURN, VK_FIRE, VK_OPEN:
             with FWindow do
             begin
               if FActiveControl <> Self then SetActive(Self)
@@ -3041,7 +3068,7 @@ begin
   Result := FItems[FIndex];
 end;
 
-procedure TGUIListBox.FSetItems(Items: SArray);
+procedure TGUIListBox.FSetItems(Items: SSArray);
 begin
   if FItems <> nil then
     FItems := nil;
@@ -3151,7 +3178,7 @@ begin
                 FStartLine := High(FItems)-FHeight+1;
             end;
 
-          IK_UP, IK_LEFT, IK_KPUP, IK_KPLEFT:
+          IK_UP, IK_LEFT, IK_KPUP, IK_KPLEFT, VK_UP, VK_LEFT:
             if FIndex > 0 then
             begin
               Dec(FIndex);
@@ -3161,7 +3188,7 @@ begin
                 FOnChangeEvent(Self);
             end;
 
-          IK_DOWN, IK_RIGHT, IK_KPDOWN, IK_KPRIGHT:
+          IK_DOWN, IK_RIGHT, IK_KPDOWN, IK_KPRIGHT, VK_DOWN, VK_RIGHT:
             if FIndex < High(FItems) then
             begin
               Inc(FIndex);
@@ -3171,7 +3198,7 @@ begin
                 FOnChangeEvent(Self);
             end;
 
-          IK_RETURN, IK_KPRETURN:
+          IK_RETURN, IK_KPRETURN, VK_FIRE, VK_OPEN:
             with FWindow do
             begin
               if FActiveControl <> Self then
@@ -3306,7 +3333,7 @@ constructor TGUIMemo.Create(FontID: DWORD; Width, Height: Word);
 begin
   inherited Create();
 
-  FFont := TFont.Create(FontID, FONT_CHAR);
+  FFont := TFont.Create(FontID, TFontType.Character);
 
   FWidth := Width;
   FHeight := Height;
@@ -3352,13 +3379,13 @@ begin
     case Msg of
       WM_KEYDOWN:
         case wParam of
-          IK_UP, IK_LEFT, IK_KPUP, IK_KPLEFT:
+          IK_UP, IK_LEFT, IK_KPUP, IK_KPLEFT, VK_UP, VK_LEFT:
             if FStartLine > 0 then
               Dec(FStartLine);
-          IK_DOWN, IK_RIGHT, IK_KPDOWN, IK_KPRIGHT:
+          IK_DOWN, IK_RIGHT, IK_KPDOWN, IK_KPRIGHT, VK_DOWN, VK_RIGHT:
             if FStartLine < Length(FLines)-FHeight then
               Inc(FStartLine);
-          IK_RETURN, IK_KPRETURN:
+          IK_RETURN, IK_KPRETURN, VK_FIRE, VK_OPEN:
             with FWindow do
             begin
               if FActiveControl <> Self then