Browse code

Fix keyboard problems introduced in improvements

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.

Andrew Alderwick authored on 20/06/2021 21:14:06
Showing 1 changed files
... ...
@@ -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;