Skip to content

Can't enter text with physical keyboard in SDL2, only on-screen one #119

@StrikerTheHedgefox

Description

@StrikerTheHedgefox

For some reason, in my program, I can only get text input via the on-screen keys, but not the physical keyboard.
My event code is as follows, just want to know what I'm doing wrong:

void UI_BeginInput()
{
	nk_input_begin(&ctx);
}

void UI_EndInput()
{
	nk_input_end(&ctx);
}

static int UI_ParseEvent(SDL_Event *evt)
{
	switch (evt->type)
	{
		case SDL_KEYUP: // KEYUP & KEYDOWN share same routine
		case SDL_KEYDOWN:
		{
			int down = evt->type == SDL_KEYDOWN;
			switch (evt->key.keysym.sym)
			{
				case SDLK_RSHIFT: // RSHIFT & LSHIFT share same routine
				case SDLK_LSHIFT:
					nk_input_key(&ctx, NK_KEY_SHIFT, down);
					break;

				case SDLK_DELETE:    nk_input_key(&ctx, NK_KEY_DEL, down); break;
				case SDLK_RETURN:    nk_input_key(&ctx, NK_KEY_ENTER, down); break;
				case SDLK_TAB:       nk_input_key(&ctx, NK_KEY_TAB, down); break;
				case SDLK_BACKSPACE: nk_input_key(&ctx, NK_KEY_BACKSPACE, down); break;

				case SDLK_HOME:
					nk_input_key(&ctx, NK_KEY_TEXT_START, down);
					nk_input_key(&ctx, NK_KEY_SCROLL_START, down);
					break;
				case SDLK_END:
					nk_input_key(&ctx, NK_KEY_TEXT_END, down);
					nk_input_key(&ctx, NK_KEY_SCROLL_END, down);
					break;

				case SDLK_PAGEDOWN:  nk_input_key(&ctx, NK_KEY_SCROLL_DOWN, down); break;
				case SDLK_PAGEUP:    nk_input_key(&ctx, NK_KEY_SCROLL_UP, down); break;
				case SDLK_z:         nk_input_key(&ctx, NK_KEY_TEXT_UNDO, down && keyset[SDL_SCANCODE_LCTRL]); break;
				case SDLK_r:         nk_input_key(&ctx, NK_KEY_TEXT_REDO, down && keyset[SDL_SCANCODE_LCTRL]); break;
				case SDLK_c:         nk_input_key(&ctx, NK_KEY_COPY, down && keyset[SDL_SCANCODE_LCTRL]); break;
				case SDLK_v:         nk_input_key(&ctx, NK_KEY_PASTE, down && keyset[SDL_SCANCODE_LCTRL]); break;
				case SDLK_x:         nk_input_key(&ctx, NK_KEY_CUT, down && keyset[SDL_SCANCODE_LCTRL]); break;
				case SDLK_b:         nk_input_key(&ctx, NK_KEY_TEXT_LINE_START, down && keyset[SDL_SCANCODE_LCTRL]); break;
				case SDLK_e:         nk_input_key(&ctx, NK_KEY_TEXT_LINE_END, down && keyset[SDL_SCANCODE_LCTRL]); break;
				case SDLK_UP:        nk_input_key(&ctx, NK_KEY_UP, down); break;
				case SDLK_DOWN:      nk_input_key(&ctx, NK_KEY_DOWN, down); break;
				case SDLK_LEFT:
					if (keyset[SDL_SCANCODE_LCTRL])
						nk_input_key(&ctx, NK_KEY_TEXT_WORD_LEFT, down);
					else nk_input_key(&ctx, NK_KEY_LEFT, down);
					break;
				case SDLK_RIGHT:
					if (keyset[SDL_SCANCODE_LCTRL])
						nk_input_key(&ctx, NK_KEY_TEXT_WORD_RIGHT, down);
					else nk_input_key(&ctx, NK_KEY_RIGHT, down);
					break;
			}

			return 1;
		}

		case SDL_MOUSEBUTTONUP: // MOUSEBUTTONUP & MOUSEBUTTONDOWN share same routine
		case SDL_MOUSEBUTTONDOWN:
		{
			int down = evt->type == SDL_MOUSEBUTTONDOWN;
			const int x = evt->button.x, y = evt->button.y;
			switch (evt->button.button)
			{
				case SDL_BUTTON_LEFT:
				{
					if (evt->button.clicks > 1)
						nk_input_button(&ctx, NK_BUTTON_DOUBLE, x, y, down);
					nk_input_button(&ctx, NK_BUTTON_LEFT, x, y, down);
					break;
				}
				case SDL_BUTTON_MIDDLE: nk_input_button(&ctx, NK_BUTTON_MIDDLE, x, y, down); break;
				case SDL_BUTTON_RIGHT:  nk_input_button(&ctx, NK_BUTTON_RIGHT, x, y, down); break;
			}

			return 1;
		}

		case SDL_MOUSEMOTION:
		{
			if (ctx.input.mouse.grabbed)
			{
				int x = (int)ctx.input.mouse.prev.x, y = (int)ctx.input.mouse.prev.y;
				nk_input_motion(&ctx, x + evt->motion.xrel, y + evt->motion.yrel);
			}
			else
				nk_input_motion(&ctx, evt->motion.x, evt->motion.y);

			return 1;
		}

		case SDL_TEXTINPUT:
		{
			nk_glyph glyph;
			memcpy(glyph, evt->text.text, NK_UTF_SIZE);
			nk_input_glyph(&ctx, glyph);

			return 1;
		}

		case SDL_MOUSEWHEEL:
		{
			nk_input_scroll(&ctx, nk_vec2((float)evt->wheel.x, (float)evt->wheel.y));

			return 1;
		}
	}

	return 0;
}
void SDL_ParseEvents()
{
	SDL_Event e;

	UI_BeginInput();

	while (SDL_PollEvent(&e) != 0)
	{
		switch (e.type)
		{
			case SDL_QUIT:
				quitFlag = 1;
				break;
			case SDL_KEYDOWN:
			case SDL_KEYUP:
				INPUT_BufferScan(e.key.keysym.scancode);
				INPUT_SetKey(e.key.keysym.scancode, e.key.state);

				if (e.type == SDL_KEYDOWN && !SDL_IsTextInputActive()) // Thanks Evan Ramos/Hendricks266 for this code!
				{
					SDL_Keycode keyvalue = e.key.keysym.sym;

					if ('a' <= keyvalue && keyvalue <= 'z')
					{
						if (!!(e.key.keysym.mod & KMOD_SHIFT) ^ !!(e.key.keysym.mod & KMOD_CAPS))
							keyvalue -= 'a' - 'A';
					}
					else if (e.key.keysym.mod & KMOD_SHIFT)
					{
						switch (keyvalue)
						{
						case '\'': keyvalue = '"'; break;

						case ',': keyvalue = '<'; break;
						case '-': keyvalue = '_'; break;
						case '.': keyvalue = '>'; break;
						case '/': keyvalue = '?'; break;
						case '0': keyvalue = ')'; break;
						case '1': keyvalue = '!'; break;
						case '2': keyvalue = '@'; break;
						case '3': keyvalue = '#'; break;
						case '4': keyvalue = '$'; break;
						case '5': keyvalue = '%'; break;
						case '6': keyvalue = '^'; break;
						case '7': keyvalue = '&'; break;
						case '8': keyvalue = '*'; break;
						case '9': keyvalue = '('; break;

						case ';': keyvalue = ':'; break;

						case '=': keyvalue = '+'; break;

						case '[': keyvalue = '{'; break;
						case '\\': keyvalue = '|'; break;
						case ']': keyvalue = '}'; break;

						case '`': keyvalue = '~'; break;
						}
					}
					else if (e.key.keysym.mod & KMOD_NUM) // && !(ev.key.keysym.mod & KMOD_SHIFT)
					{
						switch (keyvalue)
						{
						case SDLK_KP_1: keyvalue = '1'; break;
						case SDLK_KP_2: keyvalue = '2'; break;
						case SDLK_KP_3: keyvalue = '3'; break;
						case SDLK_KP_4: keyvalue = '4'; break;
						case SDLK_KP_5: keyvalue = '5'; break;
						case SDLK_KP_6: keyvalue = '6'; break;
						case SDLK_KP_7: keyvalue = '7'; break;
						case SDLK_KP_8: keyvalue = '8'; break;
						case SDLK_KP_9: keyvalue = '9'; break;
						case SDLK_KP_0: keyvalue = '0'; break;
						case SDLK_KP_PERIOD: keyvalue = '.'; break;
						case SDLK_KP_COMMA: keyvalue = ','; break;
						}
					}

					switch (keyvalue)
					{
						case SDLK_KP_DIVIDE: keyvalue = '/'; break;
						case SDLK_KP_MULTIPLY: keyvalue = '*'; break;
						case SDLK_KP_MINUS: keyvalue = '-'; break;
						case SDLK_KP_PLUS: keyvalue = '+'; break;
					}

					INPUT_BufferKey(keyvalue);
				}
				break;
			case SDL_JOYHATMOTION:
				INPUT_GetJoyHatInfo(&e.jhat);
				break;
			case SDL_JOYBUTTONUP:
			case SDL_JOYBUTTONDOWN:
				INPUT_GetJoyButtonInfo(&e.jbutton);
				break;
			case SDL_JOYAXISMOTION:
				INPUT_GetJoyAxisInfo(&e.jaxis);
				break;
			case SDL_MOUSEMOTION:
			case SDL_MOUSEBUTTONDOWN:
			case SDL_MOUSEBUTTONUP:
				INPUT_GetMouseInput();
				break;
			case SDL_WINDOWEVENT:
			{
				switch (e.window.event)
				{
					case SDL_WINDOWEVENT_FOCUS_GAINED:
						setPause((pauseFlag == PAUSE_NORMAL) ? PAUSE_NORMAL : PAUSE_OFF);
						break;
					case SDL_WINDOWEVENT_FOCUS_LOST:
						setPause((pauseFlag == PAUSE_OFF) ? PAUSE_UNFOCUSED : PAUSE_NORMAL);
						break;
					case SDL_WINDOWEVENT_RESIZED:
						RENDER_SetResolution(e.window.data1, e.window.data2, refreshRate, 0);
						break;
				}
				break;
			}
		}

		UI_HandleEvent(&e);
	}

	UI_EndInput();
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions