/* ==================== GetClipboardData ==================== */ static void GetClipboardData( char *buf, int buflen ) { char *cbd, *c; c = cbd = Sys_GetClipboardData(); if ( !cbd ) { *buf = 0; return; } for ( int i = 0, end = buflen - 1; *c && i < end; i++ ) { uint32_t utf32 = ConvertUTF8ToUTF32( c, &c ); buf[i] = ConvertUTF32ToExpectedCharset( utf32 ); } Z_Free( cbd ); }
static void IN_ProcessEvents( void ) { SDL_Event e; fakeAscii_t key = A_NULL; static fakeAscii_t lastKeyDown = A_NULL; if( !SDL_WasInit( SDL_INIT_VIDEO ) ) return; while( SDL_PollEvent( &e ) ) { switch( e.type ) { case SDL_KEYDOWN: key = IN_TranslateSDLToJKKey( &e.key.keysym, qtrue ); if ( key != A_NULL ) Sys_QueEvent( 0, SE_KEY, key, qtrue, 0, NULL ); if ( key == A_BACKSPACE ) Sys_QueEvent( 0, SE_CHAR, CTRL('h'), qfalse, 0, NULL); else if ( kg.keys[A_CTRL].down && key >= 'a' && key <= 'z' ) Sys_QueEvent( 0, SE_CHAR, CTRL(key), qfalse, 0, NULL ); lastKeyDown = key; break; case SDL_KEYUP: key = IN_TranslateSDLToJKKey( &e.key.keysym, qfalse ); if( key != A_NULL ) Sys_QueEvent( 0, SE_KEY, key, qfalse, 0, NULL ); lastKeyDown = A_NULL; break; case SDL_TEXTINPUT: if( lastKeyDown != A_CONSOLE ) { char *c = e.text.text; // Quick and dirty UTF-8 to UTF-32 conversion while( *c ) { uint32_t utf32 = ConvertUTF8ToUTF32( c, &c ); if( utf32 != 0 ) { if( IN_IsConsoleKey( A_NULL, utf32 ) ) { Sys_QueEvent( 0, SE_KEY, A_CONSOLE, qtrue, 0, NULL ); Sys_QueEvent( 0, SE_KEY, A_CONSOLE, qfalse, 0, NULL ); } else { uint8_t encoded = ConvertUTF32ToExpectedCharset( utf32 ); Sys_QueEvent( 0, SE_CHAR, encoded, 0, 0, NULL ); } } } } break; case SDL_MOUSEMOTION: if ( mouseActive ) { if ( !e.motion.xrel && !e.motion.yrel ) break; Sys_QueEvent( 0, SE_MOUSE, e.motion.xrel, e.motion.yrel, 0, NULL ); } break; case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: { unsigned short b; switch( e.button.button ) { case SDL_BUTTON_LEFT: b = A_MOUSE1; break; case SDL_BUTTON_MIDDLE: b = A_MOUSE3; break; case SDL_BUTTON_RIGHT: b = A_MOUSE2; break; case SDL_BUTTON_X1: b = A_MOUSE4; break; case SDL_BUTTON_X2: b = A_MOUSE5; break; default: b = A_AUX0 + ( e.button.button - 6 ) % 32; break; } Sys_QueEvent( 0, SE_KEY, b, ( e.type == SDL_MOUSEBUTTONDOWN ? qtrue : qfalse ), 0, NULL ); } break; case SDL_MOUSEWHEEL: if( e.wheel.y > 0 ) { Sys_QueEvent( 0, SE_KEY, A_MWHEELUP, qtrue, 0, NULL ); Sys_QueEvent( 0, SE_KEY, A_MWHEELUP, qfalse, 0, NULL ); } else { Sys_QueEvent( 0, SE_KEY, A_MWHEELDOWN, qtrue, 0, NULL ); Sys_QueEvent( 0, SE_KEY, A_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_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: { Cvar_SetValue( "com_unfocused", 1 ); SNDDMA_Activate( qfalse ); break; } case SDL_WINDOWEVENT_FOCUS_GAINED: { Cvar_SetValue( "com_unfocused", 0 ); SNDDMA_Activate( qtrue ); break; } } break; default: break; } } }
static void IN_ProcessEvents( void ) { SDL_Event e; fakeAscii_t key = A_NULL; static fakeAscii_t lastKeyDown = A_NULL; if(!SDL_WasInit(SDL_INIT_VIDEO)) return; while(SDL_PollEvent(&e)) { switch(e.type) { case SDL_KEYDOWN: if( e.key.keysym.sym == SDLK_BACKSPACE ) Sys_QueEvent( 0, SE_CHAR, e.key.keysym.sym, qtrue, 0, NULL ); else if( ( key = IN_TranslateSDLToJKKey( &e.key.keysym, qtrue ) ) ) Sys_QueEvent( 0, SE_KEY, key, qtrue, 0, NULL ); lastKeyDown = key; break; case SDL_KEYUP: if( ( key = IN_TranslateSDLToJKKey( &e.key.keysym, qfalse ) ) ) Sys_QueEvent( 0, SE_KEY, key, qfalse, 0, NULL ); lastKeyDown = A_NULL; break; case SDL_TEXTINPUT: if(lastKeyDown != A_CONSOLE) { char *c = e.text.text; // Quick and dirty UTF-8 to UTF-32 conversion while(*c) { uint32_t utf32 = ConvertUTF8ToUTF32( c, &c ); if(utf32 != 0) { if(IN_IsConsoleKey(A_NULL, utf32)) { Sys_QueEvent(0, SE_KEY, A_CONSOLE, qtrue, 0, NULL); Sys_QueEvent(0, SE_KEY, A_CONSOLE, qfalse, 0, NULL); } else { uint8_t encoded = ConvertUTF32ToExpectedCharset(utf32); Sys_QueEvent(0, SE_CHAR, encoded, 0, 0, NULL); } } } } break; case SDL_MOUSEMOTION: if(mouseActive) Sys_QueEvent(0, SE_MOUSE, e.motion.xrel, e.motion.yrel, 0, NULL); break; case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: { unsigned short b; switch(e.button.button) { case SDL_BUTTON_LEFT: b = A_MOUSE1; break; case SDL_BUTTON_MIDDLE: b = A_MOUSE3; break; case SDL_BUTTON_RIGHT: b = A_MOUSE2; break; case SDL_BUTTON_X1: b = A_MOUSE4; break; case SDL_BUTTON_X2: b = A_MOUSE5; break; default: b = A_AUX0 + (e.button.button - 6) % 32; break; } Sys_QueEvent(0, SE_KEY, b, (e.type == SDL_MOUSEBUTTONDOWN ? qtrue : qfalse), 0, NULL); break; } case SDL_MOUSEWHEEL: if(e.wheel.y > 0) { Sys_QueEvent(0, SE_KEY, A_MWHEELUP, qtrue, 0, NULL); Sys_QueEvent(0, SE_KEY, A_MWHEELUP, qfalse, 0, NULL); } else { Sys_QueEvent(0, SE_KEY, A_MWHEELDOWN, qtrue, 0, NULL); Sys_QueEvent(0, SE_KEY, A_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: { char width[32], height[32]; if (!Cvar_VariableIntegerValue("r_restartOnResize")) break; Com_sprintf(width, sizeof(width), "%d", e.window.data1); Com_sprintf(height, sizeof(height), "%d", e.window.data2); Cvar_Set("r_customwidth", width); Cvar_Set("r_customheight", height); Cvar_Set("r_mode", "-1"); // Wait until user stops dragging for 1 second, so // we aren't constantly recreating the GL context while // he tries to drag... vidRestartTime = Sys_Milliseconds() + Cvar_VariableIntegerValue("r_resizeDelay"); } 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: { Cvar_SetValue("com_unfocused", 1); SNDDMA_Activate(qfalse); break; } case SDL_WINDOWEVENT_FOCUS_GAINED: { Cvar_SetValue("com_unfocused", 0); SNDDMA_Activate(qtrue); break; } } break; case SDL_APP_DIDENTERBACKGROUND: { #ifdef __ANDROID__ LOGI("SDL_APP_DIDENTERBACKGROUND"); #endif Cvar_SetValue("com_minimized", 1); Cvar_SetValue("com_unfocused", 1); SNDDMA_Activate(qfalse); break; } case SDL_APP_DIDENTERFOREGROUND: { #ifdef __ANDROID__ LOGI("SDL_APP_DIDENTERFOREGROUND"); #endif Cvar_SetValue("com_minimized", 0); Cvar_SetValue("com_unfocused", 0); SNDDMA_Activate(qtrue); break; } default: break; } } }