static ERL_NIF_TERM window_event_to_map(ErlNifEnv* env, SDL_Event* event, ERL_NIF_TERM map) { enif_make_map_put(env, map, atom_window_id, enif_make_uint(env, event->window.windowID), &map); enif_make_map_put(env, map, atom_event, window_event_to_atom(event->window.event), &map); enif_make_map_put(env, map, atom_data1, enif_make_int(env, event->window.data1), &map); enif_make_map_put(env, map, atom_data2, enif_make_int(env, event->window.data2), &map); return map; }
int make_document(ErlNifEnv *env, vec_term_t *vec, ERL_NIF_TERM *out, int return_maps) { if(vec->length % 2 != 0) { return 0; } if(return_maps) { int idx, count = vec->length; ERL_NIF_TERM ret = enif_make_new_map(env); for(idx = 0; idx < count; idx += 2) { if(!enif_make_map_put( env, ret, vec->data[idx], vec->data[idx+1], &ret)) { return 0; } } *out = ret; return 1; } *out = enif_make_tuple_from_array(env, vec->data, vec->length); return 1; }
static ERL_NIF_TERM mouse_wheel_event_to_map(ErlNifEnv* env, SDL_Event* event, ERL_NIF_TERM map) { enif_make_map_put(env, map, atom_window_id, enif_make_uint(env, event->wheel.windowID), &map); enif_make_map_put(env, map, atom_which, (event->wheel.which == SDL_TOUCH_MOUSEID) ? atom_touch : enif_make_uint(env, event->wheel.which), &map); enif_make_map_put(env, map, atom_x, enif_make_int(env, event->wheel.x), &map); enif_make_map_put(env, map, atom_y, enif_make_int(env, event->wheel.y), &map); enif_make_map_put(env, map, atom_direction, mousewheel_direction_to_atom(event->wheel.direction), &map); return map; }
static ERL_NIF_TERM keyboard_event_to_map(ErlNifEnv* env, SDL_Event* event, ERL_NIF_TERM map) { enif_make_map_put(env, map, atom_window_id, enif_make_uint(env, event->key.windowID), &map); enif_make_map_put(env, map, atom_state, event->key.state == SDL_RELEASED ? atom_released : atom_pressed, &map); enif_make_map_put(env, map, atom_repeat, event->key.repeat == 0 ? atom_false : atom_true, &map); enif_make_map_put(env, map, atom_scancode, enif_make_uint(env, event->key.keysym.scancode), &map); enif_make_map_put(env, map, atom_sym, enif_make_int(env, event->key.keysym.sym), &map); enif_make_map_put(env, map, atom_mod, keymod_flags_to_list(env, event->key.keysym.mod), &map); return map; }
static ERL_NIF_TERM mouse_button_event_to_map(ErlNifEnv* env, SDL_Event* event, ERL_NIF_TERM map) { enif_make_map_put(env, map, atom_window_id, enif_make_uint(env, event->button.windowID), &map); enif_make_map_put(env, map, atom_which, (event->button.which == SDL_TOUCH_MOUSEID) ? atom_touch : enif_make_uint(env, event->button.which), &map); enif_make_map_put(env, map, atom_button, button_to_atom(event->button.button), &map); enif_make_map_put(env, map, atom_state, event->button.state == SDL_RELEASED ? atom_released : atom_pressed, &map); enif_make_map_put(env, map, atom_clicks, enif_make_uint(env, event->button.clicks), &map); enif_make_map_put(env, map, atom_x, enif_make_int(env, event->button.x), &map); enif_make_map_put(env, map, atom_y, enif_make_int(env, event->button.y), &map); return map; }
static ERL_NIF_TERM mouse_motion_event_to_map(ErlNifEnv* env, SDL_Event* event, ERL_NIF_TERM map) { enif_make_map_put(env, map, atom_window_id, enif_make_uint(env, event->motion.windowID), &map); enif_make_map_put(env, map, atom_which, (event->motion.which == SDL_TOUCH_MOUSEID) ? atom_touch : enif_make_uint(env, event->motion.which), &map); enif_make_map_put(env, map, atom_state, mouse_state_to_list(env, event->motion.state), &map); enif_make_map_put(env, map, atom_x, enif_make_int(env, event->motion.x), &map); enif_make_map_put(env, map, atom_y, enif_make_int(env, event->motion.y), &map); enif_make_map_put(env, map, atom_xrel, enif_make_int(env, event->motion.xrel), &map); enif_make_map_put(env, map, atom_yrel, enif_make_int(env, event->motion.yrel), &map); return map; }
static ERL_NIF_TERM event_to_map(ErlNifEnv* env, SDL_Event* event) { ERL_NIF_TERM map; map = enif_make_new_map(env); // All events have a type and a timestamp. enif_make_map_put(env, map, atom_type, event_type_to_atom(event->type), &map); enif_make_map_put(env, map, atom_timestamp, enif_make_uint(env, event->common.timestamp), &map); // The following event types have no additional fields: // // - SDL_QUIT // - SDL_APP_TERMINATING // - SDL_APP_LOWMEMORY // - SDL_APP_WILLENTERBACKGROUND // - SDL_APP_DIDENTERBACKGROUND // - SDL_APP_WILLENTERFOREGROUND // - SDL_APP_DIDENTERFOREGROUND // - SDL_KEYMAPCHANGED // - SDL_CLIPBOARDUPDATE // - SDL_RENDER_TARGETS_RESET // - SDL_RENDER_DEVICE_RESET switch (event->type) { case SDL_WINDOWEVENT: return window_event_to_map(env, event, map); // @todo SDL_SYSWMEVENT case SDL_KEYDOWN: case SDL_KEYUP: return keyboard_event_to_map(env, event, map); // @todo SDL_TEXTEDITING // @todo SDL_TEXTINPUT case SDL_MOUSEMOTION: return mouse_motion_event_to_map(env, event, map); case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: return mouse_button_event_to_map(env, event, map); case SDL_MOUSEWHEEL: return mouse_wheel_event_to_map(env, event, map); // @todo SDL_JOYAXISMOTION // @todo SDL_JOYBALLMOTION // @todo SDL_JOYHATMOTION // @todo SDL_JOYBUTTONDOWN // @todo SDL_JOYBUTTONUP // @todo SDL_JOYDEVICEADDED // @todo SDL_JOYDEVICEREMOVED // @todo SDL_CONTROLLERAXISMOTION // @todo SDL_CONTROLLERBUTTONDOWN // @todo SDL_CONTROLLERBUTTONUP // @todo SDL_CONTROLLERDEVICEADDED // @todo SDL_CONTROLLERDEVICEREMOVED // @todo SDL_CONTROLLERDEVICEREMAPPED // @todo SDL_FINGERDOWN // @todo SDL_FINGERUP // @todo SDL_FINGERMOTION // @todo SDL_DOLLARGESTURE // @todo SDL_DOLLARRECORD // @todo SDL_MULTIGESTURE // @todo SDL_DROPFILE // @todo SDL_DROPTEXT // @todo SDL_DROPBEGIN // @todo SDL_DROPCOMPLETE // @todo SDL_AUDIODEVICEADDED // @todo SDL_AUDIODEVICEREMOVED } return map; }