From 3c6650d5b4d439da70ba68259fc119bbef10f881 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Sun, 26 Feb 2006 19:30:21 +0000 Subject: [PATCH] Updated OS/2 build, yay! --- Makefile.in | 2 +- README.OS2 | 150 +++++++- Watcom-OS2.zip | Bin 0 -> 8726 bytes Watcom.mif | 33 -- include/SDL_config.h | 2 + include/SDL_config.h.minimal | 2 + include/SDL_config_os2.h | 136 +++++++ include/SDL_thread.h | 4 +- setvars.cmd | 16 - src/Makefile.wat | 132 ------- src/audio/Makefile.wat | 27 -- src/audio/SDL_audio.c | 14 +- src/audio/SDL_mixer.c | 7 +- src/audio/SDL_mixer_MMX_VC.c | 2 +- src/audio/SDL_mixer_MMX_VC.h | 2 +- src/cdrom/Makefile.wat | 30 -- src/cdrom/os2/SDL_syscdrom.c | 4 +- src/cpuinfo/Makefile.wat | 27 -- src/cpuinfo/SDL_cpuinfo.c | 6 +- src/events/Makefile.wat | 24 -- src/events/SDL_mouse.c | 2 +- src/file/Makefile.wat | 24 -- src/joystick/Makefile.wat | 27 -- src/joystick/os2/SDL_sysjoystick.c | 15 +- src/thread/Makefile.wat | 36 -- src/thread/os2/SDL_systhread.c | 1 + src/timer/Makefile.wat | 27 -- src/video/Makefile.wat | 27 -- src/video/SDL_stretch.c | 5 +- src/video/os2fslib/SDL_os2fslib.c | 559 ++++++++++++++++++++--------- src/video/os2fslib/SDL_os2fslib.h | 7 + test/Makefile.wat | 52 --- 32 files changed, 727 insertions(+), 675 deletions(-) create mode 100644 Watcom-OS2.zip delete mode 100644 Watcom.mif create mode 100644 include/SDL_config_os2.h delete mode 100644 setvars.cmd delete mode 100644 src/Makefile.wat delete mode 100644 src/audio/Makefile.wat delete mode 100644 src/cdrom/Makefile.wat delete mode 100644 src/cpuinfo/Makefile.wat delete mode 100644 src/events/Makefile.wat delete mode 100644 src/file/Makefile.wat delete mode 100644 src/joystick/Makefile.wat delete mode 100644 src/thread/Makefile.wat delete mode 100644 src/timer/Makefile.wat delete mode 100644 src/video/Makefile.wat delete mode 100644 test/Makefile.wat diff --git a/Makefile.in b/Makefile.in index b5224d509..121fedd46 100644 --- a/Makefile.in +++ b/Makefile.in @@ -36,7 +36,7 @@ SDLMAIN_TARGET = libSDLmain.a 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@ diff --git a/README.OS2 b/README.OS2 index fc3e0b8a6..8d33b4a1a 100644 --- a/README.OS2 +++ b/README.OS2 @@ -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 @@ To compile this, you'll need the followings installed: - 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 @@ of the Joystick Port hardware, not OS/2. -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 @@ Things to do: -7. Contacts +9. Contacts ----------- You can contact the developers for bugs: @@ -131,3 +188,90 @@ Things to do: 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. + + diff --git a/Watcom-OS2.zip b/Watcom-OS2.zip new file mode 100644 index 0000000000000000000000000000000000000000..e39cdc2be193b739105606b6762691d279324703 GIT binary patch literal 8726 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 EKV2DFZ2$lO literal 0 HcmV?d00001 diff --git a/Watcom.mif b/Watcom.mif deleted file mode 100644 index 350e31667..000000000 --- a/Watcom.mif +++ /dev/null @@ -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 diff --git a/include/SDL_config.h b/include/SDL_config.h index 0c177fd41..d72b9c573 100644 --- a/include/SDL_config.h +++ b/include/SDL_config.h @@ -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 */ diff --git a/include/SDL_config.h.minimal b/include/SDL_config.h.minimal index 0c177fd41..d72b9c573 100644 --- a/include/SDL_config.h.minimal +++ b/include/SDL_config.h.minimal @@ -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 */ diff --git a/include/SDL_config_os2.h b/include/SDL_config_os2.h new file mode 100644 index 000000000..e9e0afe0d --- /dev/null +++ b/include/SDL_config_os2.h @@ -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 */ diff --git a/include/SDL_thread.h b/include/SDL_thread.h index 51e517731..cf3ba82c3 100644 --- a/include/SDL_thread.h +++ b/include/SDL_thread.h @@ -65,8 +65,8 @@ typedef struct SDL_Thread SDL_Thread; #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 diff --git a/setvars.cmd b/setvars.cmd deleted file mode 100644 index b8c2071e3..000000000 --- a/setvars.cmd +++ /dev/null @@ -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 - diff --git a/src/Makefile.wat b/src/Makefile.wat deleted file mode 100644 index 476cfabbc..000000000 --- a/src/Makefile.wat +++ /dev/null @@ -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 .. diff --git a/src/audio/Makefile.wat b/src/audio/Makefile.wat deleted file mode 100644 index 0a292be3c..000000000 --- a/src/audio/Makefile.wat +++ /dev/null @@ -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 diff --git a/src/audio/SDL_audio.c b/src/audio/SDL_audio.c index e04b41509..754baa10d 100644 --- a/src/audio/SDL_audio.c +++ b/src/audio/SDL_audio.c @@ -181,10 +181,20 @@ int SDL_RunAudio(void *audiop) // 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 diff --git a/src/audio/SDL_mixer.c b/src/audio/SDL_mixer.c index c59b1adf4..5e07a0720 100644 --- a/src/audio/SDL_mixer.c +++ b/src/audio/SDL_mixer.c @@ -134,8 +134,7 @@ void SDL_MixAudio (Uint8 *dst, const Uint8 *src, Uint32 len, int volume) 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 @@ void SDL_MixAudio (Uint8 *dst, const Uint8 *src, Uint32 len, int volume) { 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); diff --git a/src/audio/SDL_mixer_MMX_VC.c b/src/audio/SDL_mixer_MMX_VC.c index 606bd0c09..89b646a05 100644 --- a/src/audio/SDL_mixer_MMX_VC.c +++ b/src/audio/SDL_mixer_MMX_VC.c @@ -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 diff --git a/src/audio/SDL_mixer_MMX_VC.h b/src/audio/SDL_mixer_MMX_VC.h index 5f221580a..afdae478f 100644 --- a/src/audio/SDL_mixer_MMX_VC.h +++ b/src/audio/SDL_mixer_MMX_VC.h @@ -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 diff --git a/src/cdrom/Makefile.wat b/src/cdrom/Makefile.wat deleted file mode 100644 index bda64eb22..000000000 --- a/src/cdrom/Makefile.wat +++ /dev/null @@ -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 diff --git a/src/cdrom/os2/SDL_syscdrom.c b/src/cdrom/os2/SDL_syscdrom.c index 8592292fb..ad3c9dfb6 100644 --- a/src/cdrom/os2/SDL_syscdrom.c +++ b/src/cdrom/os2/SDL_syscdrom.c @@ -293,7 +293,7 @@ if (LOUSHORT(mciSendCommand(cdrom->id,MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM,&msp 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 (LOUSHORT(mciSendCommand(cdrom->id,MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM,&msp 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 */ diff --git a/src/cpuinfo/Makefile.wat b/src/cpuinfo/Makefile.wat deleted file mode 100644 index 2834d629e..000000000 --- a/src/cpuinfo/Makefile.wat +++ /dev/null @@ -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 diff --git a/src/cpuinfo/SDL_cpuinfo.c b/src/cpuinfo/SDL_cpuinfo.c index c606ad400..0e2fcda7b 100644 --- a/src/cpuinfo/SDL_cpuinfo.c +++ b/src/cpuinfo/SDL_cpuinfo.c @@ -96,7 +96,7 @@ CPUid by definition. But it's nice to be able to prove it. :) */ : : "%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 @@ static __inline__ int CPU_getCPUIDFeatures(void) : : "%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 @@ static __inline__ int CPU_getCPUIDFeaturesExt(void) : : "%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 diff --git a/src/events/Makefile.wat b/src/events/Makefile.wat deleted file mode 100644 index 1ef5dffa2..000000000 --- a/src/events/Makefile.wat +++ /dev/null @@ -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 diff --git a/src/events/SDL_mouse.c b/src/events/SDL_mouse.c index 15a0fa6a4..a01a16e05 100644 --- a/src/events/SDL_mouse.c +++ b/src/events/SDL_mouse.c @@ -176,7 +176,7 @@ printf("Mouse event didn't change state - dropped!\n"); 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; diff --git a/src/file/Makefile.wat b/src/file/Makefile.wat deleted file mode 100644 index 93ee69152..000000000 --- a/src/file/Makefile.wat +++ /dev/null @@ -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 diff --git a/src/joystick/Makefile.wat b/src/joystick/Makefile.wat deleted file mode 100644 index 098215d76..000000000 --- a/src/joystick/Makefile.wat +++ /dev/null @@ -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 diff --git a/src/joystick/os2/SDL_sysjoystick.c b/src/joystick/os2/SDL_sysjoystick.c index b7cc02923..c49be5c82 100644 --- a/src/joystick/os2/SDL_sysjoystick.c +++ b/src/joystick/os2/SDL_sysjoystick.c @@ -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 @@ HFILE hJoyPort = NULL; /* Joystick GAME$ Port Address */ #define JOY_BUTTON_FLAG(n) (1< 0) } /* Hack to define Joystick Port Names */ if ( numdevs > maxdevs ) numdevs = maxdevs; - for (i=0; i // Unicode API +#include // Unicode API (codepage conversion) + #include #include @@ -115,8 +120,8 @@ static int iShiftIsPressed; // ///////////////////////////////////////////////////////////////////// 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 @@ static BOOL SetAccessableWindowPos(HWND hwnd, HWND hwndInsertBehind, 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 @@ static SDL_keysym *TranslateKey(int vkey, int chcode, int scancode, SDL_keysym * 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 @@ static SDL_keysym *TranslateKey(int vkey, int chcode, int scancode, SDL_keysym * 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 @@ static SDL_keysym *TranslateKey(int vkey, int chcode, int scancode, SDL_keysym * #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 @@ static MRESULT EXPENTRY WndProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) */ // 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 @@ static MRESULT EXPENTRY WndProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) // 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 @@ static MRESULT EXPENTRY WndProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) 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 @@ static MRESULT EXPENTRY WndProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) // 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 @@ static MRESULT EXPENTRY WndProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) #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 @@ static MRESULT EXPENTRY WndProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) 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 @@ static MRESULT EXPENTRY WndProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) #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 @@ static MRESULT EXPENTRY WndProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) DosReleaseMutexSem(pVideo->hidden->hmtxUseSrcBuffer); } } - } + } } return (MPARAM) 1; @@ -670,12 +725,12 @@ static MRESULT EXPENTRY WndProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) if ((pVideo->hidden->iMouseVisible) && (!bMouseCaptured)) WinSetPointer(HWND_DESKTOP, WinQuerySysPointer(HWND_DESKTOP, SPTR_ARROW, FALSE)); else - WinSetPointer(HWND_DESKTOP, NULL); + WinSetPointer(HWND_DESKTOP, NULL); - if (bMouseCapturable) - { + 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 @@ static MRESULT EXPENTRY WndProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) ptl.x + swpClient.cx/2, ptl.y + swpClient.cy/2); } - } + } } else { // Went out of focus - WinSetPointer(HWND_DESKTOP, WinQuerySysPointer(HWND_DESKTOP, SPTR_ARROW, FALSE)); + WinSetPointer(HWND_DESKTOP, WinQuerySysPointer(HWND_DESKTOP, SPTR_ARROW, FALSE)); - if (bMouseCaptured) - { + if (bMouseCaptured) + { // Release the mouse - WinSetCapture(HWND_DESKTOP, hwnd); + WinSetCapture(HWND_DESKTOP, hwnd); bMouseCaptured = 0; - } + } } } #ifdef DEBUG_BUILD @@ -717,16 +772,16 @@ static MRESULT EXPENTRY WndProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) 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 @@ static MRESULT EXPENTRY WndProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) ptl.x + swpClient.cx/2, ptl.y + swpClient.cy/2); } - } - } + } + } } break; case WM_BUTTON1UP: @@ -761,16 +816,16 @@ static MRESULT EXPENTRY WndProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) 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 @@ static MRESULT EXPENTRY WndProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) ptl.x + swpClient.cx/2, ptl.y + swpClient.cy/2); } - } - } + } + } } break; @@ -810,12 +865,12 @@ static MRESULT EXPENTRY WndProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) 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 @@ static MRESULT EXPENTRY WndProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) ptl.x + swpClient.cx/2, ptl.y + swpClient.cy/2); } - } - } + } + } } break; case WM_BUTTON3UP: @@ -858,19 +913,19 @@ static MRESULT EXPENTRY WndProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) 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)); + ppts->x - (swpClient.cx/2), + (swpClient.cy/2) - ppts->y); - WinQueryWindowPos(pVideo->hidden->hwndClient, &swpClient); 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 @@ static MRESULT EXPENTRY WndProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) ptl.y + swpClient.cy/2); } else { + CONVERTMOUSEPOSITION(); + // Send absolute mouse position SDL_PrivateMouseMotion(0, // Buttons not changed 0, // Absolute position @@ -984,6 +1041,98 @@ static MRESULT EXPENTRY WndProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) return WinDefWindowProc(hwnd, msg, mp1, mp2); } +///////////////////////////////////////////////////////////////////// +// +// 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 @@ -1037,7 +1186,7 @@ static void PMThreadFunc(void *pParm) &(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 @@ static void PMThreadFunc(void *pParm) (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 @@ int os2fslib_IconifyWindow(_THIS) 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 @@ static void os2fslib_VideoQuit(_THIS) 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 @@ static SDL_Rect **os2fslib_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flag 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 @@ static SDL_Rect **os2fslib_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flag 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 @@ static int os2fslib_VideoInit(_THIS, SDL_PixelFormat *vformat) _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 @@ static SDL_VideoDevice *os2fslib_CreateDevice(int devindex) } 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 }; diff --git a/src/video/os2fslib/SDL_os2fslib.h b/src/video/os2fslib/SDL_os2fslib.h index b19a83d24..57b40c5de 100644 --- a/src/video/os2fslib/SDL_os2fslib.h +++ b/src/video/os2fslib/SDL_os2fslib.h @@ -57,8 +57,15 @@ struct SDL_PrivateVideoData 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 */ diff --git a/test/Makefile.wat b/test/Makefile.wat deleted file mode 100644 index db09284e8..000000000 --- a/test/Makefile.wat +++ /dev/null @@ -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