Pārlūkot izejas kodu

* pollkey fixes (merged)

peter 24 gadi atpakaļ
vecāks
revīzija
9d93d0d4e3
3 mainītis faili ar 58 papildinājumiem un 20 dzēšanām
  1. 10 4
      rtl/inc/keyboard.inc
  2. 34 11
      rtl/inc/video.inc
  3. 14 5
      rtl/unix/keyboard.pp

+ 10 - 4
rtl/inc/keyboard.inc

@@ -105,8 +105,11 @@ begin
    exit(PendingKeyEvent);
   If Assigned(CurrentKeyBoardDriver.PollKeyEvent) Then
     begin
-    PendingKeyEvent:=CurrentKeyBoardDriver.PollKeyEvent();
-    PollKeyEvent:=PendingKeyEvent;
+    PollKeyEvent:=CurrentKeyBoardDriver.PollKeyEvent();
+    // PollKeyEvent:=PendingKeyEvent;
+    // Must be done inside every keyboard specific
+    // PollKeyEvent procedure
+    // to avoid problems if that procedure is called directly PM
     end
   else
     PollKeyEvent:=0;
@@ -117,7 +120,7 @@ Function SetKeyboardDriver (Const Driver : TKeyboardDriver) : Boolean;
 begin
   If Not KeyBoardInitialized then
     CurrentKeyBoardDriver:=Driver;
-  SetKeyboardDriver:=Not KeyBoardInitialized;  
+  SetKeyboardDriver:=Not KeyBoardInitialized;
 end;
 
 Procedure GetKeyboardDriver (Var Driver : TKeyboardDriver);
@@ -292,7 +295,10 @@ end;
 
 {
   $Log$
-  Revision 1.5  2001-10-10 20:19:00  michael
+  Revision 1.6  2001-10-12 16:03:15  peter
+    * pollkey fixes (merged)
+
+  Revision 1.5  2001/10/10 20:19:00  michael
   + Merge of Fixed PollKeyEvent - Pierres fix was not complete
 
   Revision 1.4  2001/10/03 20:08:36  michael

+ 34 - 11
rtl/inc/video.inc

@@ -35,16 +35,23 @@ end;
 
 Var
   CurrentVideoDriver : TVideoDriver;
+  NextVideoMode      : TVideoMode;
 
 Const
   VideoInitialized : Boolean = False;
+  DriverInitialized : Boolean = False;
+  NextVideoModeSet  : Boolean = False;
 
 Function SetVideoDriver (Const Driver : TVideoDriver) : Boolean;
 { Sets the videodriver to be used }
 begin
   If Not VideoInitialized then
+    Begin
     CurrentVideoDriver:=Driver;
-  SetVideoDriver:=Not VideoInitialized;  
+      DriverInitialized:=true;
+      NextVideoModeSet:=false;
+    End;
+  SetVideoDriver:=Not VideoInitialized;
 end;
 
 Procedure GetVideoDriver (Var Driver : TVideoDriver);
@@ -86,17 +93,17 @@ begin
     If (ScreenWidth<OldCols) then
       C:=ScreenWidth
     else
-      C:=OldCols;  
+      C:=OldCols;
     If (ScreenHeight<OldRows) then
       R:=ScreenHeight
     else
-      R:=OldRows;  
+      R:=OldRows;
     For I:=0 to R-1 do
       begin
-      Move(VideoBuf[I*S*OldCols],NewVideoBuf[I*S*ScreenWidth],S*C);
-      Move(OldVideoBuf[I*S*OldCols],NewOldVideoBuf[I*S*ScreenWidth],S*C);
+      Move(VideoBuf^[I*OldCols],NewVideoBuf^[I*ScreenWidth],S*C);
+      Move(OldVideoBuf^[I*OldCols],NewOldVideoBuf^[I*ScreenWidth],S*C);
       end;
-    end;  
+    end;
   FreeVideoBuf;
   VideoBufSize:=NewVideoBufSize;
   VideoBuf:=NewVideoBuf;
@@ -110,6 +117,10 @@ begin
     begin
     If Assigned(CurrentVideoDriver.InitDriver) then
       CurrentVideoDriver.InitDriver;
+    VideoInitialized:=True;
+    if NextVideoModeSet then
+      SetVideoMode(NextVideoMode)
+    else
     AssignVideoBuf(0,0);
     ClearScreen;
     end;
@@ -123,7 +134,7 @@ begin
     begin
     If Assigned(CurrentVideoDriver.DoneDriver) then
       CurrentVideoDriver.DoneDriver;
-    FreeVideoBuf;  
+    FreeVideoBuf;
     VideoInitialized:=False;
     end;
 end;
@@ -198,6 +209,11 @@ Var
   OldR,OldC: Word;
 
 begin
+  SetVideoMode:=DriverInitialized;
+  if not DriverInitialized then
+    exit;
+  If VideoInitialized then
+    begin
   OldC:=ScreenWidth;
   OldR:=ScreenHeight;
   If Assigned(CurrentVideoDriver.SetVideoMode) then
@@ -207,6 +223,12 @@ begin
   // Assign buffer
   If SetVideoMode then
     AssignVideoBuf(OldC,Oldr);
+    end
+  else
+    begin
+    NextVideoMode:=Mode;
+    NextVideoModeSet:=true;
+    end;
 end;
 
 
@@ -214,7 +236,7 @@ Function GetVideoModeCount : Word;
 
 begin
   If Assigned(CurrentVideoDriver.GetVideoModeCount) then
-    GetVideoModeCount:=GetVideoModeCount()
+    GetVideoModeCount:=CurrentVideoDriver.GetVideoModeCount()
   else
     GetVideoModeCount:=1;
 end;
@@ -239,11 +261,12 @@ begin
   DefaultErrorHandler := errAbort; { return error code }
 end;
 
-
-
 {
   $Log$
-  Revision 1.5  2001-10-10 21:03:48  michael
+  Revision 1.6  2001-10-12 16:03:15  peter
+    * pollkey fixes (merged)
+
+  Revision 1.5  2001/10/10 21:03:48  michael
   + Clearscreen now also clears oldvideobuf after screenupdate
 
   Revision 1.4  2001/10/06 22:28:24  michael

+ 14 - 5
rtl/unix/keyboard.pp

@@ -1483,9 +1483,15 @@ end;
 
 
 function SysPollKeyEvent: TKeyEvent;
+var
+  KeyEvent : TKeyEvent;
 begin
   if keypressed then
-    SysPollKeyEvent:=SysGetKeyEvent
+    begin
+      KeyEvent:=SysGetKeyEvent;
+      PutKeyEvent(KeyEvent);
+      SysPollKeyEvent:=KeyEvent
+    end
   else
     SysPollKeyEvent:=0;
 end;
@@ -1498,11 +1504,11 @@ end;
 
 
 procedure RestoreStartMode;
-
 begin
   TCSetAttr(1,TCSANOW,StartTio);
 end;
 
+
 Const
   SysKeyboardDriver : TKeyboardDriver = (
     InitDriver : @SysInitKeyBoard;
@@ -1511,16 +1517,19 @@ Const
     PollKeyEvent : @SysPollKeyEvent;
     GetShiftState : @SysGetShiftState;
     TranslateKeyEvent : Nil;
-    TranslateKeyEventUnicode : Nil; 
+    TranslateKeyEventUnicode : Nil;
   );
 
-begin 
+begin
   SetKeyBoardDriver(SysKeyBoardDriver);
   TCGetAttr(1,StartTio);
 end.
 {
   $Log$
-  Revision 1.8  2001-09-21 21:33:36  michael
+  Revision 1.9  2001-10-12 16:03:15  peter
+    * pollkey fixes (merged)
+
+  Revision 1.8  2001/09/21 21:33:36  michael
   + Merged driver support from fixbranch
 
   Revision 1.7  2001/08/30 20:55:08  peter