Beispiel #1
0
void IN_Init(void)
{
	int appState;

	if (!SDL_WasInit(SDL_INIT_VIDEO))
	{
		Com_Error(ERR_FATAL, "IN_Init called before SDL_Init( SDL_INIT_VIDEO )");
		return;
	}

	mainScreen = (SDL_Window *)GLimp_MainWindow();

	Com_DPrintf("\n------- Input Initialization -------\n");

	in_keyboardDebug = Cvar_Get("in_keyboardDebug", "0", CVAR_TEMP);

	// mouse variables
	in_mouse = Cvar_Get("in_mouse", "1", CVAR_ARCHIVE);

	if (in_mouse->integer == 2)
	{
		Com_Printf("Trying to emulate non raw input\n");
		if (!SDL_SetHintWithPriority(SDL_HINT_MOUSE_RELATIVE_MODE_WARP, "1", SDL_HINT_OVERRIDE))
		{
			Com_Printf(S_COLOR_RED "Failed to set the hint");
		}
	}
	else
	{
		SDL_SetHintWithPriority(SDL_HINT_MOUSE_RELATIVE_MODE_WARP, "0", SDL_HINT_OVERRIDE);
	}

	in_nograb = Cvar_Get("in_nograb", "0", CVAR_ARCHIVE);

	in_joystick          = Cvar_Get("in_joystick", "0", CVAR_ARCHIVE | CVAR_LATCH);
	in_joystickThreshold = Cvar_Get("joy_threshold", "0.15", CVAR_ARCHIVE);

	SDL_StartTextInput();

	mouseAvailable = (in_mouse->value != 0);
	IN_DeactivateMouse();

	appState = SDL_GetWindowFlags(mainScreen);
	Cvar_SetValue("com_unfocused", !((appState & SDL_WINDOW_INPUT_FOCUS) && (appState & SDL_WINDOW_MOUSE_FOCUS)));
	Cvar_SetValue("com_minimized", appState & SDL_WINDOW_MINIMIZED);

	IN_InitKeyLockStates();

	// FIXME: Joystick initialization crashes some Windows and Mac OS X clients (see SDL #2833)
	//IN_InitJoystick();

#ifdef DISABLE_DINGY
	IN_EnableDingFilter();
#endif
	Com_DPrintf("------------------------------------\n");
}
Beispiel #2
0
static void IN_ProcessEvents(void)
{
	SDL_Event       e;
	keyNum_t        key         = 0;
	static keyNum_t lastKeyDown = 0;

	if (!SDL_WasInit(SDL_INIT_VIDEO))
	{
		return;
	}

	while (SDL_PollEvent(&e))
	{
		switch (e.type)
		{
		case SDL_KEYDOWN:
			if (e.key.repeat && Key_GetCatcher() == 0)
			{
				break;
			}

			if ((key = IN_TranslateSDLToQ3Key(&e.key.keysym, qtrue)))
			{
				Com_QueueEvent(0, SE_KEY, key, qtrue, 0, NULL);
				if (key == K_BACKSPACE)
				{
					// This was added to keep mod comp, mods do not check K_BACKSPACE but instead use char 8 which is backspace in ascii
					// 8 == CTRL('h') == BS aka Backspace from ascii table
					Com_QueueEvent(0, SE_CHAR, CTRL('h'), 0, 0, NULL);
				}
				else if (keys[K_CTRL].down && key >= 'a' && key <= 'z')
				{
					Com_QueueEvent(0, SE_CHAR, CTRL(key), 0, 0, NULL);
				}
			}
			lastKeyDown = key;
			break;
		case SDL_KEYUP:
			if ((key = IN_TranslateSDLToQ3Key(&e.key.keysym, qfalse)))
			{
				Com_QueueEvent(0, SE_KEY, key, qfalse, 0, NULL);
			}
			lastKeyDown = 0;
			break;
		case SDL_TEXTINPUT:
			if (lastKeyDown != K_CONSOLE)
			{
				char *c = e.text.text;

				// Quick and dirty UTF-8 to UTF-32 conversion
				while (*c)
				{
					int utf32 = 0;

					if ((*c & 0x80) == 0)
					{
						utf32 = *c++;
					}
					else if ((*c & 0xE0) == 0xC0)    // 110x xxxx
					{
						utf32 |= (*c++ & 0x1F) << 6;
						utf32 |= (*c++ & 0x3F);
					}
					else if ((*c & 0xF0) == 0xE0)    // 1110 xxxx
					{
						utf32 |= (*c++ & 0x0F) << 12;
						utf32 |= (*c++ & 0x3F) << 6;
						utf32 |= (*c++ & 0x3F);
					}
					else if ((*c & 0xF8) == 0xF0)    // 1111 0xxx
					{
						utf32 |= (*c++ & 0x07) << 18;
						utf32 |= (*c++ & 0x3F) << 12;
						utf32 |= (*c++ & 0x3F) << 6;
						utf32 |= (*c++ & 0x3F);
					}
					else
					{
						Com_DPrintf("Unrecognised UTF-8 lead byte: 0x%x\n", (unsigned int)*c);
						c++;
					}

					if (utf32 != 0)
					{
						if (IN_IsConsoleKey(0, utf32))
						{
							Com_QueueEvent(0, SE_KEY, K_CONSOLE, qtrue, 0, NULL);
							Com_QueueEvent(0, SE_KEY, K_CONSOLE, qfalse, 0, NULL);
						}
						else
						{
							Com_QueueEvent(0, SE_CHAR, utf32, 0, 0, NULL);
						}
					}
				}
			}
			break;
		case SDL_MOUSEMOTION:
			if (mouseActive)
			{
				if (!e.motion.xrel && !e.motion.yrel)
				{
					break;
				}
				Com_QueueEvent(0, SE_MOUSE, e.motion.xrel, e.motion.yrel, 0, NULL);
			}
			break;
		case SDL_MOUSEBUTTONDOWN:
		case SDL_MOUSEBUTTONUP:
		{
			int b;

			switch (e.button.button)
			{
			case SDL_BUTTON_LEFT:      b = K_MOUSE1;
				break;
			case SDL_BUTTON_MIDDLE:    b = K_MOUSE3;
				break;
			case SDL_BUTTON_RIGHT:     b = K_MOUSE2;
				break;
			case SDL_BUTTON_X1:        b = K_MOUSE4;
				break;
			case SDL_BUTTON_X2:        b = K_MOUSE5;
				break;
			default:                   b = K_AUX1 + (e.button.button - SDL_BUTTON_X2 + 1) % 16;
				break;
			}
			Com_QueueEvent(0, SE_KEY, b, (e.type == SDL_MOUSEBUTTONDOWN ? qtrue : qfalse), 0, NULL);
		}
		break;
		case SDL_MOUSEWHEEL:
			if (e.wheel.y > 0)
			{
				Com_QueueEvent(0, SE_KEY, K_MWHEELUP, qtrue, 0, NULL);
				Com_QueueEvent(0, SE_KEY, K_MWHEELUP, qfalse, 0, NULL);
			}
			else if (e.wheel.y < 0)
			{
				Com_QueueEvent(0, SE_KEY, K_MWHEELDOWN, qtrue, 0, NULL);
				Com_QueueEvent(0, SE_KEY, K_MWHEELDOWN, qfalse, 0, NULL);
			}

			break;
		case SDL_QUIT:
			Cbuf_ExecuteText(EXEC_NOW, "quit Closed window\n");
			break;
		case SDL_WINDOWEVENT:
			switch (e.window.event)
			{
			case SDL_WINDOWEVENT_RESIZED:
				IN_WindowResize(&e);
				break;
			case SDL_WINDOWEVENT_MINIMIZED:
				Cvar_SetValue("com_minimized", 1);
				break;
			case SDL_WINDOWEVENT_RESTORED:
			case SDL_WINDOWEVENT_MAXIMIZED:
				Cvar_SetValue("com_minimized", 0);
				break;
			case SDL_WINDOWEVENT_FOCUS_LOST:
			// disabled for now (causes issues with vid_restart
			//IN_WindowFocusLost();
			case SDL_WINDOWEVENT_LEAVE:
				Key_ClearStates();
				Cvar_SetValue("com_unfocused", 1);
				break;
			case SDL_WINDOWEVENT_ENTER:
			case SDL_WINDOWEVENT_FOCUS_GAINED:
			{
				Cvar_SetValue("com_unfocused", 0);

				if (com_minimized->integer)
				{
					SDL_RestoreWindow(mainScreen);
				}

#ifdef DISABLE_DINGY
				IN_EnableDingFilter();
#endif
			}
			break;
			}
			break;
		default:
			break;
		}
	}
}