nuclear@0: #include nuclear@0: #include nuclear@0: #include "sgl.h" nuclear@4: #include "wsys.h" nuclear@0: nuclear@0: struct cbnode { nuclear@0: void (*func[SGL_NUM_CALLBACKS])(); nuclear@0: struct cbnode *next; nuclear@0: }; nuclear@0: nuclear@4: static void notify_wsys(void); nuclear@4: nuclear@0: struct cbnode first_cbnode; nuclear@0: struct cbnode *cb = &first_cbnode; nuclear@0: nuclear@0: int sgl_push_callbacks(void) nuclear@0: { nuclear@0: struct cbnode *node; nuclear@0: nuclear@0: if(!(node = malloc(sizeof *node))) { nuclear@0: return -1; nuclear@0: } nuclear@0: node->next = cb; nuclear@0: cb = node; nuclear@0: sgl_clear_callbacks(); nuclear@0: return 0; nuclear@0: } nuclear@0: nuclear@0: int sgl_pop_callbacks(void) nuclear@0: { nuclear@0: struct cbnode *node; nuclear@0: nuclear@0: if(!cb->next) { nuclear@0: return -1; nuclear@0: } nuclear@0: nuclear@0: node = cb; nuclear@0: cb = cb->next; nuclear@0: free(node); nuclear@4: nuclear@4: notify_wsys(); nuclear@0: return 0; nuclear@0: } nuclear@0: nuclear@0: void sgl_clear_callbacks(void) nuclear@0: { nuclear@0: memset(cb->func, 0, sizeof cb->func); nuclear@4: notify_wsys(); nuclear@0: } nuclear@0: nuclear@5: void sgl_set_callback(int idx, void (*func)()) nuclear@0: { nuclear@5: struct wsys_module *ws; nuclear@5: nuclear@0: cb->func[idx] = func; nuclear@5: nuclear@5: if((ws = sgl_wsys_module())) { nuclear@5: ws->set_event(idx, func != 0); nuclear@5: } nuclear@0: } nuclear@4: nuclear@4: void (*sgl_get_callback(int idx))() nuclear@4: { nuclear@4: return cb->func[idx]; nuclear@4: } nuclear@4: nuclear@6: nuclear@6: void sgl_create_callback(sgl_create_callback_t func) nuclear@6: { nuclear@6: sgl_set_callback(SGL_CREATE, func); nuclear@6: } nuclear@6: nuclear@6: void sgl_close_callback(sgl_close_callback_t func) nuclear@6: { nuclear@6: sgl_set_callback(SGL_CLOSE, func); nuclear@6: } nuclear@6: nuclear@6: void sgl_display_callback(sgl_display_callback_t func) nuclear@6: { nuclear@6: sgl_set_callback(SGL_DISPLAY, func); nuclear@6: } nuclear@6: nuclear@6: void sgl_reshape_callback(sgl_reshape_callback_t func) nuclear@6: { nuclear@6: sgl_set_callback(SGL_RESHAPE, func); nuclear@6: } nuclear@6: nuclear@6: void sgl_keyboard_callback(sgl_keyboard_callback_t func) nuclear@6: { nuclear@6: sgl_set_callback(SGL_KEYBOARD, func); nuclear@6: } nuclear@6: nuclear@6: void sgl_mouse_callback(sgl_mouse_callback_t func) nuclear@6: { nuclear@6: sgl_set_callback(SGL_MOUSE, func); nuclear@6: } nuclear@6: nuclear@6: void sgl_motion_callback(sgl_motion_callback_t func) nuclear@6: { nuclear@6: sgl_set_callback(SGL_MOTION, func); nuclear@6: } nuclear@6: nuclear@6: void sgl_passive_callback(sgl_passive_callback_t func) nuclear@6: { nuclear@6: sgl_set_callback(SGL_PASSIVE, func); nuclear@6: } nuclear@6: nuclear@6: void sgl_idle_callback(sgl_idle_callback_t func) nuclear@6: { nuclear@6: sgl_set_callback(SGL_IDLE, func); nuclear@6: } nuclear@6: nuclear@6: nuclear@4: /* notify the window system module as to which events are active */ nuclear@4: static void notify_wsys(void) nuclear@4: { nuclear@4: int i; nuclear@4: struct wsys_module *ws; nuclear@4: nuclear@4: if((ws = sgl_wsys_module())) { nuclear@4: for(i=0; iset_event(i, cb->func[i] != 0); nuclear@4: } nuclear@4: } nuclear@4: }