functions to access its real data. This is a big API change that will break your software, sorry :(tags/v0.99.beta14
@@ -53,64 +53,28 @@ typedef struct caca_event caca_event_t; | |||||
* The \e type field is always valid. */ | * The \e type field is always valid. */ | ||||
struct caca_event | struct caca_event | ||||
{ | { | ||||
/** \brief User event type enumeration. | unsigned char opaque_structure[32]; | ||||
* | }; | ||||
* This enum serves two purposes: | /** \brief User event type enumeration. | ||||
* - Build listening masks for caca_get_event(). | * | ||||
* - Define the type of a \e caca_event_t. | * This enum serves two purposes: | ||||
*/ | * - Build listening masks for caca_get_event(). | ||||
enum caca_event_type | * - Define the type of a \e caca_event_t. | ||||
{ | */ | ||||
CACA_EVENT_NONE = 0x0000, /**< No event. */ | enum caca_event_type | ||||
{ | |||||
CACA_EVENT_KEY_PRESS = 0x0001, /**< A key was pressed. */ | CACA_EVENT_NONE = 0x0000, /**< No event. */ | ||||
CACA_EVENT_KEY_RELEASE = 0x0002, /**< A key was released. */ | CACA_EVENT_KEY_PRESS = 0x0001, /**< A key was pressed. */ | ||||
CACA_EVENT_MOUSE_PRESS = 0x0004, /**< A mouse button was pressed. */ | CACA_EVENT_KEY_RELEASE = 0x0002, /**< A key was released. */ | ||||
CACA_EVENT_MOUSE_RELEASE = 0x0008, /**< A mouse button was released. */ | CACA_EVENT_MOUSE_PRESS = 0x0004, /**< A mouse button was pressed. */ | ||||
CACA_EVENT_MOUSE_MOTION = 0x0010, /**< The mouse was moved. */ | CACA_EVENT_MOUSE_RELEASE = 0x0008, /**< A mouse button was released. */ | ||||
CACA_EVENT_RESIZE = 0x0020, /**< The window was resized. */ | CACA_EVENT_MOUSE_MOTION = 0x0010, /**< The mouse was moved. */ | ||||
CACA_EVENT_QUIT = 0x0040, /**< The user requested to quit. */ | CACA_EVENT_RESIZE = 0x0020, /**< The window was resized. */ | ||||
CACA_EVENT_QUIT = 0x0040, /**< The user requested to quit. */ | |||||
CACA_EVENT_ANY = 0xffff /**< Bitmask for any event. */ | CACA_EVENT_ANY = 0xffff /**< Bitmask for any event. */ | ||||
} | |||||
/** \brief User event type member. | |||||
* | |||||
* This field is always valid when caca_get_event() returns. | |||||
*/ | |||||
type; | |||||
/** \brief User event data member. | |||||
* | |||||
* The validity of the \e data union depends on the value of the \e type | |||||
* field: | |||||
* - \c CACA_EVENT_NONE: no other field is valid. | |||||
* - \c CACA_EVENT_KEY_PRESS, \c CACA_EVENT_KEY_RELEASE: the | |||||
* \e data.key.ch field is valid and contains either the ASCII value for | |||||
* the key, or an \e enum \e caca_key value. If the value is a printable | |||||
* ASCII character, the \e data.key.utf32 and \e data.key.utf8 fields are | |||||
* also filled and contain respectively the UTF-32/UCS-4 and the UTF-8 | |||||
* representations of the character. Otherwise, their content is | |||||
* undefined. | |||||
* - \c CACA_EVENT_MOUSE_PRESS, \c CACA_EVENT_MOUSE_RELEASE: the | |||||
* \e data.mouse.button field is valid and contains the index of the | |||||
* mouse button that was pressed. | |||||
* - \c CACA_EVENT_MOUSE_MOTION: the \e data.mouse.x and \e data.mouse.y | |||||
* fields are valid and contain the mouse coordinates in character | |||||
* cells. | |||||
* - \c CACA_EVENT_RESIZE: the \e data.resize.w and \e data.resize.h | |||||
* fields are valid and contain the new width and height values of | |||||
* the \e libcucul canvas attached to \e libcaca. | |||||
* - \c CACA_EVENT_QUIT: no other field is valid. | |||||
* | |||||
* The result of accessing data members outside the above conditions is | |||||
* undefined. | |||||
*/ | |||||
union | |||||
{ | |||||
struct { unsigned int x, y, button; } mouse; | |||||
struct { unsigned int w, h; } resize; | |||||
struct { unsigned int ch; unsigned long int utf32; char utf8[8]; } key; | |||||
} data; | |||||
}; | }; | ||||
/** \brief Special key values. | /** \brief Special key values. | ||||
@@ -196,6 +160,8 @@ __extern unsigned int caca_get_display_time(caca_display_t const *); | |||||
__extern unsigned int caca_get_display_width(caca_display_t const *); | __extern unsigned int caca_get_display_width(caca_display_t const *); | ||||
__extern unsigned int caca_get_display_height(caca_display_t const *); | __extern unsigned int caca_get_display_height(caca_display_t const *); | ||||
__extern int caca_set_display_title(caca_display_t *, char const *); | __extern int caca_set_display_title(caca_display_t *, char const *); | ||||
__extern int caca_set_mouse(caca_display_t *, int); | |||||
__extern int caca_set_cursor(caca_display_t *, int); | |||||
/* @} */ | /* @} */ | ||||
/** \defgroup caca_event libcaca event handling | /** \defgroup caca_event libcaca event handling | ||||
@@ -208,8 +174,15 @@ __extern int caca_get_event(caca_display_t *, unsigned int, | |||||
caca_event_t *, int); | caca_event_t *, int); | ||||
__extern unsigned int caca_get_mouse_x(caca_display_t const *); | __extern unsigned int caca_get_mouse_x(caca_display_t const *); | ||||
__extern unsigned int caca_get_mouse_y(caca_display_t const *); | __extern unsigned int caca_get_mouse_y(caca_display_t const *); | ||||
__extern int caca_set_mouse(caca_display_t *, int); | __extern enum caca_event_type caca_get_event_type(caca_event_t const *); | ||||
__extern int caca_set_cursor(caca_display_t *, int); | __extern unsigned int caca_get_event_key_ch(caca_event_t const *); | ||||
__extern unsigned long int caca_get_event_key_utf32(caca_event_t const *); | |||||
__extern int caca_get_event_key_utf8(caca_event_t const *, char *); | |||||
__extern unsigned int caca_get_event_mouse_button(caca_event_t const *); | |||||
__extern unsigned int caca_get_event_mouse_x(caca_event_t const *); | |||||
__extern unsigned int caca_get_event_mouse_y(caca_event_t const *); | |||||
__extern unsigned int caca_get_event_resize_width(caca_event_t const *); | |||||
__extern unsigned int caca_get_event_resize_height(caca_event_t const *); | |||||
/* @} */ | /* @} */ | ||||
#ifdef __cplusplus | #ifdef __cplusplus | ||||
@@ -84,19 +84,19 @@ unsigned int __caca0_get_event(unsigned int m, int t) | |||||
if(!ret) | if(!ret) | ||||
return 0x00000000; | return 0x00000000; | ||||
switch(ev.type) | switch(caca_get_event_type(&ev)) | ||||
{ | { | ||||
case CACA_EVENT_KEY_PRESS: | case CACA_EVENT_KEY_PRESS: | ||||
return 0x01000000 | ev.data.key.ch; | return 0x01000000 | caca_get_event_key_ch(&ev); | ||||
case CACA_EVENT_KEY_RELEASE: | case CACA_EVENT_KEY_RELEASE: | ||||
return 0x02000000 | ev.data.key.ch; | return 0x02000000 | caca_get_event_key_ch(&ev); | ||||
case CACA_EVENT_MOUSE_PRESS: | case CACA_EVENT_MOUSE_PRESS: | ||||
return 0x04000000 | ev.data.mouse.button; | return 0x04000000 | caca_get_event_mouse_button(&ev); | ||||
case CACA_EVENT_MOUSE_RELEASE: | case CACA_EVENT_MOUSE_RELEASE: | ||||
return 0x08000000 | ev.data.mouse.button; | return 0x08000000 | caca_get_event_mouse_button(&ev); | ||||
case CACA_EVENT_MOUSE_MOTION: | case CACA_EVENT_MOUSE_MOTION: | ||||
return 0x10000000 | ((ev.data.mouse.x & 0xfff) << 12) | return 0x10000000 | ((caca_get_event_mouse_x(&ev) & 0xfff) << 12) | ||||
| (ev.data.mouse.y & 0xfff); | | (caca_get_event_mouse_y(&ev) & 0xfff); | ||||
case CACA_EVENT_RESIZE: | case CACA_EVENT_RESIZE: | ||||
return 0x20000000; | return 0x20000000; | ||||
default: | default: | ||||
@@ -20,6 +20,7 @@ | |||||
#endif | #endif | ||||
typedef struct caca_timer caca_timer_t; | typedef struct caca_timer caca_timer_t; | ||||
typedef struct caca_privevent caca_privevent_t; | |||||
#if !defined(_DOXYGEN_SKIP_ME) | #if !defined(_DOXYGEN_SKIP_ME) | ||||
# define EVENTBUF_LEN 10 | # define EVENTBUF_LEN 10 | ||||
@@ -89,6 +90,19 @@ struct caca_timer | |||||
int last_sec, last_usec; | int last_sec, last_usec; | ||||
}; | }; | ||||
/* Private event structure */ | |||||
struct caca_privevent | |||||
{ | |||||
enum caca_event_type type; | |||||
union | |||||
{ | |||||
struct { unsigned int x, y, button; } mouse; | |||||
struct { unsigned int w, h; } resize; | |||||
struct { unsigned int ch; unsigned long int utf32; char utf8[8]; } key; | |||||
} data; | |||||
}; | |||||
/* Internal caca display context */ | /* Internal caca display context */ | ||||
struct caca_display | struct caca_display | ||||
{ | { | ||||
@@ -112,7 +126,7 @@ struct caca_display | |||||
unsigned int (* get_display_height) (caca_display_t const *); | unsigned int (* get_display_height) (caca_display_t const *); | ||||
void (* display) (caca_display_t *); | void (* display) (caca_display_t *); | ||||
void (* handle_resize) (caca_display_t *); | void (* handle_resize) (caca_display_t *); | ||||
int (* get_event) (caca_display_t *, caca_event_t *); | int (* get_event) (caca_display_t *, caca_privevent_t *); | ||||
void (* set_mouse) (caca_display_t *, int); | void (* set_mouse) (caca_display_t *, int); | ||||
void (* set_cursor) (caca_display_t *, int); | void (* set_cursor) (caca_display_t *, int); | ||||
} drv; | } drv; | ||||
@@ -138,14 +152,14 @@ struct caca_display | |||||
struct events | struct events | ||||
{ | { | ||||
#if defined(USE_SLANG) || defined(USE_NCURSES) || defined(USE_CONIO) || defined(USE_GL) | #if defined(USE_SLANG) || defined(USE_NCURSES) || defined(USE_CONIO) || defined(USE_GL) | ||||
caca_event_t buf[EVENTBUF_LEN]; | caca_privevent_t buf[EVENTBUF_LEN]; | ||||
int queue; | int queue; | ||||
#endif | #endif | ||||
#if defined(USE_SLANG) || defined(USE_NCURSES) | #if defined(USE_SLANG) || defined(USE_NCURSES) | ||||
caca_timer_t key_timer; | caca_timer_t key_timer; | ||||
unsigned int last_key_ticks; | unsigned int last_key_ticks; | ||||
unsigned int autorepeat_ticks; | unsigned int autorepeat_ticks; | ||||
caca_event_t last_key_event; | caca_privevent_t last_key_event; | ||||
#endif | #endif | ||||
#if defined(USE_WIN32) | #if defined(USE_WIN32) | ||||
unsigned char not_empty_struct; | unsigned char not_empty_struct; | ||||
@@ -160,8 +174,8 @@ extern unsigned int _caca_getticks(caca_timer_t *); | |||||
/* Internal event functions */ | /* Internal event functions */ | ||||
extern void _caca_handle_resize(caca_display_t *); | extern void _caca_handle_resize(caca_display_t *); | ||||
#if defined(USE_SLANG) || defined(USE_NCURSES) || defined(USE_CONIO) || defined(USE_GL) | #if defined(USE_SLANG) || defined(USE_NCURSES) || defined(USE_CONIO) || defined(USE_GL) | ||||
extern void _push_event(caca_display_t *, caca_event_t *); | extern void _push_event(caca_display_t *, caca_privevent_t *); | ||||
extern int _pop_event(caca_display_t *, caca_event_t *); | extern int _pop_event(caca_display_t *, caca_privevent_t *); | ||||
#endif | #endif | ||||
/* Internal window functions */ | /* Internal window functions */ | ||||
@@ -130,10 +130,10 @@ static void conio_handle_resize(caca_display_t *dp) | |||||
dp->resize.h = dp->cv->height; | dp->resize.h = dp->cv->height; | ||||
} | } | ||||
static int conio_get_event(caca_display_t *dp, caca_event_t *ev) | static int conio_get_event(caca_display_t *dp, caca_privevent_t *ev) | ||||
{ | { | ||||
unsigned char ch; | unsigned char ch; | ||||
caca_event_t release; | caca_privevent_t release; | ||||
if(!_conio_kbhit()) | if(!_conio_kbhit()) | ||||
{ | { | ||||
@@ -322,7 +322,7 @@ static void gl_handle_resize(caca_display_t *dp) | |||||
glMatrixMode(GL_MODELVIEW); | glMatrixMode(GL_MODELVIEW); | ||||
} | } | ||||
static int gl_get_event(caca_display_t *dp, caca_event_t *ev) | static int gl_get_event(caca_display_t *dp, caca_privevent_t *ev) | ||||
{ | { | ||||
#ifdef HAVE_GLUTCHECKLOOP | #ifdef HAVE_GLUTCHECKLOOP | ||||
glutCheckLoop(); | glutCheckLoop(); | ||||
@@ -384,7 +384,7 @@ static void ncurses_handle_resize(caca_display_t *dp) | |||||
dp->resize.h = dp->cv->height; | dp->resize.h = dp->cv->height; | ||||
} | } | ||||
static int ncurses_get_event(caca_display_t *dp, caca_event_t *ev) | static int ncurses_get_event(caca_display_t *dp, caca_privevent_t *ev) | ||||
{ | { | ||||
int intkey; | int intkey; | ||||
@@ -83,7 +83,7 @@ static void raw_handle_resize(caca_display_t *dp) | |||||
; | ; | ||||
} | } | ||||
static int raw_get_event(caca_display_t *dp, caca_event_t *ev) | static int raw_get_event(caca_display_t *dp, caca_privevent_t *ev) | ||||
{ | { | ||||
ev->type = CACA_EVENT_NONE; | ev->type = CACA_EVENT_NONE; | ||||
return 0; | return 0; | ||||
@@ -272,7 +272,7 @@ static void slang_handle_resize(caca_display_t *dp) | |||||
SLsmg_reinit_smg(); | SLsmg_reinit_smg(); | ||||
} | } | ||||
static int slang_get_event(caca_display_t *dp, caca_event_t *ev) | static int slang_get_event(caca_display_t *dp, caca_privevent_t *ev) | ||||
{ | { | ||||
int intkey; | int intkey; | ||||
@@ -143,7 +143,7 @@ static void vga_handle_resize(caca_display_t *dp) | |||||
dp->resize.h = dp->cv->height; | dp->resize.h = dp->cv->height; | ||||
} | } | ||||
static int vga_get_event(caca_display_t *dp, caca_event_t *ev) | static int vga_get_event(caca_display_t *dp, caca_privevent_t *ev) | ||||
{ | { | ||||
/* FIXME */ | /* FIXME */ | ||||
ev->type = CACA_EVENT_NONE; | ev->type = CACA_EVENT_NONE; | ||||
@@ -244,7 +244,7 @@ static void win32_handle_resize(caca_display_t *dp) | |||||
dp->resize.h = dp->cv->height; | dp->resize.h = dp->cv->height; | ||||
} | } | ||||
static int win32_get_event(caca_display_t *dp, caca_event_t *ev) | static int win32_get_event(caca_display_t *dp, caca_privevent_t *ev) | ||||
{ | { | ||||
INPUT_RECORD rec; | INPUT_RECORD rec; | ||||
DWORD num; | DWORD num; | ||||
@@ -369,7 +369,7 @@ static void x11_handle_resize(caca_display_t *dp) | |||||
dp->drv.p->pixmap = new_pixmap; | dp->drv.p->pixmap = new_pixmap; | ||||
} | } | ||||
static int x11_get_event(caca_display_t *dp, caca_event_t *ev) | static int x11_get_event(caca_display_t *dp, caca_privevent_t *ev) | ||||
{ | { | ||||
XEvent xevent; | XEvent xevent; | ||||
char key; | char key; | ||||
@@ -21,6 +21,7 @@ | |||||
#if !defined(__KERNEL__) | #if !defined(__KERNEL__) | ||||
# include <stdio.h> | # include <stdio.h> | ||||
# include <string.h> | |||||
#endif | #endif | ||||
#include "cucul.h" | #include "cucul.h" | ||||
@@ -28,8 +29,8 @@ | |||||
#include "caca.h" | #include "caca.h" | ||||
#include "caca_internals.h" | #include "caca_internals.h" | ||||
static int _get_next_event(caca_display_t *, caca_event_t *); | static int _get_next_event(caca_display_t *, caca_privevent_t *); | ||||
static int _lowlevel_event(caca_display_t *, caca_event_t *); | static int _lowlevel_event(caca_display_t *, caca_privevent_t *); | ||||
#if !defined(_DOXYGEN_SKIP_ME) | #if !defined(_DOXYGEN_SKIP_ME) | ||||
/* If no new key was pressed after AUTOREPEAT_THRESHOLD usec, assume the | /* If no new key was pressed after AUTOREPEAT_THRESHOLD usec, assume the | ||||
@@ -67,7 +68,7 @@ static int _lowlevel_event(caca_display_t *, caca_event_t *); | |||||
int caca_get_event(caca_display_t *dp, unsigned int event_mask, | int caca_get_event(caca_display_t *dp, unsigned int event_mask, | ||||
caca_event_t *ev, int timeout) | caca_event_t *ev, int timeout) | ||||
{ | { | ||||
caca_event_t dummy_event; | caca_privevent_t privevent; | ||||
caca_timer_t timer; | caca_timer_t timer; | ||||
int usec = 0; | int usec = 0; | ||||
@@ -77,16 +78,17 @@ int caca_get_event(caca_display_t *dp, unsigned int event_mask, | |||||
if(timeout > 0) | if(timeout > 0) | ||||
_caca_getticks(&timer); | _caca_getticks(&timer); | ||||
if(ev == NULL) | |||||
ev = &dummy_event; | |||||
for( ; ; ) | for( ; ; ) | ||||
{ | { | ||||
int ret = _get_next_event(dp, ev); | int ret = _get_next_event(dp, &privevent); | ||||
/* If we got the event we wanted, return */ | /* If we got the event we wanted, return */ | ||||
if(ev->type & event_mask) | if(privevent.type & event_mask) | ||||
{ | |||||
if(ev) | |||||
memcpy(ev, &privevent, sizeof(privevent)); | |||||
return ret; | return ret; | ||||
} | |||||
/* If there is no timeout, sleep and try again. */ | /* If there is no timeout, sleep and try again. */ | ||||
if(timeout < 0) | if(timeout < 0) | ||||
@@ -98,7 +100,9 @@ int caca_get_event(caca_display_t *dp, unsigned int event_mask, | |||||
/* If we timeouted, return an empty event */ | /* If we timeouted, return an empty event */ | ||||
if(usec >= timeout) | if(usec >= timeout) | ||||
{ | { | ||||
ev->type = CACA_EVENT_NONE; | privevent.type = CACA_EVENT_NONE; | ||||
if(ev) | |||||
memcpy(ev, &privevent, sizeof(privevent)); | |||||
return 0; | return 0; | ||||
} | } | ||||
@@ -153,11 +157,170 @@ unsigned int caca_get_mouse_y(caca_display_t const *dp) | |||||
return dp->mouse.y; | return dp->mouse.y; | ||||
} | } | ||||
/** \brief Return an event's type. | |||||
* | |||||
* Return the type of an event. This function may always be called on an | |||||
* event after caca_get_event() was called, and its return value indicates | |||||
* which other functions may be called: | |||||
* - \c CACA_EVENT_NONE: no other function may be called. | |||||
* - \c CACA_EVENT_KEY_PRESS, \c CACA_EVENT_KEY_RELEASE: | |||||
* caca_get_event_key_ch(), caca_get_event_key_utf32() and | |||||
* caca_get_event_key_utf8() may be called. | |||||
* - \c CACA_EVENT_MOUSE_PRESS, \c CACA_EVENT_MOUSE_RELEASE: | |||||
* caca_get_event_mouse_button() may be called. | |||||
* - \c CACA_EVENT_MOUSE_MOTION: caca_get_event_mouse_x() and | |||||
* caca_get_event_mouse_y() may be called. | |||||
* - \c CACA_EVENT_RESIZE: caca_get_event_resize_width() and | |||||
* caca_get_event_resize_height() may be called. | |||||
* - \c CACA_EVENT_QUIT: no other function may be called. | |||||
* | |||||
* This function never fails. | |||||
* | |||||
* \param ev The libcaca event. | |||||
* \return The event's type. | |||||
*/ | |||||
enum caca_event_type caca_get_event_type(caca_event_t const *ev) | |||||
{ | |||||
return ((caca_privevent_t const *)ev)->type; | |||||
} | |||||
/** \brief Return a key press or key release event's value | |||||
* | |||||
* Return either the ASCII value for an event's key, or if the key is not | |||||
* an ASCII character, an appropriate \e enum \e caca_key value. | |||||
* | |||||
* This function never fails, but must only be called with a valid event of | |||||
* type \c CACA_EVENT_KEY_PRESS or \c CACA_EVENT_KEY_RELEASE, or the results | |||||
* will be undefined. See caca_get_event_type() for more information. | |||||
* | |||||
* \param ev The libcaca event. | |||||
* \return The key value. | |||||
*/ | |||||
unsigned int caca_get_event_key_ch(caca_event_t const *ev) | |||||
{ | |||||
return ((caca_privevent_t const *)ev)->data.key.ch; | |||||
} | |||||
/** \brief Return a key press or key release event's Unicode value | |||||
* | |||||
* Return the UTF-32/UCS-4 value for an event's key if it resolves to a | |||||
* printable character. | |||||
* | |||||
* This function never fails, but must only be called with a valid event of | |||||
* type \c CACA_EVENT_KEY_PRESS or \c CACA_EVENT_KEY_RELEASE, or the results | |||||
* will be undefined. See caca_get_event_type() for more information. | |||||
* | |||||
* \param ev The libcaca event. | |||||
* \return The key's Unicode value. | |||||
*/ | |||||
unsigned long int caca_get_event_key_utf32(caca_event_t const *ev) | |||||
{ | |||||
return ((caca_privevent_t const *)ev)->data.key.utf32; | |||||
} | |||||
/** \brief Return a key press or key release event's UTF-8 value | |||||
* | |||||
* Write the UTF-8 value for an event's key if it resolves to a printable | |||||
* character. Up to 6 UTF-8 bytes and a null termination are written. | |||||
* | |||||
* This function never fails, but must only be called with a valid event of | |||||
* type \c CACA_EVENT_KEY_PRESS or \c CACA_EVENT_KEY_RELEASE, or the results | |||||
* will be undefined. See caca_get_event_type() for more information. | |||||
* | |||||
* \param ev The libcaca event. | |||||
* \return This function always returns 0. | |||||
*/ | |||||
int caca_get_event_key_utf8(caca_event_t const *ev, char *utf8) | |||||
{ | |||||
memcpy(utf8, ((caca_privevent_t const *)ev)->data.key.utf8, 8); | |||||
return 0; | |||||
} | |||||
/** \brief Return a mouse press or mouse release event's button | |||||
* | |||||
* Return the mouse button index for an event. | |||||
* | |||||
* This function never fails, but must only be called with a valid event of | |||||
* type \c CACA_EVENT_MOUSE_PRESS or \c CACA_EVENT_MOUSE_RELEASE, or the | |||||
* results will be undefined. See caca_get_event_type() for more information. | |||||
* | |||||
* \param ev The libcaca event. | |||||
* \return The event's mouse button. | |||||
*/ | |||||
unsigned int caca_get_event_mouse_button(caca_event_t const *ev) | |||||
{ | |||||
return ((caca_privevent_t const *)ev)->data.mouse.button; | |||||
} | |||||
/** \brief Return a mouse motion event's X coordinate. | |||||
* | |||||
* Return the X coordinate for a mouse motion event. | |||||
* | |||||
* This function never fails, but must only be called with a valid event of | |||||
* type \c CACA_EVENT_MOUSE_MOTION, or the results will be undefined. See | |||||
* caca_get_event_type() for more information. | |||||
* | |||||
* \param ev The libcaca event. | |||||
* \return The event's X mouse coordinate. | |||||
*/ | |||||
unsigned int caca_get_event_mouse_x(caca_event_t const *ev) | |||||
{ | |||||
return ((caca_privevent_t const *)ev)->data.mouse.x; | |||||
} | |||||
/** \brief Return a mouse motion event's Y coordinate. | |||||
* | |||||
* Return the Y coordinate for a mouse motion event. | |||||
* | |||||
* This function never fails, but must only be called with a valid event of | |||||
* type \c CACA_EVENT_MOUSE_MOTION, or the results will be undefined. See | |||||
* caca_get_event_type() for more information. | |||||
* | |||||
* \param ev The libcaca event. | |||||
* \return The event's Y mouse coordinate. | |||||
*/ | |||||
unsigned int caca_get_event_mouse_y(caca_event_t const *ev) | |||||
{ | |||||
return ((caca_privevent_t const *)ev)->data.mouse.y; | |||||
} | |||||
/** \brief Return a resize event's display width value. | |||||
* | |||||
* Return the width value for a display resize event. | |||||
* | |||||
* This function never fails, but must only be called with a valid event of | |||||
* type \c CACA_EVENT_RESIZE, or the results will be undefined. See | |||||
* caca_get_event_type() for more information. | |||||
* | |||||
* \param ev The libcaca event. | |||||
* \return The event's new display width value. | |||||
*/ | |||||
unsigned int caca_get_event_resize_width(caca_event_t const *ev) | |||||
{ | |||||
return ((caca_privevent_t const *)ev)->data.resize.w; | |||||
} | |||||
/** \brief Return a resize event's display height value. | |||||
* | |||||
* Return the height value for a display resize event. | |||||
* | |||||
* This function never fails, but must only be called with a valid event of | |||||
* type \c CACA_EVENT_RESIZE, or the results will be undefined. See | |||||
* caca_get_event_type() for more information. | |||||
* | |||||
* \param ev The libcaca event. | |||||
* \return The event's new display height value. | |||||
*/ | |||||
unsigned int caca_get_event_resize_height(caca_event_t const *ev) | |||||
{ | |||||
return ((caca_privevent_t const *)ev)->data.resize.h; | |||||
} | |||||
/* | /* | ||||
* XXX: The following functions are local. | * XXX: The following functions are local. | ||||
*/ | */ | ||||
static int _get_next_event(caca_display_t *dp, caca_event_t *ev) | static int _get_next_event(caca_display_t *dp, caca_privevent_t *ev) | ||||
{ | { | ||||
#if defined(USE_SLANG) || defined(USE_NCURSES) | #if defined(USE_SLANG) || defined(USE_NCURSES) | ||||
unsigned int ticks; | unsigned int ticks; | ||||
@@ -239,7 +402,7 @@ static int _get_next_event(caca_display_t *dp, caca_event_t *ev) | |||||
#endif | #endif | ||||
} | } | ||||
static int _lowlevel_event(caca_display_t *dp, caca_event_t *ev) | static int _lowlevel_event(caca_display_t *dp, caca_privevent_t *ev) | ||||
{ | { | ||||
#if defined(USE_SLANG) || defined(USE_NCURSES) || defined(USE_CONIO) | #if defined(USE_SLANG) || defined(USE_NCURSES) || defined(USE_CONIO) | ||||
int ret = _pop_event(dp, ev); | int ret = _pop_event(dp, ev); | ||||
@@ -252,7 +415,7 @@ static int _lowlevel_event(caca_display_t *dp, caca_event_t *ev) | |||||
} | } | ||||
#if defined(USE_SLANG) || defined(USE_NCURSES) || defined(USE_CONIO) || defined(USE_GL) | #if defined(USE_SLANG) || defined(USE_NCURSES) || defined(USE_CONIO) || defined(USE_GL) | ||||
void _push_event(caca_display_t *dp, caca_event_t *ev) | void _push_event(caca_display_t *dp, caca_privevent_t *ev) | ||||
{ | { | ||||
if(!ev->type || dp->events.queue == EVENTBUF_LEN) | if(!ev->type || dp->events.queue == EVENTBUF_LEN) | ||||
return; | return; | ||||
@@ -260,7 +423,7 @@ void _push_event(caca_display_t *dp, caca_event_t *ev) | |||||
dp->events.queue++; | dp->events.queue++; | ||||
} | } | ||||
int _pop_event(caca_display_t *dp, caca_event_t *ev) | int _pop_event(caca_display_t *dp, caca_privevent_t *ev) | ||||
{ | { | ||||
int i; | int i; | ||||
@@ -272,7 +272,7 @@ game (void) | |||||
caca_event_t ev; | caca_event_t ev; | ||||
if(caca_get_event(dp, CACA_EVENT_KEY_PRESS, &ev, 0)) | if(caca_get_event(dp, CACA_EVENT_KEY_PRESS, &ev, 0)) | ||||
{ | { | ||||
switch(ev.data.key.ch) | switch(caca_get_event_key_ch(&ev)) | ||||
{ | { | ||||
case CACA_KEY_CTRL_C: | case CACA_KEY_CTRL_C: | ||||
case CACA_KEY_CTRL_Z: | case CACA_KEY_CTRL_Z: | ||||
@@ -108,10 +108,10 @@ int main(int argc, char **argv) | |||||
while(caca_get_event(dp, CACA_EVENT_KEY_PRESS | while(caca_get_event(dp, CACA_EVENT_KEY_PRESS | ||||
| CACA_EVENT_QUIT, &ev, 0)) | | CACA_EVENT_QUIT, &ev, 0)) | ||||
{ | { | ||||
if(ev.type == CACA_EVENT_QUIT) | if(caca_get_event_type(&ev) == CACA_EVENT_QUIT) | ||||
goto end; | goto end; | ||||
switch(ev.data.key.ch) | switch(caca_get_event_key_ch(&ev)) | ||||
{ | { | ||||
case CACA_KEY_ESCAPE: | case CACA_KEY_ESCAPE: | ||||
case CACA_KEY_CTRL_C: | case CACA_KEY_CTRL_C: | ||||
@@ -80,12 +80,12 @@ int main(int argc, char **argv) | |||||
while(caca_get_event(dp, CACA_EVENT_ANY, &ev, -1)) | while(caca_get_event(dp, CACA_EVENT_ANY, &ev, -1)) | ||||
{ | { | ||||
switch(ev.type) | switch(caca_get_event_type(&ev)) | ||||
{ | { | ||||
case CACA_EVENT_QUIT: | case CACA_EVENT_QUIT: | ||||
goto quit; | goto quit; | ||||
case CACA_EVENT_KEY_PRESS: | case CACA_EVENT_KEY_PRESS: | ||||
switch(ev.data.key.ch) | switch(caca_get_event_key_ch(&ev)) | ||||
{ | { | ||||
case CACA_KEY_LEFT: dx -= 2; break; | case CACA_KEY_LEFT: dx -= 2; break; | ||||
case CACA_KEY_RIGHT: dx += 2; break; | case CACA_KEY_RIGHT: dx += 2; break; | ||||
@@ -71,7 +71,7 @@ int main(int argc, char **argv) | |||||
int ret = caca_get_event(dp, CACA_EVENT_ANY, &ev, 0); | int ret = caca_get_event(dp, CACA_EVENT_ANY, &ev, 0); | ||||
int eof = 0; | int eof = 0; | ||||
if(ret && ev.type & CACA_EVENT_KEY_PRESS) | if(ret && caca_get_event_type(&ev) & CACA_EVENT_KEY_PRESS) | ||||
break; | break; | ||||
if(bytes == 0) | if(bytes == 0) | ||||
@@ -145,20 +145,21 @@ int main(int argc, char **argv) | |||||
while(event) | while(event) | ||||
{ | { | ||||
if(ev.type & CACA_EVENT_MOUSE_PRESS) | if(caca_get_event_type(&ev) & CACA_EVENT_MOUSE_PRESS) | ||||
{ | { | ||||
if(ev.data.mouse.button == 1) | if(caca_get_event_mouse_button(&ev) == 1) | ||||
{ | { | ||||
if(items) current = (current + 1) % items; | if(items) current = (current + 1) % items; | ||||
reload = 1; | reload = 1; | ||||
} | } | ||||
else if(ev.data.mouse.button == 2) | if(caca_get_event_mouse_button(&ev) == 2) | ||||
{ | { | ||||
if(items) current = (items + current - 1) % items; | if(items) current = (items + current - 1) % items; | ||||
reload = 1; | reload = 1; | ||||
} | } | ||||
} | } | ||||
else if(ev.type & CACA_EVENT_KEY_PRESS) switch(ev.data.key.ch) | else if(caca_get_event_type(&ev) & CACA_EVENT_KEY_PRESS) | ||||
switch(caca_get_event_key_ch(&ev)) | |||||
{ | { | ||||
case 'n': | case 'n': | ||||
case 'N': | case 'N': | ||||
@@ -286,15 +287,15 @@ int main(int argc, char **argv) | |||||
quit = 1; | quit = 1; | ||||
break; | break; | ||||
} | } | ||||
else if(ev.type == CACA_EVENT_RESIZE) | else if(caca_get_event_type(&ev) == CACA_EVENT_RESIZE) | ||||
{ | { | ||||
caca_refresh_display(dp); | caca_refresh_display(dp); | ||||
ww = ev.data.resize.w; | ww = caca_get_event_resize_width(&ev); | ||||
wh = ev.data.resize.h; | wh = caca_get_event_resize_height(&ev); | ||||
update = 1; | update = 1; | ||||
set_zoom(zoom); | set_zoom(zoom); | ||||
} | } | ||||
else if(ev.type & CACA_EVENT_QUIT) | else if(caca_get_event_type(&ev) & CACA_EVENT_QUIT) | ||||
quit = 1; | quit = 1; | ||||
if(status || new_status) | if(status || new_status) | ||||
@@ -88,14 +88,14 @@ int main(int argc, char **argv) | |||||
while(caca_get_event(dp, CACA_EVENT_ANY, &ev, 0)) | while(caca_get_event(dp, CACA_EVENT_ANY, &ev, 0)) | ||||
{ | { | ||||
if(demo && (ev.type & CACA_EVENT_KEY_PRESS)) | if(demo && (caca_get_event_type(&ev) & CACA_EVENT_KEY_PRESS)) | ||||
{ | { | ||||
menu = 1; | menu = 1; | ||||
demo = NULL; | demo = NULL; | ||||
} | } | ||||
else if(ev.type & CACA_EVENT_KEY_PRESS) | else if(caca_get_event_type(&ev) & CACA_EVENT_KEY_PRESS) | ||||
{ | { | ||||
switch(ev.data.key.ch) | switch(caca_get_event_key_ch(&ev)) | ||||
{ | { | ||||
case 'q': | case 'q': | ||||
case 'Q': | case 'Q': | ||||
@@ -159,13 +159,13 @@ int main(int argc, char **argv) | |||||
cucul_clear_canvas(cv); | cucul_clear_canvas(cv); | ||||
} | } | ||||
} | } | ||||
else if(ev.type & CACA_EVENT_MOUSE_MOTION) | else if(caca_get_event_type(&ev) & CACA_EVENT_MOUSE_MOTION) | ||||
{ | { | ||||
mouse = 1; | mouse = 1; | ||||
xmouse = ev.data.mouse.x; | xmouse = caca_get_event_mouse_x(&ev); | ||||
ymouse = ev.data.mouse.y; | ymouse = caca_get_event_mouse_y(&ev); | ||||
} | } | ||||
else if(ev.type & CACA_EVENT_RESIZE) | else if(caca_get_event_type(&ev) & CACA_EVENT_RESIZE) | ||||
{ | { | ||||
mouse = 1; /* old hack */ | mouse = 1; /* old hack */ | ||||
} | } | ||||
@@ -72,9 +72,9 @@ int main(int argc, char **argv) | |||||
do | do | ||||
{ | { | ||||
/* "quit" quits */ | /* "quit" quits */ | ||||
if(ev.type & CACA_EVENT_KEY_PRESS) | if(caca_get_event_type(&ev) & CACA_EVENT_KEY_PRESS) | ||||
{ | { | ||||
int key = ev.data.key.ch; | int key = caca_get_event_key_ch(&ev); | ||||
if((key == 'q' && quit == 0) || (key == 'u' && quit == 1) | if((key == 'q' && quit == 0) || (key == 'u' && quit == 1) | ||||
|| (key == 'i' && quit == 2) || (key == 't' && quit == 3)) | || (key == 'i' && quit == 2) || (key == 't' && quit == 3)) | ||||
quit++; | quit++; | ||||
@@ -104,7 +104,7 @@ int main(int argc, char **argv) | |||||
/* Print previous events */ | /* Print previous events */ | ||||
cucul_set_color_ansi(cv, CUCUL_WHITE, CUCUL_BLACK); | cucul_set_color_ansi(cv, CUCUL_WHITE, CUCUL_BLACK); | ||||
for(i = 1; i < h && events[i].type; i++) | for(i = 1; i < h && caca_get_event_type(&events[i]); i++) | ||||
print_event(0, i, events + i); | print_event(0, i, events + i); | ||||
caca_refresh_display(dp); | caca_refresh_display(dp); | ||||
@@ -121,36 +121,37 @@ static void print_event(int x, int y, caca_event_t *ev) | |||||
{ | { | ||||
int character; | int character; | ||||
switch(ev->type) | switch(caca_get_event_type(ev)) | ||||
{ | { | ||||
case CACA_EVENT_NONE: | case CACA_EVENT_NONE: | ||||
cucul_printf(cv, x, y, "CACA_EVENT_NONE"); | cucul_printf(cv, x, y, "CACA_EVENT_NONE"); | ||||
break; | break; | ||||
case CACA_EVENT_KEY_PRESS: | case CACA_EVENT_KEY_PRESS: | ||||
character = ev->data.key.ch; | character = caca_get_event_key_ch(ev); | ||||
cucul_printf(cv, x, y, "CACA_EVENT_KEY_PRESS 0x%02x (%c)", character, | cucul_printf(cv, x, y, "CACA_EVENT_KEY_PRESS 0x%02x (%c)", character, | ||||
(character > 0x1f && character < 0x80) ? character : '?'); | (character > 0x1f && character < 0x80) ? character : '?'); | ||||
break; | break; | ||||
case CACA_EVENT_KEY_RELEASE: | case CACA_EVENT_KEY_RELEASE: | ||||
character = ev->data.key.ch; | character = caca_get_event_key_ch(ev); | ||||
cucul_printf(cv, x, y, "CACA_EVENT_KEY_RELEASE 0x%02x (%c)", character, | cucul_printf(cv, x, y, "CACA_EVENT_KEY_RELEASE 0x%02x (%c)", character, | ||||
(character > 0x1f && character < 0x80) ? character : '?'); | (character > 0x1f && character < 0x80) ? character : '?'); | ||||
break; | break; | ||||
case CACA_EVENT_MOUSE_MOTION: | case CACA_EVENT_MOUSE_MOTION: | ||||
cucul_printf(cv, x, y, "CACA_EVENT_MOUSE_MOTION %u %u", | cucul_printf(cv, x, y, "CACA_EVENT_MOUSE_MOTION %u %u", | ||||
ev->data.mouse.x, ev->data.mouse.y); | caca_get_event_mouse_x(ev), caca_get_event_mouse_y(ev)); | ||||
break; | break; | ||||
case CACA_EVENT_MOUSE_PRESS: | case CACA_EVENT_MOUSE_PRESS: | ||||
cucul_printf(cv, x, y, "CACA_EVENT_MOUSE_PRESS %u", | cucul_printf(cv, x, y, "CACA_EVENT_MOUSE_PRESS %u", | ||||
ev->data.mouse.button); | caca_get_event_mouse_button(ev)); | ||||
break; | break; | ||||
case CACA_EVENT_MOUSE_RELEASE: | case CACA_EVENT_MOUSE_RELEASE: | ||||
cucul_printf(cv, x, y, "CACA_EVENT_MOUSE_RELEASE %u", | cucul_printf(cv, x, y, "CACA_EVENT_MOUSE_RELEASE %u", | ||||
ev->data.mouse.button); | caca_get_event_mouse_button(ev)); | ||||
break; | break; | ||||
case CACA_EVENT_RESIZE: | case CACA_EVENT_RESIZE: | ||||
cucul_printf(cv, x, y, "CACA_EVENT_RESIZE %u %u", | cucul_printf(cv, x, y, "CACA_EVENT_RESIZE %u %u", | ||||
ev->data.resize.w, ev->data.resize.h); | caca_get_event_resize_width(ev), | ||||
caca_get_event_resize_height(ev)); | |||||
break; | break; | ||||
case CACA_EVENT_QUIT: | case CACA_EVENT_QUIT: | ||||
cucul_printf(cv, x, y, "CACA_EVENT_QUIT"); | cucul_printf(cv, x, y, "CACA_EVENT_QUIT"); | ||||
@@ -74,13 +74,13 @@ int main(int argc, char *argv[]) | |||||
if(ret) | if(ret) | ||||
{ | { | ||||
if(ev.data.key.ch == CACA_KEY_LEFT) | if(caca_get_event_key_ch(&ev) == CACA_KEY_LEFT) | ||||
gam /= 1.03; | gam /= 1.03; | ||||
else if(ev.data.key.ch == CACA_KEY_RIGHT) | else if(caca_get_event_key_ch(&ev) == CACA_KEY_RIGHT) | ||||
gam *= 1.03; | gam *= 1.03; | ||||
else if(ev.data.key.ch == CACA_KEY_DOWN) | else if(caca_get_event_key_ch(&ev) == CACA_KEY_DOWN) | ||||
gam = 1.0; | gam = 1.0; | ||||
else if(ev.data.key.ch == CACA_KEY_ESCAPE) | else if(caca_get_event_key_ch(&ev) == CACA_KEY_ESCAPE) | ||||
break; | break; | ||||
} | } | ||||
@@ -95,7 +95,7 @@ int main(int argc, char *argv[]) | |||||
if(caca_get_event(dp, CACA_EVENT_KEY_PRESS, &ev, -1) == 0) | if(caca_get_event(dp, CACA_EVENT_KEY_PRESS, &ev, -1) == 0) | ||||
continue; | continue; | ||||
switch(ev.data.key.ch) | switch(caca_get_event_key_ch(&ev)) | ||||
{ | { | ||||
case CACA_KEY_ESCAPE: | case CACA_KEY_ESCAPE: | ||||
running = 0; | running = 0; | ||||
@@ -143,7 +143,8 @@ int main(int argc, char *argv[]) | |||||
memmove(entries[e].buffer + entries[e].cursor + 1, | memmove(entries[e].buffer + entries[e].cursor + 1, | ||||
entries[e].buffer + entries[e].cursor, | entries[e].buffer + entries[e].cursor, | ||||
(entries[e].size - entries[e].cursor) * 4); | (entries[e].size - entries[e].cursor) * 4); | ||||
entries[e].buffer[entries[e].cursor] = ev.data.key.utf32; | entries[e].buffer[entries[e].cursor] = | ||||
caca_get_event_key_utf32(&ev); | |||||
entries[e].size++; | entries[e].size++; | ||||
entries[e].cursor++; | entries[e].cursor++; | ||||
} | } | ||||
@@ -66,7 +66,7 @@ int main(int argc, char **argv) | |||||
while(caca_get_event(dp, CACA_EVENT_KEY_PRESS, &ev, 0)) | while(caca_get_event(dp, CACA_EVENT_KEY_PRESS, &ev, 0)) | ||||
{ | { | ||||
switch(ev.data.key.ch) | switch(caca_get_event_key_ch(&ev)) | ||||
{ | { | ||||
case 0: | case 0: | ||||
break; | break; | ||||
@@ -83,7 +83,7 @@ int main(int argc, char **argv) | |||||
caca_event_t ev; | caca_event_t ev; | ||||
int ret = caca_get_event(dp, CACA_EVENT_ANY, &ev, 0); | int ret = caca_get_event(dp, CACA_EVENT_ANY, &ev, 0); | ||||
if(ret && ev.type & CACA_EVENT_KEY_PRESS) | if(ret && caca_get_event_type(&ev) & CACA_EVENT_KEY_PRESS) | ||||
break; | break; | ||||
for(i = 0; i < 4; i++) | for(i = 0; i < 4; i++) | ||||