+ Do not refresh after each event, but only when there is no event pending. + If the pressed key is a printable character, display it. * src/time.c: + Moved _caca_getticks() to this file. * src/caca.c: + Set the escape delay to a very low value in the ncurses driver, because I don't want escape sequences to be entered manually. * src/io.c: + Autorepeat emulation in the ncurses and slang drivers: do not immediately send the key release event. * configure.ac: + Check for usleep. + Improvements in the win32 platform detection.tags/v0.99.beta14
@@ -4,9 +4,8 @@ Video rendering | |||||
o ncurses' hashmap scrolling optimisation code causes the screen to | o ncurses' hashmap scrolling optimisation code causes the screen to | ||||
occasionally flicker because it tries to optimise the vertical | occasionally flicker because it tries to optimise the vertical | ||||
scrolling. | |||||
o the X11 driver is very slow. | |||||
scrolling. With S-Lang, SLtt_Term_Cannot_Scroll prevents this | |||||
unwanted behaviour. | |||||
o some terminal emulators (Konsole, or the Linux VGA console) honour | o some terminal emulators (Konsole, or the Linux VGA console) honour | ||||
the blink attribute instead of using it for bold or bright like any | the blink attribute instead of using it for bold or bright like any | ||||
@@ -193,3 +193,5 @@ $Id$ | |||||
o MS-DOS: all bright colours, bright backgrounds, and bright combinations | o MS-DOS: all bright colours, bright backgrounds, and bright combinations | ||||
work using <conio.h>. No need to kludge anything. | work using <conio.h>. No need to kludge anything. | ||||
o Win32: we use GetConsoleScreenBufferInfo etc. | |||||
@@ -11,10 +11,12 @@ Building libcaca | |||||
--disable-imlib2: remove Imlib2 support in cacaview | --disable-imlib2: remove Imlib2 support in cacaview | ||||
o Cross-compilation example: | |||||
o Cross-compilation examples: | |||||
./configure --disable-imlib2 --host=i386-pc-msdosdjgpp | ./configure --disable-imlib2 --host=i386-pc-msdosdjgpp | ||||
./configure --disable-imlib2 --host=i586-mingw32msvc | |||||
Using libcaca | Using libcaca | ||||
@@ -15,19 +15,21 @@ AC_PROG_RANLIB | |||||
dnl AC_PROG_EGREP only exists in autoconf 2.54+, so we use AC_EGREP_CPP right | dnl AC_PROG_EGREP only exists in autoconf 2.54+, so we use AC_EGREP_CPP right | ||||
dnl now otherwise it might be set in an obscure if statement. | dnl now otherwise it might be set in an obscure if statement. | ||||
AC_EGREP_CPP(foo,foo) | |||||
AC_EGREP_CPP(foo, foo) | |||||
AC_ARG_ENABLE(slang, | AC_ARG_ENABLE(slang, | ||||
[ --enable-slang slang graphics support (autodetected)]) | [ --enable-slang slang graphics support (autodetected)]) | ||||
AC_ARG_ENABLE(ncurses, | AC_ARG_ENABLE(ncurses, | ||||
[ --enable-ncurses ncurses graphics support (autodetected)]) | [ --enable-ncurses ncurses graphics support (autodetected)]) | ||||
AC_ARG_ENABLE(win32, | |||||
[ --enable-win32 Windows console support (autodetected)]) | |||||
AC_ARG_ENABLE(conio, | AC_ARG_ENABLE(conio, | ||||
[ --enable-conio DOS conio.h graphics support (default disabled)]) | |||||
[ --enable-conio DOS conio.h graphics support (autodetected)]) | |||||
AC_ARG_ENABLE(x11, | 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) | |||||
AC_CHECK_FUNCS(vsnprintf getenv putenv strcasecmp usleep Sleep) | |||||
CACA_DRIVERS="" | CACA_DRIVERS="" | ||||
@@ -35,7 +37,7 @@ if test "${enable_conio}" != "no"; then | |||||
ac_cv_my_have_conio="no" | ac_cv_my_have_conio="no" | ||||
AC_CHECK_HEADERS(conio.h, | AC_CHECK_HEADERS(conio.h, | ||||
[AC_MSG_CHECKING(for ScreenUpdate in pc.h) | [AC_MSG_CHECKING(for ScreenUpdate in pc.h) | ||||
AC_EGREP_HEADER(ScreenUpdate,pc.h, | |||||
AC_EGREP_HEADER(ScreenUpdate, pc.h, | |||||
[ac_cv_my_have_conio="yes" | [ac_cv_my_have_conio="yes" | ||||
AC_MSG_RESULT(yes) | AC_MSG_RESULT(yes) | ||||
AC_DEFINE(SCREENUPDATE_IN_PC_H, 1, | AC_DEFINE(SCREENUPDATE_IN_PC_H, 1, | ||||
@@ -48,6 +50,23 @@ if test "${enable_conio}" != "no"; then | |||||
fi | fi | ||||
fi | fi | ||||
if test "${enable_win32}" != "no"; then | |||||
ac_cv_my_have_win32="no" | |||||
AC_CHECK_HEADERS(windows.h, | |||||
[AC_MSG_CHECKING(for AllocConsole in windows.h) | |||||
AC_EGREP_HEADER(AllocConsole, windows.h, | |||||
[ac_cv_my_have_win32="yes" | |||||
AC_MSG_RESULT(yes) | |||||
AC_DEFINE(ALLOCCONSOLE_IN_WINDOWS_H, 1, | |||||
Define if <windows.h> defines AllocConsole.) | |||||
AC_DEFINE(USE_WIN32, 1, Define to activate the win32 backend driver) | |||||
CACA_DRIVERS="${CACA_DRIVERS} win32"], | |||||
[AC_MSG_RESULT(no)])]) | |||||
if test "${ac_cv_my_have_win32}" = "no" -a "${enable_win32}" = "yes"; then | |||||
AC_MSG_ERROR([cannot find win32 console development files]) | |||||
fi | |||||
fi | |||||
if test "${enable_slang}" != "no"; then | if test "${enable_slang}" != "no"; then | ||||
ac_cv_my_have_slang="no" | ac_cv_my_have_slang="no" | ||||
AC_CHECK_HEADERS(slang.h slang/slang.h, | AC_CHECK_HEADERS(slang.h slang/slang.h, | ||||
@@ -18,6 +18,7 @@ libcaca_a_SOURCES = \ | |||||
triangle.c \ | triangle.c \ | ||||
sprite.c \ | sprite.c \ | ||||
bitmap.c \ | bitmap.c \ | ||||
time.c \ | |||||
$(NULL) | $(NULL) | ||||
if NEED_PIC | if NEED_PIC | ||||
@@ -140,6 +140,9 @@ int caca_init(void) | |||||
newmask = REPORT_MOUSE_POSITION | ALL_MOUSE_EVENTS; | newmask = REPORT_MOUSE_POSITION | ALL_MOUSE_EVENTS; | ||||
mousemask(newmask, &oldmask); | mousemask(newmask, &oldmask); | ||||
mouseinterval(-1); /* No click emulation */ | mouseinterval(-1); /* No click emulation */ | ||||
/* Set the escape delay to a ridiculously low value */ | |||||
ESCDELAY = 10; | |||||
} | } | ||||
else | else | ||||
#endif | #endif | ||||
@@ -48,6 +48,13 @@ enum caca_driver | |||||
CACA_DRIVER_NONE = 0 | CACA_DRIVER_NONE = 0 | ||||
}; | }; | ||||
/* Timer structure */ | |||||
#define CACA_TIMER_INITIALIZER { 0, 0 } | |||||
struct caca_timer | |||||
{ | |||||
int last_sec, last_usec; | |||||
}; | |||||
extern enum caca_driver _caca_driver; | extern enum caca_driver _caca_driver; | ||||
/* Initialisation functions */ | /* Initialisation functions */ | ||||
@@ -56,6 +63,9 @@ extern int _caca_end_graphics(void); | |||||
extern int _caca_init_bitmap(void); | extern int _caca_init_bitmap(void); | ||||
extern int _caca_end_bitmap(void); | extern int _caca_end_bitmap(void); | ||||
/* Timer functions */ | |||||
extern unsigned int _caca_getticks(struct caca_timer *); | |||||
/* Cached screen size */ | /* Cached screen size */ | ||||
extern unsigned int _caca_width; | extern unsigned int _caca_width; | ||||
extern unsigned int _caca_height; | extern unsigned int _caca_height; | ||||
@@ -63,8 +63,6 @@ typedef unsigned char uint8_t; | |||||
#include <stdlib.h> | #include <stdlib.h> | ||||
#include <unistd.h> | #include <unistd.h> | ||||
#include <stdarg.h> | #include <stdarg.h> | ||||
#include <sys/time.h> | |||||
#include <time.h> | |||||
#include "caca.h" | #include "caca.h" | ||||
#include "caca_internals.h" | #include "caca_internals.h" | ||||
@@ -187,8 +185,6 @@ static void slang_init_palette(void); | |||||
static int x11_error_handler(Display *, XErrorEvent *); | static int x11_error_handler(Display *, XErrorEvent *); | ||||
#endif | #endif | ||||
static unsigned int _caca_getticks(void); | |||||
/** \brief Set the default colour pair. | /** \brief Set the default colour pair. | ||||
* | * | ||||
* This function sets the default colour pair. String functions such as | * This function sets the default colour pair. String functions such as | ||||
@@ -828,39 +824,11 @@ unsigned int caca_get_rendertime(void) | |||||
return _caca_rendertime; | return _caca_rendertime; | ||||
} | } | ||||
static unsigned int _caca_getticks(void) | |||||
{ | |||||
static int last_sec = 0, last_usec = 0; | |||||
struct timeval tv; | |||||
unsigned int ticks = 0; | |||||
gettimeofday(&tv, NULL); | |||||
if(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 >= last_sec + 60) | |||||
ticks = 60 * 1000000; | |||||
else | |||||
{ | |||||
ticks = (tv.tv_sec - last_sec) * 1000000; | |||||
ticks += tv.tv_usec; | |||||
ticks -= last_usec; | |||||
} | |||||
} | |||||
last_sec = tv.tv_sec; | |||||
last_usec = tv.tv_usec; | |||||
return ticks; | |||||
} | |||||
/** \brief Flush pending changes and redraw the screen. | /** \brief Flush pending changes and redraw the screen. | ||||
* | * | ||||
* This function flushes all graphical operations and prints them to the | * This function flushes all graphical operations and prints them to the | ||||
* screen. Nothing will show on the screen caca_refresh() is not called. | |||||
* screen. Nothing will show on the screen until caca_refresh() is | |||||
* called. | |||||
* | * | ||||
* If caca_set_delay() was called with a non-zero value, caca_refresh() | * If caca_set_delay() was called with a non-zero value, caca_refresh() | ||||
* will use that value to achieve constant framerate: if two consecutive | * will use that value to achieve constant framerate: if two consecutive | ||||
@@ -873,8 +841,9 @@ void caca_refresh(void) | |||||
#if !defined(_DOXYGEN_SKIP_ME) | #if !defined(_DOXYGEN_SKIP_ME) | ||||
#define IDLE_USEC 10000 | #define IDLE_USEC 10000 | ||||
#endif | #endif | ||||
static struct caca_timer timer = CACA_TIMER_INITIALIZER; | |||||
static int lastticks = 0; | static int lastticks = 0; | ||||
int ticks = lastticks + _caca_getticks(); | |||||
int ticks = lastticks + _caca_getticks(&timer); | |||||
#if defined(USE_SLANG) | #if defined(USE_SLANG) | ||||
if(_caca_driver == CACA_DRIVER_SLANG) | if(_caca_driver == CACA_DRIVER_SLANG) | ||||
@@ -958,9 +927,19 @@ void caca_refresh(void) | |||||
#endif | #endif | ||||
/* Wait until _caca_delay + time of last call */ | /* Wait until _caca_delay + time of last call */ | ||||
ticks += _caca_getticks(); | |||||
for(; ticks + IDLE_USEC < (int)_caca_delay; ticks += _caca_getticks()) | |||||
ticks += _caca_getticks(&timer); | |||||
for(ticks += _caca_getticks(&timer); | |||||
ticks + IDLE_USEC < (int)_caca_delay; | |||||
ticks += _caca_getticks(&timer)) | |||||
{ | |||||
#if defined(HAVE_USLEEP) | |||||
usleep(IDLE_USEC); | usleep(IDLE_USEC); | ||||
#elif defined(HAVE_SLEEP) | |||||
Sleep(IDLE_USEC / 1000); | |||||
#else | |||||
SLEEP | |||||
#endif | |||||
} | |||||
/* Update the sliding mean of the render time */ | /* Update the sliding mean of the render time */ | ||||
_caca_rendertime = (7 * _caca_rendertime + ticks) / 8; | _caca_rendertime = (7 * _caca_rendertime + ticks) / 8; | ||||
@@ -54,6 +54,7 @@ | |||||
#include "caca_internals.h" | #include "caca_internals.h" | ||||
static unsigned int _get_next_event(void); | static unsigned int _get_next_event(void); | ||||
static unsigned int _lowlevel_event(void); | |||||
static void _push_event(unsigned int); | static void _push_event(unsigned int); | ||||
static unsigned int _pop_event(void); | static unsigned int _pop_event(void); | ||||
@@ -63,6 +64,16 @@ static unsigned int _pop_event(void); | |||||
static unsigned int eventbuf[EVENTBUF_LEN]; | static unsigned int eventbuf[EVENTBUF_LEN]; | ||||
static int events = 0; | static int events = 0; | ||||
#if !defined(_DOXYGEN_SKIP_ME) | |||||
/* If no new key was pressed after AUTOREPEAT_THRESHOLD usec, assume the | |||||
* key was released */ | |||||
#define AUTOREPEAT_THRESHOLD 200000 | |||||
/* Start repeating key after AUTOREPEAT_TRIGGER usec and send keypress | |||||
* events every AUTOREPEAT_RATE usec. */ | |||||
#define AUTOREPEAT_TRIGGER 300000 | |||||
#define AUTOREPEAT_RATE 100000 | |||||
#endif | |||||
/** \brief Get the next mouse or keyboard input event. | /** \brief Get the next mouse or keyboard input event. | ||||
* | * | ||||
* This function polls the event queue for mouse or keyboard events matching | * This function polls the event queue for mouse or keyboard events matching | ||||
@@ -104,7 +115,13 @@ unsigned int caca_wait_event(unsigned int event_mask) | |||||
if(event & event_mask) | if(event & event_mask) | ||||
return event; | return event; | ||||
usleep(1000); | |||||
#if defined(HAVE_USLEEP) | |||||
usleep(10000); | |||||
#elif defined(HAVE_SLEEP) | |||||
Sleep(10); | |||||
#else | |||||
SLEEP | |||||
#endif | |||||
} | } | ||||
} | } | ||||
@@ -113,6 +130,72 @@ unsigned int caca_wait_event(unsigned int event_mask) | |||||
*/ | */ | ||||
static unsigned int _get_next_event(void) | static unsigned int _get_next_event(void) | ||||
{ | |||||
#if defined(USE_SLANG) || defined(USE_NCURSES) | |||||
static struct caca_timer key_timer = CACA_TIMER_INITIALIZER; | |||||
static unsigned int last_key_ticks = 0; | |||||
static unsigned int autorepeat_ticks = 0; | |||||
static unsigned int last_key = 0; | |||||
unsigned int ticks; | |||||
#endif | |||||
unsigned int event = _lowlevel_event(); | |||||
#if defined(USE_SLANG) | |||||
if(_caca_driver != CACA_DRIVER_SLANG) | |||||
#endif | |||||
#if defined(USE_NCURSES) | |||||
if(_caca_driver != CACA_DRIVER_NCURSES) | |||||
#endif | |||||
return event; | |||||
#if defined(USE_SLANG) || defined(USE_NCURSES) | |||||
/* Simulate long keypresses using autorepeat features */ | |||||
ticks = _caca_getticks(&key_timer); | |||||
last_key_ticks += ticks; | |||||
autorepeat_ticks += ticks; | |||||
/* Handle autorepeat */ | |||||
if(last_key && autorepeat_ticks > AUTOREPEAT_TRIGGER | |||||
&& autorepeat_ticks > AUTOREPEAT_THRESHOLD | |||||
&& autorepeat_ticks > AUTOREPEAT_RATE) | |||||
{ | |||||
_push_event(event); | |||||
autorepeat_ticks -= AUTOREPEAT_RATE; | |||||
return CACA_EVENT_KEY_PRESS | last_key; | |||||
} | |||||
/* We are in autorepeat mode and the same key was just pressed, ignore | |||||
* this event and return the next one by calling ourselves. */ | |||||
if(event == (CACA_EVENT_KEY_PRESS | last_key)) | |||||
{ | |||||
last_key_ticks = 0; | |||||
return _get_next_event(); | |||||
} | |||||
/* We are in autorepeat mode, but key has expired or a new key was | |||||
* pressed - store our event and return a key release event first */ | |||||
if(last_key && (last_key_ticks > AUTOREPEAT_THRESHOLD | |||||
|| (event & CACA_EVENT_KEY_PRESS))) | |||||
{ | |||||
_push_event(event); | |||||
event = CACA_EVENT_KEY_RELEASE | last_key; | |||||
last_key = 0; | |||||
return event; | |||||
} | |||||
/* A new key was pressed, enter autorepeat mode */ | |||||
if(event & CACA_EVENT_KEY_PRESS) | |||||
{ | |||||
last_key_ticks = 0; | |||||
autorepeat_ticks = 0; | |||||
last_key = event & 0x00ffffff; | |||||
} | |||||
return event; | |||||
#endif | |||||
} | |||||
static unsigned int _lowlevel_event(void) | |||||
{ | { | ||||
unsigned int event = _pop_event(); | unsigned int event = _pop_event(); | ||||
@@ -213,7 +296,6 @@ static unsigned int _get_next_event(void) | |||||
if(intkey < 0x100) | if(intkey < 0x100) | ||||
{ | { | ||||
_push_event(CACA_EVENT_KEY_RELEASE | intkey); | |||||
return CACA_EVENT_KEY_PRESS | intkey; | return CACA_EVENT_KEY_PRESS | intkey; | ||||
} | } | ||||
@@ -360,7 +442,6 @@ static unsigned int _get_next_event(void) | |||||
case KEY_F(12): event = CACA_KEY_F12; break; | case KEY_F(12): event = CACA_KEY_F12; break; | ||||
} | } | ||||
_push_event(CACA_EVENT_KEY_RELEASE | event); | |||||
return CACA_EVENT_KEY_PRESS | event; | return CACA_EVENT_KEY_PRESS | event; | ||||
} | } | ||||
else | else | ||||
@@ -377,7 +458,6 @@ static unsigned int _get_next_event(void) | |||||
if(intkey < 0x100) | if(intkey < 0x100) | ||||
{ | { | ||||
_push_event(CACA_EVENT_KEY_RELEASE | intkey); | |||||
return CACA_EVENT_KEY_PRESS | intkey; | return CACA_EVENT_KEY_PRESS | intkey; | ||||
} | } | ||||
@@ -412,7 +492,6 @@ static unsigned int _get_next_event(void) | |||||
case SL_KEY_F(12): event = CACA_KEY_F12; break; | case SL_KEY_F(12): event = CACA_KEY_F12; break; | ||||
} | } | ||||
_push_event(CACA_EVENT_KEY_RELEASE | event); | |||||
return CACA_EVENT_KEY_PRESS | event; | return CACA_EVENT_KEY_PRESS | event; | ||||
} | } | ||||
else | else | ||||
@@ -0,0 +1,65 @@ | |||||
/* | |||||
* libcaca ASCII-Art library | |||||
* Copyright (c) 2002, 2003, 2004 Sam Hocevar <sam@zoy.org> | |||||
* All Rights Reserved | |||||
* | |||||
* 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 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., 59 Temple Place, Suite 330, Boston, MA | |||||
* 02111-1307 USA | |||||
*/ | |||||
/** \file time.c | |||||
* \version \$Id$ | |||||
* \author Sam Hocevar <sam@zoy.org> | |||||
* \brief Timer routines | |||||
* | |||||
* This file contains simple timer routines. | |||||
*/ | |||||
#include "config.h" | |||||
#include <stdlib.h> | |||||
#include <sys/time.h> | |||||
#include <time.h> | |||||
#include "caca.h" | |||||
#include "caca_internals.h" | |||||
unsigned int _caca_getticks(struct caca_timer *timer) | |||||
{ | |||||
struct timeval tv; | |||||
unsigned int ticks = 0; | |||||
gettimeofday(&tv, NULL); | |||||
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) | |||||
ticks = 60 * 1000000; | |||||
else | |||||
{ | |||||
ticks = (tv.tv_sec - timer->last_sec) * 1000000; | |||||
ticks += tv.tv_usec; | |||||
ticks -= timer->last_usec; | |||||
} | |||||
} | |||||
timer->last_sec = tv.tv_sec; | |||||
timer->last_usec = tv.tv_usec; | |||||
return ticks; | |||||
} | |||||
@@ -33,7 +33,7 @@ static void print_event(int, int, unsigned int); | |||||
int main(int argc, char **argv) | int main(int argc, char **argv) | ||||
{ | { | ||||
int *events; | int *events; | ||||
int i, h; | |||||
int i, h, quit; | |||||
if(caca_init()) | if(caca_init()) | ||||
return 1; | return 1; | ||||
@@ -48,32 +48,38 @@ int main(int argc, char **argv) | |||||
events = malloc(h * sizeof(int)); | events = malloc(h * sizeof(int)); | ||||
memset(events, 0, h * sizeof(int)); | memset(events, 0, h * sizeof(int)); | ||||
for( ; ; ) | |||||
for(quit = 0; !quit; ) | |||||
{ | { | ||||
unsigned int event = caca_wait_event(CACA_EVENT_ANY); | unsigned int event = caca_wait_event(CACA_EVENT_ANY); | ||||
if(!event) | if(!event) | ||||
continue; | continue; | ||||
memmove(events + 1, events, (h - 1) * sizeof(int)); | |||||
events[0] = event; | |||||
do | |||||
{ | |||||
/* q quits */ | |||||
if(event == (CACA_EVENT_KEY_PRESS | 'q')) | |||||
quit = 1; | |||||
memmove(events + 1, events, (h - 1) * sizeof(int)); | |||||
events[0] = event; | |||||
event = caca_get_event(CACA_EVENT_ANY); | |||||
} | |||||
while(event); | |||||
caca_clear(); | caca_clear(); | ||||
/* Print current event */ | /* Print current event */ | ||||
caca_set_color(CACA_COLOR_WHITE, CACA_COLOR_BLUE); | caca_set_color(CACA_COLOR_WHITE, CACA_COLOR_BLUE); | ||||
caca_draw_line(0, 0, caca_get_width() - 1, 0, ' '); | caca_draw_line(0, 0, caca_get_width() - 1, 0, ' '); | ||||
print_event(0, 0, event); | |||||
print_event(0, 0, events[0]); | |||||
/* Print previous events */ | /* Print previous events */ | ||||
caca_set_color(CACA_COLOR_WHITE, CACA_COLOR_BLACK); | caca_set_color(CACA_COLOR_WHITE, CACA_COLOR_BLACK); | ||||
for(i = 1; i < h && events[i]; i++) | for(i = 1; i < h && events[i]; i++) | ||||
print_event(0, i, events[i]); | print_event(0, i, events[i]); | ||||
/* q quits */ | |||||
if(event == (CACA_EVENT_KEY_PRESS | 'q')) | |||||
break; | |||||
caca_refresh(); | caca_refresh(); | ||||
} | } | ||||
@@ -85,18 +91,22 @@ int main(int argc, char **argv) | |||||
static void print_event(int x, int y, unsigned int event) | static void print_event(int x, int y, unsigned int event) | ||||
{ | { | ||||
int character; | |||||
switch(event & 0xff000000) | switch(event & 0xff000000) | ||||
{ | { | ||||
case CACA_EVENT_NONE: | case CACA_EVENT_NONE: | ||||
caca_printf(x, y, "CACA_EVENT_NONE"); | caca_printf(x, y, "CACA_EVENT_NONE"); | ||||
break; | break; | ||||
case CACA_EVENT_KEY_PRESS: | case CACA_EVENT_KEY_PRESS: | ||||
caca_printf(x, y, "CACA_EVENT_KEY_PRESS 0x%02x", | |||||
event & 0x00ffffff); | |||||
character = event & 0x00ffffff; | |||||
caca_printf(x, y, "CACA_EVENT_KEY_PRESS 0x%02x (%c)", character, | |||||
(character > 0x20 && character < 0x80) ? character : '?'); | |||||
break; | break; | ||||
case CACA_EVENT_KEY_RELEASE: | case CACA_EVENT_KEY_RELEASE: | ||||
caca_printf(x, y, "CACA_EVENT_KEY_RELEASE 0x2%x", | |||||
event & 0x00ffffff); | |||||
character = event & 0x00ffffff; | |||||
caca_printf(x, y, "CACA_EVENT_KEY_RELEASE 0x%02x (%c)", character, | |||||
(character > 0x20 && character < 0x80) ? character : '?'); | |||||
break; | break; | ||||
case CACA_EVENT_MOUSE_MOTION: | case CACA_EVENT_MOUSE_MOTION: | ||||
caca_printf(x, y, "CACA_EVENT_MOUSE_MOTION %u %u", | caca_printf(x, y, "CACA_EVENT_MOUSE_MOTION %u %u", | ||||