| ... | ... |
@@ -393,22 +393,42 @@ restart(Uxn *u) |
| 393 | 393 |
start(u, "boot.rom"); |
| 394 | 394 |
} |
| 395 | 395 |
|
| 396 |
+Uint8 |
|
| 397 |
+get_button(SDL_Event event) |
|
| 398 |
+{
|
|
| 399 |
+ switch(event.key.keysym.sym) {
|
|
| 400 |
+ case SDLK_LCTRL: return 0x01; |
|
| 401 |
+ case SDLK_LALT: return 0x02; |
|
| 402 |
+ case SDLK_LSHIFT: return 0x04; |
|
| 403 |
+ case SDLK_ESCAPE: return 0x08; |
|
| 404 |
+ case SDLK_UP: return 0x10; |
|
| 405 |
+ case SDLK_DOWN: return 0x20; |
|
| 406 |
+ case SDLK_LEFT: return 0x40; |
|
| 407 |
+ case SDLK_RIGHT: return 0x80; |
|
| 408 |
+ } |
|
| 409 |
+ return 0x00; |
|
| 410 |
+} |
|
| 411 |
+ |
|
| 412 |
+void |
|
| 413 |
+controller_down(Device *d, Uint8 mask) |
|
| 414 |
+{
|
|
| 415 |
+ d->dat[2] |= mask; |
|
| 416 |
+ uxn_eval(d->u, d->vector); |
|
| 417 |
+} |
|
| 418 |
+ |
|
| 419 |
+void |
|
| 420 |
+controller_up(Device *d, Uint8 mask) |
|
| 421 |
+{
|
|
| 422 |
+ d->dat[2] &= (~mask); |
|
| 423 |
+ uxn_eval(d->u, d->vector); |
|
| 424 |
+} |
|
| 425 |
+ |
|
| 396 | 426 |
static void |
| 397 | 427 |
doctrl(Uxn *u, SDL_Event *event, int z) |
| 398 | 428 |
{
|
| 399 |
- Uint8 flag = 0x00; |
|
| 400 | 429 |
SDL_Keymod mods = SDL_GetModState(); |
| 401 |
- devctrl->dat[2] &= 0xf8; |
|
| 402 |
- if(mods & KMOD_CTRL) devctrl->dat[2] |= 0x01; |
|
| 403 |
- if(mods & KMOD_ALT) devctrl->dat[2] |= 0x02; |
|
| 404 |
- if(mods & KMOD_SHIFT) devctrl->dat[2] |= 0x04; |
|
| 405 | 430 |
/* clang-format off */ |
| 406 | 431 |
switch(event->key.keysym.sym) {
|
| 407 |
- case SDLK_ESCAPE: flag = 0x08; break; |
|
| 408 |
- case SDLK_UP: flag = 0x10; break; |
|
| 409 |
- case SDLK_DOWN: flag = 0x20; break; |
|
| 410 |
- case SDLK_LEFT: flag = 0x40; break; |
|
| 411 |
- case SDLK_RIGHT: flag = 0x80; break; |
|
| 412 | 432 |
case SDLK_F1: if(z) set_zoom(zoom > 2 ? 1 : zoom + 1); break; |
| 413 | 433 |
case SDLK_F2: if(z) devsystem->dat[0xe] = !devsystem->dat[0xe]; ppu_clear(&ppu, &ppu.fg); break; |
| 414 | 434 |
case SDLK_F3: if(z) capture_screen(); break; |
| ... | ... |
@@ -417,13 +437,11 @@ doctrl(Uxn *u, SDL_Event *event, int z) |
| 417 | 437 |
} |
| 418 | 438 |
/* clang-format on */ |
| 419 | 439 |
if(z) {
|
| 420 |
- devctrl->dat[2] |= flag; |
|
| 421 | 440 |
if(event->key.keysym.sym < 0x20 || event->key.keysym.sym == SDLK_DELETE) |
| 422 | 441 |
devctrl->dat[3] = event->key.keysym.sym; |
| 423 | 442 |
else if((mods & KMOD_CTRL) && event->key.keysym.sym >= SDLK_a && event->key.keysym.sym <= SDLK_z) |
| 424 | 443 |
devctrl->dat[3] = event->key.keysym.sym - (mods & KMOD_SHIFT) * 0x20; |
| 425 |
- } else |
|
| 426 |
- devctrl->dat[2] &= ~flag; |
|
| 444 |
+ } |
|
| 427 | 445 |
} |
| 428 | 446 |
|
| 429 | 447 |
static const char *errors[] = {"underflow", "overflow", "division by zero"};
|
| ... | ... |
@@ -453,6 +471,22 @@ run(Uxn *u) |
| 453 | 471 |
if(!BENCH) |
| 454 | 472 |
begin = SDL_GetPerformanceCounter(); |
| 455 | 473 |
while(SDL_PollEvent(&event) != 0) {
|
| 474 |
+ /* new handlers */ |
|
| 475 |
+ if(event.type == SDL_MOUSEWHEEL) |
|
| 476 |
+ mouse_z(devmouse, event.wheel.y); |
|
| 477 |
+ else if(event.type == SDL_MOUSEBUTTONUP) |
|
| 478 |
+ mouse_up(devmouse, 0x1 << (event.button.button - 1)); |
|
| 479 |
+ else if(event.type == SDL_MOUSEBUTTONDOWN) |
|
| 480 |
+ mouse_down(devmouse, 0x1 << (event.button.button - 1)); |
|
| 481 |
+ else if(event.type == SDL_MOUSEMOTION) |
|
| 482 |
+ mouse_xy(devmouse, |
|
| 483 |
+ clamp(event.motion.x - PAD, 0, ppu.width - 1), |
|
| 484 |
+ clamp(event.motion.y - PAD, 0, ppu.height - 1)); |
|
| 485 |
+ else if(event.type == SDL_KEYDOWN) |
|
| 486 |
+ controller_down(devctrl, get_button(event)); |
|
| 487 |
+ else if(event.type == SDL_KEYUP) |
|
| 488 |
+ controller_up(devctrl, get_button(event)); |
|
| 489 |
+ /* continue */ |
|
| 456 | 490 |
switch(event.type) {
|
| 457 | 491 |
case SDL_DROPFILE: |
| 458 | 492 |
set_size(WIDTH, HEIGHT, 0); |
| ... | ... |
@@ -474,20 +508,6 @@ run(Uxn *u) |
| 474 | 508 |
goto breakout; |
| 475 | 509 |
} |
| 476 | 510 |
break; |
| 477 |
- case SDL_MOUSEWHEEL: |
|
| 478 |
- mouse_z(devmouse, event.wheel.y); |
|
| 479 |
- break; |
|
| 480 |
- case SDL_MOUSEBUTTONUP: |
|
| 481 |
- mouse_up(devmouse, 0x1 << (event.button.button - 1)); |
|
| 482 |
- break; |
|
| 483 |
- case SDL_MOUSEBUTTONDOWN: |
|
| 484 |
- mouse_down(devmouse, 0x1 << (event.button.button - 1)); |
|
| 485 |
- break; |
|
| 486 |
- case SDL_MOUSEMOTION: |
|
| 487 |
- mouse_xy(devmouse, |
|
| 488 |
- clamp(event.motion.x - PAD, 0, ppu.width - 1), |
|
| 489 |
- clamp(event.motion.y - PAD, 0, ppu.height - 1)); |
|
| 490 |
- break; |
|
| 491 | 511 |
case SDL_WINDOWEVENT: |
| 492 | 512 |
if(event.window.event == SDL_WINDOWEVENT_EXPOSED) |
| 493 | 513 |
redraw(u); |