parameter to do what both functions did before, and even more.tags/v0.99.beta14
| @@ -237,8 +237,7 @@ int caca_set_window_title(caca_t *kk, char const *); | |||||
| * clicks. | * clicks. | ||||
| * | * | ||||
| * @{ */ | * @{ */ | ||||
| int caca_get_event(caca_t *kk, unsigned int, struct caca_event *); | |||||
| int caca_wait_event(caca_t *kk, unsigned int, struct caca_event *); | |||||
| int caca_get_event(caca_t *kk, unsigned int, struct caca_event *, int); | |||||
| unsigned int caca_get_mouse_x(caca_t *kk); | unsigned int caca_get_mouse_x(caca_t *kk); | ||||
| unsigned int caca_get_mouse_y(caca_t *kk); | unsigned int caca_get_mouse_y(caca_t *kk); | ||||
| void caca_set_mouse(caca_t *kk, int); | void caca_set_mouse(caca_t *kk, int); | ||||
| @@ -45,50 +45,59 @@ static int _lowlevel_event(caca_t *, struct caca_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 | ||||
| * the event mask and returns the first matching event. Non-matching events | * the event mask and returns the first matching event. Non-matching events | ||||
| * are discarded. \c event_mask must have a non-zero value. This function 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. | |||||
| * are discarded. \c event_mask must have a non-zero value. | |||||
| * | |||||
| * The timeout value tells how long this function needs to wait for an | |||||
| * event. A value of zero returns immediately and the function returns zero | |||||
| * if no more events are pending in the queue. A negative value causes the | |||||
| * function to wait indefinitely until a matching event is received. | |||||
| * | * | ||||
| * \param event_mask Bitmask of requested events. | * \param event_mask Bitmask of requested events. | ||||
| * \param timeout A timeout value in microseconds | |||||
| * \return The next matching event in the queue, or 0 if no event is pending. | * \return The next matching event in the queue, or 0 if no event is pending. | ||||
| */ | */ | ||||
| int caca_get_event(caca_t *kk, unsigned int event_mask, struct caca_event *ev) | |||||
| int caca_get_event(caca_t *kk, unsigned int event_mask, | |||||
| struct caca_event *ev, int timeout) | |||||
| { | { | ||||
| if(!event_mask) | |||||
| return 0; | |||||
| for( ; ; ) | |||||
| { | |||||
| int ret = _get_next_event(kk, ev); | |||||
| if(!ret || ev->type & event_mask) | |||||
| return ret; | |||||
| } | |||||
| } | |||||
| struct caca_timer timer; | |||||
| int usec = 0; | |||||
| /** \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. \c event_mask must have a non-zero value. | |||||
| * 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. | |||||
| */ | |||||
| int caca_wait_event(caca_t *kk, unsigned int event_mask, struct caca_event *ev) | |||||
| { | |||||
| if(!event_mask) | if(!event_mask) | ||||
| return 0; | return 0; | ||||
| if(timeout > 0) | |||||
| _caca_getticks(&timer); | |||||
| for( ; ; ) | for( ; ; ) | ||||
| { | { | ||||
| int ret = _get_next_event(kk, ev); | int ret = _get_next_event(kk, ev); | ||||
| if(ret && (ev->type & event_mask)) | |||||
| /* If we got the event we wanted, return */ | |||||
| if(ev->type & event_mask) | |||||
| return ret; | return ret; | ||||
| _caca_sleep(10000); | |||||
| /* If there is no timeout, sleep and try again. */ | |||||
| if(timeout < 0) | |||||
| { | |||||
| _caca_sleep(10000); | |||||
| continue; | |||||
| } | |||||
| /* If we timeouted, return an empty event */ | |||||
| if(usec >= timeout) | |||||
| { | |||||
| ev->type = CACA_EVENT_NONE; | |||||
| return 0; | |||||
| } | |||||
| /* Otherwise sleep a bit. Our granularity is far too high for values | |||||
| * below 10000 microseconds so we cheat a bit. */ | |||||
| if(usec > 10000) | |||||
| _caca_sleep(10000); | |||||
| else | |||||
| _caca_sleep(1000); | |||||
| usec += _caca_getticks(&timer); | |||||
| } | } | ||||
| } | } | ||||
| @@ -266,7 +266,7 @@ game (void) | |||||
| { | { | ||||
| #ifdef LIBCACA | #ifdef LIBCACA | ||||
| struct caca_event ev; | struct caca_event ev; | ||||
| if(caca_get_event(kk, CACA_EVENT_KEY_PRESS, &ev)) | |||||
| if(caca_get_event(kk, CACA_EVENT_KEY_PRESS, &ev, 0)) | |||||
| { | { | ||||
| switch(ev.data.key.c) | switch(ev.data.key.c) | ||||
| { | { | ||||
| @@ -93,7 +93,7 @@ int main(int argc, char **argv) | |||||
| for(;;) | for(;;) | ||||
| { | { | ||||
| struct caca_event ev; | struct caca_event ev; | ||||
| if(caca_get_event(kk, CACA_EVENT_KEY_PRESS, &ev)) | |||||
| if(caca_get_event(kk, CACA_EVENT_KEY_PRESS, &ev, 0)) | |||||
| { | { | ||||
| switch(ev.data.key.c) | switch(ev.data.key.c) | ||||
| { | { | ||||
| @@ -69,7 +69,7 @@ int main (int argc, char **argv) | |||||
| for(;;) | for(;;) | ||||
| { | { | ||||
| struct caca_event ev; | struct caca_event ev; | ||||
| if(caca_get_event(kk, CACA_EVENT_KEY_PRESS, &ev)) | |||||
| if(caca_get_event(kk, CACA_EVENT_KEY_PRESS, &ev, 0)) | |||||
| { | { | ||||
| switch(ev.data.key.c) | switch(ev.data.key.c) | ||||
| { | { | ||||
| @@ -85,7 +85,7 @@ int main (int argc, char **argv) | |||||
| for(;;) | for(;;) | ||||
| { | { | ||||
| struct caca_event ev; | struct caca_event ev; | ||||
| if(caca_get_event(kk, CACA_EVENT_KEY_PRESS, &ev)) | |||||
| if(caca_get_event(kk, CACA_EVENT_KEY_PRESS, &ev, 0)) | |||||
| { | { | ||||
| switch(ev.data.key.c) | switch(ev.data.key.c) | ||||
| { | { | ||||
| @@ -66,7 +66,7 @@ int main(int argc, char **argv) | |||||
| caca_display(kk); | caca_display(kk); | ||||
| while(caca_wait_event(kk, CACA_EVENT_KEY_PRESS, &ev)) | |||||
| while(caca_get_event(kk, CACA_EVENT_KEY_PRESS, &ev, -1)) | |||||
| { | { | ||||
| if(ev.data.key.c == CACA_KEY_ESCAPE) | if(ev.data.key.c == CACA_KEY_ESCAPE) | ||||
| break; | break; | ||||
| @@ -151,9 +151,9 @@ int main(int argc, char **argv) | |||||
| int event; | int event; | ||||
| if(update) | if(update) | ||||
| event = caca_get_event(kk, event_mask, &ev); | |||||
| event = caca_get_event(kk, event_mask, &ev, 0); | |||||
| else | else | ||||
| event = caca_wait_event(kk, event_mask, &ev); | |||||
| event = caca_get_event(kk, event_mask, &ev, -1); | |||||
| while(event) | while(event) | ||||
| { | { | ||||
| @@ -304,7 +304,7 @@ int main(int argc, char **argv) | |||||
| if(help || new_help) | if(help || new_help) | ||||
| help = new_help; | help = new_help; | ||||
| event = caca_get_event(kk, CACA_EVENT_KEY_PRESS, &ev); | |||||
| event = caca_get_event(kk, CACA_EVENT_KEY_PRESS, &ev, 0); | |||||
| } | } | ||||
| if(items && reload) | if(items && reload) | ||||
| @@ -50,7 +50,7 @@ int main(int argc, char **argv) | |||||
| } | } | ||||
| caca_display(kk); | caca_display(kk); | ||||
| caca_wait_event(kk, CACA_EVENT_KEY_PRESS, &ev); | |||||
| caca_get_event(kk, CACA_EVENT_KEY_PRESS, &ev, -1); | |||||
| caca_detach(kk); | caca_detach(kk); | ||||
| cucul_free(qq); | cucul_free(qq); | ||||
| @@ -74,7 +74,7 @@ int main(int argc, char **argv) | |||||
| struct caca_event ev; | struct caca_event ev; | ||||
| int menu = 0, mouse = 0, xmouse = 0, ymouse = 0; | int menu = 0, mouse = 0, xmouse = 0, ymouse = 0; | ||||
| while(caca_get_event(kk, CACA_EVENT_ANY, &ev)) | |||||
| while(caca_get_event(kk, CACA_EVENT_ANY, &ev, 0)) | |||||
| { | { | ||||
| if(demo && (ev.type & CACA_EVENT_KEY_PRESS)) | if(demo && (ev.type & CACA_EVENT_KEY_PRESS)) | ||||
| { | { | ||||
| @@ -148,6 +148,10 @@ int main(int argc, char **argv) | |||||
| xmouse = ev.data.mouse.x; | xmouse = ev.data.mouse.x; | ||||
| ymouse = ev.data.mouse.y; | ymouse = ev.data.mouse.y; | ||||
| } | } | ||||
| else if(ev.type & CACA_EVENT_RESIZE) | |||||
| { | |||||
| mouse = 1; /* old hack */ | |||||
| } | |||||
| } | } | ||||
| if(menu || (mouse && !demo)) | if(menu || (mouse && !demo)) | ||||
| @@ -156,7 +160,8 @@ int main(int argc, char **argv) | |||||
| if(mouse && !demo) | if(mouse && !demo) | ||||
| { | { | ||||
| cucul_set_color(qq, CUCUL_COLOR_RED, CUCUL_COLOR_BLACK); | cucul_set_color(qq, CUCUL_COLOR_RED, CUCUL_COLOR_BLACK); | ||||
| cucul_putstr(qq, xmouse, ymouse, "|\\"); | |||||
| cucul_putstr(qq, xmouse, ymouse, "."); | |||||
| cucul_putstr(qq, xmouse, ymouse + 1, "|\\"); | |||||
| } | } | ||||
| caca_display(kk); | caca_display(kk); | ||||
| mouse = menu = 0; | mouse = menu = 0; | ||||
| @@ -124,7 +124,7 @@ int main(void) | |||||
| caca_display(kk); | caca_display(kk); | ||||
| caca_wait_event(kk, CACA_EVENT_KEY_PRESS, &ev); | |||||
| caca_get_event(kk, CACA_EVENT_KEY_PRESS, &ev, -1); | |||||
| caca_detach(kk); | caca_detach(kk); | ||||
| cucul_free(qq); | cucul_free(qq); | ||||
| @@ -54,7 +54,7 @@ int main(int argc, char **argv) | |||||
| { | { | ||||
| struct caca_event ev; | struct caca_event ev; | ||||
| static char const * quit_string[] = { "", "q", "qu", "qui", "quit" }; | static char const * quit_string[] = { "", "q", "qu", "qui", "quit" }; | ||||
| int ret = caca_wait_event(kk, CACA_EVENT_ANY, &ev); | |||||
| int ret = caca_get_event(kk, CACA_EVENT_ANY, &ev, -1); | |||||
| if(!ret) | if(!ret) | ||||
| continue; | continue; | ||||
| @@ -77,7 +77,7 @@ int main(int argc, char **argv) | |||||
| memmove(events + 1, events, (h - 1) * sizeof(struct caca_event)); | memmove(events + 1, events, (h - 1) * sizeof(struct caca_event)); | ||||
| events[0] = ev; | events[0] = ev; | ||||
| ret = caca_get_event(kk, CACA_EVENT_ANY, &ev); | |||||
| ret = caca_get_event(kk, CACA_EVENT_ANY, &ev, 0); | |||||
| } | } | ||||
| while(ret); | while(ret); | ||||
| @@ -62,7 +62,7 @@ int main(void) | |||||
| for(x = 0; ; x++) | for(x = 0; ; x++) | ||||
| { | { | ||||
| int ret = caca_get_event(kk, CACA_EVENT_KEY_PRESS, &ev); | |||||
| int ret = caca_get_event(kk, CACA_EVENT_KEY_PRESS, &ev, 0); | |||||
| if(ret) | if(ret) | ||||
| { | { | ||||
| @@ -53,7 +53,7 @@ int main(void) | |||||
| caca_display(kk); | caca_display(kk); | ||||
| caca_wait_event(kk, CACA_EVENT_KEY_PRESS, &ev); | |||||
| caca_get_event(kk, CACA_EVENT_KEY_PRESS, &ev, 0); | |||||
| caca_detach(kk); | caca_detach(kk); | ||||
| cucul_free(qq); | cucul_free(qq); | ||||
| @@ -57,7 +57,7 @@ int main(int argc, char **argv) | |||||
| int xa, ya, xb, yb; | int xa, ya, xb, yb; | ||||
| char buf[BUFSIZ]; | char buf[BUFSIZ]; | ||||
| while(caca_get_event(kk, CACA_EVENT_KEY_PRESS, &ev)) | |||||
| while(caca_get_event(kk, CACA_EVENT_KEY_PRESS, &ev, 0)) | |||||
| { | { | ||||
| switch(ev.data.key.c) | switch(ev.data.key.c) | ||||
| { | { | ||||
| @@ -108,7 +108,7 @@ int main(void) | |||||
| caca_display(kk); | caca_display(kk); | ||||
| caca_wait_event(kk, CACA_EVENT_KEY_PRESS, &ev); | |||||
| caca_get_event(kk, CACA_EVENT_KEY_PRESS, &ev, -1); | |||||
| caca_detach(kk); | caca_detach(kk); | ||||
| cucul_free(rotate); | cucul_free(rotate); | ||||
| @@ -87,7 +87,7 @@ int main(void) | |||||
| caca_display(kk); | caca_display(kk); | ||||
| caca_wait_event(kk, CACA_EVENT_KEY_PRESS, &ev); | |||||
| caca_get_event(kk, CACA_EVENT_KEY_PRESS, &ev, -1); | |||||
| caca_detach(kk); | caca_detach(kk); | ||||
| cucul_free(qq); | cucul_free(qq); | ||||