... | ... |
@@ -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); |