#include <IOKit/hidsystem/IOHIDLib.h>
#include <IOKit/hidsystem/IOHIDParameter.h>
#include <IOKit/hidsystem/event_status_driver.h>
-static cvar_t apple_mouse_noaccel = {CVAR_CLIENT | CVAR_SAVE, "apple_mouse_noaccel", "1", "disables mouse acceleration while DarkPlaces is active"};
-static qboolean vid_usingnoaccel;
+#if (MAC_OS_X_VERSION_MIN_REQUIRED < 120000)
+ #define IOMainPort IOMasterPort
+#endif
+static cvar_t apple_mouse_noaccel = {CF_CLIENT | CF_ARCHIVE, "apple_mouse_noaccel", "1", "disables mouse acceleration while DarkPlaces is active"};
+static qbool vid_usingnoaccel;
static double originalMouseSpeed = -1.0;
-io_connect_t IN_GetIOHandle(void)
+static io_connect_t IN_GetIOHandle(void)
{
io_connect_t iohandle = MACH_PORT_NULL;
kern_return_t status;
io_service_t iohidsystem = MACH_PORT_NULL;
mach_port_t masterport;
- status = IOMasterPort(MACH_PORT_NULL, &masterport);
+ status = IOMainPort(MACH_PORT_NULL, &masterport);
if(status != KERN_SUCCESS)
return 0;
// Tell startup code that we have a client
int cl_available = true;
-qboolean vid_supportrefreshrate = false;
+qbool vid_supportrefreshrate = false;
-static qboolean vid_usingmouse = false;
-static qboolean vid_usingmouse_relativeworks = false; // SDL2 workaround for unimplemented RelativeMouse mode
-static qboolean vid_usinghidecursor = false;
-static qboolean vid_hasfocus = false;
-static qboolean vid_isfullscreen;
-static qboolean vid_usingvsync = false;
+static qbool vid_usingmouse = false;
+static qbool vid_usingmouse_relativeworks = false; // SDL2 workaround for unimplemented RelativeMouse mode
+static qbool vid_usinghidecursor = false;
+static qbool vid_hasfocus = false;
+static qbool vid_isfullscreen;
+static qbool vid_usingvsync = false;
static SDL_Joystick *vid_sdljoystick = NULL;
static SDL_GameController *vid_sdlgamecontroller = NULL;
-static cvar_t joy_sdl2_trigger_deadzone = {CVAR_SAVE | CVAR_CLIENT, "joy_sdl2_trigger_deadzone", "0.5", "deadzone for triggers to be registered as key presses"};
+static cvar_t joy_sdl2_trigger_deadzone = {CF_ARCHIVE | CF_CLIENT, "joy_sdl2_trigger_deadzone", "0.5", "deadzone for triggers to be registered as key presses"};
// GAME_STEELSTORM specific
static cvar_t *steelstorm_showing_map = NULL; // detect but do not create the cvar
static cvar_t *steelstorm_showing_mousecursor = NULL; // detect but do not create the cvar
{
switch(sdlkey)
{
- default: return 0;
+ // sdlkey can be Unicode codepoint for non-ascii keys, which are valid
+ default: return sdlkey & SDLK_SCANCODE_MASK ? 0 : sdlkey;
// case SDLK_UNKNOWN: return K_UNKNOWN;
case SDLK_RETURN: return K_ENTER;
case SDLK_ESCAPE: return K_ESCAPE;
}
}
-qboolean VID_HasScreenKeyboardSupport(void)
+qbool VID_HasScreenKeyboardSupport(void)
{
return SDL_HasScreenKeyboardSupport() != SDL_FALSE;
}
-void VID_ShowKeyboard(qboolean show)
+void VID_ShowKeyboard(qbool show)
{
if (!SDL_HasScreenKeyboardSupport())
return;
}
}
-qboolean VID_ShowingKeyboard(void)
+qbool VID_ShowingKeyboard(void)
{
return SDL_IsTextInputActive() != 0;
}
-void VID_SetMouse(qboolean fullscreengrab, qboolean relative, qboolean hidecursor)
+void VID_SetMouse(qbool relative, qbool hidecursor)
{
#ifndef DP_MOBILETOUCH
#ifdef MACOSX
if(relative)
if(vid_usingmouse && (vid_usingnoaccel != !!apple_mouse_noaccel.integer))
- VID_SetMouse(false, false, false); // ungrab first!
+ VID_SetMouse(false, false); // ungrab first!
#endif
if (vid_usingmouse != relative)
{
vid_usingmouse = relative;
cl_ignoremousemoves = 2;
vid_usingmouse_relativeworks = SDL_SetRelativeMouseMode(relative ? SDL_TRUE : SDL_FALSE) == 0;
-// Con_Printf("VID_SetMouse(%i, %i, %i) relativeworks = %i\n", (int)fullscreengrab, (int)relative, (int)hidecursor, (int)vid_usingmouse_relativeworks);
+// Con_Printf("VID_SetMouse(%i, %i) relativeworks = %i\n", (int)relative, (int)hidecursor, (int)vid_usingmouse_relativeworks);
#ifdef MACOSX
if(relative)
{
int multitouchs[MAXFINGERS];
// modified heavily by ELUAN
-static qboolean VID_TouchscreenArea(int corner, float px, float py, float pwidth, float pheight, const char *icon, float textheight, const char *text, float *resultmove, qboolean *resultbutton, keynum_t key, const char *typedtext, float deadzone, float oversizepixels_x, float oversizepixels_y, qboolean iamexclusive)
+static qbool VID_TouchscreenArea(int corner, float px, float py, float pwidth, float pheight, const char *icon, float textheight, const char *text, float *resultmove, qbool *resultbutton, keynum_t key, const char *typedtext, float deadzone, float oversizepixels_x, float oversizepixels_y, qbool iamexclusive)
{
int finger;
float fx, fy, fwidth, fheight;
float overfx, overfy, overfwidth, overfheight;
float rel[3];
float sqsum;
- qboolean button = false;
+ qbool button = false;
VectorClear(rel);
if (pwidth > 0 && pheight > 0)
{
// ELUAN:
// not reentrant, but we only need one mouse cursor anyway...
-static void VID_TouchscreenCursor(float px, float py, float pwidth, float pheight, qboolean *resultbutton, keynum_t key)
+static void VID_TouchscreenCursor(float px, float py, float pwidth, float pheight, qbool *resultbutton, keynum_t key)
{
int finger;
float fx, fy, fwidth, fheight;
- qboolean button = false;
+ qbool button = false;
static int cursorfinger = -1;
static int cursorfreemovement = false;
static int canclick = false;
int i, numfingers;
float xscale, yscale;
float move[3], aim[3];
- static qboolean oldbuttons[128];
- static qboolean buttons[128];
+ static qbool oldbuttons[128];
+ static qbool buttons[128];
keydest_t keydest = (key_consoleactive & KEY_CONSOLEACTIVE_USER) ? key_console : key_dest;
memcpy(oldbuttons, buttons, sizeof(oldbuttons));
memset(multitouchs, 0, sizeof(multitouchs));
{
int x, y;
float move[3], aim[3], click[3];
- static qboolean oldbuttons[128];
- static qboolean buttons[128];
+ static qbool oldbuttons[128];
+ static qbool buttons[128];
keydest_t keydest = (key_consoleactive & KEY_CONSOLEACTIVE_USER) ? key_console : key_dest;
memcpy(oldbuttons, buttons, sizeof(oldbuttons));
memset(multitouchs, 0, sizeof(multitouchs));
if (!VID_ShowingKeyboard())
{
// user entered a command, close the console now
- Con_ToggleConsole_f(&cmd_client);
+ Con_ToggleConsole_f(cmd_local);
}
VID_TouchscreenArea( 0, 0, 0, 0, 0, NULL , 0.0f, NULL, NULL, &buttons[15], (keynum_t)0, NULL, 0, 0, 0, true);
VID_TouchscreenArea( 0, 0, 0, 0, 0, NULL , 0.0f, NULL, move, &buttons[0], K_MOUSE4, NULL, 0, 0, 0, true);
static int old_x = 0, old_y = 0;
static int stuck = 0;
static keydest_t oldkeydest;
- static qboolean oldshowkeyboard;
+ static qbool oldshowkeyboard;
int x, y;
vid_joystate_t joystate;
keydest_t keydest = (key_consoleactive & KEY_CONSOLEACTIVE_USER) ? key_console : key_dest;
////
#ifdef SDL_R_RESTART
-static qboolean sdl_needs_restart;
+static qbool sdl_needs_restart;
static void sdl_start(void)
{
}
// SDL2
void Sys_SendKeyEvents( void )
{
- static qboolean sound_active = true;
+ static qbool sound_active = true;
int keycode;
int i;
- qboolean isdown;
+ const char *chp;
+ qbool isdown;
Uchar unicode;
SDL_Event event;
// so, let's better queue it for next frame
if(!sdl_needs_restart)
{
- Cbuf_AddText(&cmd_client, "\nr_restart\n");
+ Cbuf_AddText(cmd_local, "\nr_restart\n");
sdl_needs_restart = true;
}
#endif
#endif
// convert utf8 string to char
// NOTE: this code is supposed to run even if utf8enable is 0
- unicode = u8_getchar_utf8_enabled(event.text.text + (int)u8_bytelen(event.text.text, 0), NULL);
- Key_Event(K_TEXT, unicode, true);
- Key_Event(K_TEXT, unicode, false);
+ chp = event.text.text;
+ while (*chp != 0)
+ {
+ // input the chars one by one (there can be multiple chars when e.g. using an "input method")
+ unicode = u8_getchar_utf8_enabled(chp, &chp);
+ Key_Event(K_TEXT, unicode, true);
+ Key_Event(K_TEXT, unicode, false);
+ }
break;
case SDL_MOUSEMOTION:
break;
return p;
}
-qboolean GL_ExtensionSupported(const char *name)
+qbool GL_ExtensionSupported(const char *name)
{
return SDL_GL_ExtensionSupported(name);
}
-static qboolean vid_sdl_initjoysticksystem = false;
+static qbool vid_sdl_initjoysticksystem = false;
void VID_Init (void)
{
}
static int vid_sdljoystickindex = -1;
-void VID_EnableJoystick(qboolean enable)
+void VID_EnableJoystick(qbool enable)
{
int index = joy_enable.integer > 0 ? joy_index.integer : -1;
int numsdljoysticks;
- qboolean success = false;
+ qbool success = false;
int sharedcount = 0;
int sdlindex = -1;
sharedcount = VID_Shared_SetJoystick(index);
extern cvar_t gl_info_platform;
extern cvar_t gl_info_driver;
-static qboolean VID_InitModeGL(viddef_mode_t *mode)
+static qbool VID_InitModeGL(viddef_mode_t *mode)
{
int windowflags = SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL;
// currently SDL_WINDOWPOS_UNDEFINED behaves exactly like SDL_WINDOWPOS_CENTERED, this might change some day
extern cvar_t gl_info_platform;
extern cvar_t gl_info_driver;
-qboolean VID_InitMode(viddef_mode_t *mode)
+qbool VID_InitMode(viddef_mode_t *mode)
{
// GAME_STEELSTORM specific
steelstorm_showing_map = Cvar_FindVar(&cvars_all, "steelstorm_showing_map", ~0);
void VID_Shutdown (void)
{
VID_EnableJoystick(false);
- VID_SetMouse(false, false, false);
+ VID_SetMouse(false, false);
SDL_DestroyWindow(window);
window = NULL;
void VID_Finish (void)
{
- qboolean vid_usevsync;
+ qbool vid_usevsync;
vid_activewindow = !vid_hidden && vid_hasfocus;
VID_UpdateGamma();