Browse Source

* Temp commit to allow upgrade

git-svn-id: trunk@6910 -
daniel 18 years ago
parent
commit
74f3b75ec1

+ 12 - 10
.gitattributes

@@ -3309,16 +3309,18 @@ packages/extra/ptc/win32/directx/primary.inc -text
 packages/extra/ptc/win32/directx/primaryd.inc -text
 packages/extra/ptc/win32/directx/translte.inc -text
 packages/extra/ptc/x11/check.inc svneol=native#text/x-pascal
-packages/extra/ptc/x11/consoled.inc svneol=native#text/x-pascal
-packages/extra/ptc/x11/consolei.inc svneol=native#text/x-pascal
-packages/extra/ptc/x11/dgadispd.inc svneol=native#text/x-pascal
-packages/extra/ptc/x11/dgadispi.inc svneol=native#text/x-pascal
-packages/extra/ptc/x11/displayd.inc svneol=native#text/x-pascal
-packages/extra/ptc/x11/displayi.inc svneol=native#text/x-pascal
-packages/extra/ptc/x11/imaged.inc svneol=native#text/x-pascal
-packages/extra/ptc/x11/imagei.inc svneol=native#text/x-pascal
-packages/extra/ptc/x11/windowd.inc -text
-packages/extra/ptc/x11/windowi.inc svneol=native#text/x-pascal
+packages/extra/ptc/x11/modesd.inc svneol=native#text/x-pascal
+packages/extra/ptc/x11/modesi.inc svneol=native#text/x-pascal
+packages/extra/ptc/x11/svnimaged.inc svneol=native#text/x-pascal
+packages/extra/ptc/x11/svnimagei.inc svneol=native#text/x-pascal
+packages/extra/ptc/x11/x11consoled.inc svneol=native#text/x-pascal
+packages/extra/ptc/x11/x11consolei.inc svneol=native#text/x-pascal
+packages/extra/ptc/x11/x11dgadisplayd.inc svneol=native#text/x-pascal
+packages/extra/ptc/x11/x11dgadisplayi.inc svneol=native#text/x-pascal
+packages/extra/ptc/x11/x11displayd.inc svneol=native#text/x-pascal
+packages/extra/ptc/x11/x11displayi.inc svneol=native#text/x-pascal
+packages/extra/ptc/x11/x11windowd.inc svneol=native#text/x-pascal
+packages/extra/ptc/x11/x11windowi.inc svneol=native#text/x-pascal
 packages/extra/ptc/x11/xunikey.inc -text
 packages/extra/rexx/Makefile svneol=native#text/plain
 packages/extra/rexx/Makefile.fpc svneol=native#text/plain

+ 19 - 0
packages/extra/ptc/x11/modesd.inc

@@ -0,0 +1,19 @@
+Type
+  TX11Modes = Class(TObject)
+  Private
+    FDisplay : PDisplay;
+    FScreen : cint;
+
+    FModeList : PPXF86VidModeModeInfo;
+    FModeListCount : cint;
+    FSavedMode : PXF86VidModeModeLine;
+    FSavedDotClock : cint;
+
+    Procedure GetModes;
+    Function FindNumberOfBestMode(width, height : Integer) : Integer;
+  Public
+    Constructor Create(display : PDisplay; screen : cint);
+    Destructor Destroy; Override;
+    Procedure SetBestMode(width, height : Integer);
+    Procedure RestorePreviousMode;
+  End;

+ 146 - 0
packages/extra/ptc/x11/modesi.inc

@@ -0,0 +1,146 @@
+Constructor TX11Modes.Create(display : PDisplay; screen : Integer);
+
+Var
+  dummy1, dummy2 : cint;
+
+Begin
+  FSavedMode := Nil;
+  FSavedDotClock := 0;
+  FModeList := Nil;
+  FModeListCount := 0;
+
+  FDisplay := display;
+  FScreen := screen;
+
+  If Not XF86VidModeQueryExtension(FDisplay, @dummy1, @dummy2) Then
+    Raise TPTCError.Create('VidMode extension not available');
+End;
+
+Destructor TX11Modes.Destroy;
+
+Begin
+  If FSavedMode <> Nil Then
+  Begin
+    RestorePreviousMode;
+    If FSavedMode^.privsize <> 0 Then
+      XFree(FSavedMode^.c_private);
+    Dispose(FSavedMode);
+  End;
+
+  If FModeList <> Nil Then
+    XFree(FModeList);
+
+  Inherited Destroy;
+End;
+
+Procedure TX11Modes.GetModes;
+
+Begin
+  { If we have been called before, do nothing }
+  If FModeList <> Nil Then
+    Exit;
+
+  { Save previous mode }
+  New(FSavedMode);
+  FillChar(FSavedMode^, SizeOf(FSavedMode^), 0);
+  XF86VidModeGetModeLine(FDisplay, FScreen, @FSavedDotClock, FSavedMode);
+
+  { Get all available video modes }
+  XF86VidModeGetAllModeLines(FDisplay, FScreen, @FModeListCount, @FModeList);
+End;
+
+Function TX11Modes.FindNumberOfBestMode(width, height : Integer) : Integer;
+
+Var
+  min_diff : Integer;
+  d_x, d_y : Integer;
+  found_mode : Integer;
+  I : Integer;
+
+Begin
+  { Try an exact match }
+  For I := 0 To FModeListCount - 1 Do
+    If (FModeList[I]^.hdisplay = width) And (FModeList[I]^.vdisplay = height) Then
+      Exit(I);
+
+  { Try to find a mode that matches the width first }
+  For I := 0 To FModeListCount - 1 Do
+    If (FModeList[I]^.hdisplay = width) And (FModeList[I]^.vdisplay >= height) Then
+      Exit(I);
+
+  { Next try to match the height }
+  For I := 0 To FModeListCount - 1 Do
+    If (FModeList[I]^.hdisplay >= width) And (FModeList[I]^.vdisplay = height) Then
+      Exit(I);
+
+  { Finally, find the mode that is bigger than the requested one and makes }
+  { the least difference }
+  found_mode := -1;
+  min_diff := High(Integer);
+  For I := 0 To FModeListCount - 1 Do
+    If (FModeList[I]^.hdisplay >= width) And (FModeList[I]^.vdisplay >= height) Then
+    Begin
+      d_x := FModeList[I]^.hdisplay - width;
+      d_x *= d_x;
+      d_y := FModeList[I]^.vdisplay - height;
+      d_y *= d_y;
+      If (d_x + d_y) < min_diff Then
+      Begin
+        min_diff := d_x + d_y;
+        found_mode := I;
+      End;
+    End;
+
+  If found_mode <> -1 Then
+    Result := found_mode
+  Else
+    Raise TPTCError.Create('Cannot find matching DGA video mode');
+End;
+
+Procedure TX11Modes.SetBestMode(width, height : Integer);
+
+Var
+  BestMode : Integer;
+
+Begin
+  GetModes;
+
+  BestMode := FindNumberOfBestMode(width, height);
+  If Not XF86VidModeSwitchToMode(FDisplay, FScreen, FModeList[BestMode]) Then
+    Raise TPTCError.Create('Error switching to the requested video mode');
+
+  XWarpPointer(FDisplay, None, RootWindow(FDisplay, FScreen), 0, 0, 0, 0,
+               FModeList[BestMode]^.hdisplay Div 2,
+	       FModeList[BestMode]^.vdisplay Div 2);
+
+  If Not XF86VidModeSetViewPort(FDisplay, FScreen, 0, 0) Then
+    Raise TPTCError.Create('Error moving the viewport to the upper-left corner');
+End;
+
+Procedure TX11Modes.RestorePreviousMode;
+
+Var
+  ModeInfo : TXF86VidModeModeInfo;
+
+Begin
+  If FSavedMode <> Nil Then
+  Begin
+    {FSavedMode is a TXF86VidModeModeLine, but XF86VidModeSwitchToMode wants a
+                     TXF86VidModeModeInfo :}
+    FillChar(ModeInfo, SizeOf(ModeInfo), 0);
+    ModeInfo.dotclock := FSavedDotClock;
+    ModeInfo.hdisplay := FSavedMode^.hdisplay;
+    ModeInfo.hsyncstart := FSavedMode^.hsyncstart;
+    ModeInfo.hsyncend := FSavedMode^.hsyncend;
+    ModeInfo.htotal := FSavedMode^.htotal;
+    ModeInfo.vdisplay := FSavedMode^.vdisplay;
+    ModeInfo.vsyncstart := FSavedMode^.vsyncstart;
+    ModeInfo.vsyncend := FSavedMode^.vsyncend;
+    ModeInfo.vtotal := FSavedMode^.vtotal;
+    ModeInfo.flags := FSavedMode^.flags;
+    ModeInfo.privsize := FSavedMode^.privsize;
+    ModeInfo.c_private := FSavedMode^.c_private;
+    
+    XF86VidModeSwitchToMode(FDisplay, FScreen, @ModeInfo);
+  End;
+End;

+ 0 - 0
packages/extra/ptc/x11/imaged.inc → packages/extra/ptc/x11/svnimaged.inc


+ 0 - 0
packages/extra/ptc/x11/imagei.inc → packages/extra/ptc/x11/svnimagei.inc


+ 0 - 0
packages/extra/ptc/x11/consoled.inc → packages/extra/ptc/x11/x11consoled.inc


+ 0 - 0
packages/extra/ptc/x11/consolei.inc → packages/extra/ptc/x11/x11consolei.inc


+ 0 - 0
packages/extra/ptc/x11/dgadispd.inc → packages/extra/ptc/x11/x11dgadisplayd.inc


+ 0 - 0
packages/extra/ptc/x11/dgadispi.inc → packages/extra/ptc/x11/x11dgadisplayi.inc


+ 0 - 0
packages/extra/ptc/x11/displayd.inc → packages/extra/ptc/x11/x11displayd.inc


+ 0 - 0
packages/extra/ptc/x11/displayi.inc → packages/extra/ptc/x11/x11displayi.inc


+ 0 - 0
packages/extra/ptc/x11/windowd.inc → packages/extra/ptc/x11/x11windowd.inc


+ 0 - 0
packages/extra/ptc/x11/windowi.inc → packages/extra/ptc/x11/x11windowi.inc