void * s_window_loop_event (void *arg) { s_event_t *event; s_window_t *window; window = (s_window_t *) arg; while (window->running > 0) { if (s_eventq_wait(window, &event) != 0) { continue; } if (window->atevent != NULL) { window->atevent(window, event); } switch (event->type & EVENT_TYPE_MASK) { // case EVENT_TYPE_QUIT: window->running = 0; break; case EVENT_TYPE_QUIT: s_socket_request(window, SOC_DATA_CLOSE); s_event_uninit(event); return NULL; break; case EVENT_TYPE_MOUSE: s_event_parse_mouse(window, event); break; case EVENT_TYPE_KEYBOARD: s_event_parse_keybd(window, event); break; case EVENT_TYPE_EXPOSE: s_event_parse_expos(window, event); break; case EVENT_TYPE_CONFIG: s_event_parse_config(window, event); break; case EVENT_TYPE_TIMER: s_event_parse_timer(window, event); break; case EVENT_TYPE_FOCUS: break; case EVENT_TYPE_MAP: break; case EVENT_TYPE_DESKTOP: break; } s_event_uninit(event); } return NULL; }
static void lxynth_shutdown_driver (void) { DEBUGF ("%s (%s:%d)\n", __FUNCTION__, __FILE__, __LINE__); if (lxynth_root->running) { lxynth_root->running = 0; s_window_quit(lxynth_root->window); s_thread_join(lxynth_root->tid, NULL); kill_timer(lxynth_root->timerid); } while (!s_list_eol(lxynth_root->eventq->list, 0)) { s_event_t *event = s_list_get(lxynth_root->eventq->list, 0); s_list_remove(lxynth_root->eventq->list, 0); s_event_uninit(event); } s_free(lxynth_root->eventq->list); s_thread_mutex_destroy(lxynth_root->eventq->mut); s_free(lxynth_root->eventq); while (!s_list_eol(lxynth_root->gd->list, 0)) { struct graphics_device *gd = s_list_get(lxynth_root->gd->list, 0); lxynth_device_t *wd = (lxynth_device_t *) gd->driver_data; s_list_remove(lxynth_root->gd->list, 0); s_free(wd->title); s_surface_destroy(wd->surface); s_free(wd); s_free(gd); } s_free(lxynth_root->gd->list); s_thread_mutex_destroy(lxynth_root->gd->mut); s_free(lxynth_root->gd); s_free(lxynth_root); }
static void lxynth_timer (void *arg) { int x = 0; int y = 0; int k = 0; int flag = 0; s_event_t *event; s_thread_mutex_lock(lxynth_root->eventq->mut); while (!s_list_eol(lxynth_root->eventq->list, 0)) { event = (s_event_t *) s_list_get(lxynth_root->eventq->list, 0); s_list_remove(lxynth_root->eventq->list, 0); switch (event->type & EVENT_MASK) { case QUIT_EVENT: break; case MOUSE_EVENT: lxynth_event_parse_mouse(event); break; case KEYBD_EVENT: lxynth_event_parse_keybd(event); break; case CONFIG_EVENT: lxynth_event_parse_config(event); break; } s_event_uninit(event); } s_thread_mutex_unlock(lxynth_root->eventq->mut); if (lxynth_root->running) { lxynth_root->timerid = install_timer(20, lxynth_timer, NULL); } }
void * s_window_loop_event (void *arg) { s_event_t *event; s_window_t *window; window = (s_window_t *) arg; while (window->running > 0) { if (s_eventq_wait(window, &event) != 0) { continue; } if (window->atevent != NULL) { window->atevent(window, event); } switch (event->type & EVENT_MASK) { case QUIT_EVENT: s_socket_request(window, SOC_DATA_CLOSE); s_event_uninit(event); return NULL; break; case MOUSE_EVENT: s_event_parse_mouse(window, event); break; case KEYBD_EVENT: s_event_parse_keybd(window, event); break; case EXPOSE_EVENT: s_event_parse_expos(window, event); break; case CONFIG_EVENT: s_event_parse_config(window, event); break; case TIMER_EVENT: s_event_parse_timer(window, event); break; case FOCUS_EVENT: break; case DESKTOP_EVENT: break; } s_event_uninit(event); } return NULL; }
static void handler_set_char (s_window_t *window, osk_char_t *chr) { s_event_t *evt; s_event_init(&evt); evt->type = KEYBD_EVENT | KEYBD_PRESSED; evt->keybd->ascii = chr->ascii; evt->keybd->button = chr->button; evt->keybd->keycode = chr->button; evt->keybd->scancode = chr->scancode; s_socket_request(window, SOC_DATA_EVENT, evt); evt->type = KEYBD_EVENT | KEYBD_RELEASED; s_socket_request(window, SOC_DATA_EVENT, evt); s_event_uninit(evt); }
void s_window_uninit (s_window_t *window) { if (window == NULL) { return; } window->event->type = EVENT_TYPE_QUIT; s_event_changed(window); s_thread_join(window->eventq->tid, NULL); s_childs_uninit(window); if (window->type & (WINDOW_TYPE_TEMP | WINDOW_TYPE_CHILD)) { if (s_child_del(window->parent, window) == 0) { s_thread_detach(window->tid); } } else if (window->type & WINDOW_TYPE_POPUP) { s_thread_detach(window->tid); } debugf(DCLI, "[%d] Exiting (%s%s)", window->id, (window->type & WINDOW_TYPE_MAIN) ? "WINDOW_TYPE_MAIN" : ((window->type & WINDOW_TYPE_CHILD) ? "WINDOW_TYPE_CHILD" : ((window->type & WINDOW_TYPE_TEMP) ? "WINDOW_TYPE_TEMP" : ((window->type & WINDOW_TYPE_POPUP) ? "WINDOW_TYPE_POPUP" : ((window->type & WINDOW_TYPE_DESKTOP) ? "WINDOW_TYPE_DESKTOP" : "WINDOW_UNKNOWN")))), (window->type & WINDOW_TYPE_NOFORM) ? " | WINDOW_TYPE_NOFORM" : ""); /* andrei * call atexit only after we have released all children * the idea is to let the children access their parent's data attribute */ if (window->atexit != NULL) { window->atexit(window); } s_timers_uninit(window); s_pollfds_uninit(window); s_handlers_uninit(window); s_eventq_uninit(window); s_surface_uninit(window); s_event_uninit(window->event); s_free(window->title); s_free(window); window = NULL; }
int s_eventq_uninit (s_window_t *window) { s_event_t *e; s_thread_mutex_destroy(window->eventq->mut); s_thread_cond_destroy(window->eventq->cond); while (!s_list_eol(window->eventq->queue, 0)) { e = (s_event_t *) s_list_get(window->eventq->queue, 0); s_list_remove(window->eventq->queue, 0); s_event_uninit(e); } s_free(window->eventq->queue); s_free(window->eventq); return 0; }
int s_window_init (s_window_t **window) { s_window_t *w; w = (s_window_t *) s_calloc(1, sizeof(s_window_t)); if (s_pollfds_init(w)) { goto err1; } if (s_timers_init(w)) { goto err2; } if (s_socket_init(w)) { goto err3; } if (s_handlers_init(w)) { goto err4; } if (s_childs_init(w)) { goto err5; } if (s_eventq_init(w)) { goto err6; } if (s_event_init(&w->event)) { goto err7; } w->running = 1; w->id = -1; w->pri = -1; w->mapped = -1; w->viewable = -1; w->resizeable = 1; w->alwaysontop = 0; w->cursor = CURSOR_TYPE_ARROW; w->mouse_entered = 0; *window = w; if (s_surface_init(w)) { goto err8; } if (s_socket_request(w, SOC_DATA_DISPLAY)) { goto err9; } if (s_surface_attach(w)) { goto err10; } return 0; err10: err9: s_surface_uninit(w); err8: s_event_uninit(w->event); err7: s_eventq_uninit(w); err6: s_childs_uninit(w); err5: s_handlers_uninit(w); err4: err3: s_timers_uninit(w); err2: s_pollfds_uninit(w); err1: s_free(w); debugf(DCLI | DFAT, "Cannot connect to server"); return -1; }
void s_window_uninit (s_window_t *window) { if (window == NULL) { return; } window->event->type = QUIT_EVENT; s_event_changed(window); s_thread_join(window->eventq->tid, NULL); s_timers_uninit(window); s_pollfds_uninit(window); s_handlers_uninit(window); if (window->atexit != NULL) { window->atexit(window); } s_childs_uninit(window); if (window->type & (WINDOW_TEMP | WINDOW_CHILD)) { if (s_child_del(window->parent, window) == 0) { s_free(window->tid); } } debugf(DCLI, "[%d] Exiting (%s%s)", window->id, (window->type & WINDOW_MAIN) ? "WINDOW_MAIN" : ((window->type & WINDOW_CHILD) ? "WINDOW_CHILD" : ((window->type & WINDOW_TEMP) ? "WINDOW_TEMP" : ((window->type & WINDOW_DESKTOP) ? "WINDOW_DESKTOP" : "WINDOW_UNKNOWN"))), (window->type & WINDOW_NOFORM) ? " | WINDOW_NOFORM" : ""); s_eventq_uninit(window); s_surface_uninit(window); s_event_uninit(window->event); s_gettext_uninit(window); s_free(window->title); s_free(window); window = NULL; }
void w_signal_delete (w_object_t *object) { int pos = 0; s_event_t *event; w_signal_t *signal; s_thread_mutex_lock(object->window->window->eventq->mut); while (!s_list_eol(object->window->window->eventq->queue, pos)) { event = (s_event_t *) s_list_get(object->window->window->eventq->queue, pos); signal = (w_signal_t *) event->data; if ((event->type == SIGNAL_EVENT) && ((signal->from == object) || (signal->to == object))) { s_list_remove(object->window->window->eventq->queue, pos); s_free(signal); s_event_uninit(event); } else { pos++; } } s_thread_mutex_unlock(object->window->window->eventq->mut); }
int s_window_init (s_window_t **window) { s_window_t *w; w = (s_window_t *) s_calloc(1, sizeof(s_window_t)); if (s_surface_init(w)) { goto err1; } if (s_pollfds_init(w)) { goto err2; } if (s_timers_init(w)) { goto err3; } if (s_socket_init(w)) { goto err4; } if (s_handlers_init(w)) { goto err4; } if (s_childs_init(w)) { goto err5; } if (s_eventq_init(w)) { goto err6; } if (s_event_init(&w->event)) { goto err7; } if (s_gettext_init(w)) { goto err8; } w->running = 1; w->id = -1; w->pri = -1; w->resizeable = 1; /* -1 means no limits on width or height. */ w->min_w = w->min_h = w->max_w = w->max_h = -1; w->alwaysontop = 0; w->cursor = MOUSE_CURSOR_ARROW; w->mouse_entered = 0; *window = w; if (s_socket_request(w, SOC_DATA_DISPLAY)) { goto err9; } return 0; err9: s_gettext_uninit(w); err8: s_event_uninit(w->event); err7: s_eventq_uninit(w); err6: s_childs_uninit(w); err5: s_handlers_uninit(w); err4: s_timers_uninit(w); err3: s_pollfds_uninit(w); err2: s_free(w->surface); err1: s_free(w); debugf(DCLI | DFAT, "Cannot connect to server"); return -1; }