+ caca_get_event() and caca_wait_event() now accept a mask as an argument in order to select events.tags/v0.99.beta14
@@ -236,7 +236,7 @@ game (void) | |||
int event; | |||
gentable (); | |||
#ifdef LIBCACA | |||
while (!(event = caca_get_event() & CACA_EVENT_KEY_PRESS)) | |||
while (!(event = caca_get_event(CACA_EVENT_KEY_PRESS))) | |||
#else | |||
while (!(event = aa_getevent (context, 0)) || event == AA_RESIZE) | |||
#endif | |||
@@ -108,112 +108,114 @@ int main(int argc, char **argv) | |||
int ww = caca_get_width(); | |||
int wh = caca_get_height(); | |||
int event, new_status = 0, new_help = 0; | |||
unsigned int event, new_status = 0, new_help = 0; | |||
while((event = caca_get_event())) | |||
while((event = caca_get_event(CACA_EVENT_KEY_PRESS))) | |||
{ | |||
switch(event) | |||
unsigned int key = event & 0x00ffffff; | |||
switch(key) | |||
{ | |||
case CACA_EVENT_KEY_PRESS | 'n': | |||
case CACA_EVENT_KEY_PRESS | 'N': | |||
case 'n': | |||
case 'N': | |||
if(items) current = (current + 1) % items; | |||
reload = 1; | |||
break; | |||
case CACA_EVENT_KEY_PRESS | 'p': | |||
case CACA_EVENT_KEY_PRESS | 'P': | |||
case 'p': | |||
case 'P': | |||
if(items) current = (items + current - 1) % items; | |||
reload = 1; | |||
break; | |||
case CACA_EVENT_KEY_PRESS | 'f': | |||
case CACA_EVENT_KEY_PRESS | 'F': | |||
case 'f': | |||
case 'F': | |||
fullscreen = ~fullscreen; | |||
update = 1; | |||
break; | |||
case CACA_EVENT_KEY_PRESS | 'b': | |||
case 'b': | |||
i = 1 + caca_get_feature(CACA_BACKGROUND); | |||
if(i > CACA_BACKGROUND_MAX) i = CACA_BACKGROUND_MIN; | |||
caca_set_feature(i); | |||
new_status = STATUS_BACKGROUND; | |||
update = 1; | |||
break; | |||
case CACA_EVENT_KEY_PRESS | 'B': | |||
case 'B': | |||
i = -1 + caca_get_feature(CACA_BACKGROUND); | |||
if(i < CACA_BACKGROUND_MIN) i = CACA_BACKGROUND_MAX; | |||
caca_set_feature(i); | |||
new_status = STATUS_BACKGROUND; | |||
update = 1; | |||
break; | |||
case CACA_EVENT_KEY_PRESS | 'a': | |||
case 'a': | |||
i = 1 + caca_get_feature(CACA_ANTIALIASING); | |||
if(i > CACA_ANTIALIASING_MAX) i = CACA_ANTIALIASING_MIN; | |||
caca_set_feature(i); | |||
new_status = STATUS_ANTIALIASING; | |||
update = 1; | |||
break; | |||
case CACA_EVENT_KEY_PRESS | 'A': | |||
case 'A': | |||
i = -1 + caca_get_feature(CACA_ANTIALIASING); | |||
if(i < CACA_ANTIALIASING_MIN) i = CACA_ANTIALIASING_MAX; | |||
caca_set_feature(i); | |||
new_status = STATUS_ANTIALIASING; | |||
update = 1; | |||
break; | |||
case CACA_EVENT_KEY_PRESS | 'd': | |||
case 'd': | |||
i = 1 + caca_get_feature(CACA_DITHERING); | |||
if(i > CACA_DITHERING_MAX) i = CACA_DITHERING_MIN; | |||
caca_set_feature(i); | |||
new_status = STATUS_DITHERING; | |||
update = 1; | |||
break; | |||
case CACA_EVENT_KEY_PRESS | 'D': | |||
case 'D': | |||
i = -1 + caca_get_feature(CACA_DITHERING); | |||
if(i < CACA_DITHERING_MIN) i = CACA_DITHERING_MAX; | |||
caca_set_feature(i); | |||
new_status = STATUS_DITHERING; | |||
update = 1; | |||
break; | |||
case CACA_EVENT_KEY_PRESS | '+': | |||
case '+': | |||
zoom++; | |||
if(zoom > 48) zoom = 48; else update = 1; | |||
break; | |||
case CACA_EVENT_KEY_PRESS | '-': | |||
case '-': | |||
zoom--; | |||
if(zoom < -48) zoom = -48; else update = 1; | |||
break; | |||
case CACA_EVENT_KEY_PRESS | 'x': | |||
case CACA_EVENT_KEY_PRESS | 'X': | |||
case 'x': | |||
case 'X': | |||
zoom = 0; | |||
update = 1; | |||
break; | |||
case CACA_EVENT_KEY_PRESS | 'k': | |||
case CACA_EVENT_KEY_PRESS | 'K': | |||
case CACA_EVENT_KEY_PRESS | CACA_KEY_UP: | |||
case 'k': | |||
case 'K': | |||
case CACA_KEY_UP: | |||
if(zoom > 0) y -= 1 + h / (2 + zoom) / 8; | |||
update = 1; | |||
break; | |||
case CACA_EVENT_KEY_PRESS | 'j': | |||
case CACA_EVENT_KEY_PRESS | 'J': | |||
case CACA_EVENT_KEY_PRESS | CACA_KEY_DOWN: | |||
case 'j': | |||
case 'J': | |||
case CACA_KEY_DOWN: | |||
if(zoom > 0) y += 1 + h / (2 + zoom) / 8; | |||
update = 1; | |||
break; | |||
case CACA_EVENT_KEY_PRESS | 'h': | |||
case CACA_EVENT_KEY_PRESS | 'H': | |||
case CACA_EVENT_KEY_PRESS | CACA_KEY_LEFT: | |||
case 'h': | |||
case 'H': | |||
case CACA_KEY_LEFT: | |||
if(zoom > 0) x -= 1 + w / (2 + zoom) / 8; | |||
update = 1; | |||
break; | |||
case CACA_EVENT_KEY_PRESS | 'l': | |||
case CACA_EVENT_KEY_PRESS | 'L': | |||
case CACA_EVENT_KEY_PRESS | CACA_KEY_RIGHT: | |||
case 'l': | |||
case 'L': | |||
case CACA_KEY_RIGHT: | |||
if(zoom > 0) x += 1 + w / (2 + zoom) / 8; | |||
update = 1; | |||
break; | |||
case CACA_EVENT_KEY_PRESS | '?': | |||
case '?': | |||
new_help = !help; | |||
update = 1; | |||
break; | |||
case CACA_EVENT_KEY_PRESS | 'q': | |||
case CACA_EVENT_KEY_PRESS | 'Q': | |||
case 'q': | |||
case 'Q': | |||
quit = 1; | |||
break; | |||
} | |||
@@ -74,7 +74,7 @@ int main(int argc, char **argv) | |||
int menu = 0, mouse = 0, xmouse = 0, ymouse = 0; | |||
int event; | |||
while((event = caca_get_event())) | |||
while((event = caca_get_event(CACA_EVENT_ANY))) | |||
{ | |||
if(demo && (event & CACA_EVENT_KEY_PRESS)) | |||
{ | |||
@@ -58,25 +58,24 @@ int main(int argc, char **argv) | |||
char buf[BUFSIZ]; | |||
int event; | |||
while((event = caca_get_event())) | |||
while((event = caca_get_event(CACA_EVENT_KEY_PRESS))) | |||
{ | |||
if(event & CACA_EVENT_KEY_PRESS) | |||
switch(event & 0xff) | |||
{ | |||
case 0: | |||
break; | |||
case 'q': | |||
quit = 1; | |||
break; | |||
case '-': | |||
if(frame > 0) | |||
frame--; | |||
break; | |||
case '+': | |||
if(frame < caca_get_sprite_frames(sprite) - 1) | |||
frame++; | |||
break; | |||
} | |||
switch(event & 0x00ffffff) | |||
{ | |||
case 0: | |||
break; | |||
case 'q': | |||
quit = 1; | |||
break; | |||
case '-': | |||
if(frame > 0) | |||
frame--; | |||
break; | |||
case '+': | |||
if(frame < caca_get_sprite_frames(sprite) - 1) | |||
frame++; | |||
break; | |||
} | |||
} | |||
caca_clear(); | |||
@@ -180,7 +180,8 @@ enum caca_event | |||
CACA_EVENT_KEY_RELEASE = 0x02000000, /**< A key was released. */ | |||
CACA_EVENT_MOUSE_PRESS = 0x04000000, /**< A mouse button was pressed. */ | |||
CACA_EVENT_MOUSE_RELEASE = 0x08000000, /**< A mouse button was released. */ | |||
CACA_EVENT_MOUSE_MOTION = 0x10000000 /**< The mouse was moved. */ | |||
CACA_EVENT_MOUSE_MOTION = 0x10000000, /**< The mouse was moved. */ | |||
CACA_EVENT_ANY = 0xff000000 /**< Bitmask for any event. */ | |||
}; | |||
/** \brief Special key values. | |||
@@ -236,8 +237,8 @@ void caca_end(void); | |||
* clicks. | |||
* | |||
* @{ */ | |||
unsigned int caca_get_event(void); | |||
unsigned int caca_wait_event(void); | |||
unsigned int caca_get_event(unsigned int); | |||
unsigned int caca_wait_event(unsigned int); | |||
/* @} */ | |||
/** \defgroup char Character printing | |||
@@ -53,6 +53,7 @@ | |||
#include "caca.h" | |||
#include "caca_internals.h" | |||
static unsigned int _get_next_event(void); | |||
static void _push_key(unsigned int); | |||
static unsigned int _pop_key(void); | |||
static unsigned int _read_key(void); | |||
@@ -63,18 +64,59 @@ static int keys = 0; | |||
/** \brief Get the next mouse or keyboard input event. | |||
* | |||
* This function polls the event queue for mouse or keyboard events and | |||
* returns the event. It is non-blocking and returns zero if no event is | |||
* This function polls the event queue for mouse or keyboard events matching | |||
* the event mask and returns the first matching event. Non-matching events | |||
* are discarded. It is non-blocking and returns zero if no more events are | |||
* pending in the queue. See also caca_wait_event() for a blocking version | |||
* of this function. | |||
* | |||
* \return The next event in the queue, or 0 if no event is pending. | |||
* \param event_mask Bitmask of requested events. | |||
* \return The next matching event in the queue, or 0 if no event is pending. | |||
*/ | |||
unsigned int caca_get_event(void) | |||
unsigned int caca_get_event(unsigned int event_mask) | |||
{ | |||
for( ; ; ) | |||
{ | |||
unsigned int event = _get_next_event(); | |||
if(!event || event & event_mask) | |||
return event; | |||
} | |||
} | |||
/** \brief Wait for the next mouse or keyboard input event. | |||
* | |||
* This function returns the first mouse or keyboard event in the queue | |||
* that matches the event mask. If no event is pending, it blocks until a | |||
* matching event is received. See also caca_get_event() for a non-blocking | |||
* version of this function. | |||
* | |||
* \param event_mask Bitmask of requested events. | |||
* \return The next event in the queue. | |||
*/ | |||
unsigned int caca_wait_event(unsigned int event_mask) | |||
{ | |||
for( ; ; ) | |||
{ | |||
unsigned int event = _get_next_event(); | |||
if(event & event_mask) | |||
return event; | |||
usleep(1000); | |||
} | |||
} | |||
/* | |||
* XXX: The following functions are local. | |||
*/ | |||
static unsigned int _get_next_event(void) | |||
{ | |||
unsigned int event = 0; | |||
#if defined(USE_X11) | |||
/* The X11 event check routine */ | |||
if(_caca_driver == CACA_DRIVER_X11) | |||
{ | |||
XEvent xevent; | |||
@@ -88,6 +130,7 @@ unsigned int caca_get_event(void) | |||
{ | |||
KeySym keysym; | |||
/* Check for mouse motion events */ | |||
if(xevent.type == MotionNotify) | |||
{ | |||
unsigned int newx = xevent.xmotion.x / x11_font_width; | |||
@@ -107,18 +150,20 @@ unsigned int caca_get_event(void) | |||
return CACA_EVENT_MOUSE_MOTION | (newx << 12) | (newy << 0); | |||
} | |||
/* Check for mouse press and release events */ | |||
if(xevent.type == ButtonPress) | |||
return CACA_EVENT_MOUSE_PRESS | 1; | |||
if(xevent.type == ButtonRelease) | |||
return CACA_EVENT_MOUSE_RELEASE | 1; | |||
/* Check for key press and release events */ | |||
if(xevent.type == KeyPress) | |||
event |= CACA_EVENT_KEY_PRESS; | |||
else if(xevent.type == KeyRelease) | |||
event |= CACA_EVENT_KEY_RELEASE; | |||
else | |||
return 0; | |||
continue; | |||
if(XLookupString(&xevent.xkey, &key, 1, NULL, NULL)) | |||
return event | key; | |||
@@ -175,8 +220,7 @@ unsigned int caca_get_event(void) | |||
_pop_key(); | |||
getmouse(&mevent); | |||
_push_key(CACA_EVENT_MOUSE_PRESS | 1); | |||
return CACA_EVENT_MOUSE_MOTION | |||
| (mevent.x << 12) | (mevent.y << 0); | |||
return CACA_EVENT_MOUSE_MOTION | (mevent.x << 12) | mevent.y; | |||
} | |||
switch(keybuf[0]) | |||
@@ -277,31 +321,6 @@ unsigned int caca_get_event(void) | |||
return CACA_EVENT_KEY_PRESS | '\x1b'; | |||
} | |||
/** \brief Wait for the next mouse or keyboard input event. | |||
* | |||
* This function returns the first mouse or keyboard event in the queue. If | |||
* no event is pending, it blocks until an event is received. See also | |||
* caca_get_event() for a non-blocking version of this function. | |||
* | |||
* \return The next event in the queue. | |||
*/ | |||
unsigned int caca_wait_event(void) | |||
{ | |||
for( ; ; ) | |||
{ | |||
unsigned int event = caca_get_event(); | |||
if(event) | |||
return event; | |||
usleep(1000); | |||
} | |||
} | |||
/* | |||
* XXX: The following functions are local. | |||
*/ | |||
static void _push_key(unsigned int key) | |||
{ | |||
if(keys == KEY_BUFLEN) | |||
@@ -128,7 +128,7 @@ int main(void) | |||
caca_refresh(); | |||
while((caca_get_event() & 0xff000000) != CACA_EVENT_KEY_PRESS); | |||
while(!caca_get_event(CACA_EVENT_KEY_PRESS)); | |||
caca_end(); | |||
return 0; | |||
@@ -56,7 +56,7 @@ int main(void) | |||
caca_refresh(); | |||
while((caca_get_event() & 0xff000000) != CACA_EVENT_KEY_PRESS); | |||
while(!caca_get_event(CACA_EVENT_KEY_PRESS)); | |||
caca_end(); | |||