nuclear@0: #include nuclear@0: #include nuclear@0: #include "input.h" nuclear@0: #include "logger.h" nuclear@0: nuclear@0: #define NUM_KEYS 65536 nuclear@0: static std::bitset keystate; nuclear@0: nuclear@0: void set_key_state(int key, bool state) nuclear@0: { nuclear@0: if(key < 0 || key >= NUM_KEYS) { nuclear@0: error_log("set_key_state: key (%d) out of bounds\n", key); nuclear@0: return; nuclear@0: } nuclear@0: keystate[key] = state; nuclear@0: } nuclear@0: nuclear@0: bool get_key_state(int key) nuclear@0: { nuclear@0: if(key < 0 || key >= NUM_KEYS) { nuclear@0: error_log("get_key_state: key (%d) out of bounds\n", key); nuclear@0: return false; nuclear@0: } nuclear@0: return keystate[key]; nuclear@0: } nuclear@0: nuclear@0: struct ButtonState { nuclear@0: bool pressed; nuclear@0: int press_x, press_y; nuclear@0: }; nuclear@0: static std::vector bnstate(16); nuclear@0: #define MAX_BNSTATE 128 nuclear@0: static int mouse_x, mouse_y; nuclear@0: nuclear@0: void set_mouse_state(int x, int y, int bn, bool state) nuclear@0: { nuclear@0: mouse_x = x; nuclear@0: mouse_y = y; nuclear@0: nuclear@0: if(bn < 0 || bn >= MAX_BNSTATE) { nuclear@0: return; nuclear@0: } nuclear@0: if((size_t)bn >= bnstate.size()) { nuclear@0: bnstate.resize(bn + 1); nuclear@0: } nuclear@0: nuclear@0: bnstate[bn].pressed = state; nuclear@0: if(state) { nuclear@0: bnstate[bn].press_x = x; nuclear@0: bnstate[bn].press_y = y; nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: bool mouse_button(int bn) nuclear@0: { nuclear@0: if(bn < 0 || (size_t)bn >= bnstate.size()) { nuclear@0: return false; nuclear@0: } nuclear@0: return bnstate[bn].pressed; nuclear@0: } nuclear@0: nuclear@0: bool mouse_dragging(int bn) nuclear@0: { nuclear@0: if(bn < 0 || (size_t)bn >= bnstate.size()) { nuclear@0: return false; nuclear@0: } nuclear@0: nuclear@0: return bnstate[bn].pressed && mouse_x != bnstate[bn].press_x && nuclear@0: mouse_y != bnstate[bn].press_y; nuclear@0: } nuclear@0: nuclear@0: bool mouse_drag_origin(int bn, int *xorig, int *yorig) nuclear@0: { nuclear@0: if(!mouse_dragging()) { nuclear@0: // this also handles bound issues, no need to recheck nuclear@0: *xorig = mouse_x; nuclear@0: *yorig = mouse_y; nuclear@0: return false; nuclear@0: } nuclear@0: nuclear@0: *xorig = bnstate[bn].press_x; nuclear@0: *yorig = bnstate[bn].press_y; nuclear@0: return true; nuclear@0: }