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; |