Difference between revisions of "SDL"

From NikiWiki
Jump to: navigation, search
(Morph your program to a PM program at runtime)
Line 1: Line 1:
 
== Porting SDL applications to OS/2 ==
 
== Porting SDL applications to OS/2 ==
  
=== Requirements ===
+
Moved to [http://www.edm2.com/index.php/SDL]
 
 
To port SDL applications to OS/2, you'll need the latest SDL binaries
 
and header files from netlabs.org. Currently the OpenWatcom compiler is
 
<b>the</b> compiler for the OS/2 port of SDL, but it should also work
 
with GCC.
 
 
 
=== Using the OpenWatcom compiler ===
 
 
 
There are some requirements and tricks with using the OpenWatcom compiler
 
to port SDL applications. You should note the followings things.
 
 
 
==== Use the -ei switch for the OpenWatcom C compiler ====
 
 
 
You have to use the <i>-ei</i> switch for the OpenWatcom C compiler to
 
have the size of enums equal to the size of ints. This is a requirement of
 
SDL itself.
 
 
 
==== Wrapping the SDL_Quit() function ====
 
 
 
The OS/2 version of SDL is compiled into a DLL file. This DLL file has all
 
the SDL functions exported by name. In order to be able to use this DLL from
 
most of the available compilers, these exports are using the <i>_Syscall</i>
 
calling convention. This leads to problems with some SDL apps, where they assume
 
that the calling convention of the API is the same as the calling convention of
 
their runtime library. For example, the following line is very usual in SDL
 
applications:
 
 
 
...
 
atexit(SDL_Quit);
 
...
 
 
 
This should be worked around by creating a wrapper function for SDL_Quit, and
 
using that one, this way:
 
 
 
#ifdef __WATCOMC__
 
void SDL_Quit_Wrapper()
 
{
 
    SDL_Quit();
 
}
 
#endif
 
...
 
#ifdef __WATCOMC__
 
atexit(SDL_Quit_Wrapper);
 
#else
 
atexit(SDL_Quit);
 
#endif;
 
 
 
=== Using the GNU C Compiler ===
 
 
 
It was reported that some (or maybe all) of the GNU C compilers
 
(GCC) available for OS/2 can not handle the SDL.LIB file included in
 
the SDL DevPack. The problem is that the SDL.LIB file was created
 
directly from the SDL.DLL file, using the IMPLIB.EXE tool from the
 
OS/2 Developer's Toolkit, and the GCC does not recognize it to be a
 
valid library file.
 
 
 
There is a workaround, which is reported to work in this case. One has
 
to create a GCC-compatible library file (.a), using the EMXIMP tool,
 
and link against that file:
 
 
 
emximp -o sdl.imp sdl.lib
 
emximp -o sdl.a sdl.imp
 
 
 
If you plan on using SDL's multithreading capabilities (e.g. if you want
 
to include "SDL_thread.h"), be sure that enable multithreading with -Zmt
 
on your GCC commandline, otherwise you'll get an error because _beginthread()
 
and _endthread() will not be defined.
 
 
 
=== General tips and tricks ===
 
 
 
==== Morph your program to a PM program at runtime ====
 
 
 
Most SDL applications assume that they can write to STDOUT, and the user will
 
see it. In OS/2, you have to compile your application to a PM application in
 
order to be able to have a PM Window, but the STDOUT will go to NULL in this
 
case. The solution is to compile your code to a VIO application, and morph the
 
application to a PM one dynamically, at runtime, before calling SDL_Init().
 
 
 
Once you have your text output back, you might use it for showing debug messages.
 
If you do so, it's a good idea to make the STDOUT and STDERR unbuffered, so
 
the debug messages will be shown right at the time when the printf() is called,
 
so every message will be visible even in case of a crash.
 
 
 
Here is an example code on how to morph your VIO application to a PM one
 
dynamically, at runtime, and how to set STDOUT and STDERR unbuffered:
 
 
 
#define INCL_DOS
 
#include <os2.h>
 
#include <stdio.h>
 
 
...
 
 
void MorphToPM()
 
{
 
  PPIB pib;
 
  PTIB tib;
 
 
  DosGetInfoBlocks(&tib, &pib);
 
 
  // Change flag from VIO to PM:
 
  if (pib->pib_ultype==2) pib->pib_ultype = 3;
 
}
 
 
...
 
 
int main(int argc, char *argv[])
 
{
 
  MorphToPM(); // Morph the VIO application to a PM one to be able to use Win* functions
 
 
  // Make stdout and stderr unbuffered
 
  setbuf( stdout, NULL );
 
  setbuf( stderr, NULL );
 
 
 
  /* Initialize SDL */
 
  if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) {
 
      fprintf(stderr, "Couldn't initialize SDL: %s\n",SDL_GetError());
 
      exit(1);
 
  }
 
 
 
...
 

Revision as of 10:10, 20 May 2005

Porting SDL applications to OS/2

Moved to [1]