Browse code

Various keyboard handling improvements

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

Andrew Alderwick authored on 19/06/2021 12:56:55
Showing 1 changed files
... ...
@@ -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;