reenable cursor movement etc. sdl2transition
authorsheepluva
Wed, 11 Nov 2015 19:25:56 +0100
branchsdl2transition
changeset 11365 b8b208501475
parent 11364 b0df3f2fcafc
child 11366 f1b5f1dc61a3
reenable cursor movement etc.
hedgewars/SDLh.pas
hedgewars/hwengine.pas
hedgewars/uChat.pas
hedgewars/uInputHandler.pas
--- a/hedgewars/SDLh.pas	Tue Nov 10 22:37:54 2015 +0100
+++ b/hedgewars/SDLh.pas	Wed Nov 11 19:25:56 2015 +0100
@@ -241,7 +241,7 @@
     MIX_INIT_MODPLUG    = $00000004;
     MIX_INIT_MP3        = $00000008;
     MIX_INIT_OGG        = $00000010;
-    MIX_INIT_FLUIDSYNTH = $00000020; 
+    MIX_INIT_FLUIDSYNTH = $00000020;
 
     {* SDL_TTF *}
     TTF_STYLE_NORMAL = 0;
@@ -264,7 +264,8 @@
     IMG_INIT_PNG = $00000002;
     IMG_INIT_TIF = $00000004;
 
-    {* SDL_keysym *}
+    {* SDL_keycode *}
+    SDLK_UNKNOWN = 0;
     SDLK_BACKSPACE = 8;
     SDLK_RETURN    = 13;
     SDLK_ESCAPE    = 27;
@@ -285,6 +286,8 @@
     SDLK_PAGEUP    = 280;
     SDLK_PAGEDOWN  = 281;
 
+    // special keycodes (for modifier keys etc. will have this bit set)
+    SDLK_SCANCODE_MASK = (1 shl 30);
 
 /////////////////////////////////////////////////////////////////
 ///////////////////////  TYPE DEFINITIONS ///////////////////////
@@ -301,9 +304,254 @@
     PSDL_GLContext= Pointer;
     TSDL_TouchId  = Int64;
     TSDL_FingerId = Int64;
+    TSDL_Keycode = LongInt;
 
     TSDL_eventaction = (SDL_ADDEVENT, SDL_PEEPEVENT, SDL_GETEVENT);
 
+    TSDL_Scancode = (
+        SDL_SCANCODE_UNKNOWN := 0,
+        SDL_SCANCODE_A := 4,
+        SDL_SCANCODE_B := 5,
+        SDL_SCANCODE_C := 6,
+        SDL_SCANCODE_D := 7,
+        SDL_SCANCODE_E := 8,
+        SDL_SCANCODE_F := 9,
+        SDL_SCANCODE_G := 10,
+        SDL_SCANCODE_H := 11,
+        SDL_SCANCODE_I := 12,
+        SDL_SCANCODE_J := 13,
+        SDL_SCANCODE_K := 14,
+        SDL_SCANCODE_L := 15,
+        SDL_SCANCODE_M := 16,
+        SDL_SCANCODE_N := 17,
+        SDL_SCANCODE_O := 18,
+        SDL_SCANCODE_P := 19,
+        SDL_SCANCODE_Q := 20,
+        SDL_SCANCODE_R := 21,
+        SDL_SCANCODE_S := 22,
+        SDL_SCANCODE_T := 23,
+        SDL_SCANCODE_U := 24,
+        SDL_SCANCODE_V := 25,
+        SDL_SCANCODE_W := 26,
+        SDL_SCANCODE_X := 27,
+        SDL_SCANCODE_Y := 28,
+        SDL_SCANCODE_Z := 29,
+        SDL_SCANCODE_1 := 30,
+        SDL_SCANCODE_2 := 31,
+        SDL_SCANCODE_3 := 32,
+        SDL_SCANCODE_4 := 33,
+        SDL_SCANCODE_5 := 34,
+        SDL_SCANCODE_6 := 35,
+        SDL_SCANCODE_7 := 36,
+        SDL_SCANCODE_8 := 37,
+        SDL_SCANCODE_9 := 38,
+        SDL_SCANCODE_0 := 39,
+        SDL_SCANCODE_RETURN := 40,
+        SDL_SCANCODE_ESCAPE := 41,
+        SDL_SCANCODE_BACKSPACE := 42,
+        SDL_SCANCODE_TAB := 43,
+        SDL_SCANCODE_SPACE := 44,
+        SDL_SCANCODE_MINUS := 45,
+        SDL_SCANCODE_EQUALS := 46,
+        SDL_SCANCODE_LEFTBRACKET := 47,
+        SDL_SCANCODE_RIGHTBRACKET := 48,
+        SDL_SCANCODE_BACKSLASH := 49,
+        SDL_SCANCODE_NONUSHASH := 50,
+        SDL_SCANCODE_SEMICOLON := 51,
+        SDL_SCANCODE_APOSTROPHE := 52,
+        SDL_SCANCODE_GRAVE := 53,
+        SDL_SCANCODE_COMMA := 54,
+        SDL_SCANCODE_PERIOD := 55,
+        SDL_SCANCODE_SLASH := 56,
+        SDL_SCANCODE_CAPSLOCK := 57,
+        SDL_SCANCODE_F1 := 58,
+        SDL_SCANCODE_F2 := 59,
+        SDL_SCANCODE_F3 := 60,
+        SDL_SCANCODE_F4 := 61,
+        SDL_SCANCODE_F5 := 62,
+        SDL_SCANCODE_F6 := 63,
+        SDL_SCANCODE_F7 := 64,
+        SDL_SCANCODE_F8 := 65,
+        SDL_SCANCODE_F9 := 66,
+        SDL_SCANCODE_F10 := 67,
+        SDL_SCANCODE_F11 := 68,
+        SDL_SCANCODE_F12 := 69,
+        SDL_SCANCODE_PRINTSCREEN := 70,
+        SDL_SCANCODE_SCROLLLOCK := 71,
+        SDL_SCANCODE_PAUSE := 72,
+        SDL_SCANCODE_INSERT := 73,
+        SDL_SCANCODE_HOME := 74,
+        SDL_SCANCODE_PAGEUP := 75,
+        SDL_SCANCODE_DELETE := 76,
+        SDL_SCANCODE_END := 77,
+        SDL_SCANCODE_PAGEDOWN := 78,
+        SDL_SCANCODE_RIGHT := 79,
+        SDL_SCANCODE_LEFT := 80,
+        SDL_SCANCODE_DOWN := 81,
+        SDL_SCANCODE_UP := 82,
+        SDL_SCANCODE_NUMLOCKCLEAR := 83,
+        SDL_SCANCODE_KP_DIVIDE := 84,
+        SDL_SCANCODE_KP_MULTIPLY := 85,
+        SDL_SCANCODE_KP_MINUS := 86,
+        SDL_SCANCODE_KP_PLUS := 87,
+        SDL_SCANCODE_KP_ENTER := 88,
+        SDL_SCANCODE_KP_1 := 89,
+        SDL_SCANCODE_KP_2 := 90,
+        SDL_SCANCODE_KP_3 := 91,
+        SDL_SCANCODE_KP_4 := 92,
+        SDL_SCANCODE_KP_5 := 93,
+        SDL_SCANCODE_KP_6 := 94,
+        SDL_SCANCODE_KP_7 := 95,
+        SDL_SCANCODE_KP_8 := 96,
+        SDL_SCANCODE_KP_9 := 97,
+        SDL_SCANCODE_KP_0 := 98,
+        SDL_SCANCODE_KP_PERIOD := 99,
+        SDL_SCANCODE_NONUSBACKSLASH := 100,
+        SDL_SCANCODE_APPLICATION := 101,
+        SDL_SCANCODE_POWER := 102,
+        SDL_SCANCODE_KP_EQUALS := 103,
+        SDL_SCANCODE_F13 := 104,
+        SDL_SCANCODE_F14 := 105,
+        SDL_SCANCODE_F15 := 106,
+        SDL_SCANCODE_F16 := 107,
+        SDL_SCANCODE_F17 := 108,
+        SDL_SCANCODE_F18 := 109,
+        SDL_SCANCODE_F19 := 110,
+        SDL_SCANCODE_F20 := 111,
+        SDL_SCANCODE_F21 := 112,
+        SDL_SCANCODE_F22 := 113,
+        SDL_SCANCODE_F23 := 114,
+        SDL_SCANCODE_F24 := 115,
+        SDL_SCANCODE_EXECUTE := 116,
+        SDL_SCANCODE_HELP := 117,
+        SDL_SCANCODE_MENU := 118,
+        SDL_SCANCODE_SELECT := 119,
+        SDL_SCANCODE_STOP := 120,
+        SDL_SCANCODE_AGAIN := 121,
+        SDL_SCANCODE_UNDO := 122,
+        SDL_SCANCODE_CUT := 123,
+        SDL_SCANCODE_COPY := 124,
+        SDL_SCANCODE_PASTE := 125,
+        SDL_SCANCODE_FIND := 126,
+        SDL_SCANCODE_MUTE := 127,
+        SDL_SCANCODE_VOLUMEUP := 128,
+        SDL_SCANCODE_VOLUMEDOWN := 129,
+        SDL_SCANCODE_KP_COMMA := 133,
+        SDL_SCANCODE_KP_EQUALSAS400 := 134,
+        SDL_SCANCODE_INTERNATIONAL1 := 135,
+        SDL_SCANCODE_INTERNATIONAL2 := 136,
+        SDL_SCANCODE_INTERNATIONAL3 := 137,
+        SDL_SCANCODE_INTERNATIONAL4 := 138,
+        SDL_SCANCODE_INTERNATIONAL5 := 139,
+        SDL_SCANCODE_INTERNATIONAL6 := 140,
+        SDL_SCANCODE_INTERNATIONAL7 := 141,
+        SDL_SCANCODE_INTERNATIONAL8 := 142,
+        SDL_SCANCODE_INTERNATIONAL9 := 143,
+        SDL_SCANCODE_LANG1 := 144, (*< Hangul/English toggle *)
+        SDL_SCANCODE_LANG2 := 145, (*< Hanja conversion *)
+        SDL_SCANCODE_LANG3 := 146, (*< Katakana *)
+        SDL_SCANCODE_LANG4 := 147, (*< Hiragana *)
+        SDL_SCANCODE_LANG5 := 148, (*< Zenkaku/Hankaku *)
+        SDL_SCANCODE_LANG6 := 149, (*< reserved *)
+        SDL_SCANCODE_LANG7 := 150, (*< reserved *)
+        SDL_SCANCODE_LANG8 := 151, (*< reserved *)
+        SDL_SCANCODE_LANG9 := 152, (*< reserved *)
+        SDL_SCANCODE_ALTERASE := 153,
+        SDL_SCANCODE_SYSREQ := 154,
+        SDL_SCANCODE_CANCEL := 155,
+        SDL_SCANCODE_CLEAR := 156,
+        SDL_SCANCODE_PRIOR := 157,
+        SDL_SCANCODE_RETURN2 := 158,
+        SDL_SCANCODE_SEPARATOR := 159,
+        SDL_SCANCODE_OUT := 160,
+        SDL_SCANCODE_OPER := 161,
+        SDL_SCANCODE_CLEARAGAIN := 162,
+        SDL_SCANCODE_CRSEL := 163,
+        SDL_SCANCODE_EXSEL := 164,
+        SDL_SCANCODE_KP_00 := 176,
+        SDL_SCANCODE_KP_000 := 177,
+        SDL_SCANCODE_THOUSANDSSEPARATOR := 178,
+        SDL_SCANCODE_DECIMALSEPARATOR := 179,
+        SDL_SCANCODE_CURRENCYUNIT := 180,
+        SDL_SCANCODE_CURRENCYSUBUNIT := 181,
+        SDL_SCANCODE_KP_LEFTPAREN := 182,
+        SDL_SCANCODE_KP_RIGHTPAREN := 183,
+        SDL_SCANCODE_KP_LEFTBRACE := 184,
+        SDL_SCANCODE_KP_RIGHTBRACE := 185,
+        SDL_SCANCODE_KP_TAB := 186,
+        SDL_SCANCODE_KP_BACKSPACE := 187,
+        SDL_SCANCODE_KP_A := 188,
+        SDL_SCANCODE_KP_B := 189,
+        SDL_SCANCODE_KP_C := 190,
+        SDL_SCANCODE_KP_D := 191,
+        SDL_SCANCODE_KP_E := 192,
+        SDL_SCANCODE_KP_F := 193,
+        SDL_SCANCODE_KP_XOR := 194,
+        SDL_SCANCODE_KP_POWER := 195,
+        SDL_SCANCODE_KP_PERCENT := 196,
+        SDL_SCANCODE_KP_LESS := 197,
+        SDL_SCANCODE_KP_GREATER := 198,
+        SDL_SCANCODE_KP_AMPERSAND := 199,
+        SDL_SCANCODE_KP_DBLAMPERSAND := 200,
+        SDL_SCANCODE_KP_VERTICALBAR := 201,
+        SDL_SCANCODE_KP_DBLVERTICALBAR := 202,
+        SDL_SCANCODE_KP_COLON := 203,
+        SDL_SCANCODE_KP_HASH := 204,
+        SDL_SCANCODE_KP_SPACE := 205,
+        SDL_SCANCODE_KP_AT := 206,
+        SDL_SCANCODE_KP_EXCLAM := 207,
+        SDL_SCANCODE_KP_MEMSTORE := 208,
+        SDL_SCANCODE_KP_MEMRECALL := 209,
+        SDL_SCANCODE_KP_MEMCLEAR := 210,
+        SDL_SCANCODE_KP_MEMADD := 211,
+        SDL_SCANCODE_KP_MEMSUBTRACT := 212,
+        SDL_SCANCODE_KP_MEMMULTIPLY := 213,
+        SDL_SCANCODE_KP_MEMDIVIDE := 214,
+        SDL_SCANCODE_KP_PLUSMINUS := 215,
+        SDL_SCANCODE_KP_CLEAR := 216,
+        SDL_SCANCODE_KP_CLEARENTRY := 217,
+        SDL_SCANCODE_KP_BINARY := 218,
+        SDL_SCANCODE_KP_OCTAL := 219,
+        SDL_SCANCODE_KP_DECIMAL := 220,
+        SDL_SCANCODE_KP_HEXADECIMAL := 221,
+        SDL_SCANCODE_LCTRL := 224,
+        SDL_SCANCODE_LSHIFT := 225,
+        SDL_SCANCODE_LALT := 226,
+        SDL_SCANCODE_LGUI := 227,
+        SDL_SCANCODE_RCTRL := 228,
+        SDL_SCANCODE_RSHIFT := 229,
+        SDL_SCANCODE_RALT := 230,
+        SDL_SCANCODE_RGUI := 231,
+        SDL_SCANCODE_MODE := 257,
+        SDL_SCANCODE_AUDIONEXT := 258,
+        SDL_SCANCODE_AUDIOPREV := 259,
+        SDL_SCANCODE_AUDIOSTOP := 260,
+        SDL_SCANCODE_AUDIOPLAY := 261,
+        SDL_SCANCODE_AUDIOMUTE := 262,
+        SDL_SCANCODE_MEDIASELECT := 263,
+        SDL_SCANCODE_WWW := 264,
+        SDL_SCANCODE_MAIL := 265,
+        SDL_SCANCODE_CALCULATOR := 266,
+        SDL_SCANCODE_COMPUTER := 267,
+        SDL_SCANCODE_AC_SEARCH := 268,
+        SDL_SCANCODE_AC_HOME := 269,
+        SDL_SCANCODE_AC_BACK := 270,
+        SDL_SCANCODE_AC_FORWARD := 271,
+        SDL_SCANCODE_AC_STOP := 272,
+        SDL_SCANCODE_AC_REFRESH := 273,
+        SDL_SCANCODE_AC_BOOKMARKS := 274,
+        SDL_SCANCODE_BRIGHTNESSDOWN := 275,
+        SDL_SCANCODE_BRIGHTNESSUP := 276,
+        SDL_SCANCODE_DISPLAYSWITCH := 277,
+        SDL_SCANCODE_KBDILLUMTOGGLE := 278,
+        SDL_SCANCODE_KBDILLUMDOWN := 279,
+        SDL_SCANCODE_KBDILLUMUP := 280,
+        SDL_SCANCODE_EJECT := 281,
+        SDL_SCANCODE_SLEEP := 282,
+        SDL_SCANCODE_APP1 := 283,
+        SDL_SCANCODE_APP2 := 284
+    );
+
     PSDL_Rect = ^TSDL_Rect;
     TSDL_Rect = record
         x, y, w, h: LongInt;
@@ -441,8 +689,8 @@
 {* SDL_Event type definition *}
 
     TSDL_Keysym = record
-        scancode: LongInt;
-        sym: LongInt;
+        scancode: TSDL_Scancode;
+        sym: TSDL_Keycode;
         modifier: Word;
         unused: LongWord;
         end;
@@ -854,10 +1102,10 @@
 
 
 function  SDL_GetMouseState(x, y: PLongInt): Byte; cdecl; external SDLLibName;
-function  SDL_GetKeyName(key: LongWord): PChar; cdecl; external SDLLibName;
-function  SDL_GetScancodeName(key: LongWord): PChar; cdecl; external SDLLibName;
-function  SDL_GetKeyFromScancode(key: LongWord): LongInt; cdecl; external SDLLibName;
-
+function  SDL_GetKeyName(key: TSDL_Keycode): PChar; cdecl; external SDLLibName;
+function  SDL_GetScancodeName(key: TSDL_Scancode): PChar; cdecl; external SDLLibName;
+function  SDL_GetKeyFromScancode(key: TSDL_Scancode): TSDL_Keycode; cdecl; external SDLLibName;
+// SDL2 functions has some additional functions (not listed here) for keycode/scancode translation
 
 procedure SDL_PumpEvents; cdecl; external SDLLibName;
 function  SDL_PollEvent(event: PSDL_Event): LongInt; cdecl; external SDLLibName;
--- a/hedgewars/hwengine.pas	Tue Nov 10 22:37:54 2015 +0100
+++ b/hedgewars/hwengine.pas	Wed Nov 11 19:25:56 2015 +0100
@@ -169,7 +169,7 @@
                     if GameState = gsChat then
                         begin
                     // sdl on iphone supports only ashii keyboards and the unicode field is deprecated in sdl 1.3
-                        KeyPressChat(SDL_GetKeyFromScancode(event.key.keysym.sym), event.key.keysym.sym, event.key.keysym.modifier);
+                        KeyPressChat(event.key.keysym);
                         end
                     else
                         if GameState >= gsGame then ProcessKey(event.key);
--- a/hedgewars/uChat.pas	Tue Nov 10 22:37:54 2015 +0100
+++ b/hedgewars/uChat.pas	Wed Nov 11 19:25:56 2015 +0100
@@ -29,10 +29,9 @@
 procedure CleanupInput;
 procedure AddChatString(s: shortstring);
 procedure DrawChat;
-procedure KeyPressChat(Key, Sym: Longword; Modifier: Word);
+procedure KeyPressChat(keysym: TSDL_Keysym);
 procedure SendHogSpeech(s: shortstring);
 procedure CopyToClipboard(var newContent: shortstring);
-
 procedure TextInput(var event: TSDL_TextInputEvent);
 
 implementation
@@ -572,6 +571,7 @@
     FreezeEnterKey;
     history:= 0;
     SDL_StopTextInput();
+    //SDL_EnableKeyRepeat(0,0);
     GameState:= gsGame;
     ResetKbd;
 end;
@@ -780,25 +780,6 @@
         end;
 end;
 
-procedure TextInput(var event: TSDL_TextInputEvent);
-var s: shortstring;
-    l: byte;
-begin
-    DeleteSelected();
-
-    l:= 0;
-    while event.text[l] <> #0 do
-        begin
-        s[l + 1]:= event.text[l];
-        inc(l)
-        end;
-    s[0]:= char(l);
-
-    if byte(InputStr.s[0]) + l > 240 then exit;
-
-    InsertIntoInputStr(s);
-end;
-
 procedure PasteFromClipboard();
 var clip: PChar;
 begin
@@ -815,14 +796,21 @@
         end;
 end;
 
-procedure KeyPressChat(Key, Sym: Longword; Modifier: Word);
+procedure KeyPressChat(keysym: TSDL_Keysym);
 const firstByteMark: array[0..3] of byte = (0, $C0, $E0, $F0);
       nonStateMask = (not (KMOD_NUM or KMOD_CAPS));
 var i, btw, index: integer;
     utf8: shortstring;
     action, selMode, ctrl, ctrlonly: boolean;
     skip: TCharSkip;
+    Scancode: TSDL_Scancode;
+    Sym: TSDL_Keycode;
+    Modifier: Word;
 begin
+    Scancode:= keysym.scancode;
+    Sym:= keysym.sym;
+    Modifier:= keysym.modifier;
+
     LastKeyPressTick:= RealTicks;
     action:= true;
 
@@ -831,8 +819,8 @@
     ctrlonly:= ctrl and ((modifier and nonStateMask and (not (KMOD_LCTRL or KMOD_RCTRL))) = 0);
     skip:= none;
 
-    case Sym of
-        SDLK_BACKSPACE:
+    case Scancode of
+        SDL_SCANCODE_BACKSPACE:
             begin
             if selectedPos < 0 then
                 begin
@@ -849,7 +837,7 @@
             DeleteSelected();
             UpdateCursorCoords();
             end;
-        SDLK_DELETE:
+        SDL_SCANCODE_DELETE:
             begin
             if selectedPos < 0 then
                 begin
@@ -866,7 +854,7 @@
             DeleteSelected();
             UpdateCursorCoords();
             end;
-        SDLK_ESCAPE:
+        SDL_SCANCODE_ESCAPE:
             begin
             if Length(InputStr.s) > 0 then
                 begin
@@ -875,7 +863,7 @@
                 end
             else CleanupInput
             end;
-        SDLK_RETURN, SDLK_KP_ENTER:
+        SDL_SCANCODE_RETURN, SDL_SCANCODE_KP_ENTER:
             begin
             if Length(InputStr.s) > 0 then
                 begin
@@ -885,10 +873,10 @@
                 end;
             CleanupInput
             end;
-        SDLK_UP, SDLK_DOWN:
+        SDL_SCANCODE_UP, SDL_SCANCODE_DOWN:
             begin
-            if (Sym = SDLK_UP) and (history < localLastStr) then inc(history);
-            if (Sym = SDLK_DOWN) and (history > 0) then dec(history);
+            if (Scancode = SDL_SCANCODE_UP) and (history < localLastStr) then inc(history);
+            if (Scancode = SDL_SCANCODE_DOWN) and (history > 0) then dec(history);
             index:= localLastStr - history + 1;
             if (index > localLastStr) then
                 begin
@@ -902,7 +890,7 @@
             ResetSelection();
             UpdateCursorCoords();
             end;
-        SDLK_HOME:
+        SDL_SCANCODE_HOME:
             begin
             if cursorPos > 0 then
                 begin
@@ -914,7 +902,7 @@
 
             UpdateCursorCoords();
             end;
-        SDLK_END:
+        SDL_SCANCODE_END:
             begin
             i:= Length(InputStr.s);
             if cursorPos < i then
@@ -927,7 +915,7 @@
 
             UpdateCursorCoords();
             end;
-        SDLK_LEFT:
+        SDL_SCANCODE_LEFT:
             begin
             if cursorPos > 0 then
                 begin
@@ -956,7 +944,7 @@
 
             UpdateCursorCoords();
             end;
-        SDLK_RIGHT:
+        SDL_SCANCODE_RIGHT:
             begin
             if cursorPos < Length(InputStr.s) then
                 begin
@@ -981,11 +969,12 @@
 
             UpdateCursorCoords();
             end;
-        SDLK_PAGEUP, SDLK_PAGEDOWN:
+        SDL_SCANCODE_PAGEUP, SDL_SCANCODE_PAGEDOWN:
             begin
             // ignore me!!!
             end;
-        SDLK_a:
+        // TODO: figure out how to determine those keys better
+        SDL_SCANCODE_a:
             begin
             // select all
             if ctrlonly then
@@ -999,7 +988,7 @@
             else
                 action:= false;
             end;
-        SDLK_c:
+        SDL_SCANCODE_c:
             begin
             // copy
             if ctrlonly then
@@ -1007,7 +996,7 @@
             else
                 action:= false;
             end;
-        SDLK_v:
+        SDL_SCANCODE_v:
             begin
             // paste
             if ctrlonly then
@@ -1018,7 +1007,7 @@
             else
                 action:= false;
             end;
-        SDLK_x:
+        SDL_SCANCODE_x:
             begin
             // cut
             if ctrlonly then
@@ -1032,10 +1021,69 @@
         else
             action:= false;
         end;
+    (*
+    if (not action) and (Sym <> SDLK_UNKNOWN) and ((Sym and SDLK_SCANCODE_MASK) = 0) then
+        begin
+        DeleteSelected();
 
-        // TODO: ctrl+c etc. probably won't work anymore while in text input mode
+        if (Sym < $80) then
+            btw:= 1
+        else if (Sym < $800) then
+            btw:= 2
+        else if (Sym < $10000) then
+            btw:= 3
+        else
+            btw:= 4;
+
+        utf8:= '';
+
+        for i:= btw downto 2 do
+            begin
+            utf8:= char((Sym or $80) and $BF) + utf8;
+            Sym:= Sym shr 6
+            end;
+
+        utf8:= char(Sym or firstByteMark[Pred(btw)]) + utf8;
+
+        if Length(InputStr.s) + btw > MaxInputStrLen then
+            exit;
+
+        // if speech bubble quotes are used as first input, add the closing quote and place cursor inbetween
+        if (Length(InputStr.s) = 0) and (Length(utf8) = 1) and (charIsForHogSpeech(utf8[1])) then
+            begin
+            InsertIntoInputStr(utf8);
+            InsertIntoInputStr(utf8);
+            cursorPos:= 1;
+            UpdateCursorCoords();
+            end
+        else
+            InsertIntoInputStr(utf8);
+        end
+        *)
 end;
 
+procedure TextInput(var event: TSDL_TextInputEvent);
+var s: shortstring;
+    l: byte;
+begin
+    DeleteSelected();
+
+    l:= 0;
+    while event.text[l] <> #0 do
+        begin
+        s[l + 1]:= event.text[l];
+        inc(l)
+        end;
+
+    if l > 0 then
+        begin
+        if byte(InputStr.s[0]) + l > 240 then exit;
+        s[0]:= char(l);
+        InsertIntoInputStr(s);
+        end
+end;
+
+
 procedure chChatMessage(var s: shortstring);
 begin
     AddChatString(s)
@@ -1081,7 +1129,9 @@
 begin
     s:= s; // avoid compiler hint
     GameState:= gsChat;
+    SDL_StopTextInput();
     SDL_StartTextInput();
+    //SDL_EnableKeyRepeat(200,45);
     if length(s) = 0 then
         SetLine(InputStr, '', true)
     else
@@ -1121,6 +1171,7 @@
 
     LastKeyPressTick:= 0;
     ResetCursor();
+    SDL_StopTextInput();
 end;
 
 procedure freeModule;
--- a/hedgewars/uInputHandler.pas	Tue Nov 10 22:37:54 2015 +0100
+++ b/hedgewars/uInputHandler.pas	Wed Nov 11 19:25:56 2015 +0100
@@ -210,7 +210,8 @@
 procedure ProcessKey(event: TSDL_KeyboardEvent); inline;
 var code: LongInt;
 begin
-    code:= event.keysym.scancode;
+    // TODO
+    code:= LongInt(event.keysym.scancode);
     //writelntoconsole('[KEY] '+inttostr(code)+ ' -> ''' +KeyNames[code] + ''', type = '+inttostr(event.type_));
     ProcessKey(code, event.type_ = SDL_KEYDOWN);
 end;
@@ -315,7 +316,7 @@
 
     for i:= 0 to cKeyMaxIndex - 5 do
         begin
-        s:= shortstring(SDL_GetScancodeName(i));
+        s:= shortstring(SDL_GetScancodeName(TSDL_Scancode(i)));
 
         for t:= 1 to Length(s) do
             if s[t] = ' ' then