2015-06-21 17:33:46 +02:00
/*
2024-01-01 13:15:26 -08:00
Copyright ( C ) 1997 - 2024 Sam Lantinga < slouken @ libsdl . org >
2015-06-21 17:33:46 +02:00
This software is provided ' as - is ' , without any express or implied
warranty . In no event will the authors be held liable for any damages
arising from the use of this software .
Permission is granted to anyone to use this software for any purpose ,
including commercial applications , and to alter it and redistribute it
freely .
*/
/* Simple program: Loop, watching keystrokes
Note that you need to call SDL_PollEvent ( ) or SDL_WaitEvent ( ) to
pump the event loop and catch keystrokes .
*/
2022-11-26 20:43:38 -08:00
# include <SDL3/SDL.h>
2022-12-15 05:58:20 +01:00
# include <SDL3/SDL_main.h>
2023-03-17 00:25:39 +01:00
# include <SDL3/SDL_test.h>
2015-06-21 17:33:46 +02:00
2024-01-24 02:40:51 +01:00
# ifdef SDL_PLATFORM_EMSCRIPTEN
# include <emscripten/emscripten.h>
# endif
2024-06-24 05:58:26 -07:00
# define TEXT_WINDOW_OFFSET_X 2.0f
# define TEXT_WINDOW_OFFSET_Y (2.0f + FONT_LINE_HEIGHT)
2024-06-24 07:07:40 -07:00
# define CURSOR_BLINK_INTERVAL_MS 500
2024-06-24 18:07:49 -07:00
typedef struct
{
SDLTest_TextWindow * textwindow ;
char * edit_text ;
int edit_cursor ;
int edit_length ;
} TextWindowState ;
2023-08-22 18:44:28 +02:00
static SDLTest_CommonState * state ;
2024-06-24 18:07:49 -07:00
static TextWindowState * windowstates ;
2024-06-24 05:58:26 -07:00
static SDL_bool escape_pressed ;
2024-06-24 07:07:40 -07:00
static SDL_bool cursor_visible ;
static Uint64 last_cursor_change ;
2022-07-01 12:56:47 -07:00
static int done ;
2015-06-21 17:33:46 +02:00
2024-06-24 18:07:49 -07:00
static TextWindowState * GetTextWindowStateForWindowID ( SDL_WindowID id )
2024-06-24 05:58:26 -07:00
{
int i ;
for ( i = 0 ; i < state - > num_windows ; + + i ) {
if ( id = = SDL_GetWindowID ( state - > windows [ i ] ) ) {
2024-06-24 18:07:49 -07:00
return & windowstates [ i ] ;
2024-06-24 05:58:26 -07:00
}
}
return NULL ;
}
2024-06-24 18:07:49 -07:00
static SDLTest_TextWindow * GetTextWindowForWindowID ( SDL_WindowID id )
{
TextWindowState * windowstate = GetTextWindowStateForWindowID ( id ) ;
if ( windowstate ) {
return windowstate - > textwindow ;
}
return NULL ;
}
2024-06-24 05:58:26 -07:00
static void UpdateTextWindowInputRect ( SDL_WindowID id )
{
int i ;
for ( i = 0 ; i < state - > num_windows ; + + i ) {
if ( id = = SDL_GetWindowID ( state - > windows [ i ] ) ) {
2024-06-24 18:07:49 -07:00
SDLTest_TextWindow * textwindow = windowstates [ i ] . textwindow ;
2024-06-24 05:58:26 -07:00
int w , h ;
SDL_Rect rect ;
2024-06-28 13:17:04 -07:00
int cursor = 0 ;
2024-06-24 18:07:49 -07:00
int current = textwindow - > current ;
const char * current_line = textwindow - > lines [ current ] ;
2024-06-24 05:58:26 -07:00
SDL_GetWindowSize ( state - > windows [ i ] , & w , & h ) ;
if ( current_line ) {
2024-06-28 13:17:04 -07:00
cursor = ( int ) SDL_utf8strlen ( current_line ) * FONT_CHARACTER_SIZE ;
2024-06-24 05:58:26 -07:00
}
2024-06-28 13:17:04 -07:00
rect . x = ( int ) TEXT_WINDOW_OFFSET_X ;
2024-06-24 05:58:26 -07:00
rect . y = ( int ) TEXT_WINDOW_OFFSET_Y + current * FONT_LINE_HEIGHT ;
rect . w = ( int ) ( w - ( 2 * TEXT_WINDOW_OFFSET_X ) ) ;
2024-06-28 13:17:04 -07:00
rect . h = FONT_CHARACTER_SIZE ;
SDL_SetTextInputArea ( state - > windows [ i ] , & rect , cursor ) ;
2024-06-24 05:58:26 -07:00
return ;
}
}
}
2024-06-19 15:00:12 -07:00
static void print_string ( char * * text , size_t * maxlen , const char * fmt , . . . )
2015-06-21 17:33:46 +02:00
{
int len ;
va_list ap ;
va_start ( ap , fmt ) ;
len = SDL_vsnprintf ( * text , * maxlen , fmt , ap ) ;
if ( len > 0 ) {
* text + = len ;
2022-11-30 12:51:59 -08:00
if ( ( ( size_t ) len ) < * maxlen ) {
* maxlen - = ( size_t ) len ;
2015-06-21 17:33:46 +02:00
} else {
* maxlen = 0 ;
}
}
va_end ( ap ) ;
}
2024-06-19 15:00:12 -07:00
static void print_modifiers ( char * * text , size_t * maxlen , SDL_Keymod mod )
2015-06-21 17:33:46 +02:00
{
print_string ( text , maxlen , " modifiers: " ) ;
2024-06-19 15:00:12 -07:00
if ( mod = = SDL_KMOD_NONE ) {
2015-06-21 17:33:46 +02:00
print_string ( text , maxlen , " (none) " ) ;
return ;
}
2024-06-19 15:00:12 -07:00
if ( ( mod & SDL_KMOD_SHIFT ) = = SDL_KMOD_SHIFT ) {
print_string ( text , maxlen , " SHIFT " ) ;
} else {
if ( mod & SDL_KMOD_LSHIFT ) {
print_string ( text , maxlen , " LSHIFT " ) ;
}
if ( mod & SDL_KMOD_RSHIFT ) {
print_string ( text , maxlen , " RSHIFT " ) ;
}
2022-11-27 17:38:43 +01:00
}
2024-06-19 15:00:12 -07:00
if ( ( mod & SDL_KMOD_CTRL ) = = SDL_KMOD_CTRL ) {
print_string ( text , maxlen , " CTRL " ) ;
} else {
if ( mod & SDL_KMOD_LCTRL ) {
print_string ( text , maxlen , " LCTRL " ) ;
}
if ( mod & SDL_KMOD_RCTRL ) {
print_string ( text , maxlen , " RCTRL " ) ;
}
2022-11-27 17:38:43 +01:00
}
2024-06-19 15:00:12 -07:00
if ( ( mod & SDL_KMOD_ALT ) = = SDL_KMOD_ALT ) {
print_string ( text , maxlen , " ALT " ) ;
} else {
if ( mod & SDL_KMOD_LALT ) {
print_string ( text , maxlen , " LALT " ) ;
}
if ( mod & SDL_KMOD_RALT ) {
print_string ( text , maxlen , " RALT " ) ;
}
2022-11-27 17:38:43 +01:00
}
2024-06-19 15:00:12 -07:00
if ( ( mod & SDL_KMOD_GUI ) = = SDL_KMOD_GUI ) {
print_string ( text , maxlen , " GUI " ) ;
} else {
if ( mod & SDL_KMOD_LGUI ) {
print_string ( text , maxlen , " LGUI " ) ;
}
if ( mod & SDL_KMOD_RGUI ) {
print_string ( text , maxlen , " RGUI " ) ;
}
2022-11-27 17:38:43 +01:00
}
2022-12-23 20:52:46 -05:00
if ( mod & SDL_KMOD_NUM ) {
2015-06-21 17:33:46 +02:00
print_string ( text , maxlen , " NUM " ) ;
2022-11-27 17:38:43 +01:00
}
2022-12-23 20:52:46 -05:00
if ( mod & SDL_KMOD_CAPS ) {
2015-06-21 17:33:46 +02:00
print_string ( text , maxlen , " CAPS " ) ;
2022-11-27 17:38:43 +01:00
}
2022-12-23 20:52:46 -05:00
if ( mod & SDL_KMOD_MODE ) {
2015-06-21 17:33:46 +02:00
print_string ( text , maxlen , " MODE " ) ;
2022-11-27 17:38:43 +01:00
}
2022-12-23 20:52:46 -05:00
if ( mod & SDL_KMOD_SCROLL ) {
2021-08-10 17:50:17 -07:00
print_string ( text , maxlen , " SCROLL " ) ;
2022-11-27 17:38:43 +01:00
}
2015-06-21 17:33:46 +02:00
}
2024-06-19 15:00:12 -07:00
static void PrintKeymap ( void )
{
SDL_Keymod mods [ ] = {
SDL_KMOD_NONE ,
SDL_KMOD_SHIFT ,
SDL_KMOD_CAPS ,
( SDL_KMOD_SHIFT | SDL_KMOD_CAPS ) ,
SDL_KMOD_ALT ,
( SDL_KMOD_ALT | SDL_KMOD_SHIFT ) ,
( SDL_KMOD_ALT | SDL_KMOD_CAPS ) ,
( SDL_KMOD_ALT | SDL_KMOD_SHIFT | SDL_KMOD_CAPS ) ,
SDL_KMOD_MODE ,
( SDL_KMOD_MODE | SDL_KMOD_SHIFT ) ,
( SDL_KMOD_MODE | SDL_KMOD_CAPS ) ,
( SDL_KMOD_MODE | SDL_KMOD_SHIFT | SDL_KMOD_CAPS )
} ;
int i , m ;
SDL_Log ( " Differences from the default keymap: \n " ) ;
for ( m = 0 ; m < SDL_arraysize ( mods ) ; + + m ) {
for ( i = 0 ; i < SDL_NUM_SCANCODES ; + + i ) {
SDL_Keycode key = SDL_GetKeyFromScancode ( ( SDL_Scancode ) i , mods [ m ] ) ;
2024-06-22 06:15:51 -07:00
SDL_Keycode default_key = SDL_GetDefaultKeyFromScancode ( ( SDL_Scancode ) i , mods [ m ] ) ;
2024-06-19 15:00:12 -07:00
if ( key ! = default_key ) {
char message [ 512 ] ;
char * spot ;
size_t left ;
spot = message ;
left = sizeof ( message ) ;
print_string ( & spot , & left , " Scancode %s " , SDL_GetScancodeName ( ( SDL_Scancode ) i ) ) ;
print_modifiers ( & spot , & left , mods [ m ] ) ;
print_string ( & spot , & left , " : %s 0x%x (default: %s 0x%x) " , SDL_GetKeyName ( key ) , key , SDL_GetKeyName ( default_key ) , default_key ) ;
SDL_Log ( " %s " , message ) ;
}
}
}
}
static void PrintModifierState ( void )
2015-06-21 17:33:46 +02:00
{
char message [ 512 ] ;
char * spot ;
size_t left ;
spot = message ;
left = sizeof ( message ) ;
2024-06-19 15:00:12 -07:00
print_modifiers ( & spot , & left , SDL_GetModState ( ) ) ;
2015-06-21 17:33:46 +02:00
SDL_Log ( " Initial state:%s \n " , message ) ;
}
2024-06-21 19:50:10 -07:00
static void PrintKey ( SDL_KeyboardEvent * event )
2015-06-21 17:33:46 +02:00
{
char message [ 512 ] ;
char * spot ;
size_t left ;
spot = message ;
left = sizeof ( message ) ;
/* Print the keycode, name and state */
2024-06-21 19:50:10 -07:00
if ( event - > key ) {
2015-06-21 17:33:46 +02:00
print_string ( & spot , & left ,
2024-06-18 18:34:55 -07:00
" Key %s: raw 0x%.2x, scancode %d = %s, keycode 0x%08X = %s " ,
2024-06-21 19:50:10 -07:00
event - > state ? " pressed " : " released " ,
event - > raw ,
event - > scancode ,
event - > scancode = = SDL_SCANCODE_UNKNOWN ? " UNKNOWN " : SDL_GetScancodeName ( event - > scancode ) ,
event - > key , SDL_GetKeyName ( event - > key ) ) ;
2015-06-21 17:33:46 +02:00
} else {
print_string ( & spot , & left ,
2024-06-18 18:34:55 -07:00
" Unknown Key (raw 0x%.2x, scancode %d = %s) %s " ,
2024-06-21 19:50:10 -07:00
event - > raw ,
event - > scancode ,
event - > scancode = = SDL_SCANCODE_UNKNOWN ? " UNKNOWN " : SDL_GetScancodeName ( event - > scancode ) ,
event - > state ? " pressed " : " released " ) ;
2015-06-21 17:33:46 +02:00
}
2024-06-21 19:50:10 -07:00
print_modifiers ( & spot , & left , event - > mod ) ;
if ( event - > repeat ) {
2015-06-21 17:33:46 +02:00
print_string ( & spot , & left , " (repeat) " ) ;
}
SDL_Log ( " %s \n " , message ) ;
}
2024-06-19 15:00:12 -07:00
static void PrintText ( const char * eventtype , const char * text )
2015-06-21 17:33:46 +02:00
{
2021-11-20 01:02:02 +03:00
const char * spot ;
char expanded [ 1024 ] ;
2015-06-21 17:33:46 +02:00
expanded [ 0 ] = ' \0 ' ;
2022-11-30 12:51:59 -08:00
for ( spot = text ; * spot ; + + spot ) {
2015-06-21 17:33:46 +02:00
size_t length = SDL_strlen ( expanded ) ;
2023-03-09 15:10:00 -08:00
( void ) SDL_snprintf ( expanded + length , sizeof ( expanded ) - length , " \\ x%.2x " , ( unsigned char ) * spot ) ;
2015-06-21 17:33:46 +02:00
}
SDL_Log ( " %s Text (%s): \" %s%s \" \n " , eventtype , expanded , * text = = ' " ' ? " \\ " : " " , text ) ;
}
2024-06-11 09:09:12 -07:00
static void CountKeysDown ( void )
{
int i , count = 0 , max_keys = 0 ;
const Uint8 * keystate = SDL_GetKeyboardState ( & max_keys ) ;
for ( i = 0 ; i < max_keys ; + + i ) {
if ( keystate [ i ] ) {
+ + count ;
}
}
SDL_Log ( " Keys down: %d \n " , count ) ;
}
2024-06-24 07:07:40 -07:00
static void DrawCursor ( int i )
{
SDL_FRect rect ;
2024-06-24 18:07:49 -07:00
TextWindowState * windowstate = & windowstates [ i ] ;
SDLTest_TextWindow * textwindow = windowstate - > textwindow ;
int current = textwindow - > current ;
const char * current_line = textwindow - > lines [ current ] ;
2024-06-24 07:07:40 -07:00
rect . x = TEXT_WINDOW_OFFSET_X ;
if ( current_line ) {
rect . x + = SDL_utf8strlen ( current_line ) * FONT_CHARACTER_SIZE ;
}
2024-06-24 18:07:49 -07:00
if ( windowstate - > edit_cursor > 0 ) {
rect . x + = ( float ) windowstate - > edit_cursor * FONT_CHARACTER_SIZE ;
}
2024-06-24 07:07:40 -07:00
rect . y = TEXT_WINDOW_OFFSET_Y + current * FONT_LINE_HEIGHT ;
rect . w = FONT_CHARACTER_SIZE * 0.75f ;
2024-06-24 13:36:46 -07:00
rect . h = ( float ) FONT_CHARACTER_SIZE ;
2024-06-24 07:07:40 -07:00
SDL_SetRenderDrawColor ( state - > renderers [ i ] , 0xAA , 0xAA , 0xAA , 255 ) ;
SDL_RenderFillRect ( state - > renderers [ i ] , & rect ) ;
}
2024-06-24 18:07:49 -07:00
static void DrawEditText ( int i )
{
SDL_FRect rect ;
TextWindowState * windowstate = & windowstates [ i ] ;
SDLTest_TextWindow * textwindow = windowstate - > textwindow ;
int current = textwindow - > current ;
const char * current_line = textwindow - > lines [ current ] ;
if ( windowstate - > edit_text = = NULL ) {
return ;
}
/* Draw the highlight under the selected text */
if ( windowstate - > edit_length > 0 ) {
rect . x = TEXT_WINDOW_OFFSET_X ;
if ( current_line ) {
rect . x + = SDL_utf8strlen ( current_line ) * FONT_CHARACTER_SIZE ;
}
if ( windowstate - > edit_cursor > 0 ) {
rect . x + = ( float ) windowstate - > edit_cursor * FONT_CHARACTER_SIZE ;
}
rect . y = TEXT_WINDOW_OFFSET_Y + current * FONT_LINE_HEIGHT ;
rect . w = ( float ) windowstate - > edit_length * FONT_CHARACTER_SIZE ;
rect . h = ( float ) FONT_CHARACTER_SIZE ;
SDL_SetRenderDrawColor ( state - > renderers [ i ] , 0xAA , 0xAA , 0xAA , 255 ) ;
SDL_RenderFillRect ( state - > renderers [ i ] , & rect ) ;
}
/* Draw the edit text */
rect . x = TEXT_WINDOW_OFFSET_X ;
if ( current_line ) {
rect . x + = SDL_utf8strlen ( current_line ) * FONT_CHARACTER_SIZE ;
}
rect . y = TEXT_WINDOW_OFFSET_Y + current * FONT_LINE_HEIGHT ;
SDL_SetRenderDrawColor ( state - > renderers [ i ] , 255 , 255 , 0 , 255 ) ;
SDLTest_DrawString ( state - > renderers [ i ] , rect . x , rect . y , windowstate - > edit_text ) ;
}
2023-03-08 11:40:07 +01:00
static void loop ( void )
2015-06-21 17:33:46 +02:00
{
SDL_Event event ;
2024-06-24 07:07:40 -07:00
Uint64 now ;
2023-08-22 18:44:28 +02:00
int i ;
2024-06-24 17:05:08 -07:00
char line [ 1024 ] ;
2015-06-21 17:33:46 +02:00
while ( SDL_PollEvent ( & event ) ) {
switch ( event . type ) {
2023-01-23 17:54:09 -08:00
case SDL_EVENT_KEY_DOWN :
case SDL_EVENT_KEY_UP :
2024-06-21 19:50:10 -07:00
PrintKey ( & event . key ) ;
2023-01-23 17:54:09 -08:00
if ( event . type = = SDL_EVENT_KEY_DOWN ) {
2024-06-21 19:50:10 -07:00
switch ( event . key . key ) {
2022-07-01 12:56:47 -07:00
case SDLK_BACKSPACE :
2024-06-24 05:58:26 -07:00
SDLTest_TextWindowAddText ( GetTextWindowForWindowID ( event . key . windowID ) , " \b " ) ;
UpdateTextWindowInputRect ( event . key . windowID ) ;
2022-07-01 12:56:47 -07:00
break ;
case SDLK_RETURN :
2024-06-24 05:58:26 -07:00
SDLTest_TextWindowAddText ( GetTextWindowForWindowID ( event . key . windowID ) , " \n " ) ;
UpdateTextWindowInputRect ( event . key . windowID ) ;
2022-07-01 12:56:47 -07:00
break ;
default :
break ;
}
2024-06-24 05:58:26 -07:00
if ( event . key . key = = SDLK_ESCAPE ) {
/* Pressing escape twice will stop the application */
if ( escape_pressed ) {
done = 1 ;
} else {
escape_pressed = SDL_TRUE ;
}
} else {
escape_pressed = SDL_TRUE ;
}
2022-07-01 12:56:47 -07:00
}
2024-06-11 09:09:12 -07:00
CountKeysDown ( ) ;
2015-06-21 17:33:46 +02:00
break ;
2023-01-23 17:54:09 -08:00
case SDL_EVENT_TEXT_EDITING :
2024-06-24 18:07:49 -07:00
{
TextWindowState * windowstate = GetTextWindowStateForWindowID ( event . edit . windowID ) ;
if ( windowstate - > edit_text ) {
SDL_free ( windowstate - > edit_text ) ;
windowstate - > edit_text = NULL ;
}
if ( event . edit . text & & * event . edit . text ) {
windowstate - > edit_text = SDL_strdup ( event . edit . text ) ;
}
windowstate - > edit_cursor = event . edit . start ;
windowstate - > edit_length = event . edit . length ;
2024-06-24 17:05:08 -07:00
SDL_snprintf ( line , sizeof ( line ) , " EDIT % " SDL_PRIs32 " :% " SDL_PRIs32 , event . edit . start , event . edit . length ) ;
PrintText ( line , event . edit . text ) ;
2015-06-21 17:33:46 +02:00
break ;
2024-06-24 18:07:49 -07:00
}
2023-01-23 17:54:09 -08:00
case SDL_EVENT_TEXT_INPUT :
2015-06-21 17:33:46 +02:00
PrintText ( " INPUT " , event . text . text ) ;
2024-06-24 05:58:26 -07:00
SDLTest_TextWindowAddText ( GetTextWindowForWindowID ( event . text . windowID ) , " %s " , event . text . text ) ;
UpdateTextWindowInputRect ( event . text . windowID ) ;
2015-06-21 17:33:46 +02:00
break ;
2023-01-23 17:54:09 -08:00
case SDL_EVENT_FINGER_DOWN :
2024-06-22 06:16:19 -07:00
{
SDL_Window * window = SDL_GetWindowFromID ( event . tfinger . windowID ) ;
if ( SDL_TextInputActive ( window ) ) {
2024-06-24 05:58:26 -07:00
SDL_Log ( " Stopping text input for window % " SDL_PRIu32 " \n " , event . tfinger . windowID ) ;
2024-06-22 06:16:19 -07:00
SDL_StopTextInput ( window ) ;
2022-06-29 17:40:45 -07:00
} else {
2024-06-24 05:58:26 -07:00
SDL_Log ( " Starting text input for window % " SDL_PRIu32 " \n " , event . tfinger . windowID ) ;
2024-06-22 06:16:19 -07:00
SDL_StartTextInput ( window ) ;
2022-06-29 17:40:45 -07:00
}
break ;
2024-06-22 06:16:19 -07:00
}
2023-01-30 04:06:08 +01:00
case SDL_EVENT_MOUSE_BUTTON_DOWN :
2024-06-24 17:27:06 -07:00
if ( event . button . button = = SDL_BUTTON_RIGHT ) {
SDL_Window * window = SDL_GetWindowFromID ( event . button . windowID ) ;
if ( SDL_TextInputActive ( window ) ) {
SDL_Log ( " Stopping text input for window % " SDL_PRIu32 " \n " , event . button . windowID ) ;
SDL_StopTextInput ( window ) ;
} else {
SDL_Log ( " Starting text input for window % " SDL_PRIu32 " \n " , event . button . windowID ) ;
SDL_StartTextInput ( window ) ;
}
2017-08-11 10:32:47 -07:00
}
break ;
2024-06-19 15:00:12 -07:00
case SDL_EVENT_KEYMAP_CHANGED :
SDL_Log ( " Keymap changed! \n " ) ;
PrintKeymap ( ) ;
break ;
2023-01-23 17:54:09 -08:00
case SDL_EVENT_QUIT :
2015-06-21 17:33:46 +02:00
done = 1 ;
break ;
default :
break ;
}
}
2022-07-01 12:56:47 -07:00
2024-06-24 07:07:40 -07:00
now = SDL_GetTicks ( ) ;
2023-08-22 18:44:28 +02:00
for ( i = 0 ; i < state - > num_windows ; i + + ) {
2024-06-24 05:58:26 -07:00
char caption [ 1024 ] ;
2024-06-24 07:07:40 -07:00
/* Clear the window */
2023-08-22 18:44:28 +02:00
SDL_SetRenderDrawColor ( state - > renderers [ i ] , 0 , 0 , 0 , 255 ) ;
SDL_RenderClear ( state - > renderers [ i ] ) ;
2024-06-24 07:07:40 -07:00
/* Draw the text */
2023-08-22 18:44:28 +02:00
SDL_SetRenderDrawColor ( state - > renderers [ i ] , 255 , 255 , 255 , 255 ) ;
2024-06-24 17:27:06 -07:00
SDL_snprintf ( caption , sizeof ( caption ) , " Text input %s (click right mouse button to toggle) \n " , SDL_TextInputActive ( state - > windows [ i ] ) ? " enabled " : " disabled " ) ;
2024-06-24 05:58:26 -07:00
SDLTest_DrawString ( state - > renderers [ i ] , TEXT_WINDOW_OFFSET_X , TEXT_WINDOW_OFFSET_X , caption ) ;
2024-06-24 18:07:49 -07:00
SDLTest_TextWindowDisplay ( windowstates [ i ] . textwindow , state - > renderers [ i ] ) ;
2024-06-24 07:07:40 -07:00
2024-06-24 17:05:08 -07:00
/* Draw the cursor */
2024-06-24 07:07:40 -07:00
if ( ( now - last_cursor_change ) > = CURSOR_BLINK_INTERVAL_MS ) {
cursor_visible = ! cursor_visible ;
last_cursor_change = now ;
}
if ( cursor_visible ) {
DrawCursor ( i ) ;
}
2024-06-24 18:07:49 -07:00
/* Draw the composition text */
DrawEditText ( i ) ;
2023-08-22 18:44:28 +02:00
SDL_RenderPresent ( state - > renderers [ i ] ) ;
}
2022-07-01 12:56:47 -07:00
2022-07-01 13:35:41 -07:00
/* Slow down framerate */
SDL_Delay ( 100 ) ;
2024-01-24 02:40:51 +01:00
# ifdef SDL_PLATFORM_EMSCRIPTEN
2015-06-21 17:33:46 +02:00
if ( done ) {
emscripten_cancel_main_loop ( ) ;
}
# endif
}
2022-11-30 12:51:59 -08:00
int main ( int argc , char * argv [ ] )
2015-06-21 17:33:46 +02:00
{
2024-06-24 05:58:26 -07:00
int i ;
2023-03-17 00:25:39 +01:00
2024-06-11 09:09:12 -07:00
SDL_SetHint ( SDL_HINT_WINDOWS_RAW_KEYBOARD , " 1 " ) ;
2023-03-17 00:25:39 +01:00
/* Initialize test framework */
2023-08-22 18:44:28 +02:00
state = SDLTest_CommonCreateState ( argv , SDL_INIT_VIDEO ) ;
2023-11-09 22:29:15 +01:00
if ( ! state ) {
2023-03-17 00:25:39 +01:00
return 1 ;
}
2023-08-22 18:44:28 +02:00
state - > window_title = " CheckKeys Test " ;
2023-03-17 00:25:39 +01:00
2015-11-25 21:39:28 +01:00
/* Enable standard application logging */
2024-05-16 10:00:50 -07:00
SDL_SetLogPriority ( SDL_LOG_CATEGORY_APPLICATION , SDL_LOG_PRIORITY_INFO ) ;
2015-06-21 17:33:46 +02:00
2023-03-17 00:25:39 +01:00
/* Parse commandline */
if ( ! SDLTest_CommonDefaultArgs ( state , argc , argv ) ) {
return 1 ;
}
2022-06-29 17:40:45 -07:00
/* Disable mouse emulation */
SDL_SetHint ( SDL_HINT_TOUCH_MOUSE_EVENTS , " 0 " ) ;
2015-06-21 17:33:46 +02:00
/* Initialize SDL */
2023-08-22 18:44:28 +02:00
if ( ! SDLTest_CommonInit ( state ) ) {
2015-11-25 21:39:28 +01:00
SDL_LogError ( SDL_LOG_CATEGORY_APPLICATION , " Couldn't initialize SDL: %s \n " , SDL_GetError ( ) ) ;
2022-11-27 17:38:43 +01:00
return 1 ;
2015-06-21 17:33:46 +02:00
}
2024-06-24 18:07:49 -07:00
windowstates = ( TextWindowState * ) SDL_calloc ( state - > num_windows , sizeof ( * windowstates ) ) ;
if ( ! windowstates ) {
2024-06-24 05:58:26 -07:00
SDL_LogError ( SDL_LOG_CATEGORY_APPLICATION , " Couldn't allocate text windows: %s \n " , SDL_GetError ( ) ) ;
goto done ;
}
for ( i = 0 ; i < state - > num_windows ; + + i ) {
int w , h ;
SDL_FRect rect ;
SDL_GetWindowSize ( state - > windows [ i ] , & w , & h ) ;
rect . x = TEXT_WINDOW_OFFSET_X ;
rect . y = TEXT_WINDOW_OFFSET_Y ;
rect . w = w - ( 2 * TEXT_WINDOW_OFFSET_X ) ;
rect . h = h - TEXT_WINDOW_OFFSET_Y ;
2024-06-24 18:07:49 -07:00
windowstates [ i ] . textwindow = SDLTest_TextWindowCreate ( rect . x , rect . y , rect . w , rect . h ) ;
2024-06-24 05:58:26 -07:00
}
2021-08-13 21:25:35 +08:00
2024-01-24 02:40:51 +01:00
# ifdef SDL_PLATFORM_IOS
2023-08-22 18:44:28 +02:00
{
/* Creating the context creates the view, which we need to show keyboard */
for ( i = 0 ; i < state - > num_windows ; i + + ) {
SDL_GL_CreateContext ( state - > windows [ i ] ) ;
}
}
2015-06-21 17:33:46 +02:00
# endif
2024-06-24 05:58:26 -07:00
for ( i = 0 ; i < state - > num_windows ; + + i ) {
UpdateTextWindowInputRect ( SDL_GetWindowID ( state - > windows [ i ] ) ) ;
2024-06-22 06:15:51 -07:00
2024-06-24 05:58:26 -07:00
SDL_StartTextInput ( state - > windows [ i ] ) ;
}
2015-06-21 17:33:46 +02:00
2024-06-19 15:00:12 -07:00
/* Print initial state */
2015-06-21 17:33:46 +02:00
SDL_PumpEvents ( ) ;
2024-06-19 15:00:12 -07:00
PrintKeymap ( ) ;
2015-06-21 17:33:46 +02:00
PrintModifierState ( ) ;
/* Watch keystrokes */
done = 0 ;
2024-01-24 02:40:51 +01:00
# ifdef SDL_PLATFORM_EMSCRIPTEN
2015-06-21 17:33:46 +02:00
emscripten_set_main_loop ( loop , 0 , 1 ) ;
# else
while ( ! done ) {
loop ( ) ;
}
# endif
2024-06-24 05:58:26 -07:00
done :
for ( i = 0 ; i < state - > num_windows ; + + i ) {
2024-06-24 18:07:49 -07:00
SDLTest_TextWindowDestroy ( windowstates [ i ] . textwindow ) ;
2024-06-24 05:58:26 -07:00
}
2024-06-24 18:07:49 -07:00
SDL_free ( windowstates ) ;
2023-08-22 18:44:28 +02:00
SDLTest_CleanupTextDrawing ( ) ;
SDLTest_CommonQuit ( state ) ;
2022-11-27 17:38:43 +01:00
return 0 ;
2015-06-21 17:33:46 +02:00
}