Updated OS/2 build, yay!
authorSam Lantinga <slouken@libsdl.org>
Sun, 26 Feb 2006 19:30:21 +0000
changeset 1442 e3242177fe4a
parent 1441 b9f034536fa0
child 1443 9ebbbb4ae53b
Updated OS/2 build, yay!
Makefile.in
README.OS2
Watcom-OS2.zip
Watcom.mif
include/SDL_config.h
include/SDL_config.h.minimal
include/SDL_config_os2.h
include/SDL_thread.h
setvars.cmd
src/Makefile.wat
src/audio/Makefile.wat
src/audio/SDL_audio.c
src/audio/SDL_mixer.c
src/audio/SDL_mixer_MMX_VC.c
src/audio/SDL_mixer_MMX_VC.h
src/cdrom/Makefile.wat
src/cdrom/os2/SDL_syscdrom.c
src/cpuinfo/Makefile.wat
src/cpuinfo/SDL_cpuinfo.c
src/events/Makefile.wat
src/events/SDL_mouse.c
src/file/Makefile.wat
src/joystick/Makefile.wat
src/joystick/os2/SDL_sysjoystick.c
src/thread/Makefile.wat
src/thread/os2/SDL_systhread.c
src/timer/Makefile.wat
src/video/Makefile.wat
src/video/SDL_stretch.c
src/video/os2fslib/SDL_os2fslib.c
src/video/os2fslib/SDL_os2fslib.h
test/Makefile.wat
--- a/Makefile.in	Sun Feb 26 13:42:00 2006 +0000
+++ b/Makefile.in	Sun Feb 26 19:30:21 2006 +0000
@@ -36,7 +36,7 @@
 SDLMAIN_SOURCES = @SDLMAIN_SOURCES@
 SDLMAIN_OBJECTS = @SDLMAIN_OBJECTS@
 
-DIST = acinclude.m4 autogen.sh Borland.html Borland.zip BUGS build-scripts configure configure.in COPYING CREDITS CWprojects.sea.bin docs docs.html EpocBuildFiles.zip include INSTALL Makefile.dc Makefile.in MPWmake.sea.bin PBProjects.tar.gz README* sdl-config.in sdl.m4 SDL.qpg.in SDL.spec SDL.spec.in setvars.cmd src test TODO VisualCE.zip VisualC.html VisualC.zip Watcom.mif WhatsNew Xcode21.tar.gz Xcode.tar.gz XcodeUniversal.tar.gz
+DIST = acinclude.m4 autogen.sh Borland.html Borland.zip BUGS build-scripts configure configure.in COPYING CREDITS CWprojects.sea.bin docs docs.html EpocBuildFiles.zip include INSTALL Makefile.dc Makefile.in MPWmake.sea.bin PBProjects.tar.gz README* sdl-config.in sdl.m4 SDL.qpg.in SDL.spec SDL.spec.in src test TODO VisualCE.zip VisualC.html VisualC.zip Watcom-OS2.zip WhatsNew Xcode21.tar.gz Xcode.tar.gz XcodeUniversal.tar.gz
 
 LT_AGE      = @LT_AGE@
 LT_CURRENT  = @LT_CURRENT@
--- a/README.OS2	Sun Feb 26 13:42:00 2006 +0000
+++ b/README.OS2	Sun Feb 26 19:30:21 2006 +0000
@@ -3,7 +3,7 @@
 SDL on OS/2
 ===========
 
-Last updated on Oct 02, 2005.
+Last updated on Feb. 26, 2006.
 
 
 1. How to compile?
@@ -16,6 +16,11 @@
 - The FSLib library
   (ftp://ftp.netlabs.org/pub/SDL)
 
+First of all, you have to put the OS/2-specific Watcom makefiles into the
+source code tree by unzipping the file Watcom-OS2.zip here.  This will
+result in a Watcom.mif and a setvars.cmd file in this folder, and several
+Makefile.wat files in the src\ folder and in some of its subfolders.
+
 Please edit the second, fourth and fifth lines of setvars.cmd file
 to set the folders where the toolkit, the OW compiler and the FSLib are. 
 You won't need NASM yet (The Netwide Assembler), you can leave that line.
@@ -107,7 +112,59 @@
 
 
 
-6. Next steps...
+6. Proportional windows
+-----------------------
+
+For some SDL applications it can be handy to have proportional windows, so
+the windows will keep their aspect ratio when resized.
+This can be achieved in two ways:
+
+- Before starting the given SDL application, set the
+  SDL_USE_PROPORTIONAL_WINDOW environment variable to something, e.g.:
+
+  SET SDL_USE_PROPORTIONAL_WINDOW=1
+  dosbox.exe
+
+- If you have a HOME environment variable set, then SDL will look for a file
+  in there called ".sdl.proportionals". If that file contains the name of the
+  currently running SDL executable, then that process will have proportional
+  windows automatically.
+
+  Please note that this file is created automatically with default values
+  at the first run.
+
+
+
+7. Audio in SDL applications
+----------------------------
+
+Audio effects are one of the most important features in games. Creating audio
+effects in sync with the game and without hickups and pauses in the audio are
+very important things.
+
+However there are multithreaded SDL applications that have tight loops as their
+main logic loop. This kills performance in OS/2, and takes too much CPU from
+other threads in the same process, for example from the thread to create the 
+sound effects.
+
+For this reason, the OS/2 port of SDL can be instructed to run the audio thread
+in high priority, which makes sure that there will be enough time for the 
+processing of the audio data.
+
+At default, SDL/2 runs the audio thread at ForegroundServer+0 priority. Well 
+written and well behaving SDL applications should work well in this mode.
+For other applications, you can tell SDL/2 to run the audio thread at 
+TimeCritical priority by setting an env.variable before starting the SDL app:
+
+    SET SDL_USE_TIMECRITICAL_AUDIO=1
+
+Please note that this is a bit risky, because if the SDL application runs a
+tight infinite loop in this thread, this will make the whole system 
+unresponsive, so use it with care, and only for applications that need it!
+
+
+
+8. Next steps...
 ----------------
 
 Things to do:
@@ -119,7 +176,7 @@
 
 
 
-7. Contacts
+9. Contacts
 -----------
 
    You can contact the developers for bugs:
@@ -131,3 +188,90 @@
    Notice however that SDL/2 is 'in development' stage so ... if you want to help,
 please, be our guest and contact us!
 
+
+
+10. Changelog of the OS/2 port
+------------------------------
+
+Version 1.2 - 2006-02-26  - Doodle
+ - Updated the official SDL version with the OS/2 specific changes.
+ - Added support for real unicode keycode conversion.
+
+Version 1.2.7 - 2006-01-20  - Doodle
+ - Added support for selectively using timecritical priority for
+   audio threads by SDL_USE_TIMECRITICAL_AUDIO environment variable.
+   (e.g.: 
+    SET SDL_USE_TIMECRITICAL_AUDIO=1
+    dosbox.exe
+   )
+
+Version 1.2.7 - 2005-12-22  - Doodle
+ - Added support for proportional SDL windows.
+   There are two ways to have proportional (aspect-keeping) windows for
+   a given SDL application: Either set the SDL_USE_PROPORTIONAL_WINDOW
+   environment variable to something before starting the application
+   (e.g.: 
+    SET SDL_USE_PROPORTIONAL_WINDOW=1
+    dosbox.exe
+   )
+   or, if you have the HOME environment variable set, then SDL.DLL will
+   create a file in that directory called .sdl.proportionals, and you can
+   put there the name of executable files that will be automatically made
+   proportional.
+
+Version 1.2.7 - 2005-10-14  - Doodle
+ - Enabled Exception handler code in FSLib to be able to restore original
+   desktop video mode in case the application crashes.
+ - Added the missing FSLib_Uninitialize() call into SDL.
+   (The lack of it did not cause problems, but it's cleaner this way.)
+ - Fixed a mouse problem in Fullscreen mode where any mouse click
+   re-centered the mouse.
+
+Version 1.2.7 - 2005-10-09  - Doodle
+ - Implemented window icon support
+
+Version 1.2.7 - 2005-10-03  - Doodle
+ - Reworked semaphore support again
+ - Tuned thread priorities
+
+Version 1.2.7 - 2005-10-02  - Doodle
+ - Added support for custom mouse pointers
+ - Fixed WM_CLOSE processing: give a chance to SDL app to ask user...
+ - Added support for MMX-accelerated audio mixers
+ - Other small fixes
+
+Version 1.2.7 - 2005-09-12  - Doodle
+ - Small fixes for DosBox incorporated into public release
+ - Fixed semaphore support (SDL_syssem.c)
+ - Fixed FSLib to have good clipping in scaled window mode,
+   and to prevent occasional desktop freezes.
+
+Version 1.2.7 - 2004-09-08a - Caetano
+	- Improved joystick support (general verifications about hardware).
+	- Added support up to 8 buttons in 2 axes joysticks and 6 buttons in 3 axes joysticks.
+	- Added support to environment variable SDL_OS2_JOYSTICK to specify a joystick.
+	- Improved Joystick test to handle every type of joystick and display only relevant information.
+	- Merged with Doodle 2004-09-08
+	- Little tid up in README.OS2
+	- Added explanation about SDL_OS2_JOYSTICK environment variable on README.OS2
+
+Version 1.2.7 - 2004-09-07 - Caetano
+	- Merged with changes in headers for GCC compiling.
+	- Added Joystick support using basic IBM GAME$ support, allowing it to work with all joystick drivers since OS/2 2.1.
+	- Improved joystick detection (hacked!). OS/2 do not allow real joystick detection, so... 
+	- Modified makefile in test to compile "testjoystick". Anyway, it's useless, since it seems to cause a lot of trouble in OS/2 (because os video routines, not Joystick support).
+	- Created separated Joystick test program to test only joystick functions.
+	- Improved joystick auto-centering.
+	- Improved the coordinate correction routine to use two scale factors for each axis.
+
+Version 1.2.7 - 2004-07-05 - Caetano
+	- Corrected the time returned by status in CDROM support (it was incorrect)
+	- Added the testcdrom.c and corrected the linking directive (it was causing an error)
+
+Version 1.2.7 - 2004-07-02a - Caetano
+	- Corrected a little problem in a comment at SDL-1.2.7\test\torturethread.c, line 18 (missing */, nested comment)
+	- Added CDROM support to tree (SDL-1.2.7\src\cdrom\os2\SDL_syscdrom.c)
+	- Modified makefile (SDL-1.2.7\src\makefiles.wat and SDL-1.2.7\watcom.mif) to build with CDROM support
+	- Added the "extra" SDL_types.h forgotten in 2004-07-02 version.
+
+<End-Of-File>
Binary file Watcom-OS2.zip has changed
--- a/Watcom.mif	Sun Feb 26 13:42:00 2006 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,33 +0,0 @@
-#=============================================================================
-#             This file contains the common includes for the
-#               Watcom makefiles to build SDL.DLL for OS/2
-#
-#
-#=============================================================================
-
-# Create debug build or not?
-#debug_build=defined
-
-# Special flags for building SDL
-SDLCFlags = -dBUILD_SDL -dCHECK_LEAKS
-
-#
-#==============================================================================
-#
-
-!ifdef debug_build
-debugflags = -d2 -dDEBUG_BUILD
-!else
-debugflags =
-!endif
-
-cflags = -zq $(debugflags) -bd -bm -bt=OS2 -5s -fpi -sg -otexan -wx -ei $(SDLCFlags) $(ExtraCFlags)
-
-.extensions:
-.extensions: .lib .dll .obj .c .asm
-
-.c.obj : .AUTODEPEND
-    wcc386 $[* $(cflags)
-
-.asm.obj : .AUTODEPEND
-    nasm -t -O2 -f obj -I$(%include) $[*.asm
--- a/include/SDL_config.h	Sun Feb 26 13:42:00 2006 +0000
+++ b/include/SDL_config.h	Sun Feb 26 19:30:21 2006 +0000
@@ -36,6 +36,8 @@
 #include "SDL_config_macosx.h"
 #elif defined(__WIN32__)
 #include "SDL_config_win32.h"
+#elif defined(__OS2__)
+#include "SDL_config_os2.h"
 #else
 /* This is the minimal configuration that can be used to build SDL */
 
--- a/include/SDL_config.h.minimal	Sun Feb 26 13:42:00 2006 +0000
+++ b/include/SDL_config.h.minimal	Sun Feb 26 19:30:21 2006 +0000
@@ -36,6 +36,8 @@
 #include "SDL_config_macosx.h"
 #elif defined(__WIN32__)
 #include "SDL_config_win32.h"
+#elif defined(__OS2__)
+#include "SDL_config_os2.h"
 #else
 /* This is the minimal configuration that can be used to build SDL */
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/SDL_config_os2.h	Sun Feb 26 19:30:21 2006 +0000
@@ -0,0 +1,136 @@
+/*
+    SDL - Simple DirectMedia Layer
+    Copyright (C) 1997-2006 Sam Lantinga
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    Sam Lantinga
+    slouken@libsdl.org
+*/
+
+#ifndef _SDL_config_os2_h
+#define _SDL_config_os2_h
+
+/* This is a set of defines to configure the SDL features */
+
+typedef signed char         int8_t;
+typedef unsigned char       uint8_t;
+typedef signed short        int16_t;
+typedef unsigned short      uint16_t;
+typedef signed int          int32_t;
+typedef unsigned int        uint32_t;
+typedef unsigned int        size_t;
+typedef unsigned long       uintptr_t;
+typedef signed long long    int64_t;
+typedef unsigned long long  uint64_t;
+
+#define SDL_HAS_64BIT_TYPE	1
+
+/* Use Watcom's LIBC */
+#define HAVE_LIBC 1
+
+/* Useful headers */
+#define HAVE_SYS_TYPES_H 1
+#define HAVE_STDIO_H 1
+#define STDC_HEADERS 1
+#define HAVE_STDLIB_H 1
+#define HAVE_STDARG_H 1
+#define HAVE_MALLOC_H 1
+#define HAVE_MEMORY_H 1
+#define HAVE_STRING_H 1
+#define HAVE_STRINGS_H 1
+#define HAVE_INTTYPES_H 1
+#define HAVE_STDINT_H 1
+#define HAVE_CTYPE_H 1
+#define HAVE_MATH_H 1
+#define HAVE_SIGNAL_H 1
+
+/* C library functions */
+#define HAVE_MALLOC 1
+#define HAVE_CALLOC 1
+#define HAVE_REALLOC 1
+#define HAVE_FREE 1
+#define HAVE_ALLOCA 1
+#define HAVE_GETENV 1
+#define HAVE_PUTENV 1
+#define HAVE_UNSETENV 1
+#define HAVE_QSORT 1
+#define HAVE_ABS 1
+#define HAVE_BCOPY 1
+#define HAVE_MEMSET 1
+#define HAVE_MEMCPY 1
+#define HAVE_MEMMOVE 1
+#define HAVE_MEMCMP 1
+#define HAVE_STRLEN 1
+#define HAVE_STRLCPY 1
+#define HAVE_STRLCAT 1
+#define HAVE_STRDUP 1
+#define HAVE__STRREV 1
+#define HAVE__STRUPR 1
+#define HAVE__STRLWR 1
+#define HAVE_INDEX 1
+#define HAVE_RINDEX 1
+#define HAVE_STRCHR 1
+#define HAVE_STRRCHR 1
+#define HAVE_STRSTR 1
+#define HAVE_ITOA 1
+#define HAVE__LTOA 1
+#define HAVE__UITOA 1
+#define HAVE__ULTOA 1
+#define HAVE_STRTOL 1
+#define HAVE__I64TOA 1
+#define HAVE__UI64TOA 1
+#define HAVE_STRTOLL 1
+#define HAVE_STRTOD 1
+#define HAVE_ATOI 1
+#define HAVE_ATOF 1
+#define HAVE_STRCMP 1
+#define HAVE_STRNCMP 1
+#define HAVE_STRICMP 1
+#define HAVE_STRCASECMP 1
+#define HAVE_SSCANF 1
+#define HAVE_SNPRINTF 1
+#define HAVE_VSNPRINTF 1
+#define HAVE_SETJMP 1
+#define HAVE_CLOCK_GETTIME 1
+
+/* Enable various audio drivers */
+#define SDL_AUDIO_DRIVER_DART	1
+
+/* Enable various cdrom drivers */
+#define SDL_CDROM_OS2	1
+
+/* Enable various input drivers */
+#define SDL_JOYSTICK_OS2	1
+
+/* Enable various shared object loading systems */
+#define SDL_LOADSO_OS2	1
+
+/* Enable various threading systems */
+#define SDL_THREAD_OS2	1
+
+/* Enable various timer systems */
+#define SDL_TIMER_OS2	1
+
+/* Enable various video drivers */
+#define SDL_VIDEO_DRIVER_OS2FS	1
+
+/* Enable OpenGL support */
+/* Nothing here yet for OS/2... :( */
+
+/* Enable assembly routines where available */
+#define SDL_ASSEMBLY_ROUTINES	1
+
+#endif /* _SDL_config_os2_h */
--- a/include/SDL_thread.h	Sun Feb 26 13:42:00 2006 +0000
+++ b/include/SDL_thread.h	Sun Feb 26 19:30:21 2006 +0000
@@ -65,8 +65,8 @@
 #endif
 
 #ifdef __OS2__
-typedef int (__cdecl *pfnSDL_CurrentBeginThread)(void (*func)(void *), void *, unsigned, void *arg); 
-typedef void (__cdecl *pfnSDL_CurrentEndThread)(void);
+typedef int (*pfnSDL_CurrentBeginThread)(void (*func)(void *), void *, unsigned, void *arg); 
+typedef void (*pfnSDL_CurrentEndThread)(void);
 #else
 #ifdef __GNUC__
 #include <stdint.h>
--- a/setvars.cmd	Sun Feb 26 13:42:00 2006 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
-@ECHO OFF
-SET WATCOM=d:\watcom
-SET NASM=d:\nasm
-SET OS2TK=d:\os2tk45
-SET FSLIB=d:\watcom\projects\FSLib
-
-SET PATH=%WATCOM%\BINP;%WATCOM%\BINW;%os2tk%\bin;%NASM%;%PATH%
-SET INCLUDE=%WATCOM%\H;%WATCOM%\H\OS2
-SET FINCLUDE=%WATCOM%\SRC\FORTRAN
-SET EDPATH=%WATCOM%\EDDAT
-SET HELP=%WATCOM%\BINP\HELP;%HELP%
-SET BOOKSHELF=%WATCOM%\BINP\HELP;%BOOKSHELF%
-SET BEGINLIBPATH=%WATCOM%\BINP\DLL
-
-cmd
-
--- a/src/Makefile.wat	Sun Feb 26 13:42:00 2006 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,132 +0,0 @@
-#=============================================================================
-#          This is a Watcom makefile to build SDL.DLL for OS/2
-#
-#
-#=============================================================================
-
-dllname=SDL
-
-audioobjs = audio\SDL_audio.obj audio\SDL_audiocvt.obj audio\SDL_audiomem.obj &
-            audio\SDL_mixer.obj audio\SDL_mixer_MMX_VC.obj audio\SDL_wave.obj &
-            audio\SDL_dart.obj
-cdromobjs = cdrom\SDL_cdrom.obj cdrom\SDL_syscdrom.obj
-cpuinfoobjs = cpuinfo\SDL_cpuinfo.obj
-endianobjs = endian\SDL_endian.obj
-eventsobjs = events\SDL_active.obj events\SDL_events.obj events\SDL_expose.obj &
-             events\SDL_keyboard.obj events\SDL_mouse.obj events\SDL_quit.obj &
-             events\SDL_resize.obj
-fileobjs = file\SDL_rwops.obj
-hermesobjs = hermes\mmx_main.obj hermes\mmxp2_32.obj hermes\x86_main.obj &
-             hermes\x86p_16.obj hermes\x86p_32.obj
-joystickobjs = joystick\SDL_joystick.obj joystick\SDL_sysjoystick.obj
-threadobjs = thread\SDL_thread.obj thread\SDL_sysmutex.obj &
-             thread\SDL_syssem.obj thread\SDL_systhread.obj &
-             thread\SDL_syscond.obj
-timerobjs = timer\SDL_timer.obj timer\SDL_systimer.obj
-videoobjs = video\SDL_blit.obj video\SDL_blit_0.obj video\SDL_blit_1.obj &
-            video\SDL_blit_A.obj video\SDL_blit_N.obj video\SDL_bmp.obj &
-            video\SDL_cursor.obj video\SDL_gamma.obj video\SDL_pixels.obj &
-            video\SDL_RLEaccel.obj video\SDL_stretch.obj video\SDL_surface.obj &
-            video\SDL_video.obj video\SDL_yuv.obj video\SDL_yuv_mmx.obj &
-            video\SDL_yuv_sw.obj video\SDL_os2fslib.obj
-
-object_files= SDL.obj SDL_error.obj SDL_fatal.obj SDL_getenv.obj &
-              SDL_loadso.obj $(audioobjs) $(cpuinfoobjs) $(endianobjs) &
-              $(eventsobjs) $(fileobjs) $(joystickobjs) &
-              $(threadobjs) $(timerobjs) $(videoobjs) $(cdromobjs)
-	      
-
-# Extra stuffs to pass to C compiler:
-ExtraCFlags=
-
-#
-#==============================================================================
-#
-!include ..\Watcom.mif
-
-.before
-    @set include=$(%os2tk)\h;$(%include);../include;./thread;./thread/os2;./video;./cdrom;./cdrom/os2;./joystick;./joystick/os2;
-
-all : check_subdir_objects $(dllname).dll $(dllname).lib
-
-$(dllname).dll : $(dllname).lnk $(object_files)
-    wlink @$(dllname)
-
-check_subdir_objects: .always .symbolic
-    @cd audio
-    @wmake -h -f Makefile.wat
-    @cd ..\cdrom
-    @wmake -h -f Makefile.wat
-    @cd ..\cpuinfo
-    @wmake -h -f Makefile.wat
-    @cd ..\endian
-    @wmake -h -f Makefile.wat
-    @cd ..\events
-    @wmake -h -f Makefile.wat
-    @cd ..\file
-    @wmake -h -f Makefile.wat
-    @cd ..\joystick
-    @wmake -h -f Makefile.wat
-    @cd ..\thread
-    @wmake -h -f Makefile.wat
-    @cd ..\timer
-    @wmake -h -f Makefile.wat
-    @cd ..\video
-    @wmake -h -f Makefile.wat
-    @cd ..
-
-$(dllname).lnk :
-    @echo Creating linker file ($(dllname).lnk)...
-    @echo $#============================================================================= >$^@
-    @echo $#              This is a linker file to build SDL.DLL for OS/2 >>$^@
-    @echo $# >>$^@
-    @echo $# Generated automatically by Makefile.wat >>$^@
-    @echo $#============================================================================= >>$^@
-    @echo SYSTEM 386 LX DLL INITINSTANCE TERMINSTANCE >>$^@
-    @echo NAME $^& >>$^@
-    @for %i in ($(object_files)) do @echo FILE %i >>$^@
-    @echo LIBPATH %os2tk%\lib >>$^@
-    @echo LIBPATH %fslib% >>$^@
-    @echo LIB mmpm2.lib >>$^@
-    @echo LIB fslib.lib >>$^@
-    @echo OPTION QUIET >>$^@
-    @echo OPTION MAP=$^&.map >>$^@
-    @echo OPTION DESCRIPTION 'Simple DirectMedia Layer v1.2.7' >>$^@
-    @echo OPTION ELIMINATE >>$^@
-    @echo OPTION MANYAUTODATA >>$^@
-    @echo OPTION OSNAME='OS/2 and eComStation' >>$^@
-    @echo OPTION SHOWDEAD >>$^@
-    @echo Linker file created!
-
-$(dllname).lib : $(dllname).dll
-    implib $(dllname).lib $(dllname).dll
-
-clean : .SYMBOLIC
-    @if exist *.dll del *.dll
-    @if exist *.lib del *.lib
-    @if exist *.obj del *.obj
-    @if exist *.lnk del *.lnk
-    @if exist *.map del *.map
-    @if exist *.res del *.res
-    @if exist *.lst del *.lst
-    @cd audio
-    @wmake -h -f Makefile.wat clean
-    @cd ..\cdrom
-    @wmake -h -f Makefile.wat clean
-    @cd ..\cpuinfo
-    @wmake -h -f Makefile.wat clean
-    @cd ..\endian
-    @wmake -h -f Makefile.wat clean
-    @cd ..\events
-    @wmake -h -f Makefile.wat clean
-    @cd ..\file
-    @wmake -h -f Makefile.wat clean
-    @cd ..\joystick
-    @wmake -h -f Makefile.wat clean
-    @cd ..\thread
-    @wmake -h -f Makefile.wat clean
-    @cd ..\timer
-    @wmake -h -f Makefile.wat clean
-    @cd ..\video
-    @wmake -h -f Makefile.wat clean
-    @cd ..
--- a/src/audio/Makefile.wat	Sun Feb 26 13:42:00 2006 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,27 +0,0 @@
-#=============================================================================
-#          This is a Watcom makefile to build SDL.DLL for OS/2
-#
-# Makefile for DART (audio support)
-#=============================================================================
-
-object_files= SDL_audio.obj SDL_audiocvt.obj SDL_audiomem.obj SDL_mixer.obj SDL_mixer_MMX_VC.obj SDL_wave.obj SDL_dart.obj
-ExtraCFlags=-dUSE_ASM_MIXER_VC -dUSE_DOSSETPRIORITY
-
-#
-#==============================================================================
-#
-!include ..\..\Watcom.mif
-
-.before
-    set include=$(%os2tk)\h;$(%include);../../include;./dart
-
-all : $(object_files)
-
-SDL_dart.obj: .AUTODEPEND
-    wcc386 dart\SDL_dart.c $(cflags)
-
-clean : .SYMBOLIC
-        @if exist *.obj del *.obj
-        @if exist *.map del *.map
-        @if exist *.res del *.res
-        @if exist *.lst del *.lst
--- a/src/audio/SDL_audio.c	Sun Feb 26 13:42:00 2006 +0000
+++ b/src/audio/SDL_audio.c	Sun Feb 26 19:30:21 2006 +0000
@@ -181,10 +181,20 @@
         // Increase the priority of this thread to make sure that
         // the audio will be continuous all the time!
 #ifdef USE_DOSSETPRIORITY
+        if (SDL_getenv("SDL_USE_TIMECRITICAL_AUDIO"))
+        {
 #ifdef DEBUG_BUILD
-        printf("[SDL_RunAudio] : Setting priority to ForegroundServer+0! (TID%d)\n", SDL_ThreadID());
+          printf("[SDL_RunAudio] : Setting priority to TimeCritical+0! (TID%d)\n", SDL_ThreadID());
 #endif
-        DosSetPriority(PRTYS_THREAD, PRTYC_FOREGROUNDSERVER, 0, 0);
+          DosSetPriority(PRTYS_THREAD, PRTYC_TIMECRITICAL, 0, 0);
+        }
+        else
+        {
+#ifdef DEBUG_BUILD
+          printf("[SDL_RunAudio] : Setting priority to ForegroundServer+0! (TID%d)\n", SDL_ThreadID());
+#endif
+          DosSetPriority(PRTYS_THREAD, PRTYC_FOREGROUNDSERVER, 0, 0);
+        }
 #endif
 #endif
 
--- a/src/audio/SDL_mixer.c	Sun Feb 26 13:42:00 2006 +0000
+++ b/src/audio/SDL_mixer.c	Sun Feb 26 19:30:21 2006 +0000
@@ -134,8 +134,7 @@
 				SDL_MixAudio_MMX_S8((char*)dst,(char*)src,(unsigned int)len,(int)volume);
 			}
 			else
-#endif
-#if defined(_MSC_VER) && defined(M_I86) && defined(SDL_ASSEMBLY_ROUTINES)
+#elif ((defined(_MSC_VER) && defined(_M_IX86)) || defined(__WATCOMC__)) && defined(SDL_ASSEMBLY_ROUTINES)
 			if (SDL_HasMMX())
 			{
 				SDL_MixAudio_MMX_S8_VC((char*)dst,(char*)src,(unsigned int)len,(int)volume);
@@ -180,8 +179,8 @@
 			{
 				SDL_MixAudio_MMX_S16((char*)dst,(char*)src,(unsigned int)len,(int)volume);
 			}
-			else
-#elif defined(USE_ASM_MIXER_VC)
+                        else
+#elif ((defined(_MSC_VER) && defined(_M_IX86)) || defined(__WATCOMC__)) && defined(SDL_ASSEMBLY_ROUTINES)
 			if (SDL_HasMMX())
 			{
 				SDL_MixAudio_MMX_S16_VC((char*)dst,(char*)src,(unsigned int)len,(int)volume);
--- a/src/audio/SDL_mixer_MMX_VC.c	Sun Feb 26 13:42:00 2006 +0000
+++ b/src/audio/SDL_mixer_MMX_VC.c	Sun Feb 26 19:30:21 2006 +0000
@@ -23,7 +23,7 @@
 
 #include "SDL_mixer_MMX_VC.h"
 
-#if defined(_MSC_VER) && defined(M_I86) && defined(SDL_ASSEMBLY_ROUTINES)
+#if ((defined(_MSC_VER) && defined(_M_IX86)) || defined(__WATCOMC__)) && defined(SDL_ASSEMBLY_ROUTINES)
 // MMX assembler version of SDL_MixAudio for signed little endian 16 bit samples and signed 8 bit samples
 // Copyright 2002 Stephane Marchesin (stephane.marchesin@wanadoo.fr)
 // Converted to Intel ASM notation by Cth
--- a/src/audio/SDL_mixer_MMX_VC.h	Sun Feb 26 13:42:00 2006 +0000
+++ b/src/audio/SDL_mixer_MMX_VC.h	Sun Feb 26 19:30:21 2006 +0000
@@ -21,7 +21,7 @@
 */
 #include "SDL_config.h"
 
-#if defined(_MSC_VER) && defined(M_I86) && defined(SDL_ASSEMBLY_ROUTINES)
+#if ((defined(_MSC_VER) && defined(M_I86)) || (defined(__WATCOMC__))) && defined(SDL_ASSEMBLY_ROUTINES)
 // headers for MMX assembler version of SDL_MixAudio
 // Copyright 2002 Stephane Marchesin (stephane.marchesin@wanadoo.fr)
 // Converted to Intel ASM notation by Cth
--- a/src/cdrom/Makefile.wat	Sun Feb 26 13:42:00 2006 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,30 +0,0 @@
-#=============================================================================
-#          This is a Watcom makefile to build SDL.DLL for OS/2
-#
-# Makefile for OS/2 System CDROM support
-#=============================================================================
-
-object_files=SDL_syscdrom.obj SDL_cdrom.obj
-ExtraCFlags=
-
-#
-#==============================================================================
-#
-!include ..\..\Watcom.mif
-
-.before
-    set include=$(%os2tk)\h;$(%include);../../include;./os2;../;
-
-all : $(object_files)
-
-SDL_syscdrom.obj : .AUTODEPEND
-    wcc386 os2\SDL_syscdrom.c $(cflags)
-
-SDL_cdrom.obj : .AUTODEPEND
-    wcc386 SDL_cdrom.c $(cflags)
-
-clean : .SYMBOLIC
-        @if exist *.obj del *.obj
-        @if exist *.map del *.map
-        @if exist *.res del *.res
-        @if exist *.lst del *.lst
--- a/src/cdrom/os2/SDL_syscdrom.c	Sun Feb 26 13:42:00 2006 +0000
+++ b/src/cdrom/os2/SDL_syscdrom.c	Sun Feb 26 19:30:21 2006 +0000
@@ -293,7 +293,7 @@
 	if (msp.ulReturn == MCI_MODE_PAUSE)
 		{
 		mgp.hwndCallback = (HWND)NULL;		// None
-		mciSendCommand(cdrom->id,MCI_RESUME,NULL,&mgp, 0);
+		mciSendCommand(cdrom->id,MCI_RESUME,0,&mgp, 0);
 		}
 	}
 /* Now play it. */
@@ -338,7 +338,7 @@
 	if (msp.ulReturn == MCI_MODE_PAUSE)
 		{
 		mgp.hwndCallback = (HWND)NULL;		// None
-		mciSendCommand(cdrom->id,MCI_RESUME,NULL,&mgp, 0);
+		mciSendCommand(cdrom->id,MCI_RESUME,0,&mgp, 0);
 		}
 	}
 /* Now stops the media */
--- a/src/cpuinfo/Makefile.wat	Sun Feb 26 13:42:00 2006 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,27 +0,0 @@
-#=============================================================================
-#          This is a Watcom makefile to build SDL.DLL for OS/2
-#
-# Makefile for cpuinfo
-#=============================================================================
-
-object_files=SDL_cpuinfo.obj
-
-# We have to define the following so the assembly parts can be
-# compiled by Watcom, too!
-ExtraCFlags=-d_MSC_VER
-
-#
-#==============================================================================
-#
-!include ..\..\Watcom.mif
-
-.before
-    set include=$(%os2tk)\h;$(%include);../../include
-
-all : $(object_files)
-
-clean : .SYMBOLIC
-        @if exist *.obj del *.obj
-        @if exist *.map del *.map
-        @if exist *.res del *.res
-        @if exist *.lst del *.lst
--- a/src/cpuinfo/SDL_cpuinfo.c	Sun Feb 26 13:42:00 2006 +0000
+++ b/src/cpuinfo/SDL_cpuinfo.c	Sun Feb 26 19:30:21 2006 +0000
@@ -96,7 +96,7 @@
 	:
 	: "%rax", "%rcx"
 	);
-#elif defined(_MSC_VER) && (defined(_M_IX86) || defined(_X86_))
+#elif (defined(_MSC_VER) && defined(_M_IX86)) || defined(__WATCOMC__)
 	__asm {
         pushfd                      ; Get original EFLAGS
         pop     eax
@@ -165,7 +165,7 @@
 	:
 	: "%eax", "%ecx", "%edx", "%edi"
 	);
-#elif defined(_MSC_VER)  && (defined(_M_IX86) || defined(_X86_))
+#elif (defined(_MSC_VER) && defined(_M_IX86)) || defined(__WATCOMC__)
 	__asm {
         xor     eax, eax            ; Set up for CPUID instruction
         cpuid                       ; Get and save vendor ID
@@ -217,7 +217,7 @@
 	:
 	: "%eax", "%ecx", "%edx", "%edi"
 	);
-#elif defined(_MSC_VER)  && (defined(_M_IX86) || defined(_X86_))
+#elif (defined(_MSC_VER) && defined(_M_IX86)) || defined(__WATCOMC__)
 	__asm {
         mov     eax,80000000h       ; Query for extended functions
         cpuid                       ; Get extended function limit
--- a/src/events/Makefile.wat	Sun Feb 26 13:42:00 2006 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
-#=============================================================================
-#          This is a Watcom makefile to build SDL.DLL for OS/2
-#
-# Makefile for events
-#=============================================================================
-
-object_files=SDL_active.obj SDL_events.obj SDL_expose.obj SDL_keyboard.obj SDL_mouse.obj SDL_quit.obj SDL_resize.obj
-ExtraCFlags=-dUSE_DOSSETPRIORITY
-
-#
-#==============================================================================
-#
-!include ..\..\Watcom.mif
-
-.before
-    set include=$(%os2tk)\h;$(%include);../../include;../timer;../joystick;../video;
-
-all : $(object_files)
-
-clean : .SYMBOLIC
-        @if exist *.obj del *.obj
-        @if exist *.map del *.map
-        @if exist *.res del *.res
-        @if exist *.lst del *.lst
--- a/src/events/SDL_mouse.c	Sun Feb 26 13:42:00 2006 +0000
+++ b/src/events/SDL_mouse.c	Sun Feb 26 19:30:21 2006 +0000
@@ -176,7 +176,7 @@
 	SDL_MouseY = Y;
 	SDL_DeltaX += Xrel;
 	SDL_DeltaY += Yrel;
-	SDL_MoveCursor(SDL_MouseX, SDL_MouseY);
+        SDL_MoveCursor(SDL_MouseX, SDL_MouseY);
 
 	/* Post the event, if desired */
 	posted = 0;
--- a/src/file/Makefile.wat	Sun Feb 26 13:42:00 2006 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
-#=============================================================================
-#          This is a Watcom makefile to build SDL.DLL for OS/2
-#
-# Makefile for file
-#=============================================================================
-
-object_files=SDL_rwops.obj
-ExtraCFlags=
-
-#
-#==============================================================================
-#
-!include ..\..\Watcom.mif
-
-.before
-    set include=$(%os2tk)\h;$(%include);../../include
-
-all : $(object_files)
-
-clean : .SYMBOLIC
-        @if exist *.obj del *.obj
-        @if exist *.map del *.map
-        @if exist *.res del *.res
-        @if exist *.lst del *.lst
--- a/src/joystick/Makefile.wat	Sun Feb 26 13:42:00 2006 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,27 +0,0 @@
-#=============================================================================
-#          This is a Watcom makefile to build SDL.DLL for OS/2
-#
-# Makefile for joystick (using the dummy joystick driver)
-#=============================================================================
-
-object_files=SDL_joystick.obj SDL_sysjoystick.obj
-ExtraCFlags=
-
-#
-#==============================================================================
-#
-!include ..\..\Watcom.mif
-
-.before
-    set include=$(%os2tk)\h;$(%include);../../include;./os2;../;../events;
-
-all : $(object_files)
-
-SDL_sysjoystick.obj: .AUTODEPEND
-    wcc386 os2\SDL_sysjoystick.c $(cflags)
-
-clean : .SYMBOLIC
-        @if exist *.obj del *.obj
-        @if exist *.map del *.map
-        @if exist *.res del *.res
-        @if exist *.lst del *.lst
--- a/src/joystick/os2/SDL_sysjoystick.c	Sun Feb 26 13:42:00 2006 +0000
+++ b/src/joystick/os2/SDL_sysjoystick.c	Sun Feb 26 19:30:21 2006 +0000
@@ -32,6 +32,7 @@
 #include "joyos2.h"
 
 #include "SDL_joystick.h"
+#include "SDL_events.h"
 #include "../SDL_sysjoystick.h"
 #include "../SDL_joystick_c.h"
 
@@ -50,7 +51,7 @@
 #define JOY_BUTTON_FLAG(n) (1<<n)
 
 /* Joystick data... hold information about detected devices */
-struct _SYS_JoyData
+typedef struct SYS_JoyData_s
 {
 Sint8					id;								// Device ID
 char					szDeviceName[MAX_JOYNAME];	// Device Name
@@ -62,7 +63,9 @@
 int					axes_med[MAX_AXES];			// medium callibration value for axes
 int					axes_max[MAX_AXES];			// maximum callibration value for axes
 int					buttoncalc[4];					// Used for buttons 5, 6, 7 and 8.
-} SYS_JoyData[MAX_JOYSTICKS];
+} SYS_JoyData_t, *SYS_JoyData_p;
+
+SYS_JoyData_t SYS_JoyData[MAX_JOYSTICKS];
 
 
 /* Structure used to convert data from OS/2 driver format to SDL format */
@@ -292,16 +295,16 @@
 			}
 		/* Hack to define Joystick Port Names */
 		if ( numdevs > maxdevs ) numdevs = maxdevs;
-		for (i=0; i<numdevs; i++) {
-			SDL_snprintf (SYS_JoyData[i].szDeviceName, SDL_arraysize(szDeviceName), "Default Joystick %c", 'A'+SYS_JoyData[i].id);
-		}
+		for (i=0; i<numdevs; i++)
+                  SDL_snprintf (SYS_JoyData[i].szDeviceName, SDL_arraysize(SYS_JoyData[i].szDeviceName), "Default Joystick %c", 'A'+SYS_JoyData[i].id);
+
+                }
 	}
 /* Return the number of devices found */
 return(numdevs);
 }
 
 
-
 /***********************************************************/
 /* Function to get the device-dependent name of a joystick */
 /***********************************************************/
--- a/src/thread/Makefile.wat	Sun Feb 26 13:42:00 2006 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,36 +0,0 @@
-#=============================================================================
-#          This is a Watcom makefile to build SDL.DLL for OS/2
-#
-# Makefile for threading
-#=============================================================================
-
-object_files=SDL_thread.obj SDL_sysmutex.obj SDL_syssem.obj SDL_systhread.obj SDL_syscond.obj
-ExtraCFlags=
-
-#
-#==============================================================================
-#
-!include ..\..\Watcom.mif
-
-.before
-    set include=$(%os2tk)\h;$(%include);../../include;./os2;../;
-
-all : $(object_files)
-
-SDL_sysmutex.obj: .AUTODEPEND
-    wcc386 os2\SDL_sysmutex.c $(cflags)
-
-SDL_syssem.obj: .AUTODEPEND
-    wcc386 os2\SDL_syssem.c $(cflags)
-
-SDL_systhread.obj: .AUTODEPEND
-    wcc386 os2\SDL_systhread.c $(cflags)
-
-SDL_syscond.obj: .AUTODEPEND
-    wcc386 os2\SDL_syscond.c $(cflags)
-
-clean : .SYMBOLIC
-        @if exist *.obj del *.obj
-        @if exist *.map del *.map
-        @if exist *.res del *.res
-        @if exist *.lst del *.lst
--- a/src/thread/os2/SDL_systhread.c	Sun Feb 26 13:42:00 2006 +0000
+++ b/src/thread/os2/SDL_systhread.c	Sun Feb 26 19:30:21 2006 +0000
@@ -30,6 +30,7 @@
 
 #include "SDL_thread.h"
 #include "../SDL_systhread.h"
+#include "../SDL_thread_c.h"
 
 typedef struct ThreadStartParms
 {
--- a/src/timer/Makefile.wat	Sun Feb 26 13:42:00 2006 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,27 +0,0 @@
-#=============================================================================
-#          This is a Watcom makefile to build SDL.DLL for OS/2
-#
-# Makefile for timers
-#=============================================================================
-
-object_files=SDL_timer.obj SDL_systimer.obj
-ExtraCFlags=
-
-#
-#==============================================================================
-#
-!include ..\..\Watcom.mif
-
-.before
-    set include=$(%os2tk)\h;$(%include);../../include;./os2;../;
-
-all : $(object_files)
-
-SDL_systimer.obj: .AUTODEPEND
-    wcc386 os2\SDL_systimer.c $(cflags)
-
-clean : .SYMBOLIC
-        @if exist *.obj del *.obj
-        @if exist *.map del *.map
-        @if exist *.res del *.res
-        @if exist *.lst del *.lst
--- a/src/video/Makefile.wat	Sun Feb 26 13:42:00 2006 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,27 +0,0 @@
-#=============================================================================
-#          This is a Watcom makefile to build SDL.DLL for OS/2
-#
-# Makefile for threading
-#=============================================================================
-
-object_files=SDL_blit.obj SDL_blit_0.obj SDL_blit_1.obj SDL_blit_A.obj SDL_blit_N.obj SDL_bmp.obj SDL_cursor.obj SDL_gamma.obj SDL_pixels.obj SDL_RLEaccel.obj SDL_stretch.obj SDL_surface.obj SDL_video.obj SDL_yuv.obj SDL_yuv_mmx.obj SDL_yuv_sw.obj SDL_os2fslib.obj
-ExtraCFlags=-dUSE_DOSSETPRIORITY
-
-#
-#==============================================================================
-#
-!include ..\..\Watcom.mif
-
-.before
-    set include=$(%os2tk)\h;$(%include);../../include;../;./os2;../events;../hermes;$(%FSLIB);
-
-all : $(object_files)
-
-SDL_os2fslib.obj : .AUTODEPEND
-    wcc386 os2fslib\SDL_os2fslib.c $(cflags)
-
-clean : .SYMBOLIC
-        @if exist *.obj del *.obj
-        @if exist *.map del *.map
-        @if exist *.res del *.res
-        @if exist *.lst del *.lst
--- a/src/video/SDL_stretch.c	Sun Feb 26 13:42:00 2006 +0000
+++ b/src/video/SDL_stretch.c	Sun Feb 26 19:30:21 2006 +0000
@@ -35,6 +35,7 @@
 */
 
 #if ((defined(_MFC_VER) && defined(_M_IX86)/* && !defined(_WIN32_WCE) still needed? */) || \
+     defined(__WATCOMC__) || \
      (defined(__GNUC__) && defined(__i386__))) && SDL_ASSEMBLY_ROUTINES
 #define USE_ASM_STRETCH
 #endif
@@ -281,8 +282,7 @@
 			: "=&D" (u1), "=&S" (u2)
 			: "0" (dstp), "1" (srcp), "r" (copy_row)
 			: "memory" );
-#else
-#ifdef _MSC_VER
+#elif defined(_MSC_VER) || defined(__WATCOMC__)
 		{ void *code = copy_row;
 			__asm {
 				push edi
@@ -299,7 +299,6 @@
 #else
 #error Need inline assembly for this compiler
 #endif
-#endif /* __GNUC__ */
 			break;
 		}
 #else
--- a/src/video/os2fslib/SDL_os2fslib.c	Sun Feb 26 13:42:00 2006 +0000
+++ b/src/video/os2fslib/SDL_os2fslib.c	Sun Feb 26 19:30:21 2006 +0000
@@ -21,6 +21,11 @@
 */
 #include "SDL_config.h"
 
+#define _ULS_CALLCONV_
+#define CALLCONV _System
+#include <unidef.h>                    // Unicode API
+#include <uconv.h>                     // Unicode API (codepage conversion)
+
 #include <process.h>
 #include <time.h>
 
@@ -115,8 +120,8 @@
 //
 /////////////////////////////////////////////////////////////////////
 static BOOL SetAccessableWindowPos(HWND hwnd, HWND hwndInsertBehind,
-				   LONG x, LONG y,
-				   LONG cx, LONG cy,
+                                   LONG x, LONG y,
+                                   LONG cx, LONG cy,
                                    ULONG fl)
 {
   SWP swpDesktop, swp;
@@ -169,6 +174,58 @@
   return WinSetWindowPos(hwnd, hwndInsertBehind, x, y, cx, cy, fl);
 }
 
+static UniChar NativeCharToUniChar(int chcode)
+{
+  UniChar ucResult = (UniChar) chcode;
+  int rc;
+  UconvObject ucoTemp;
+  char     achFrom[2];
+  char     *pchFrom;
+  size_t   iFromCount;
+  UniChar  aucTo[10];
+  UniChar  *pucTo;
+  size_t   iToCount;
+  size_t   iNonIdentical;
+
+  // Create unicode convert object
+  rc = UniCreateUconvObject(L"", &ucoTemp);
+  if (rc!=ULS_SUCCESS)
+  {
+    // Could not create convert object!
+    return ucResult;
+  }
+
+  // Convert language code string to unicode string
+  achFrom[0] = (char) chcode;
+  achFrom[1] = 0;
+  iFromCount = sizeof(char) * 2;
+  iToCount = sizeof(UniChar) * 2;
+  pucTo = &(aucTo[0]);
+  pchFrom = &(achFrom[0]);
+
+  rc = UniUconvToUcs(ucoTemp,
+                     &pchFrom,
+                     &iFromCount,
+                     &pucTo,
+                     &iToCount,
+                     &iNonIdentical);
+
+  if (rc!=ULS_SUCCESS)
+  {
+    // Could not convert language code to UCS string!
+    UniFreeUconvObject(ucoTemp);
+    return ucResult;
+  }
+
+  UniFreeUconvObject(ucoTemp);
+
+#ifdef DEBUG_BUILD
+  printf("%02x converted to %02x\n", (int) chcode, (int) (aucTo[0]));
+#endif
+
+  return aucTo[0];
+}
+
 /////////////////////////////////////////////////////////////////////
 //
 // TranslateKey
@@ -184,10 +241,8 @@
 
   if (iPressed && SDL_TranslateUNICODE)
   {
-    // TODO:
-    // Implement real unicode conversion!
     if (chcode)
-      keysym->unicode = chcode;
+      keysym->unicode = NativeCharToUniChar(chcode);
     else
       keysym->unicode = vkey;
   }
@@ -207,74 +262,74 @@
     switch (keysym->sym)
     {
       case SDLK_BACKQUOTE:
-	keysym->sym = '~';
-	break;
+        keysym->sym = '~';
+        break;
       case SDLK_1:
-	keysym->sym = SDLK_EXCLAIM;
-	break;
+        keysym->sym = SDLK_EXCLAIM;
+        break;
       case SDLK_2:
-	keysym->sym = SDLK_AT;
-	break;
+        keysym->sym = SDLK_AT;
+        break;
       case SDLK_3:
-	keysym->sym = SDLK_HASH;
-	break;
+        keysym->sym = SDLK_HASH;
+        break;
       case SDLK_4:
-	keysym->sym = SDLK_DOLLAR;
-	break;
+        keysym->sym = SDLK_DOLLAR;
+        break;
       case SDLK_5:
-	keysym->sym = '%';
-	break;
+        keysym->sym = '%';
+        break;
       case SDLK_6:
-	keysym->sym = SDLK_CARET;
-	break;
+        keysym->sym = SDLK_CARET;
+        break;
       case SDLK_7:
-	keysym->sym = SDLK_AMPERSAND;
-	break;
+        keysym->sym = SDLK_AMPERSAND;
+        break;
       case SDLK_8:
-	keysym->sym = SDLK_ASTERISK;
-	break;
+        keysym->sym = SDLK_ASTERISK;
+        break;
       case SDLK_9:
-	keysym->sym = SDLK_LEFTPAREN;
-	break;
+        keysym->sym = SDLK_LEFTPAREN;
+        break;
       case SDLK_0:
-	keysym->sym = SDLK_RIGHTPAREN;
-	break;
+        keysym->sym = SDLK_RIGHTPAREN;
+        break;
       case SDLK_MINUS:
-	keysym->sym = SDLK_UNDERSCORE;
-	break;
+        keysym->sym = SDLK_UNDERSCORE;
+        break;
       case SDLK_PLUS:
-	keysym->sym = SDLK_EQUALS;
-	break;
+        keysym->sym = SDLK_EQUALS;
+        break;
 
       case SDLK_LEFTBRACKET:
-	keysym->sym = '{';
-	break;
+        keysym->sym = '{';
+        break;
       case SDLK_RIGHTBRACKET:
-	keysym->sym = '}';
-	break;
+        keysym->sym = '}';
+        break;
 
       case SDLK_SEMICOLON:
-	keysym->sym = SDLK_COLON;
-	break;
+        keysym->sym = SDLK_COLON;
+        break;
       case SDLK_QUOTE:
-	keysym->sym = SDLK_QUOTEDBL;
-	break;
+        keysym->sym = SDLK_QUOTEDBL;
+        break;
       case SDLK_BACKSLASH:
-	keysym->sym = '|';
-	break;
+        keysym->sym = '|';
+        break;
 
       case SDLK_COMMA:
-	keysym->sym = SDLK_LESS;
-	break;
+        keysym->sym = SDLK_LESS;
+        break;
       case SDLK_PERIOD:
-	keysym->sym = SDLK_GREATER;
-	break;
+        keysym->sym = SDLK_GREATER;
+        break;
       case SDLK_SLASH:
-	keysym->sym = SDLK_QUESTION;
-	break;
+        keysym->sym = SDLK_QUESTION;
+        break;
 
       default:
-	break;
+        break;
     }
   }
   return keysym;
@@ -283,33 +338,33 @@
 #define CONVERTMOUSEPOSITION()  \
         /* We have to inverse the mouse position, because every non-os/2 system */                                                \
         /* has a coordinate system where the (0;0) is the top-left corner,      */                                                \
-	/* while on os/2 it's the bottom left corner!                           */                                                \
-	if (FSLib_QueryFSMode(hwnd))                                                                                              \
-	{                                                                                                                         \
-	  /* We're in FS mode!                                                        */                                          \
-	  /* In FS mode our window is as big as fullscreen mode, but not necessary as */                                          \
-	  /* big as the source buffer (can be bigger)                                 */                                          \
+        /* while on os/2 it's the bottom left corner!                           */                                                \
+        if (FSLib_QueryFSMode(hwnd))                                                                                              \
+        {                                                                                                                         \
+          /* We're in FS mode!                                                        */                                          \
+          /* In FS mode our window is as big as fullscreen mode, but not necessary as */                                          \
+          /* big as the source buffer (can be bigger)                                 */                                          \
           /* So, limit mouse pos to source buffer size!                               */                                          \
-	  if (ppts->x<0) ppts->x = 0;                                                                                             \
-	  if (ppts->y<0) ppts->y = 0;                                                                                             \
-	  if (ppts->x>=pVideo->hidden->SrcBufferDesc.uiXResolution) ppts->x = pVideo->hidden->SrcBufferDesc.uiXResolution-1;      \
+          if (ppts->x<0) ppts->x = 0;                                                                                             \
+          if (ppts->y<0) ppts->y = 0;                                                                                             \
+          if (ppts->x>=pVideo->hidden->SrcBufferDesc.uiXResolution) ppts->x = pVideo->hidden->SrcBufferDesc.uiXResolution-1;      \
           if (ppts->y>=pVideo->hidden->SrcBufferDesc.uiYResolution) ppts->y = pVideo->hidden->SrcBufferDesc.uiYResolution-1;      \
           pVideo->hidden->iSkipWMMOUSEMOVE++; /* Don't take next WM_MOUSEMOVE into account!  */                                   \
           ptl.x = ppts->x; ptl.y = ppts->y;                                                                                       \
           WinMapWindowPoints(pVideo->hidden->hwndClient, HWND_DESKTOP, &ptl, 1);                                                  \
-	  WinSetPointerPos(HWND_DESKTOP, ptl.x, ptl.y);                                                                           \
-	  /* Then convert OS/2 position to SDL position */                                                                        \
+          WinSetPointerPos(HWND_DESKTOP, ptl.x, ptl.y);                                                                           \
+          /* Then convert OS/2 position to SDL position */                                                                        \
           ppts->y = pVideo->hidden->SrcBufferDesc.uiYResolution - ppts->y - 1;                                                    \
-	} else                                                                                                                    \
-	{                                                                                                                         \
-	  SWP swpClient;                                                                                                          \
+        } else                                                                                                                    \
+        {                                                                                                                         \
+          SWP swpClient;                                                                                                          \
           /* We're in windowed mode! */                                                                                           \
-	  WinQueryWindowPos(pVideo->hidden->hwndClient, &swpClient);                                                              \
+          WinQueryWindowPos(pVideo->hidden->hwndClient, &swpClient);                                                              \
           /* Convert OS/2 mouse position to SDL position, and also scale it! */                                                   \
-	  (ppts->x) = (ppts->x) * pVideo->hidden->SrcBufferDesc.uiXResolution / swpClient.cx;                                       \
-	  (ppts->y) = (ppts->y) * pVideo->hidden->SrcBufferDesc.uiYResolution / swpClient.cy;                                       \
-	  (ppts->y) = pVideo->hidden->SrcBufferDesc.uiYResolution - (ppts->y)  - 1;                                                 \
-	}
+          (ppts->x) = (ppts->x) * pVideo->hidden->SrcBufferDesc.uiXResolution / swpClient.cx;                                       \
+          (ppts->y) = (ppts->y) * pVideo->hidden->SrcBufferDesc.uiYResolution / swpClient.cy;                                       \
+          (ppts->y) = pVideo->hidden->SrcBufferDesc.uiYResolution - (ppts->y)  - 1;                                                 \
+        }
 
 
 
@@ -351,9 +406,9 @@
         */
 
         // If it's not repeated, then let's see if its pressed or released!
-	if (SHORT1FROMMP(mp1) & KC_KEYUP)
-	{
-	  // A key has been released
+        if (SHORT1FROMMP(mp1) & KC_KEYUP)
+        {
+          // A key has been released
           SDL_keysym keysym;
 
 #ifdef DEBUG_BUILD
@@ -362,10 +417,10 @@
 
           // One problem is with F1, which gets only the keyup message because
           // it is a system key.
-	  // So, when we get keyup message, we simulate keydown too!
-	  // UPDATE:
-	  //  This problem should be solved now, that the accelerator keys are
-	  //  disabled for this window!
+          // So, when we get keyup message, we simulate keydown too!
+          // UPDATE:
+          //  This problem should be solved now, that the accelerator keys are
+          //  disabled for this window!
           /*
           if (SHORT2FROMMP(mp2)==VK_F1)
           {
@@ -373,45 +428,45 @@
                                                            SHORT1FROMMP(mp2), // Character code
                                                            CHAR4FROMMP(mp1),  // HW Scan code
                                                            &keysym,0));
-	  }*/
+          }*/
 
           SDL_PrivateKeyboard(SDL_RELEASED, TranslateKey(SHORT2FROMMP(mp2), // VK_ code
-							 SHORT1FROMMP(mp2), // Character code
-							 CHAR4FROMMP(mp1),  // HW Scan code
+                                                         SHORT1FROMMP(mp2), // Character code
+                                                         CHAR4FROMMP(mp1),  // HW Scan code
                                                          &keysym,0));
           
-	} else
-	{
+        } else
+        {
           // A key has been pressed
           SDL_keysym keysym;
 
 #ifdef DEBUG_BUILD
 //          printf("WM_CHAR, keydown, code is [0x%0x]\n", CHAR4FROMMP(mp1)); // HW scan code
 #endif
-	  // Check for fastkeys: ALT+HOME to toggle FS mode
+          // Check for fastkeys: ALT+HOME to toggle FS mode
           //                     ALT+END to close app
-	  if ((SHORT1FROMMP(mp1) & KC_ALT) &&
-	      (SHORT2FROMMP(mp2) == VK_HOME))
-	  {
+          if ((SHORT1FROMMP(mp1) & KC_ALT) &&
+              (SHORT2FROMMP(mp2) == VK_HOME))
+          {
 #ifdef DEBUG_BUILD
-	    printf(" Pressed ALT+HOME!\n"); fflush(stdout);
+            printf(" Pressed ALT+HOME!\n"); fflush(stdout);
 #endif
-	    // Only switch between fullscreen and back if it's not
-	    // a resizable mode!
+            // Only switch between fullscreen and back if it's not
+            // a resizable mode!
             if (
                 (!pVideo->hidden->pSDLSurface) ||
                 ((pVideo->hidden->pSDLSurface)
                  && ((pVideo->hidden->pSDLSurface->flags & SDL_RESIZABLE)==0)
                 )
                )
-	      FSLib_ToggleFSMode(hwnd, !FSLib_QueryFSMode(hwnd));
+              FSLib_ToggleFSMode(hwnd, !FSLib_QueryFSMode(hwnd));
 #ifdef DEBUG_BUILD
             else
-	      printf(" Resizable mode, so discarding ALT+HOME!\n"); fflush(stdout);
+              printf(" Resizable mode, so discarding ALT+HOME!\n"); fflush(stdout);
 #endif
-	  } else
-	  if ((SHORT1FROMMP(mp1) & KC_ALT) &&
-	      (SHORT2FROMMP(mp2) == VK_END))
+          } else
+          if ((SHORT1FROMMP(mp1) & KC_ALT) &&
+              (SHORT2FROMMP(mp2) == VK_END))
           {
 #ifdef DEBUG_BUILD
             printf(" Pressed ALT+END!\n"); fflush(stdout);
@@ -421,32 +476,32 @@
             // wait for it to be processed!
             SDL_PrivateQuit();
             WinPostMsg(hwnd, WM_QUIT, 0, 0);
-	  } else
+          } else
           {
             
-	    SDL_PrivateKeyboard(SDL_PRESSED, TranslateKey(SHORT2FROMMP(mp2), // VK_ code
-							  SHORT1FROMMP(mp2), // Character code
-							  CHAR4FROMMP(mp1),  // HW Scan code
+            SDL_PrivateKeyboard(SDL_PRESSED, TranslateKey(SHORT2FROMMP(mp2), // VK_ code
+                                                          SHORT1FROMMP(mp2), // Character code
+                                                          CHAR4FROMMP(mp1),  // HW Scan code
                                                           &keysym,1));
             
-	  }
-	}
+          }
+        }
       }
       return (MRESULT) TRUE;
 
     case WM_TRANSLATEACCEL:
       {
-	PQMSG pqmsg;
-	pqmsg = (PQMSG) mp1;
-	if (mp1)
-	{
-	  if (pqmsg->msg == WM_CHAR)
-	  {
-	    // WM_CHAR message!
-	    // Let's filter the ALT keypress and all other acceleration keys!
-	    return (MRESULT) FALSE;
-	  }
-	}
+        PQMSG pqmsg;
+        pqmsg = (PQMSG) mp1;
+        if (mp1)
+        {
+          if (pqmsg->msg == WM_CHAR)
+          {
+            // WM_CHAR message!
+            // Let's filter the ALT keypress and all other acceleration keys!
+            return (MRESULT) FALSE;
+          }
+        }
         break; // Default processing (pass to parent until frame control)
       }
 
@@ -560,7 +615,7 @@
 #ifdef DEBUG_BUILD
       else
       {
-	printf("WM_PAINT : No pVideo!\n"); fflush(stdout);
+        printf("WM_PAINT : No pVideo!\n"); fflush(stdout);
       }
 #endif
       WinEndPaint(ps);
@@ -573,14 +628,14 @@
     case WM_SIZE:
       {
 #ifdef DEBUG_BUILD
-	printf("WM_SIZE : (%d %d)\n",
-	       SHORT1FROMMP(mp2), SHORT2FROMMP(mp2)); fflush(stdout);
+        printf("WM_SIZE : (%d %d)\n",
+               SHORT1FROMMP(mp2), SHORT2FROMMP(mp2)); fflush(stdout);
 #endif
         iWindowSizeX = SHORT1FROMMP(mp2);
         iWindowSizeY = SHORT2FROMMP(mp2);
         bWindowResized = 1;
 
-	// Make sure the window will be redrawn
+        // Make sure the window will be redrawn
         WinInvalidateRegion(hwnd, NULL, TRUE);
       }
       break;
@@ -591,9 +646,9 @@
 #endif
       if ((int)mp1 == FSLN_TOGGLEFSMODE)
       {
-	// FS mode changed, reblit image!
-	pVideo = FSLib_GetUserParm(hwnd);
-	if (pVideo)
+        // FS mode changed, reblit image!
+        pVideo = FSLib_GetUserParm(hwnd);
+        if (pVideo)
         {
           if (!pVideo->hidden->pSDLSurface)
           {
@@ -651,7 +706,7 @@
               DosReleaseMutexSem(pVideo->hidden->hmtxUseSrcBuffer);
             }
           }
-	}
+        }
       }
       return (MPARAM) 1;
 
@@ -670,12 +725,12 @@
           if ((pVideo->hidden->iMouseVisible) && (!bMouseCaptured))
             WinSetPointer(HWND_DESKTOP, WinQuerySysPointer(HWND_DESKTOP, SPTR_ARROW, FALSE));
           else
-	    WinSetPointer(HWND_DESKTOP, NULL);
-
-	  if (bMouseCapturable)
-	  {
+            WinSetPointer(HWND_DESKTOP, NULL);
+
+          if (bMouseCapturable)
+          {
             // Re-capture the mouse, if we captured it before!
-	    WinSetCapture(HWND_DESKTOP, hwnd);
+            WinSetCapture(HWND_DESKTOP, hwnd);
             bMouseCaptured = 1;
             {
               SWP swpClient;
@@ -689,18 +744,18 @@
                                ptl.x + swpClient.cx/2,
                                ptl.y + swpClient.cy/2);
             }
-	  }
+          }
         } else
         {
           // Went out of focus
-	  WinSetPointer(HWND_DESKTOP, WinQuerySysPointer(HWND_DESKTOP, SPTR_ARROW, FALSE));
-
-	  if (bMouseCaptured)
-	  {
+          WinSetPointer(HWND_DESKTOP, WinQuerySysPointer(HWND_DESKTOP, SPTR_ARROW, FALSE));
+
+          if (bMouseCaptured)
+          {
             // Release the mouse
-	    WinSetCapture(HWND_DESKTOP, hwnd);
+            WinSetCapture(HWND_DESKTOP, hwnd);
             bMouseCaptured = 0;
-	  }
+          }
         }
       }
 #ifdef DEBUG_BUILD
@@ -717,16 +772,16 @@
       pVideo = FSLib_GetUserParm(hwnd);
       if (pVideo)
       {
-	SDL_PrivateMouseButton(SDL_PRESSED,
+        SDL_PrivateMouseButton(SDL_PRESSED,
                                SDL_BUTTON_LEFT,
                                0, 0); // Don't report mouse movement!
 
-	if (bMouseCapturable)
-	{
-	  // We should capture the mouse!
-	  if (!bMouseCaptured)
-	  {
-	    WinSetCapture(HWND_DESKTOP, hwnd);
+        if (bMouseCapturable)
+        {
+          // We should capture the mouse!
+          if (!bMouseCaptured)
+          {
+            WinSetCapture(HWND_DESKTOP, hwnd);
             WinSetPointer(HWND_DESKTOP, NULL);
             bMouseCaptured = 1;
             {
@@ -741,8 +796,8 @@
                                ptl.x + swpClient.cx/2,
                                ptl.y + swpClient.cy/2);
             }
-	  }
-	}
+          }
+        }
       }
       break;
     case WM_BUTTON1UP:
@@ -761,16 +816,16 @@
       pVideo = FSLib_GetUserParm(hwnd);
       if (pVideo)
       {
-	SDL_PrivateMouseButton(SDL_PRESSED,
+        SDL_PrivateMouseButton(SDL_PRESSED,
                                SDL_BUTTON_RIGHT,
                                0, 0); // Don't report mouse movement!
 
-	if (bMouseCapturable)
-	{
-	  // We should capture the mouse!
-	  if (!bMouseCaptured)
-	  {
-	    WinSetCapture(HWND_DESKTOP, hwnd);
+        if (bMouseCapturable)
+        {
+          // We should capture the mouse!
+          if (!bMouseCaptured)
+          {
+            WinSetCapture(HWND_DESKTOP, hwnd);
             WinSetPointer(HWND_DESKTOP, NULL);
             bMouseCaptured = 1;
             {
@@ -785,8 +840,8 @@
                                ptl.x + swpClient.cx/2,
                                ptl.y + swpClient.cy/2);
             }
-	  }
-	}
+          }
+        }
 
       }
       break;
@@ -810,12 +865,12 @@
                                SDL_BUTTON_MIDDLE,
                                0, 0); // Don't report mouse movement!
         
-	if (bMouseCapturable)
-	{
-	  // We should capture the mouse!
-	  if (!bMouseCaptured)
-	  {
-	    WinSetCapture(HWND_DESKTOP, hwnd);
+        if (bMouseCapturable)
+        {
+          // We should capture the mouse!
+          if (!bMouseCaptured)
+          {
+            WinSetCapture(HWND_DESKTOP, hwnd);
             WinSetPointer(HWND_DESKTOP, NULL);
             bMouseCaptured = 1;
             {
@@ -830,8 +885,8 @@
                                ptl.x + swpClient.cx/2,
                                ptl.y + swpClient.cy/2);
             }
-	  }
-	}
+          }
+        }
       }
       break;
     case WM_BUTTON3UP:
@@ -858,19 +913,19 @@
           POINTS *ppts = (POINTS *) (&mp1);
           POINTL ptl;
 
-          CONVERTMOUSEPOSITION();
-
           if (bMouseCaptured)
           {
             SWP swpClient;
+
+            WinQueryWindowPos(pVideo->hidden->hwndClient, &swpClient);
+
             // Send relative mouse position, and re-center the mouse
             // Reposition the mouse to the center of the screen/window
             SDL_PrivateMouseMotion(0, // Buttons not changed
                                    1, // Relative position
-                                   ppts->x - (pVideo->hidden->SrcBufferDesc.uiXResolution/2),
-                                   ppts->y+1 - (pVideo->hidden->SrcBufferDesc.uiYResolution/2));
-
-            WinQueryWindowPos(pVideo->hidden->hwndClient, &swpClient);
+                                   ppts->x - (swpClient.cx/2),
+                                   (swpClient.cy/2) - ppts->y);
+
             ptl.x = 0; ptl.y = 0;
             WinMapWindowPoints(pVideo->hidden->hwndClient, HWND_DESKTOP, &ptl, 1);
             pVideo->hidden->iSkipWMMOUSEMOVE++; /* Don't take next WM_MOUSEMOVE into account!  */
@@ -880,6 +935,8 @@
                              ptl.y + swpClient.cy/2);
           } else
           {
+            CONVERTMOUSEPOSITION();
+
             // Send absolute mouse position
             SDL_PrivateMouseMotion(0, // Buttons not changed
                                    0, // Absolute position
@@ -986,6 +1043,98 @@
 
 /////////////////////////////////////////////////////////////////////
 //
+// FrameWndProc
+//
+// This is the message processing window procedure for the
+// frame window of SDLWindowClass.
+//
+/////////////////////////////////////////////////////////////////////
+static MRESULT EXPENTRY FrameWndProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+  PFNWP pOldFrameProc;
+  MRESULT result;
+  PTRACKINFO ti;
+  int cx, cy, ncx, ncy;
+  RECTL rclTemp;
+  PSWP pswpTemp;
+
+  SDL_VideoDevice *pVideo = NULL;
+
+  pVideo = (SDL_VideoDevice *) WinQueryWindowULong(hwnd, QWL_USER);
+
+  pOldFrameProc = pVideo->hidden->pfnOldFrameProc;
+
+  if ((pVideo->hidden->bProportionalResize) &&
+      (msg==WM_ADJUSTWINDOWPOS) &&
+      (!FSLib_QueryFSMode(pVideo->hidden->hwndClient))
+     )
+  {
+    pswpTemp = (PSWP) mp1;
+
+    /* Resizing? */
+    if (pswpTemp->fl & SWP_SIZE)
+    {
+      /* Calculate client size */
+      rclTemp.xLeft = pswpTemp->x;
+      rclTemp.xRight = pswpTemp->x + pswpTemp->cx;
+      rclTemp.yBottom = pswpTemp->y;
+      rclTemp.yTop = pswpTemp->y + pswpTemp->cy;
+      WinCalcFrameRect(hwnd, &rclTemp, TRUE);
+
+      ncx = cx = rclTemp.xRight - rclTemp.xLeft;
+      ncy = cy = rclTemp.yTop - rclTemp.yBottom;
+
+      /* Calculate new size to keep it proportional */
+
+      if ((pVideo->hidden->ulResizingFlag & TF_LEFT) || (pVideo->hidden->ulResizingFlag & TF_RIGHT))
+      {
+        /* The window is resized horizontally */
+        ncy = pVideo->hidden->SrcBufferDesc.uiYResolution * cx / pVideo->hidden->SrcBufferDesc.uiXResolution;
+      } else
+      if ((pVideo->hidden->ulResizingFlag & TF_TOP) || (pVideo->hidden->ulResizingFlag & TF_BOTTOM))
+      {
+        /* The window is resized vertically */
+        ncx = pVideo->hidden->SrcBufferDesc.uiXResolution * cy / pVideo->hidden->SrcBufferDesc.uiYResolution;
+      }
+
+      /* Calculate back frame coordinates */
+      rclTemp.xLeft = pswpTemp->x;
+      rclTemp.xRight = pswpTemp->x + ncx;
+      rclTemp.yBottom = pswpTemp->y;
+      rclTemp.yTop = pswpTemp->y + ncy;
+      WinCalcFrameRect(hwnd, &rclTemp, FALSE);
+
+      /* Store new size/position info */
+      pswpTemp->cx = rclTemp.xRight - rclTemp.xLeft;
+
+      if (!(pVideo->hidden->ulResizingFlag & TF_TOP))
+      {
+        pswpTemp->y = pswpTemp->y + pswpTemp->cy - (rclTemp.yTop - rclTemp.yBottom);
+        pswpTemp->cy = rclTemp.yTop - rclTemp.yBottom;
+      } else
+      {
+        pswpTemp->cy = rclTemp.yTop - rclTemp.yBottom;
+      }
+    }
+  }
+
+  result = (*pOldFrameProc)(hwnd, msg, mp1, mp2);
+
+  if ((pVideo->hidden->bProportionalResize) && (msg==WM_QUERYTRACKINFO))
+  {
+    ti = (PTRACKINFO) mp2;
+
+    /* Store the direction of resizing */
+    if ((ti->fs & TF_LEFT) || (ti->fs & TF_RIGHT) ||
+        (ti->fs & TF_TOP) || (ti->fs & TF_BOTTOM))
+      pVideo->hidden->ulResizingFlag = ti->fs;
+  }
+
+  return result;
+}
+
+/////////////////////////////////////////////////////////////////////
+//
 // PMThreadFunc
 //
 // This function implements the PM-Thread, which initializes the
@@ -1037,7 +1186,7 @@
                             &(pVideo->hidden->SrcBufferDesc),
                             WndProc,
                             &(pVideo->hidden->hwndClient),
-			    &(pVideo->hidden->hwndFrame));
+                            &(pVideo->hidden->hwndFrame));
 
 #ifdef DEBUG_BUILD
     printf("[PMThreadFunc] : FSLib_CreateWindow() rc = %d\n", rc);
@@ -1085,6 +1234,11 @@
                              (rectl.yTop-rectl.yBottom),
                              SWP_SIZE | SWP_ACTIVATE | SWP_SHOW | SWP_MOVE);
 
+      // Subclass frame procedure and store old window proc address
+      pVideo->hidden->pfnOldFrameProc =
+        WinSubclassWindow(pVideo->hidden->hwndFrame, FrameWndProc);
+      WinSetWindowULong(pVideo->hidden->hwndFrame, QWL_USER, (ULONG) pVideo);
+
 #ifdef DEBUG_BUILD
       printf("[PMThreadFunc] : Entering message loop\n"); fflush(stdout);
 #endif
@@ -1814,7 +1968,7 @@
   hmqerror = WinGetLastError(hab);
 
   WinSetWindowPos(_this->hidden->hwndFrame, HWND_TOP,
-		 0, 0, 0, 0, SWP_MINIMIZE);
+                 0, 0, 0, 0, SWP_MINIMIZE);
 
   // Now destroy the message queue, if we've created it!
   if (ERRORIDERROR(hmqerror)==0)
@@ -2139,7 +2293,7 @@
  should take care of cleaning up the current mode.
  */
 static SDL_Surface *os2fslib_SetVideoMode(_THIS, SDL_Surface *current,
-					  int width, int height, int bpp, Uint32 flags)
+                                          int width, int height, int bpp, Uint32 flags)
 {
   static int bFirstCall = 1;
   FSLib_VideoMode_p pModeInfo, pModeInfoFound;
@@ -2475,7 +2629,7 @@
           pRect->h = pFSMode->uiYResolution;
 #ifdef DEBUG_BUILD
 //          printf("!!! Seems to be good!\n");
-//	  printf("F: %dx%d\n", pRect->w, pRect->h);
+//        printf("F: %dx%d\n", pRect->w, pRect->h);
 #endif
           // And insert into list of pRects
           if (!(_this->hidden->pListModesResult))
@@ -2489,7 +2643,7 @@
             if (_this->hidden->pListModesResult)
             {
               _this->hidden->pListModesResult[0] = pRect;
-	      _this->hidden->pListModesResult[1] = NULL;
+              _this->hidden->pListModesResult[1] = NULL;
             } else
             {
               SDL_free(pRect);
@@ -2601,6 +2755,83 @@
   _this->hidden->fInFocus = 0;
   _this->hidden->iSkipWMMOUSEMOVE = 0;
   _this->hidden->iMouseVisible = 1;
+
+  if (getenv("SDL_USE_PROPORTIONAL_WINDOW"))
+    _this->hidden->bProportionalResize = 1;
+  else
+  {
+    PPIB pib;
+    PTIB tib;
+    char *pchFileName, *pchTemp;
+    char achConfigFile[CCHMAXPATH];
+    FILE *hFile;
+
+    /* No environment variable to have proportional window.
+     * Ok, let's check if this executable is in config file!
+     */
+    _this->hidden->bProportionalResize = 0;
+
+    DosGetInfoBlocks(&tib, &pib);
+    pchTemp = pchFileName = pib->pib_pchcmd;
+    while (*pchTemp)
+    {
+      if (*pchTemp=='\\')
+        pchFileName = pchTemp+1;
+      pchTemp++;
+    }
+    if (getenv("HOME"))
+    {
+      sprintf(achConfigFile, "%s\\.sdl.proportionals", getenv("HOME"));
+      hFile = fopen(achConfigFile, "rt");
+      if (!hFile)
+      {
+        /* Seems like the file cannot be opened or does not exist.
+         * Let's try to create it with defaults!
+         */
+        hFile = fopen(achConfigFile, "wt");
+        if (hFile)
+        {
+          fprintf(hFile, "; This file is a config file of SDL/2, containing\n");
+          fprintf(hFile, "; the list of executables that must have proportional\n");
+          fprintf(hFile, "; windows.\n");
+          fprintf(hFile, ";\n");
+          fprintf(hFile, "; You can add executable filenames into this file,\n");
+          fprintf(hFile, "; one under the other. If SDL finds that a given\n");
+          fprintf(hFile, "; program is in this list, then that application\n");
+          fprintf(hFile, "; will have proportional windows, just like if\n");
+          fprintf(hFile, "; the SET SDL_USE_PROPORTIONAL_WINDOW env. variable\n");
+          fprintf(hFile, "; would have been set for that process.\n");
+          fprintf(hFile, ";\n");
+          fprintf(hFile, "\n");
+          fprintf(hFile, "dosbox.exe\n");
+          fclose(hFile);
+        }
+
+        hFile = fopen(achConfigFile, "rt");
+      }
+
+      if (hFile)
+      {
+        while (fgets(achConfigFile, sizeof(achConfigFile), hFile))
+        {
+          /* Cut \n from end of string */
+
+          while (achConfigFile[strlen(achConfigFile)-1] == '\n')
+            achConfigFile[strlen(achConfigFile)-1] = 0;
+
+          /* Compare... */
+          if (stricmp(achConfigFile, pchFileName)==0)
+          {
+            /* Found it in config file! */
+            _this->hidden->bProportionalResize = 1;
+            break;
+          }
+        }
+        fclose(hFile);
+      }
+    }
+  }
+
   DosCreateMutexSem(NULL, &(_this->hidden->hmtxUseSrcBuffer), 0, FALSE);
 
   // Now create our window with a default size
@@ -2777,7 +3008,7 @@
 }
 
 VideoBootStrap OS2FSLib_bootstrap = {
-  	"os2fslib", "OS/2 Video Output using FSLib",
-	os2fslib_Available, os2fslib_CreateDevice
+        "os2fslib", "OS/2 Video Output using FSLib",
+        os2fslib_Available, os2fslib_CreateDevice
 };
 
--- a/src/video/os2fslib/SDL_os2fslib.h	Sun Feb 26 13:42:00 2006 +0000
+++ b/src/video/os2fslib/SDL_os2fslib.h	Sun Feb 26 19:30:21 2006 +0000
@@ -57,8 +57,15 @@
   int                 fInFocus;         // True if we're in focus!
   int                 iSkipWMMOUSEMOVE; // Number of WM_MOUSEMOVE messages to skip!
   int                 iMouseVisible;    //
+
+  PFNWP               pfnOldFrameProc;  // Old window frame procedure
+  int                 bProportionalResize; // 0: No proportional resizing
+                                           // 1: Do proportional resizing
+  ULONG               ulResizingFlag;   // First resizing flag value
 };
 
+/* OS/2 specific backdoor function to be able to set FrameControlFlags of */
+/* the SDL window before creating it. */
 extern DECLSPEC void SDLCALL SDL_OS2FSLIB_SetFCFToUse(ULONG ulFCF);
 
 #endif /* _SDL_os2fslib_h */
--- a/test/Makefile.wat	Sun Feb 26 13:42:00 2006 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,52 +0,0 @@
-#=============================================================================
-#          This is a Watcom makefile to build SDL.DLL for OS/2
-#
-# Makefile for test applications
-#=============================================================================
-
-# Create debug build or not?
-debug_build=defined
-
-#-----------------------------------------------------------------------------
-# The next part is somewhat general, for creation of EXE files.
-#-----------------------------------------------------------------------------
-
-cflags = $(debugflags) -bm -bt=OS2 -5 -fpi -sg -otexan -wx -ei
-
-.before
-    set include=$(%os2tk)\h;$(%include);../include
-
-.extensions:
-.extensions: .exe .obj .c
-
-all :   testalpha.exe     &
-        testbitmap.exe    &
-        testcdrom.exe     &
-        testcpuinfo.exe   &
-        testjoystick.exe  &
-        testkeys.exe      &
-        testlock.exe      &
-        testsem.exe       &
-        testsprite.exe    &
-        testtimer.exe     &
-        testtypes.exe     &
-        testver.exe       &
-        testvidinfo.exe   &
-        testwin.exe       &
-        testwm.exe        &
-        threadwin.exe     &
-        torturethread.exe &
-        checkkeys.exe
-
-.c.obj : .AUTODEPEND
-    wcc386 -zq -bm -5s -ei -oteaxan -wx $[* $(cflags)
-
-.obj.exe : .AUTODEPEND
-    wlink system os2v2 F $* L ..\src\sdl.lib name $@ op quiet
-
-clean : .SYMBOLIC
-        @if exist *.exe del *.exe
-        @if exist *.obj del *.obj
-        @if exist *.map del *.map
-        @if exist *.res del *.res
-        @if exist *.lst del *.lst