Chesto 0.9
A declarative and element-based library for creating GUIs on homebrew'd consoles
Public Member Functions | Static Public Member Functions | Public Attributes | Static Public Attributes | List of all members
InputEvents Class Reference
Collaboration diagram for InputEvents:
Collaboration graph
[legend]

Public Member Functions

bool held (int buttons)
 whether or not a button is pressed during this cycle More...
 
bool pressed (int buttons)
 
bool released (int buttons)
 
bool touchIn (int x, int width, int y, int height)
 whether or not a touch is detected within the specified rect in this cycle More...
 
bool processSDLEvents ()
 update which buttons are pressed More...
 
bool update ()
 
bool isTouchDown ()
 
bool isTouchUp ()
 
bool isTouchDrag ()
 
bool isTouch ()
 
bool isScroll ()
 
bool isKeyDown ()
 
bool isKeyUp ()
 
bool processDirectionalButtons ()
 
int directionForKeycode ()
 
void toggleHeldButtons ()
 
void processJoystickHotplugging (SDL_Event *event)
 joystick device events processing More...
 

Static Public Member Functions

static GamepadInfogetLastGamepadInfo ()
 

Public Attributes

bool allowTouch = true
 
bool isScrolling = false
 
CST_Keycode keyCode = -1
 
CST_Keymod mod = -1
 
SDL_Event event
 
bool held_directions [4] = { false, false, false, false }
 
Uint32 held_type
 
int rapidFireRate = 12
 
int curFrame = 0
 
std::function< void()> quitaction = NULL
 
float wheelScroll = 0
 
int yPos = 0
 
int xPos = 0
 
bool noop = false
 
Uint32 type
 

Static Public Attributes

static bool bypassKeyEvents = false
 
static std::string lastGamepadKey = defaultKeyName
 

Detailed Description

Definition at line 75 of file InputEvents.hpp.

Constructor & Destructor Documentation

◆ InputEvents()

InputEvents::InputEvents ( )

Definition at line 67 of file InputEvents.cpp.

68{
69#if defined(__WIIU__) && defined(USE_KEYBOARD)
70 // hook up keyboard events for wiiu and SDL (TODO: have these fired by SDL2 port itself)
71 KBWrapper* kbdwrapper = new KBWrapper(true, true);
72#endif
73}

Member Function Documentation

◆ directionForKeycode()

int InputEvents::directionForKeycode ( )

Definition at line 240 of file InputEvents.cpp.

241{
242 // this keycode overlaps with some other constants, so just return asap
243 if (this->type == SDL_KEYDOWN && this->keyCode == SDLK_RETURN)
244 return -1;
245
246 // returns 0 1 2 or 3 for up down left or right
247 switch (this->keyCode)
248 {
249 case SDL_UP_STICK:
250 case SDL_UP:
251 case SDLK_UP:
252 return 0;
253 case SDL_DOWN_STICK:
254 case SDL_DOWN:
255 case SDLK_DOWN:
256 return 1;
257 case SDL_LEFT_STICK:
258 case SDL_LEFT:
259 case SDLK_LEFT:
260 return 2;
261 case SDL_RIGHT_STICK:
262 case SDL_RIGHT:
263 case SDLK_RIGHT:
264 return 3;
265 default:
266 return -1;
267 }
268 return -1;
269}

◆ getLastGamepadInfo()

GamepadInfo & InputEvents::getLastGamepadInfo ( )
static

Definition at line 365 of file InputEvents.cpp.

366{
367 return gamepadMap[lastGamepadKey];
368}

◆ held()

bool InputEvents::held ( int  buttons)

whether or not a button is pressed during this cycle

Definition at line 271 of file InputEvents.cpp.

272{
273 // if it's a key event
274 if ((this->type == SDL_KEYDOWN || this->type == SDL_KEYUP) && !InputEvents::bypassKeyEvents)
275 {
276 for (int x = 0; x < TOTAL_BUTTONS; x++)
277 if (key_buttons[x] == keyCode && (buttons & currentButtons[x]))
278 return true;
279 }
280
281 // if it's a controller event
282 else if (this->type == SDL_JOYBUTTONDOWN || this->type == SDL_JOYBUTTONUP)
283 {
284 for (int x = 0; x < TOTAL_BUTTONS; x++)
285 if (pad_buttons[x] == keyCode && (buttons & currentButtons[x]))
286 return true;
287 }
288
289 return false;
290}

Referenced by Button::process(), and EKeyboard::process().

◆ isKeyDown()

bool InputEvents::isKeyDown ( )

Definition at line 332 of file InputEvents.cpp.

333{
334 return this->type == SDL_KEYDOWN || this->type == SDL_JOYBUTTONDOWN;
335}

◆ isKeyUp()

bool InputEvents::isKeyUp ( )

Definition at line 337 of file InputEvents.cpp.

338{
339 return this->type == SDL_KEYUP || this->type == SDL_JOYBUTTONUP;
340}

◆ isScroll()

bool InputEvents::isScroll ( )

Definition at line 327 of file InputEvents.cpp.

328{
329 return this->isScrolling;
330}

◆ isTouch()

bool InputEvents::isTouch ( )

Definition at line 322 of file InputEvents.cpp.

323{
324 return isTouchDown() || isTouchDrag() || isTouchUp();
325}

◆ isTouchDown()

bool InputEvents::isTouchDown ( )

Definition at line 307 of file InputEvents.cpp.

308{
309 return this->type == SDL_MOUSEBUTTONDOWN || (allowTouch && this->type == SDL_FINGERDOWN);
310}

◆ isTouchDrag()

bool InputEvents::isTouchDrag ( )

Definition at line 312 of file InputEvents.cpp.

313{
314 return this->type == SDL_MOUSEMOTION || (allowTouch && this->type == SDL_FINGERMOTION);
315}

◆ isTouchUp()

bool InputEvents::isTouchUp ( )

Definition at line 317 of file InputEvents.cpp.

318{
319 return this->type == SDL_MOUSEBUTTONUP || (allowTouch && this->type == SDL_FINGERUP);
320}

◆ pressed()

bool InputEvents::pressed ( int  buttons)

Definition at line 292 of file InputEvents.cpp.

293{
294 return isKeyDown() && held(buttons);
295}
bool held(int buttons)
whether or not a button is pressed during this cycle

◆ processDirectionalButtons()

bool InputEvents::processDirectionalButtons ( )

Definition at line 213 of file InputEvents.cpp.

214{
215 // up the counter
216 curFrame++;
217
218 // if one of the four direction keys is true, fire off repeat events for it
219 // (when rapidFire lines up only)
220 if (curFrame > 0 && curFrame % rapidFireRate == 0)
221 {
222 for (int x = 0; x < 4; x++)
223 {
224 if (!held_directions[x])
225 continue;
226
227 // send a corresponding directional event
228 this->type = held_type;
229 bool isGamepad = (this->type == SDL_JOYBUTTONDOWN || this->type == SDL_JOYBUTTONUP);
230 this->keyCode = isGamepad ? pad_buttons[4 + x] : key_buttons[4 + x]; // send up through right directions
231 this->noop = false;
232
233 return true;
234 }
235 }
236
237 return false;
238}

◆ processJoystickHotplugging()

void InputEvents::processJoystickHotplugging ( SDL_Event *  event)

joystick device events processing

Definition at line 342 of file InputEvents.cpp.

343{
344 SDL_Joystick *j;
345 switch(event->type)
346 {
347 case SDL_JOYDEVICEADDED:
348 j = SDL_JoystickOpen(event->jdevice.which);
349 if (j)
350 printf("Added joystick device: %s, with ID %d\n", SDL_JoystickName(j), SDL_JoystickInstanceID(j));
351 break;
352 case SDL_JOYDEVICEREMOVED:
353 j = SDL_JoystickFromInstanceID(event->jdevice.which);
354 if (j && SDL_JoystickGetAttached(j))
355 {
356 printf("Removed joystick device: %s\n", SDL_JoystickName(j));
357 SDL_JoystickClose(j);
358 }
359 break;
360 default:
361 break;
362 }
363}

Referenced by processSDLEvents().

◆ processSDLEvents()

bool InputEvents::processSDLEvents ( )

update which buttons are pressed

Definition at line 75 of file InputEvents.cpp.

76{
77 // get an event from SDL
78 if (!SDL_PollEvent(&event))
79 return false;
80
81 // update our variables
82 this->type = event.type;
83 this->noop = false;
84
85 // process joystick hotplugging events
87
88 std::string curControllerName= lastGamepadKey;
89
90 // get the controller name
91 if (this->type == SDL_KEYDOWN || this->type == SDL_KEYUP) {
92 // keyboard event
93 lastGamepadKey = "Keyboard";
94 } else if (this->type == SDL_JOYBUTTONDOWN || this->type == SDL_JOYBUTTONUP) {
95 SDL_Joystick* joystickId = SDL_JoystickFromInstanceID(event.jbutton.which);
96 if (joystickId != NULL) {
97 std::string controllerName = SDL_JoystickName(joystickId);
98 lastGamepadKey = defaultKeyName; // default in case no match is found
99 if (!controllerName.empty() && gamepadMap.find(controllerName) != gamepadMap.end()){
100 lastGamepadKey = controllerName;
101 }
102 }
103 }
104 if (curControllerName != lastGamepadKey) {
105 printf("Switched to controller profile: %s\n", lastGamepadKey.c_str());
106 GamepadInfo& gamepadInfo = gamepadMap[lastGamepadKey];
107 if (gamepadInfo.buttons != nullptr) {
108 currentButtons = gamepadInfo.buttons;
109 }
110 // keyButtonNames = gamepadInfo.names;
111 // TODO: callback to update all buttons on the UI
112 }
113
114 this->isScrolling = false;
115
116#ifdef PC
117 this->allowTouch = false;
118 if (event.type == SDL_MOUSEWHEEL) {
119 this->wheelScroll = event.wheel.y;
120 this->isScrolling = true;
121 }
122#endif
123
124 if (this->type == SDL_QUIT)
125 {
126 return false; //Quitting overrides all other events.
127 }
128 else if (event.key.repeat == 0 && (this->type == SDL_KEYDOWN || this->type == SDL_KEYUP))
129 {
130 this->keyCode = event.key.keysym.sym;
131 this->mod = event.key.keysym.mod;
132 }
133 else if (this->type == SDL_JOYBUTTONDOWN || this->type == SDL_JOYBUTTONUP)
134 {
135 this->keyCode = event.jbutton.button;
136 }
137 else if (this->type == SDL_MOUSEMOTION || this->type == SDL_MOUSEBUTTONUP || this->type == SDL_MOUSEBUTTONDOWN)
138 {
139 bool isMotion = this->type == SDL_MOUSEMOTION;
140
141 this->yPos = isMotion ? event.motion.y : event.button.y;
142 this->xPos = isMotion ? event.motion.x : event.button.x;
143 }
144 else if (allowTouch && (this->type == SDL_FINGERMOTION || this->type == SDL_FINGERUP || this->type == SDL_FINGERDOWN))
145 {
146 this->yPos = event.tfinger.y * SCREEN_HEIGHT;
147 this->xPos = event.tfinger.x * SCREEN_WIDTH;
148 }
149
150 if (this->type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_RESIZED) {
151 printf("Window resized to %dx%d\n", event.window.data1, event.window.data2);
152 RootDisplay::mainDisplay->setScreenResolution(
153 event.window.data1 * RootDisplay::dpiScale,
154 event.window.data2 * RootDisplay::dpiScale
155 );
156
157 // callback to alert the app that the window changed resolution
158 if (RootDisplay::mainDisplay->windowResizeCallback)
159 RootDisplay::mainDisplay->windowResizeCallback();
160
161 RootDisplay::mainDisplay->needsRedraw = true;
162 }
163
164 // offset the x, y positions by the dpi scale
165 this->xPos = (int)(this->xPos * RootDisplay::dpiScale);
166 this->yPos = (int)(this->yPos * RootDisplay::dpiScale);
167
168 toggleHeldButtons();
169
170 return true;
171}
bool needsRedraw
whether or not this element needs the screen redrawn next time it's processed
Definition: Element.hpp:86
void processJoystickHotplugging(SDL_Event *event)
joystick device events processing

References Element::needsRedraw, and processJoystickHotplugging().

◆ released()

bool InputEvents::released ( int  buttons)

Definition at line 297 of file InputEvents.cpp.

298{
299 return isKeyUp() && held(buttons);
300}

◆ toggleHeldButtons()

void InputEvents::toggleHeldButtons ( )

Definition at line 183 of file InputEvents.cpp.

184{
185 int directionCode = directionForKeycode();
186
187 if (directionCode >= 0)
188 {
189 if (isKeyDown())
190 {
191 // make sure it's not already down
192 if (!held_directions[directionCode])
193 {
194 // on key down, set the corresponding held boolean to true
195 held_directions[directionCode] = true;
196 held_type = this->type;
197
198 // reset the frame counter so we don't fire on this frame
199 // (initial reset is lower to add a slight delay when they first start holding)
200 curFrame = -25;
201 }
202 }
203
204 if (isKeyUp())
205 {
206 // release the corresponding key too
207 held_directions[directionCode] = false;
208 }
209 }
210}

◆ touchIn()

bool InputEvents::touchIn ( int  x,
int  width,
int  y,
int  height 
)

whether or not a touch is detected within the specified rect in this cycle

Definition at line 302 of file InputEvents.cpp.

303{
304 return (this->xPos >= x && this->xPos <= x + width && this->yPos >= y && this->yPos <= y + height);
305}

Referenced by EKeyboard::process(), and Element::process().

◆ update()

bool InputEvents::update ( )

Definition at line 173 of file InputEvents.cpp.

174{
175 this->type = 0;
176 this->keyCode = -1;
177 this->noop = true;
178
179 // process SDL or directional events
180 return processSDLEvents() || processDirectionalButtons();
181}
bool processSDLEvents()
update which buttons are pressed
Definition: InputEvents.cpp:75

Member Data Documentation

◆ allowTouch

bool InputEvents::allowTouch = true

Definition at line 92 of file InputEvents.hpp.

◆ bypassKeyEvents

bool InputEvents::bypassKeyEvents = false
static

Definition at line 123 of file InputEvents.hpp.

◆ curFrame

int InputEvents::curFrame = 0

Definition at line 121 of file InputEvents.hpp.

◆ event

SDL_Event InputEvents::event

Definition at line 115 of file InputEvents.hpp.

◆ held_directions

bool InputEvents::held_directions[4] = { false, false, false, false }

Definition at line 117 of file InputEvents.hpp.

◆ held_type

Uint32 InputEvents::held_type

Definition at line 118 of file InputEvents.hpp.

◆ isScrolling

bool InputEvents::isScrolling = false

Definition at line 93 of file InputEvents.hpp.

◆ keyCode

CST_Keycode InputEvents::keyCode = -1

Definition at line 113 of file InputEvents.hpp.

◆ lastGamepadKey

std::string InputEvents::lastGamepadKey = defaultKeyName
static

Definition at line 125 of file InputEvents.hpp.

◆ mod

CST_Keymod InputEvents::mod = -1

Definition at line 114 of file InputEvents.hpp.

◆ noop

bool InputEvents::noop = false

Definition at line 133 of file InputEvents.hpp.

◆ quitaction

std::function<void()> InputEvents::quitaction = NULL

Definition at line 127 of file InputEvents.hpp.

◆ rapidFireRate

int InputEvents::rapidFireRate = 12

Definition at line 120 of file InputEvents.hpp.

◆ type

Uint32 InputEvents::type

Definition at line 135 of file InputEvents.hpp.

◆ wheelScroll

float InputEvents::wheelScroll = 0

Definition at line 129 of file InputEvents.hpp.

◆ xPos

int InputEvents::xPos = 0

Definition at line 132 of file InputEvents.hpp.

◆ yPos

int InputEvents::yPos = 0

Definition at line 131 of file InputEvents.hpp.


The documentation for this class was generated from the following files: