Date: Fri, 15 Aug 2003 09:13:59 +0300
From: "Mike Gorchak"
Subject: Patches for tests and QNX6
Here more fixes for the QNX6 in sdlqnx.diff file:
- Spellchecked README.QNX (thanks to Julian Kinraid)
- Fixed bugs in fullscreen mode: window region wasn't on top by default, so \
it caused some artifacts to be appeared on the screen, prevent window conten\
ts default filler in Photon while in fullscreen mode, it damages the screen.
- Added support for the SDL_VIDEO_WINDOW_POS, SDL_VIDEO_CENTERED env variabl\
es.
- Some minor code restructurization.
--- a/BUGS Sat Aug 23 23:18:49 2003 +0000
+++ b/BUGS Sat Aug 23 23:20:21 2003 +0000
@@ -142,7 +142,7 @@
No console output screen. Printing to stdout do not have any effect.
QNX:
- Fullscreen switch doesn't work correctly.
+ Fullscreen switch doesn't work (disabled for now).
OpenBSD: -= NOT YET SUPPORTED =-
--- a/README.QNX Sat Aug 23 23:18:49 2003 +0000
+++ b/README.QNX Sat Aug 23 23:20:21 2003 +0000
@@ -1,112 +1,108 @@
README by Mike Gorchak <mike@malva.ua>, <lestat@i.com.ua>
-Last changed at 29 Jul 2003.
+Last changed at 12 Aug 2003.
-=========================================================================
+======================================================================
OpenGL:
- OpenGL in window mode works well and stable, in fullscreen
-mode too, but fullscreen mode has not been heavily tested yet.
- If you have QNX RtP version 6.1.0 and above you must download
-new Photon3D runtime from http://developers.qnx.com or install it
-from public repository or from public CD, available with QNX. The
-versions of OS before 6.1.0 are not supported.
- While creating OpenGL context software renderer mode is
-artificially selected (QSSL made acceleration only for Voodoo
-boards in fullscreen mode, sorry but I don't have this board to
-test OpenGL - maybe it work or maybe not :)). If you want accele-
-ration - you may remove some line in source code: find the file
-SDL_ph_video.c and remove the following
+ OpenGL works well and is stable, but fullscreen mode has not been
+heavily tested yet.
+ If you have QNX RtP version 6.1.0 or above you must download the
+Photon3D runtime from http://developers.qnx.com or install it from the
+public repository or the public CD, available with QNX. OS versions
+below 6.1.0 are not supported.
+ When creating an OpenGL context, software renderer mode is artifi-
+cially selected (QSSL made acceleration only for Voodoo boards in
+fullscreen mode, sorry but I don't have this board to test OpenGL -
+maybe it works or maybe not :)). If you want acceleration - you can
+remove one line in the source code: find the file SDL_ph_video.c and
+remove the following
OGLAttrib[OGLargc++]=PHOGL_ATTRIB_FORCE_SW;
-line in the ph_SetupOpenGLContext() function or change argument
-to the PHOGL_ATTRIB_FORCE_HW or PHOGL_ATTRIB_FAVOR_HW.
+line in the ph_SetupOpenGLContext() function or change the argument to
+PHOGL_ATTRIB_FORCE_HW or PHOGL_ATTRIB_FAVOR_HW.
-=========================================================================
-Wheel and multibutton mouses:
+======================================================================
+Wheel and multi-button mouses:
- Photon emitting keyboard events (key up and down) when moved
-mouse wheel. But key_scan field appears valid according to flags,
-and it contain zero. It is base method of detecting mouse wheel
-events under photon. It looks like a hack, but it works for me :)
-on different PC configurations.
+ Photon emits keyboard events (key up and down) when the mouse
+wheel is moved. The key_scan field appears valid, and it contains zero.
+That is a basic method of detecting mouse wheel events under Photon.
+It looks like a hack, but it works for me :) on various PC configura-
+tions.
-I'm tested it on:
+I've tested it on:
1. Genius Optical NetScroll/+ (1 wheel)
-2. A4Tech Optical GreatEye WheelMouse, model: WOP-35. (2 wheels +
- 2 additional buttons). Wheel for vertical scrolling works as
- usual, but second wheel for horizontal scrolling emitting two
- consequented events up or down, so it can provide more fast
- scrolling then the first wheel. Additional buttons doesn't
- emitting any events, but its look like handled by photon in
- unusual way - like click to front, but works not with any win-
- dow, looks like bug-o-feature :).
+2. A4Tech Optical GreatEye WheelMouse, model: WOP-35. (2 wheels + 2
+ additional buttons). The wheel for vertical scrolling works as usu-
+ al, but the second wheel for horizontal scrolling emits two sequen-
+ tial events up or down, so it can provide faster scrolling than the
+ first wheel. Additional buttons don't emit any events, but it looks
+ like they're handled by photon in an unusual way - like click to
+ front, but works not with any window, looks like bug-o-feature :).
-=========================================================================
+======================================================================
CDROM handling issues:
- Access to CDROM can be provided only with 'root' previleges.
-I can't do anything with this fact. /dev/cd0 have the brw-------
-flags and root:root rights.
+ Access to CDROM can only be provided with 'root' privileges. I
+can't do anything about that, /dev/cd0 has brw------- permissions and
+root:root rights.
-=========================================================================
+======================================================================
Video Overlays:
- Overlays can flickering during the window movement, resizing,
-etc. It happens because photon driver updates the real window
-contents behind the overlay, then draws the temporary chroma key
-color over window contents. It can be done without the chroma key
-using but it cause overlay will be always on top. So flickering
-during the movement much better in that case.
- Double buffering code temporary disabled in the photon driver
-code, beacuse on my GF2-MX it cause accidently buffer switch,
-which going to the old frame showing. S3 Savage3D have the same
-problem, but ATI Rage 128 has not this problem. I think it can be
-fixed later. Current code works very fine, so maybe double buffe-
-ring is not needed right now.
- Something strange appears when you tried to move window with
-overlay beyond the left border of the screen. Overlay trying to
-stay at position x=0, but when tried to move it a bit more it
-jumps at posituin x=-60. Really strange, looks like overlay
-doesn't love the negotive coordinates.
+ Overlays can flicker during window movement, resizing, etc. It
+happens because the photon driver updates the real window contents be-
+hind the overlay, then draws the temporary chroma key color over the
+window contents. It can be done without using the chroma key but that
+causes the overlay to always be on top. So flickering during window
+movement is preferred instead.
+ Double buffering code is temporarily disabled in the photon driver
+code, because on my GF2-MX it can accidentally cause a buffer switch,
+which causes the old frame to show. S3 Savage4 has the same problem,
+but ATI Rage 128 doesn't. I think it can be fixed later. Current code
+works very well, so maybe double buffering is not needed right now.
+ Something strange happens when you try to move the window with the
+overlay beyond the left border of the screen. The overlay tries to
+stay at position x=0, but when attempting to move it a bit more it
+jumps to position x=-60 (on GF2-MX, on ATI Rage128 this value a bit
+smaller). It's really strange, looks like the overlay doesn't like
+negative coordinates.
-=========================================================================
+=======================================================================
Shared library building:
- Shared library can be built, but before running autogen.sh
-script you need manually delete the libtool m4 stuff from
-the acinclude.m4 file (it comes after ESD detection code up to
-end of the file). Because libtool stuff in the acinclude.m4 file
-very old and doesn't know anything about the QNX. Just remove it
-and run autogen.sh script.
+ A shared library can be built, but before running the autogen.sh
+script you must manually delete the libtool.m4 stuff from the acinclu-
+de.m4 file (it comes after the ESD detection code up to the end of the
+file), because the libtool stuff in the acinclude.m4 file is very old
+and doesn't know anything about QNX. Just remove it and run autogen.sh.
-=========================================================================
+======================================================================
Some building issues:
- Feel free to not pass --disable-shared option to configure,
-if you read comment above about 'Shared library building'. Other-
-wise this option is strongly recomended, because the sdl-config
-script will be unfunctional.
+ Feel free to not use the --disable-shared configure option if you'
+ve read the above comment about 'Shared library building'. Otherwise
+this option is strongly recommended, as without it the sdl-config
+script will be broken.
- Run configure script without x11 support, e.g.:
+ Run the configure script without x11 support, e.g.:
a) for OpenGL support:
- ./configure --prefix=/usr/local \
+ ./configure --prefix=/usr \
--disable-video-x11 \
--disable-shared
b) without OpenGL support:
- ./configure --prefix=/usr/local \
+ ./configure --prefix=/usr \
--disable-video-x11 \
--disable-shared \
--disable-video-opengl
- In test directory also run ./configure script without x11
-support, e.g.:
+ In the test directory also run the ./configure script without
+x11 support, e.g.:
- ./configure --with-sdl-prefix=/usr/local \
- --with-sdl-exec-prefix=/usr/local \
- --prefix=/usr/local --without-x
-
-
+ ./configure --with-sdl-prefix=/usr \
+ --with-sdl-exec-prefix=/usr \
+ --prefix=/usr --without-x
--- a/src/video/photon/SDL_ph_image.c Sat Aug 23 23:18:49 2003 +0000
+++ b/src/video/photon/SDL_ph_image.c Sat Aug 23 23:20:21 2003 +0000
@@ -267,6 +267,8 @@
this->UpdateRects = ph_OCDCUpdate;
+ PgFlush();
+
return 0;
}
--- a/src/video/photon/SDL_ph_modes.c Sat Aug 23 23:18:49 2003 +0000
+++ b/src/video/photon/SDL_ph_modes.c Sat Aug 23 23:20:21 2003 +0000
@@ -297,13 +297,14 @@
currently_fullscreen = 1;
}
+ PgFlush();
return 1;
}
int ph_LeaveFullScreen(_THIS)
{
- PgDisplaySettings_t mymode_settings;
+ PgDisplaySettings_t oldmode_settings;
if (currently_fullscreen)
{
@@ -332,11 +333,11 @@
/* Restore old video mode */
if (old_video_mode != -1)
{
- mymode_settings.mode = (unsigned short) old_video_mode;
- mymode_settings.refresh = (unsigned short) old_refresh_rate;
- mymode_settings.flags = 0;
+ oldmode_settings.mode = (unsigned short) old_video_mode;
+ oldmode_settings.refresh = (unsigned short) old_refresh_rate;
+ oldmode_settings.flags = 0;
- if (PgSetVideoMode(&mymode_settings) < 0)
+ if (PgSetVideoMode(&oldmode_settings) < 0)
{
SDL_SetError("Ph_LeaveFullScreen(): PgSetVideoMode() function failed !\n");
return 0;
--- a/src/video/photon/SDL_ph_video.c Sat Aug 23 23:18:49 2003 +0000
+++ b/src/video/photon/SDL_ph_video.c Sat Aug 23 23:20:21 2003 +0000
@@ -194,9 +194,11 @@
PhPoint_t pos = {0, 0};
PhDim_t dim = {w, h};
int nargs = 0;
+ const char* windowpos;
+ const char* iscentered;
+ int x, y;
PtSetArg(&args[nargs++], Pt_ARG_DIM, &dim, 0);
- PtSetArg(&args[nargs++], Pt_ARG_FILL_COLOR, Pg_BLACK, 0);
if ((flags & SDL_RESIZABLE) == SDL_RESIZABLE)
{
@@ -234,12 +236,36 @@
if ((flags & SDL_FULLSCREEN) == SDL_FULLSCREEN)
{
PtSetArg(&args[nargs++], Pt_ARG_POS, &pos, 0);
+ PtSetArg(&args[nargs++], Pt_ARG_BASIC_FLAGS, Pt_TRUE, Pt_BASIC_PREVENT_FILL);
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_MANAGED_FLAGS, Pt_TRUE, Ph_WM_FFRONT | Ph_WM_MAX);
- PtSetArg(&args[nargs++], Pt_ARG_WINDOW_STATE, Pt_TRUE, Ph_WM_STATE_ISFRONT | Ph_WM_STATE_ISMAX |
- Ph_WM_STATE_ISFOCUS | Ph_WM_STATE_ISALTKEY);
+ PtSetArg(&args[nargs++], Pt_ARG_WINDOW_STATE, Pt_TRUE, Ph_WM_STATE_ISFRONT | Ph_WM_STATE_ISFOCUS | Ph_WM_STATE_ISALTKEY);
}
else
{
+ windowpos = getenv("SDL_VIDEO_WINDOW_POS");
+ iscentered = getenv("SDL_VIDEO_CENTERED");
+
+ if ((iscentered) || ((windowpos) && (strcmp(windowpos, "center")==0)))
+ {
+ pos.x = (desktop_mode.width - w)/2;
+ pos.y = (desktop_mode.height - h)/2;
+ PtSetArg(&args[nargs++], Pt_ARG_POS, &pos, 0);
+ }
+ else
+ {
+ if (windowpos)
+ {
+ if (sscanf(windowpos, "%d,%d", &x, &y) == 2 )
+ {
+ pos.x=x;
+ pos.y=y;
+ PtSetArg(&args[nargs++], Pt_ARG_POS, &pos, 0);
+ }
+ }
+ }
+
+
+ PtSetArg(&args[nargs++], Pt_ARG_FILL_COLOR, Pg_BLACK, 0);
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_STATE, Pt_FALSE, Ph_WM_STATE_ISFRONT | Ph_WM_STATE_ISMAX | Ph_WM_STATE_ISALTKEY);
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_MANAGED_FLAGS, Pt_TRUE, Ph_WM_HIDE);
PtSetArg(&args[nargs++], Pt_ARG_WINDOW_NOTIFY_FLAGS, Pt_TRUE, Ph_WM_HIDE);
@@ -248,6 +274,7 @@
PtSetResources(window, nargs, args);
PtRealizeWidget(window);
+ PtWindowToFront(window);
return 0;
}
@@ -281,7 +308,6 @@
static int ph_VideoInit(_THIS, SDL_PixelFormat *vformat)
{
- PgVideoModeInfo_t my_mode_info;
PgHWCaps_t my_hwcaps;
int i;
@@ -325,7 +351,7 @@
return -1;
}
- if (PgGetVideoModeInfo(my_hwcaps.current_video_mode, &my_mode_info) < 0)
+ if (PgGetVideoModeInfo(my_hwcaps.current_video_mode, &desktop_mode) < 0)
{
SDL_SetError("ph_VideoInit(): PgGetVideoModeInfo function failed !\n");
this->FreeWMCursor(this, SDL_BlankCursor);
@@ -333,9 +359,9 @@
}
/* We need to return BytesPerPixel as it in used by CreateRGBsurface */
- vformat->BitsPerPixel = my_mode_info.bits_per_pixel;
- vformat->BytesPerPixel = my_mode_info.bytes_per_scanline/my_mode_info.width;
- desktopbpp = my_mode_info.bits_per_pixel;
+ vformat->BitsPerPixel = desktop_mode.bits_per_pixel;
+ vformat->BytesPerPixel = desktop_mode.bytes_per_scanline/desktop_mode.width;
+ desktopbpp = desktop_mode.bits_per_pixel;
/* save current palette */
if (desktopbpp==8)
@@ -434,6 +460,7 @@
}
current->flags &= ~SDL_RESIZABLE; /* no resize for Direct Context */
+ current->flags |= SDL_HWSURFACE;
}
else
{
@@ -488,6 +515,10 @@
{
PtFlush();
}
+ else
+ {
+ PgFlush();
+ }
SDL_Unlock_EventThread();
--- a/src/video/photon/SDL_ph_video.h Sat Aug 23 23:18:49 2003 +0000
+++ b/src/video/photon/SDL_ph_video.h Sat Aug 23 23:20:21 2003 +0000
@@ -72,20 +72,22 @@
PgColor_t savedpal[_Pg_MAX_PALETTE];
PgColor_t syspalph[_Pg_MAX_PALETTE];
- struct {
+ struct
+ {
PdDirectContext_t* direct_context;
PdOffscreenContext_t* offscreen_context;
PdOffscreenContext_t* offscreen_backcontext;
PhDrawContext_t* oldDC;
uint8_t* dc_ptr;
- unsigned char* CurrentFrameData;
- unsigned char* FrameData0;
- unsigned char* FrameData1;
- int current;
- long flags;
+ unsigned char* CurrentFrameData;
+ unsigned char* FrameData0;
+ unsigned char* FrameData1;
+ int current;
+ long flags;
} ocimage;
PgHWCaps_t graphics_card_caps; /* Graphics card caps at the moment of start */
+ PgVideoModeInfo_t desktop_mode; /* Current desktop video mode information */
int old_video_mode; /* Stored mode before fullscreen switch */
int old_refresh_rate; /* Stored refresh rate befor fullscreen switch */
@@ -119,6 +121,7 @@
#define currently_hided (this->hidden->currently_hided)
#define event (this->hidden->event)
#define current_overlay (this->hidden->overlay)
+#define desktop_mode (this->hidden->desktop_mode)
/* Old variable names */
#define mouse_relative (this->hidden->mouse_relative)