view pwplib/pwplib-win.c @ 71:a87eb778f225

Improvements to the MinGW crossbuild. Should now build with default tools from Debian mingw packages, though you need Win32 version of libSDL with the necessary headers and so on in addition. 64-bit builds not tested and probably won't work. Tested on Debian 7.0, earlier won't work. binutils-mingw-w64-i686 gcc-mingw-w64-i686 mingw-w64-i686-dev
author Matti Hamalainen <ccr@tnsp.org>
date Tue, 14 Aug 2012 03:08:10 +0300
parents 5d819ba6891c
children
line wrap: on
line source

#define __PWPLIB_C

#include "config.h"

#include <stdio.h>
#include <stdlib.h>

#include <windows.h>

#ifdef DRIVE_SDL
#include <SDL.h>
#endif

#include "pwplib.h"
#include "sound.h"
#include "video.h"

static int sdl_init = 0;

/******************** random stuff *************************/

extern void pwplib_dummy();
#define pwp_dummy pwplib_dummy

void pwpwrite(const char *fmt, ...)
{
    if (!pwplib.setup[SETUP_SHUTUP]) {
        va_list ap;
        va_start(ap, fmt);
        vfprintf(stderr, fmt, ap);
        va_end(ap);

        usleep(1000 * pwplib.set.infodelay);
    }
}

/********************* timer  ******************************/

#define TIMERHZ 72
int pwp_w32_ticks()
{
#ifdef DRIVE_SDL
    if (sdl_init) {
        int quit = 0;
        SDL_Event event;
        if (SDL_PollEvent(&event) >= 0) {
            switch (event.type) {
              case SDL_KEYDOWN:
                  if (event.key.keysym.sym == SDLK_ESCAPE)
                      quit = 1;
                  break;
              case SDL_QUIT:
                  quit = 1;
                  break;
            }
        }
        if (quit) {
            SDL_Quit();
            pwplib_shutdown();
            exit(1);
        }
        return (SDL_GetTicks() * TIMERHZ) / 1000;
    }
    else
#endif
    {
        int ticks = GetTickCount();
        return ((ticks*TIMERHZ)/1000);
        // (10000000/10441));
    }
}

/******************** initialization *********************/

int pwplib_initcore()
{
    int sdl_flags = 0;

    pwplib_init_common();

#ifdef DRIVE_SDL
    if (SDL_Init(SDL_INIT_TIMER | SDL_INIT_VIDEO | SDL_INIT_AUDIO) != 0) {
        pwpwrite("* SDL could not be initialized (%s).\n", SDL_GetError());
        sdl_init = 0;
    } else
        sdl_init = 1;

    if (sdl_init && !pwp_SDL_init())
    {
        sdl_init = 0;
        SDL_Quit();
    }
    if (sdl_init && !pwp_SDL_audio_init())
    {
        sdl_init = 0;
        SDL_Quit();
    }
#endif

    if (!sdl_init) {
#ifdef DRIVE_WIN32
        win32con_init();
        win32snd_init();
        if (pwplib.dump_rast == pwplib_dummy && pwplib.dump_attr != pwplib_dummy)
            pwplib.dump_rast = pwplib_dump_rast_plain;
#else
        return 0;
#endif
    }

    pwplib.timerfunc = pwp_w32_ticks;

    return 1;
}

/*********************************************************************/

void pwplib_startup()
{
  /* just dummy here */
}

void pwplib_end()
{
  pwplib_shutdown();

  /* write some stuph */
}

#ifdef __WIN32
int usleep(int t)
{
    Sleep(t / 1000);
}
#endif

/***************************************************************/

extern void pwplib_getopts();

int pwplib_init(int argc,char**argv)
{
    pwplib.argc=argc;
    pwplib.argv=argv;

    pwplib_getopts();

    if (pwplib.setup[SETUP_WANTHELP])
    {
        pwplib_printhelp();
        exit(0);
    }

    if (!pwplib_initcore())
    {
        pwpwrite("initialization failed!\n");
        return 0;
    }

    if (pwplib.setup[SETUP_WANTHELP])
        return 0;

    return 1;
}