static int handle_joy_event(struct in_sdl_state *state, SDL_Event *event, int *kc_out, int *down_out) { int kc = -1, down = 0, ret = 0; /* TODO: remaining axis */ switch (event->type) { case SDL_JOYAXISMOTION: if (event->jaxis.which != state->joy_id) return -2; if (event->jaxis.axis > 1) break; if (-16384 <= event->jaxis.value && event->jaxis.value <= 16384) { kc = state->axis_keydown[event->jaxis.axis]; state->axis_keydown[event->jaxis.axis] = 0; ret = 1; } else if (event->jaxis.value < -16384) { kc = state->axis_keydown[event->jaxis.axis]; if (kc) update_keystate(state->keystate, kc, 0); kc = event->jaxis.axis ? SDLK_UP : SDLK_LEFT; state->axis_keydown[event->jaxis.axis] = kc; down = 1; ret = 1; } else if (event->jaxis.value > 16384) { kc = state->axis_keydown[event->jaxis.axis]; if (kc) update_keystate(state->keystate, kc, 0); kc = event->jaxis.axis ? SDLK_DOWN : SDLK_RIGHT; state->axis_keydown[event->jaxis.axis] = kc; down = 1; ret = 1; } break; case SDL_JOYBUTTONDOWN: case SDL_JOYBUTTONUP: if (event->jbutton.which != state->joy_id) return -2; kc = (int)event->jbutton.button + SDLK_WORLD_0; down = event->jbutton.state == SDL_PRESSED; ret = 1; break; default: return -1; } if (ret) update_keystate(state->keystate, kc, down); if (kc_out != NULL) *kc_out = kc; if (down_out != NULL) *down_out = down; return ret; }
void LocalClient::KeystateTaskThread::task() { #define KEYSTATE_GRANULARITY_MS 46.66 // aiming for as low a rate as possible static TIMER keystate_timer; keystate_timer.begin(); while (LocalClient::KeystateTaskThread::is_running() && LocalClient::is_connected()) { if (keystate_timer.get_ms() > KEYSTATE_GRANULARITY_MS) { update_keystate(keys); post_keystate(); keystate_timer.begin(); long wait_ms = KEYSTATE_GRANULARITY_MS - keystate_timer.get_ms(); if (wait_ms > 1) { SLEEP_MS(wait_ms); } } } }
static int handle_event(struct in_sdl_state *state, SDL_Event *event, int *kc_out, int *down_out) { if (event->type != SDL_KEYDOWN && event->type != SDL_KEYUP) return -1; update_keystate(state->keystate, event->key.keysym.sym, event->type == SDL_KEYDOWN); if (kc_out != NULL) *kc_out = event->key.keysym.sym; if (down_out != NULL) *down_out = event->type == SDL_KEYDOWN; return 1; }