Explorar o código

Graph: Special characters for ReadKey and KeyPressed

Arthur Yefimov %!s(int64=3) %!d(string=hai) anos
pai
achega
8943f5dfb6
Modificáronse 2 ficheiros con 30 adicións e 20 borrados
  1. 6 3
      Programs/TestGraph.Mod
  2. 24 17
      src/Graph.Mod

+ 6 - 3
Programs/TestGraph.Mod

@@ -3,6 +3,7 @@ IMPORT G := Graph;
 VAR c, f: G.Color;
   X, Y, W, H: INTEGER;
   font: G.Font;
+  ZZ: ARRAY 2 OF CHAR;
 
 PROCEDURE Draw;
 BEGIN
@@ -19,7 +20,8 @@ PROCEDURE Message;
 BEGIN
   IF font # NIL THEN
     G.DrawString('Press space to return. X for down, ESC for up.',
-      0, 0, font, f)
+      0, 0, font, f);
+    G.DrawString(ZZ, 0, 16, font, f)
   END
 END Message;
 
@@ -52,6 +54,7 @@ BEGIN
     ch := G.ReadKey();
     IF ch = 'x' THEN INC(Y, 100)
     ELSIF ch = CHR(27) THEN DEC(Y, 100)
+    ELSE ZZ[0] := ch
     END
   UNTIL ch = ' '
 END ByKey;
@@ -60,14 +63,14 @@ PROCEDURE Do;
 VAR e: G.Event;
   done: BOOLEAN;
 BEGIN
-  (*G.Settings(320, 200, {});*)
+  (*G.Settings(320, 200, {G.window});*)
   G.Init;
   G.ShowMouse(FALSE);
   font := G.LoadFont('../Data/Fonts/Main');
   G.GetTargetSize(W, H); DEC(W); DEC(H);
   G.MakeCol(c, 20, 30, 80);
   G.MakeCol(f, 0, 180, 255);
-  done := FALSE; X := -1;
+  done := FALSE; X := -1; ZZ[0] := 0X; ZZ[1] := 0X;
   REPEAT
     WHILE G.HasEvents() DO
       G.WaitEvent(e);

+ 24 - 17
src/Graph.Mod

@@ -292,7 +292,8 @@ VAR
   target: Bitmap;
   black: Color;
 
-  charRead: CHAR;
+  charRead: CHAR; (* For KeyPressed and ReadKey *)
+  specialChar: BOOLEAN; (* For charRead *)
 
 PROCEDURE Error(s: ARRAY OF CHAR);
 BEGIN Out.String(s); Out.Ln
@@ -632,9 +633,9 @@ PROCEDURE ClearBitmap*(bmp: Bitmap);
 BEGIN ClearBitmapToColor(bmp, black)
 END ClearBitmap;
 
-PROCEDURE ClearScreenToColor*(c: Color);
+PROCEDURE ClearToColor*(c: Color);
 BEGIN ClearBitmapToColor(GetScreen(), c)
-END ClearScreenToColor;
+END ClearToColor;
 
 PROCEDURE ClearScreen*;
 BEGIN ClearBitmapToColor(GetScreen(), black)
@@ -1175,24 +1176,30 @@ PROCEDURE HasEvents*(): BOOLEAN;
 VAR e: Event;
 RETURN PeekEvent(e) END HasEvents;
 
-PROCEDURE KeyPressed*(): BOOLEAN;
+PROCEDURE WaitAndParseKeyEvent;
 VAR e: Event;
-BEGIN
-  WHILE (charRead = 0X) & HasEvents() DO
-    WaitEvent(e);
-    IF e.type = char THEN charRead := e.ch END
+BEGIN WaitEvent(e);
+  IF e.type = char THEN charRead := e.ch; specialChar := FALSE
+  ELSIF (e.type = keyDown) &
+        ((kF1 <= e.key) & (e.key <= kF12) OR
+         (kHome <= e.key) & (e.key <= kDown) OR
+         (e.key = kInsert) OR (e.key = kPause))
+  THEN charRead := CHR(e.key); specialChar := TRUE
   END
-RETURN charRead # 0X END KeyPressed;
+END WaitAndParseKeyEvent;
+
+PROCEDURE KeyPressed*(): BOOLEAN;
+BEGIN
+  WHILE ~specialChar & (charRead = 0X) & HasEvents() DO WaitAndParseKeyEvent END
+RETURN specialChar OR (charRead # 0X) END KeyPressed;
 
 PROCEDURE ReadKey*(): CHAR;
-VAR e: Event;
-  c: CHAR;
+VAR c: CHAR;
 BEGIN
-  WHILE charRead = 0X DO
-    WaitEvent(e);
-    IF e.type = char THEN charRead := e.ch END
-  END;
-  c := charRead; charRead := 0X
+  WHILE ~specialChar & (charRead = 0X) DO WaitAndParseKeyEvent END;
+  IF specialChar THEN c := 0X; specialChar := FALSE
+  ELSE c := charRead; charRead := 0X
+  END
 RETURN c END ReadKey;
 
 PROCEDURE Pause*;
@@ -1468,7 +1475,7 @@ BEGIN ok := TRUE;
     END
   ELSE Error('Could not init Allegro.'); ok := FALSE
   END;
-  charRead := 0X;
+  charRead := 0X; specialChar := FALSE;
   Done := ok
 END Init;