diff --git a/configure.ac b/configure.ac index 5684d12..1501fca 100644 --- a/configure.ac +++ b/configure.ac @@ -29,7 +29,7 @@ AC_ARG_ENABLE(x11, [ --enable-x11 X11 support (autodetected)]) AC_CHECK_HEADERS(inttypes.h endian.h) -AC_CHECK_FUNCS(vsnprintf getenv putenv strcasecmp usleep Sleep) +AC_CHECK_FUNCS(vsnprintf getenv putenv strcasecmp usleep Sleep gettimeofday) AC_CHECK_LIB(m, sin, MATH_LIBS="${MATH_LIBS} -lm") CACA_DRIVERS="" diff --git a/src/caca.c b/src/caca.c index 56fa424..414fc7c 100644 --- a/src/caca.c +++ b/src/caca.c @@ -48,6 +48,9 @@ #if defined(USE_X11) # include #endif +#if defined(USE_WIN32) +# include +#endif #include #include @@ -156,7 +159,19 @@ int caca_init(void) else #endif #if defined(USE_X11) - /* Nothing to do */ + if(_caca_driver == CACA_DRIVER_X11) + { + /* Nothing to do */ + } + else +#endif +#if defined(USE_WIN32) + if(_caca_driver == CACA_DRIVER_WIN32) + { + /* Nothing to do */ + printf("initialising win32 driver\n"); + } + else #endif { /* Dummy */ @@ -372,6 +387,13 @@ void caca_end(void) /* Nothing to do */ } else +#endif +#if defined(USE_WIN32) + if(_caca_driver == CACA_DRIVER_WIN32) + { + /* Nothing to do */ + } + else #endif { /* Dummy */ @@ -390,6 +412,11 @@ static void caca_init_driver(void) /* If the environment variable was set, use it */ if(var && *var) { +#if defined(USE_WIN32) + if(!strcasecmp(var, "win32")) + _caca_driver = CACA_DRIVER_WIN32; + else +#endif #if defined(USE_CONIO) if(!strcasecmp(var, "conio")) _caca_driver = CACA_DRIVER_CONIO; @@ -416,6 +443,10 @@ static void caca_init_driver(void) } #endif +#if defined(USE_WIN32) + _caca_driver = CACA_DRIVER_WIN32; + return; +#endif #if defined(USE_CONIO) _caca_driver = CACA_DRIVER_CONIO; return; @@ -487,8 +518,10 @@ static void caca_init_features(void) static void caca_init_terminal(void) { -#if defined(HAVE_GETENV) && defined(HAVE_PUTENV) +#if defined(HAVE_GETENV) && defined(HAVE_PUTENV) && \ + (defined(USE_SLANG) || defined(USE_NCURSES)) char *term, *colorterm, *other; +#endif #if defined(USE_SLANG) if(_caca_driver != CACA_DRIVER_SLANG) @@ -498,6 +531,8 @@ static void caca_init_terminal(void) #endif return; +#if defined(HAVE_GETENV) && defined(HAVE_PUTENV) && \ + (defined(USE_SLANG) || defined(USE_NCURSES)) term = getenv("TERM"); colorterm = getenv("COLORTERM"); diff --git a/src/caca_internals.h b/src/caca_internals.h index 4d49777..5bd9e06 100644 --- a/src/caca_internals.h +++ b/src/caca_internals.h @@ -44,6 +44,9 @@ enum caca_driver #endif #if defined(USE_X11) CACA_DRIVER_X11 = 4, +#endif +#if defined(USE_WIN32) + CACA_DRIVER_WIN32 = 5, #endif CACA_DRIVER_NONE = 0 }; @@ -64,6 +67,7 @@ extern int _caca_init_bitmap(void); extern int _caca_end_bitmap(void); /* Timer functions */ +extern void _caca_sleep(unsigned int); extern unsigned int _caca_getticks(struct caca_timer *); /* Cached screen size */ diff --git a/src/graphics.c b/src/graphics.c index dba8700..c4ab587 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -61,7 +61,6 @@ typedef unsigned char uint8_t; #include /* BUFSIZ */ #include #include -#include #include #include "caca.h" @@ -935,13 +934,7 @@ void caca_refresh(void) ticks + IDLE_USEC < (int)_caca_delay; ticks += _caca_getticks(&timer)) { -#if defined(HAVE_USLEEP) - usleep(IDLE_USEC); -#elif defined(HAVE_SLEEP) - Sleep(IDLE_USEC / 1000); -#else - SLEEP -#endif + _caca_sleep(IDLE_USEC); } /* Update the sliding mean of the render time */ diff --git a/src/io.c b/src/io.c index 3ef068c..a26c07d 100644 --- a/src/io.c +++ b/src/io.c @@ -47,8 +47,9 @@ # include # include #endif - -#include +#if defined(USE_WIN32) +# include +#endif #include "caca.h" #include "caca_internals.h" @@ -121,13 +122,7 @@ unsigned int caca_wait_event(unsigned int event_mask) if(event & event_mask) return event; -#if defined(HAVE_USLEEP) - usleep(10000); -#elif defined(HAVE_SLEEP) - Sleep(10); -#else - SLEEP -#endif + _caca_sleep(10000); } } @@ -541,6 +536,13 @@ static unsigned int _lowlevel_event(void) return CACA_EVENT_KEY_PRESS | event; } else +#endif +#if defined(USE_WIN32) + if(_caca_driver == CACA_DRIVER_WIN32) + { + return CACA_EVENT_NONE; + } + else #endif { /* Dummy */ diff --git a/src/time.c b/src/time.c index 555db74..ec147a3 100644 --- a/src/time.c +++ b/src/time.c @@ -33,32 +33,69 @@ #include #include +#if defined(USE_WIN32) +# include +#endif + +#include + #include "caca.h" #include "caca_internals.h" +void _caca_sleep(unsigned int usec) +{ +#if defined(HAVE_USLEEP) + usleep(usec); +#elif defined(HAVE_SLEEP) + Sleep(usec / 1000); +#else + SLEEP +#endif +} + unsigned int _caca_getticks(struct caca_timer *timer) { +#if defined(HAVE_GETTIMEOFDAY) struct timeval tv; +#elif defined(USE_WIN32) + static long long int freq = -1LL; + long long int usec; +#endif unsigned int ticks = 0; + int new_sec, new_usec; +#if defined(HAVE_GETTIMEOFDAY) gettimeofday(&tv, NULL); + new_sec = tv.tv_sec; + new_usec = tv.tv_usec; +#elif defined(USE_WIN32) + if(freq == -1LL) + { + if(!QueryPerformanceFrequency((LARGE_INTEGER *)&freq)) + freq = 0; + } + + QueryPerformanceCounter((LARGE_INTEGER *)&usec); + new_sec = usec / freq; + new_usec = usec % freq; +#endif if(timer->last_sec != 0) { /* If the delay was greater than 60 seconds, return 10 seconds * otherwise we may overflow our ticks counter. */ - if(tv.tv_sec >= timer->last_sec + 60) + if(new_sec >= timer->last_sec + 60) ticks = 60 * 1000000; else { - ticks = (tv.tv_sec - timer->last_sec) * 1000000; - ticks += tv.tv_usec; + ticks = (new_sec - timer->last_sec) * 1000000; + ticks += new_usec; ticks -= timer->last_usec; } } - timer->last_sec = tv.tv_sec; - timer->last_usec = tv.tv_usec; + timer->last_sec = new_sec; + timer->last_usec = new_usec; return ticks; } diff --git a/test/event.c b/test/event.c index 4022bad..3707c8b 100644 --- a/test/event.c +++ b/test/event.c @@ -25,6 +25,7 @@ #include #include +#include #include "caca.h"