+ Check for gettimeofday().
* src/time.c:
+ Created _caca_time().
+ Ported _caca_getticks() to the Win32 API.
* src/caca.c:
+ Properly builds on Win32.
* test/event.c:
+ Added <stdlib.h> because we use malloc().
tags/v0.99.beta14
| @@ -29,7 +29,7 @@ AC_ARG_ENABLE(x11, | |||||
| [ --enable-x11 X11 support (autodetected)]) | [ --enable-x11 X11 support (autodetected)]) | ||||
| AC_CHECK_HEADERS(inttypes.h endian.h) | 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") | AC_CHECK_LIB(m, sin, MATH_LIBS="${MATH_LIBS} -lm") | ||||
| CACA_DRIVERS="" | CACA_DRIVERS="" | ||||
| @@ -48,6 +48,9 @@ | |||||
| #if defined(USE_X11) | #if defined(USE_X11) | ||||
| # include <X11/Xlib.h> | # include <X11/Xlib.h> | ||||
| #endif | #endif | ||||
| #if defined(USE_WIN32) | |||||
| # include <windows.h> | |||||
| #endif | |||||
| #include <stdlib.h> | #include <stdlib.h> | ||||
| #include <string.h> | #include <string.h> | ||||
| @@ -156,7 +159,19 @@ int caca_init(void) | |||||
| else | else | ||||
| #endif | #endif | ||||
| #if defined(USE_X11) | #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 | #endif | ||||
| { | { | ||||
| /* Dummy */ | /* Dummy */ | ||||
| @@ -372,6 +387,13 @@ void caca_end(void) | |||||
| /* Nothing to do */ | /* Nothing to do */ | ||||
| } | } | ||||
| else | else | ||||
| #endif | |||||
| #if defined(USE_WIN32) | |||||
| if(_caca_driver == CACA_DRIVER_WIN32) | |||||
| { | |||||
| /* Nothing to do */ | |||||
| } | |||||
| else | |||||
| #endif | #endif | ||||
| { | { | ||||
| /* Dummy */ | /* Dummy */ | ||||
| @@ -390,6 +412,11 @@ static void caca_init_driver(void) | |||||
| /* If the environment variable was set, use it */ | /* If the environment variable was set, use it */ | ||||
| if(var && *var) | if(var && *var) | ||||
| { | { | ||||
| #if defined(USE_WIN32) | |||||
| if(!strcasecmp(var, "win32")) | |||||
| _caca_driver = CACA_DRIVER_WIN32; | |||||
| else | |||||
| #endif | |||||
| #if defined(USE_CONIO) | #if defined(USE_CONIO) | ||||
| if(!strcasecmp(var, "conio")) | if(!strcasecmp(var, "conio")) | ||||
| _caca_driver = CACA_DRIVER_CONIO; | _caca_driver = CACA_DRIVER_CONIO; | ||||
| @@ -416,6 +443,10 @@ static void caca_init_driver(void) | |||||
| } | } | ||||
| #endif | #endif | ||||
| #if defined(USE_WIN32) | |||||
| _caca_driver = CACA_DRIVER_WIN32; | |||||
| return; | |||||
| #endif | |||||
| #if defined(USE_CONIO) | #if defined(USE_CONIO) | ||||
| _caca_driver = CACA_DRIVER_CONIO; | _caca_driver = CACA_DRIVER_CONIO; | ||||
| return; | return; | ||||
| @@ -487,8 +518,10 @@ static void caca_init_features(void) | |||||
| static void caca_init_terminal(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; | char *term, *colorterm, *other; | ||||
| #endif | |||||
| #if defined(USE_SLANG) | #if defined(USE_SLANG) | ||||
| if(_caca_driver != CACA_DRIVER_SLANG) | if(_caca_driver != CACA_DRIVER_SLANG) | ||||
| @@ -498,6 +531,8 @@ static void caca_init_terminal(void) | |||||
| #endif | #endif | ||||
| return; | return; | ||||
| #if defined(HAVE_GETENV) && defined(HAVE_PUTENV) && \ | |||||
| (defined(USE_SLANG) || defined(USE_NCURSES)) | |||||
| term = getenv("TERM"); | term = getenv("TERM"); | ||||
| colorterm = getenv("COLORTERM"); | colorterm = getenv("COLORTERM"); | ||||
| @@ -44,6 +44,9 @@ enum caca_driver | |||||
| #endif | #endif | ||||
| #if defined(USE_X11) | #if defined(USE_X11) | ||||
| CACA_DRIVER_X11 = 4, | CACA_DRIVER_X11 = 4, | ||||
| #endif | |||||
| #if defined(USE_WIN32) | |||||
| CACA_DRIVER_WIN32 = 5, | |||||
| #endif | #endif | ||||
| CACA_DRIVER_NONE = 0 | CACA_DRIVER_NONE = 0 | ||||
| }; | }; | ||||
| @@ -64,6 +67,7 @@ extern int _caca_init_bitmap(void); | |||||
| extern int _caca_end_bitmap(void); | extern int _caca_end_bitmap(void); | ||||
| /* Timer functions */ | /* Timer functions */ | ||||
| extern void _caca_sleep(unsigned int); | |||||
| extern unsigned int _caca_getticks(struct caca_timer *); | extern unsigned int _caca_getticks(struct caca_timer *); | ||||
| /* Cached screen size */ | /* Cached screen size */ | ||||
| @@ -61,7 +61,6 @@ typedef unsigned char uint8_t; | |||||
| #include <stdio.h> /* BUFSIZ */ | #include <stdio.h> /* BUFSIZ */ | ||||
| #include <string.h> | #include <string.h> | ||||
| #include <stdlib.h> | #include <stdlib.h> | ||||
| #include <unistd.h> | |||||
| #include <stdarg.h> | #include <stdarg.h> | ||||
| #include "caca.h" | #include "caca.h" | ||||
| @@ -935,13 +934,7 @@ void caca_refresh(void) | |||||
| ticks + IDLE_USEC < (int)_caca_delay; | ticks + IDLE_USEC < (int)_caca_delay; | ||||
| ticks += _caca_getticks(&timer)) | 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 */ | /* Update the sliding mean of the render time */ | ||||
| @@ -47,8 +47,9 @@ | |||||
| # include <X11/Xutil.h> | # include <X11/Xutil.h> | ||||
| # include <X11/keysym.h> | # include <X11/keysym.h> | ||||
| #endif | #endif | ||||
| #include <unistd.h> | |||||
| #if defined(USE_WIN32) | |||||
| # include <windows.h> | |||||
| #endif | |||||
| #include "caca.h" | #include "caca.h" | ||||
| #include "caca_internals.h" | #include "caca_internals.h" | ||||
| @@ -121,13 +122,7 @@ unsigned int caca_wait_event(unsigned int event_mask) | |||||
| if(event & event_mask) | if(event & event_mask) | ||||
| return event; | 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; | return CACA_EVENT_KEY_PRESS | event; | ||||
| } | } | ||||
| else | else | ||||
| #endif | |||||
| #if defined(USE_WIN32) | |||||
| if(_caca_driver == CACA_DRIVER_WIN32) | |||||
| { | |||||
| return CACA_EVENT_NONE; | |||||
| } | |||||
| else | |||||
| #endif | #endif | ||||
| { | { | ||||
| /* Dummy */ | /* Dummy */ | ||||
| @@ -33,32 +33,69 @@ | |||||
| #include <sys/time.h> | #include <sys/time.h> | ||||
| #include <time.h> | #include <time.h> | ||||
| #if defined(USE_WIN32) | |||||
| # include <windows.h> | |||||
| #endif | |||||
| #include <unistd.h> | |||||
| #include "caca.h" | #include "caca.h" | ||||
| #include "caca_internals.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) | unsigned int _caca_getticks(struct caca_timer *timer) | ||||
| { | { | ||||
| #if defined(HAVE_GETTIMEOFDAY) | |||||
| struct timeval tv; | struct timeval tv; | ||||
| #elif defined(USE_WIN32) | |||||
| static long long int freq = -1LL; | |||||
| long long int usec; | |||||
| #endif | |||||
| unsigned int ticks = 0; | unsigned int ticks = 0; | ||||
| int new_sec, new_usec; | |||||
| #if defined(HAVE_GETTIMEOFDAY) | |||||
| gettimeofday(&tv, NULL); | 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(timer->last_sec != 0) | ||||
| { | { | ||||
| /* If the delay was greater than 60 seconds, return 10 seconds | /* If the delay was greater than 60 seconds, return 10 seconds | ||||
| * otherwise we may overflow our ticks counter. */ | * 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; | ticks = 60 * 1000000; | ||||
| else | 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; | 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; | return ticks; | ||||
| } | } | ||||
| @@ -25,6 +25,7 @@ | |||||
| #include <stdio.h> | #include <stdio.h> | ||||
| #include <string.h> | #include <string.h> | ||||
| #include <stdlib.h> | |||||
| #include "caca.h" | #include "caca.h" | ||||