Handling of a lot of ordinary keys was broken, e.g. number row and
non-alphanumeric keys, especially with Shift.
I think what's broken has been fixed, but have reverted the improvement
that Controller/vector is only called once per keypress. Many keys cause
Controller/vector to be called twice, but only once with Controller/key
nonzero.
... | ... |
@@ -145,6 +145,7 @@ 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(); |
|
148 | 149 |
SDL_ShowCursor(SDL_DISABLE); |
149 | 150 |
SDL_zero(as); |
150 | 151 |
as.freq = SAMPLE_FREQUENCY; |
... | ... |
@@ -188,7 +189,11 @@ doctrl(Uxn *u, SDL_Event *event, int z) |
188 | 189 |
Uint8 flag = 0x00; |
189 | 190 |
SDL_Keymod mods = SDL_GetModState(); |
190 | 191 |
devctrl->dat[2] &= 0xf8; |
191 |
- if(mods & KMOD_CTRL) devctrl->dat[2] |= 0x01; |
|
192 |
+ if(mods & KMOD_CTRL) { |
|
193 |
+ devctrl->dat[2] |= 0x01; |
|
194 |
+ if(z && event->key.keysym.sym >= SDLK_a && event->key.keysym.sym <= SDLK_z) |
|
195 |
+ devctrl->dat[3] = event->key.keysym.sym & 0x1f; |
|
196 |
+ } |
|
192 | 197 |
if(mods & KMOD_ALT) devctrl->dat[2] |= 0x02; |
193 | 198 |
if(mods & KMOD_SHIFT) devctrl->dat[2] |= 0x04; |
194 | 199 |
switch(event->key.keysym.sym) { |
... | ... |
@@ -204,22 +209,12 @@ doctrl(Uxn *u, SDL_Event *event, int z) |
204 | 209 |
case SDLK_DOWN: flag = 0x20; break; |
205 | 210 |
case SDLK_LEFT: flag = 0x40; break; |
206 | 211 |
case SDLK_RIGHT: flag = 0x80; break; |
212 |
+ case SDLK_DELETE: devctrl->dat[3] = z ? 0x7f : 0x00; break; |
|
207 | 213 |
} |
208 | 214 |
if(z) |
209 | 215 |
devctrl->dat[2] |= flag; |
210 | 216 |
else |
211 | 217 |
devctrl->dat[2] &= ~flag; |
212 |
- if(z && event->key.keysym.sym < 0x80) { |
|
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 |
- } |
|
223 | 218 |
} |
224 | 219 |
|
225 | 220 |
#pragma mark - Devices |
... | ... |
@@ -364,10 +359,13 @@ start(Uxn *u) |
364 | 359 |
case SDL_QUIT: |
365 | 360 |
quit(); |
366 | 361 |
break; |
362 |
+ case SDL_TEXTINPUT: |
|
363 |
+ devctrl->dat[3] = event.text.text[0]; |
|
367 | 364 |
case SDL_KEYDOWN: |
368 | 365 |
case SDL_KEYUP: |
369 | 366 |
doctrl(u, &event, event.type == SDL_KEYDOWN); |
370 | 367 |
evaluxn(u, mempeek16(devctrl->dat, 0)); |
368 |
+ devctrl->dat[3] = 0; |
|
371 | 369 |
break; |
372 | 370 |
case SDL_MOUSEWHEEL: |
373 | 371 |
devmouse->dat[7] = event.wheel.y; |