diff options
Diffstat (limited to 'navit/graphics/sdl/event_sdl.c')
-rw-r--r-- | navit/graphics/sdl/event_sdl.c | 395 |
1 files changed, 180 insertions, 215 deletions
diff --git a/navit/graphics/sdl/event_sdl.c b/navit/graphics/sdl/event_sdl.c index 28fe4fafb..454e9eb06 100644 --- a/navit/graphics/sdl/event_sdl.c +++ b/navit/graphics/sdl/event_sdl.c @@ -19,7 +19,7 @@ #include <glib.h> #include <poll.h> -#include <SDL/SDL.h> +#include "SDL.h" #include <pthread.h> #include <signal.h> #include "config.h" @@ -43,301 +43,266 @@ static struct event_idle *event_sdl_add_idle(int, struct callback *); static void event_sdl_remove_idle(struct event_idle *); static void event_sdl_call_callback(struct callback_list *); -static Uint32 -sdl_timer_callback(Uint32 interval, void* param) -{ - struct event_timeout *timeout=(struct event_timeout*)param; +static Uint32 sdl_timer_callback(Uint32 interval, void* param) { + struct event_timeout *timeout=(struct event_timeout*)param; - dbg(lvl_debug,"timer(%p) multi(%d) interval(%d) fired\n", param, timeout->multi, interval); + dbg(lvl_debug,"timer(%p) multi(%d) interval(%d) fired", param, timeout->multi, interval); - SDL_Event event; - SDL_UserEvent userevent; + SDL_Event event; + SDL_UserEvent userevent; - userevent.type = SDL_USEREVENT; - userevent.code = SDL_USEREVENT_CODE_TIMER; - userevent.data1 = timeout->cb; - userevent.data2 = NULL; + userevent.type = SDL_USEREVENT; + userevent.code = SDL_USEREVENT_CODE_TIMER; + userevent.data1 = timeout->cb; + userevent.data2 = NULL; - event.type = SDL_USEREVENT; - event.user = userevent; + event.type = SDL_USEREVENT; + event.user = userevent; - SDL_PushEvent (&event); + SDL_PushEvent (&event); - if (timeout->multi == 0) { - timeout->id = 0; - return 0; // cancel timer - } - return interval; // reactivate timer + if (timeout->multi == 0) { + timeout->id = 0; + return 0; // cancel timer + } + return interval; // reactivate timer } /* SDL Mainloop */ -static void -event_sdl_main_loop_run(void) -{ - graphics_sdl_idle(NULL); - event_sdl_watch_stopthread(); +static void event_sdl_main_loop_run(void) { + graphics_sdl_idle(NULL); + event_sdl_watch_stopthread(); } -static void -event_sdl_main_loop_quit(void) -{ - quit_event_loop = 1; +static void event_sdl_main_loop_quit(void) { + quit_event_loop = 1; } /* Watch */ -void -event_sdl_watch_thread (GPtrArray *watch_list) -{ - struct pollfd *pfds = g_new0 (struct pollfd, watch_list->len); - struct event_watch *ew; - int ret; - int idx; +void event_sdl_watch_thread (GPtrArray *watch_list) { + struct pollfd *pfds = g_new0 (struct pollfd, watch_list->len); + struct event_watch *ew; + int ret; + int idx; - for (idx = 0; idx < watch_list->len; idx++ ) { - ew = g_ptr_array_index (watch_list, idx); - g_memmove (&pfds[idx], ew->pfd, sizeof(struct pollfd)); - } + for (idx = 0; idx < watch_list->len; idx++ ) { + ew = g_ptr_array_index (watch_list, idx); + g_memmove (&pfds[idx], ew->pfd, sizeof(struct pollfd)); + } - while ((ret = ppoll(pfds, watch_list->len, NULL, NULL)) > 0) { - for (idx = 0; idx < watch_list->len; idx++ ) { - if (pfds[idx].revents == pfds[idx].events) { /* The requested event happened, notify mainloop! */ - ew = g_ptr_array_index (watch_list, idx); - dbg(lvl_debug,"watch(%p) event(%d) encountered\n", ew, pfds[idx].revents); + while ((ret = ppoll(pfds, watch_list->len, NULL, NULL)) > 0) { + for (idx = 0; idx < watch_list->len; idx++ ) { + if (pfds[idx].revents == pfds[idx].events) { /* The requested event happened, notify mainloop! */ + ew = g_ptr_array_index (watch_list, idx); + dbg(lvl_debug,"watch(%p) event(%d) encountered", ew, pfds[idx].revents); - SDL_Event event; - SDL_UserEvent userevent; + SDL_Event event; + SDL_UserEvent userevent; - userevent.type = SDL_USEREVENT; - userevent.code = SDL_USEREVENT_CODE_WATCH; - userevent.data1 = ew->cb; - userevent.data2 = NULL; + userevent.type = SDL_USEREVENT; + userevent.code = SDL_USEREVENT_CODE_WATCH; + userevent.data1 = ew->cb; + userevent.data2 = NULL; - event.type = SDL_USEREVENT; - event.user = userevent; + event.type = SDL_USEREVENT; + event.user = userevent; - SDL_PushEvent (&event); - } - } - } + SDL_PushEvent (&event); + } + } + } - g_free(pfds); + g_free(pfds); - pthread_exit(0); + pthread_exit(0); } -static void -event_sdl_watch_startthread(GPtrArray *watch_list) -{ - dbg(lvl_debug,"enter\n"); - if (sdl_watch_thread) - event_sdl_watch_stopthread(); +static void event_sdl_watch_startthread(GPtrArray *watch_list) { + dbg(lvl_debug,"enter"); + if (sdl_watch_thread) + event_sdl_watch_stopthread(); - int ret; - ret = pthread_create (&sdl_watch_thread, NULL, (void *)event_sdl_watch_thread, (void *)watch_list); + int ret; + ret = pthread_create (&sdl_watch_thread, NULL, (void *)event_sdl_watch_thread, (void *)watch_list); - dbg_assert (ret == 0); + dbg_assert (ret == 0); } -static void -event_sdl_watch_stopthread() -{ - dbg(lvl_debug,"enter\n"); - if (sdl_watch_thread) { - /* Notify the watch thread that the list of FDs will change */ - pthread_kill(sdl_watch_thread, SIGUSR1); - pthread_join(sdl_watch_thread, NULL); - sdl_watch_thread = 0; - } +static void event_sdl_watch_stopthread() { + dbg(lvl_debug,"enter"); + if (sdl_watch_thread) { + /* Notify the watch thread that the list of FDs will change */ + pthread_kill(sdl_watch_thread, SIGUSR1); + pthread_join(sdl_watch_thread, NULL); + sdl_watch_thread = 0; + } } -static struct event_watch * -event_sdl_add_watch(int fd, enum event_watch_cond cond, struct callback *cb) -{ - dbg(lvl_debug,"fd(%d) cond(%x) cb(%x)\n", fd, cond, cb); +static struct event_watch *event_sdl_add_watch(int fd, enum event_watch_cond cond, struct callback *cb) { + dbg(lvl_debug,"fd(%d) cond(%x) cb(%x)", fd, cond, cb); - event_sdl_watch_stopthread(); + event_sdl_watch_stopthread(); - if (!sdl_watch_list) - sdl_watch_list = g_ptr_array_new(); + if (!sdl_watch_list) + sdl_watch_list = g_ptr_array_new(); - struct event_watch *new_ew = g_new0 (struct event_watch, 1); - struct pollfd *pfd = g_new0 (struct pollfd, 1); + struct event_watch *new_ew = g_new0 (struct event_watch, 1); + struct pollfd *pfd = g_new0 (struct pollfd, 1); - pfd->fd = fd; + pfd->fd = fd; - /* Modify watchlist here */ - switch (cond) { - case event_watch_cond_read: - pfd->events = POLLIN; - break; - case event_watch_cond_write: - pfd->events = POLLOUT; - break; - case event_watch_cond_except: - pfd->events = POLLERR|POLLHUP; - break; - } + /* Modify watchlist here */ + switch (cond) { + case event_watch_cond_read: + pfd->events = POLLIN; + break; + case event_watch_cond_write: + pfd->events = POLLOUT; + break; + case event_watch_cond_except: + pfd->events = POLLERR|POLLHUP; + break; + } - new_ew->pfd = (struct pollfd*) pfd; - new_ew->cb = cb; + new_ew->pfd = (struct pollfd*) pfd; + new_ew->cb = cb; - g_ptr_array_add (sdl_watch_list, (gpointer)new_ew); + g_ptr_array_add (sdl_watch_list, (gpointer)new_ew); - event_sdl_watch_startthread(sdl_watch_list); + event_sdl_watch_startthread(sdl_watch_list); - return new_ew; + return new_ew; } -static void -event_sdl_remove_watch(struct event_watch *ew) -{ - dbg(lvl_debug,"enter %p\n",ew); +static void event_sdl_remove_watch(struct event_watch *ew) { + dbg(lvl_debug,"enter %p",ew); - event_sdl_watch_stopthread(); + event_sdl_watch_stopthread(); - g_ptr_array_remove (sdl_watch_list, ew); - g_free (ew->pfd); - g_free (ew); + g_ptr_array_remove (sdl_watch_list, ew); + g_free (ew->pfd); + g_free (ew); - if (sdl_watch_list->len > 0) - event_sdl_watch_startthread(sdl_watch_list); + if (sdl_watch_list->len > 0) + event_sdl_watch_startthread(sdl_watch_list); } /* Timeout */ -static struct event_timeout * -event_sdl_add_timeout(int timeout, int multi, struct callback *cb) -{ - struct event_timeout * ret = g_new0(struct event_timeout, 1); - if(!ret) { - dbg(lvl_error,"g_new0 failed\n"); - return ret; - } - dbg(lvl_debug,"timer(%p) multi(%d) interval(%d) cb(%p) added\n",ret, multi, timeout, cb); - ret->multi = multi; - ret->cb = cb; - ret->id = SDL_AddTimer(timeout, sdl_timer_callback, ret); - - return ret; +static struct event_timeout *event_sdl_add_timeout(int timeout, int multi, struct callback *cb) { + struct event_timeout * ret = g_new0(struct event_timeout, 1); + if(!ret) { + dbg(lvl_error,"g_new0 failed"); + return ret; + } + dbg(lvl_debug,"timer(%p) multi(%d) interval(%d) cb(%p) added",ret, multi, timeout, cb); + ret->multi = multi; + ret->cb = cb; + ret->id = SDL_AddTimer(timeout, sdl_timer_callback, ret); + + return ret; } -static void -event_sdl_remove_timeout(struct event_timeout *to) -{ - dbg(lvl_info,"enter %p\n", to); - if(to) - { - /* do not SDL_RemoveTimer if oneshot timer has already fired */ - int ret = to->id == 0 ? SDL_TRUE : SDL_RemoveTimer(to->id); - - if (ret == SDL_FALSE) - dbg(lvl_error,"SDL_RemoveTimer (%p) failed\n", to->id); - - g_free(to); - dbg(lvl_debug,"timer(%p) removed\n", to); - } +static void event_sdl_remove_timeout(struct event_timeout *to) { + dbg(lvl_info,"enter %p", to); + if(to) { + /* do not SDL_RemoveTimer if oneshot timer has already fired */ + int ret = to->id == 0 ? SDL_TRUE : SDL_RemoveTimer(to->id); + + if (ret == SDL_FALSE) + dbg(lvl_error,"SDL_RemoveTimer (%p) failed", to->id); + + g_free(to); + dbg(lvl_debug,"timer(%p) removed", to); + } } /* Idle */ /* sort ptr_array by priority, increasing order */ -static gint -sdl_sort_idle_tasks(gconstpointer parama, gconstpointer paramb) -{ - struct idle_task *a = (struct idle_task *)parama; - struct idle_task *b = (struct idle_task *)paramb; - if (a->priority < b->priority) - return -1; - if (a->priority > b->priority) - return 1; - return 0; +static gint sdl_sort_idle_tasks(gconstpointer parama, gconstpointer paramb) { + struct idle_task *a = (struct idle_task *)parama; + struct idle_task *b = (struct idle_task *)paramb; + if (a->priority < b->priority) + return -1; + if (a->priority > b->priority) + return 1; + return 0; } -static struct event_idle * -event_sdl_add_idle(int priority, struct callback *cb) -{ - dbg(lvl_debug,"add idle priority(%d) cb(%p)\n", priority, cb); +static struct event_idle *event_sdl_add_idle(int priority, struct callback *cb) { + dbg(lvl_debug,"add idle priority(%d) cb(%p)", priority, cb); - struct idle_task *task = g_new0(struct idle_task, 1); - task->priority = priority; - task->cb = cb; + struct idle_task *task = g_new0(struct idle_task, 1); + task->priority = priority; + task->cb = cb; - g_ptr_array_add(idle_tasks, (gpointer)task); + g_ptr_array_add(idle_tasks, (gpointer)task); - if (idle_tasks->len < 2) - { - SDL_Event event; - SDL_UserEvent userevent; + if (idle_tasks->len < 2) { + SDL_Event event; + SDL_UserEvent userevent; - dbg(lvl_debug,"poking eventloop because of new idle_events\n"); + dbg(lvl_debug,"poking eventloop because of new idle_events"); - userevent.type = SDL_USEREVENT; - userevent.code = SDL_USEREVENT_CODE_IDLE_EVENT; - userevent.data1 = NULL; - userevent.data2 = NULL; + userevent.type = SDL_USEREVENT; + userevent.code = SDL_USEREVENT_CODE_IDLE_EVENT; + userevent.data1 = NULL; + userevent.data2 = NULL; - event.type = SDL_USEREVENT; - event.user = userevent; + event.type = SDL_USEREVENT; + event.user = userevent; - SDL_PushEvent (&event); - } - else // more than one entry => sort the list - g_ptr_array_sort(idle_tasks, sdl_sort_idle_tasks); + SDL_PushEvent (&event); + } else // more than one entry => sort the list + g_ptr_array_sort(idle_tasks, sdl_sort_idle_tasks); - return (struct event_idle *)task; + return (struct event_idle *)task; } -static void -event_sdl_remove_idle(struct event_idle *task) -{ - dbg(lvl_debug,"remove task(%p)\n", task); - g_ptr_array_remove(idle_tasks, (gpointer)task); +static void event_sdl_remove_idle(struct event_idle *task) { + dbg(lvl_debug,"remove task(%p)", task); + g_ptr_array_remove(idle_tasks, (gpointer)task); } /* callback */ -static void -event_sdl_call_callback(struct callback_list *cbl) -{ - dbg(lvl_debug,"call_callback cbl(%p)\n",cbl); - SDL_Event event; - SDL_UserEvent userevent; +static void event_sdl_call_callback(struct callback_list *cbl) { + dbg(lvl_debug,"call_callback cbl(%p)",cbl); + SDL_Event event; + SDL_UserEvent userevent; - userevent.type = SDL_USEREVENT; - userevent.code = SDL_USEREVENT_CODE_CALL_CALLBACK; - userevent.data1 = cbl; - userevent.data2 = NULL; + userevent.type = SDL_USEREVENT; + userevent.code = SDL_USEREVENT_CODE_CALL_CALLBACK; + userevent.data1 = cbl; + userevent.data2 = NULL; - event.type = SDL_USEREVENT; - event.user = userevent; + event.type = SDL_USEREVENT; + event.user = userevent; - SDL_PushEvent (&event); + SDL_PushEvent (&event); } static struct event_methods event_sdl_methods = { - event_sdl_main_loop_run, - event_sdl_main_loop_quit, - event_sdl_add_watch, - event_sdl_remove_watch, - event_sdl_add_timeout, - event_sdl_remove_timeout, - event_sdl_add_idle, - event_sdl_remove_idle, - event_sdl_call_callback, + event_sdl_main_loop_run, + event_sdl_main_loop_quit, + event_sdl_add_watch, + event_sdl_remove_watch, + event_sdl_add_timeout, + event_sdl_remove_timeout, + event_sdl_add_idle, + event_sdl_remove_idle, + event_sdl_call_callback, }; -static struct event_priv * -event_sdl_new(struct event_methods* methods) -{ - idle_tasks = g_ptr_array_new(); - *methods = event_sdl_methods; - return NULL; +static struct event_priv *event_sdl_new(struct event_methods* methods) { + idle_tasks = g_ptr_array_new(); + *methods = event_sdl_methods; + return NULL; } -void -event_sdl_register(void) -{ - plugin_register_category_event("sdl", event_sdl_new); +void event_sdl_register(void) { + plugin_register_category_event("sdl", event_sdl_new); } |