The Ctrl, Alt and Shift bits in Controller/button activate with either
left or right modifier keys, and either can be used to take screenshots
/ zoom / show debugging info rather than left modifiers only.
Delete now sets Controller/key to 0x7f rather than being ignored (by
setting Controller/key to 0x00).
Ctrl + letter now sets Controller/key to 0x01-0x1e rather than being
ignored: for example, Ctrl+S will set Controller/key to 0x13.
Controller/vector is no longer called twice per key press (the extra
call with Controller/key set to 0x00 is removed).
| ... | ... |
@@ -145,7 +145,6 @@ init(void) |
| 145 | 145 |
return error("Texture", SDL_GetError());
|
| 146 | 146 |
SDL_UpdateTexture(bgTexture, NULL, ppu.bg.pixels, 4); |
| 147 | 147 |
SDL_UpdateTexture(fgTexture, NULL, ppu.fg.pixels, 4); |
| 148 |
- SDL_StartTextInput(); |
|
| 149 | 148 |
SDL_ShowCursor(SDL_DISABLE); |
| 150 | 149 |
SDL_zero(as); |
| 151 | 150 |
as.freq = SAMPLE_FREQUENCY; |
| ... | ... |
@@ -187,34 +186,40 @@ void |
| 187 | 186 |
doctrl(Uxn *u, SDL_Event *event, int z) |
| 188 | 187 |
{
|
| 189 | 188 |
Uint8 flag = 0x00; |
| 190 |
- if(z && event->key.keysym.sym == SDLK_h) |
|
| 191 |
- switch(SDL_GetModState() & (KMOD_LSHIFT | KMOD_LCTRL | KMOD_LALT)) {
|
|
| 192 |
- case KMOD_LSHIFT | KMOD_LCTRL: |
|
| 193 |
- screencapture(); |
|
| 194 |
- break; |
|
| 195 |
- case KMOD_LCTRL: |
|
| 196 |
- toggledebug(u); |
|
| 197 |
- break; |
|
| 198 |
- case KMOD_LALT: |
|
| 199 |
- togglezoom(u); |
|
| 200 |
- break; |
|
| 201 |
- } |
|
| 189 |
+ SDL_Keymod mods = SDL_GetModState(); |
|
| 190 |
+ devctrl->dat[2] &= 0xf8; |
|
| 191 |
+ if(mods & KMOD_CTRL) devctrl->dat[2] |= 0x01; |
|
| 192 |
+ if(mods & KMOD_ALT) devctrl->dat[2] |= 0x02; |
|
| 193 |
+ if(mods & KMOD_SHIFT) devctrl->dat[2] |= 0x04; |
|
| 202 | 194 |
switch(event->key.keysym.sym) {
|
| 203 |
- case SDLK_LCTRL: flag = 0x01; break; |
|
| 204 |
- case SDLK_LALT: flag = 0x02; break; |
|
| 205 |
- case SDLK_LSHIFT: flag = 0x04; break; |
|
| 195 |
+ case SDLK_h: |
|
| 196 |
+ if(z) switch(devctrl->dat[2] & 0x07) {
|
|
| 197 |
+ case 0x1: toggledebug(u); break; |
|
| 198 |
+ case 0x2: togglezoom(u); break; |
|
| 199 |
+ case 0x5: screencapture(); break; |
|
| 200 |
+ } |
|
| 201 |
+ break; |
|
| 206 | 202 |
case SDLK_ESCAPE: flag = 0x08; break; |
| 207 | 203 |
case SDLK_UP: flag = 0x10; break; |
| 208 | 204 |
case SDLK_DOWN: flag = 0x20; break; |
| 209 | 205 |
case SDLK_LEFT: flag = 0x40; break; |
| 210 | 206 |
case SDLK_RIGHT: flag = 0x80; break; |
| 211 | 207 |
} |
| 212 |
- if(flag && z) |
|
| 208 |
+ if(z) |
|
| 213 | 209 |
devctrl->dat[2] |= flag; |
| 214 |
- else if(flag) |
|
| 215 |
- devctrl->dat[2] &= (~flag); |
|
| 216 |
- if(z && event->key.keysym.sym < 20) |
|
| 210 |
+ else |
|
| 211 |
+ devctrl->dat[2] &= ~flag; |
|
| 212 |
+ if(z && event->key.keysym.sym < 0x80) {
|
|
| 217 | 213 |
devctrl->dat[3] = event->key.keysym.sym; |
| 214 |
+ if(devctrl->dat[3] >= 0x60 && devctrl->dat[3] < 0x7f) {
|
|
| 215 |
+ if(devctrl->dat[2] & 0x01) |
|
| 216 |
+ devctrl->dat[3] &= ~0x60; |
|
| 217 |
+ else if(!(devctrl->dat[2] & 0x04) ^ !(mods & KMOD_CAPS)) |
|
| 218 |
+ devctrl->dat[3] &= ~0x20; |
|
| 219 |
+ } |
|
| 220 |
+ } else {
|
|
| 221 |
+ devctrl->dat[3] = 0; |
|
| 222 |
+ } |
|
| 218 | 223 |
} |
| 219 | 224 |
|
| 220 | 225 |
#pragma mark - Devices |
| ... | ... |
@@ -359,14 +364,10 @@ start(Uxn *u) |
| 359 | 364 |
case SDL_QUIT: |
| 360 | 365 |
quit(); |
| 361 | 366 |
break; |
| 362 |
- case SDL_TEXTINPUT: |
|
| 363 | 367 |
case SDL_KEYDOWN: |
| 364 | 368 |
case SDL_KEYUP: |
| 365 |
- if(event.text.text[0] >= ' ' && event.text.text[0] <= '~') |
|
| 366 |
- devctrl->dat[3] = event.text.text[0]; |
|
| 367 | 369 |
doctrl(u, &event, event.type == SDL_KEYDOWN); |
| 368 | 370 |
evaluxn(u, mempeek16(devctrl->dat, 0)); |
| 369 |
- devctrl->dat[3] = 0; |
|
| 370 | 371 |
break; |
| 371 | 372 |
case SDL_MOUSEWHEEL: |
| 372 | 373 |
devmouse->dat[7] = event.wheel.y; |