# HG changeset patch # User nemo # Date 1363529594 14400 # Node ID b7b8bd398c1ba385ec9a12edbd77989e0dc6e91b # Parent c98ec68656315090746f7970a57bc0d2ba35f56b Key returned 0 for arrows under linux. Sym works, clearer anyway. diff -r c98ec6865631 -r b7b8bd398c1b hedgewars/SDLh.pas --- a/hedgewars/SDLh.pas Sun Mar 17 01:36:04 2013 +0100 +++ b/hedgewars/SDLh.pas Sun Mar 17 10:13:14 2013 -0400 @@ -312,6 +312,13 @@ IMG_INIT_PNG = $00000002; IMG_INIT_TIF = $00000004; + {* SDL_keysym *} + SDLK_BACKSPACE = 8; + SDLK_RETURN = 13; + SDLK_ESCAPE = 27; + SDLK_UP = 273; + SDLK_DOWN = 274; + ///////////////////////////////////////////////////////////////// /////////////////////// TYPE DEFINITIONS /////////////////////// diff -r c98ec6865631 -r b7b8bd398c1b hedgewars/hwengine.pas --- a/hedgewars/hwengine.pas Sun Mar 17 01:36:04 2013 +0100 +++ b/hedgewars/hwengine.pas Sun Mar 17 10:13:14 2013 -0400 @@ -167,8 +167,10 @@ {$IFDEF SDL13} SDL_KEYDOWN: 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))//TODO correct for keymodifiers + KeyPressChat(SDL_GetKeyFromScancode(event.key.keysym.sym, event.key.keysym.sym)//TODO correct for keymodifiers + end else ProcessKey(event.key); SDL_KEYUP: @@ -212,7 +214,7 @@ {$ELSE} SDL_KEYDOWN: if GameState = gsChat then - KeyPressChat(event.key.keysym.unicode) + KeyPressChat(event.key.keysym.unicode, event.key.keysym.sym) else ProcessKey(event.key); SDL_KEYUP: diff -r c98ec6865631 -r b7b8bd398c1b hedgewars/uChat.pas --- a/hedgewars/uChat.pas Sun Mar 17 01:36:04 2013 +0100 +++ b/hedgewars/uChat.pas Sun Mar 17 10:13:14 2013 -0400 @@ -28,7 +28,7 @@ procedure CleanupInput; procedure AddChatString(s: shortstring); procedure DrawChat; -procedure KeyPressChat(Key: Longword); +procedure KeyPressChat(Key, Sym: Longword); implementation uses SDLh, uInputHandler, uTypes, uVariables, uCommands, uUtils, uTextures, uRender, uIO; @@ -303,72 +303,78 @@ ResetKbd; end; -procedure KeyPressChat(Key: Longword); +procedure KeyPressChat(Key, Sym: Longword); const firstByteMark: array[0..3] of byte = (0, $C0, $E0, $F0); var i, btw, index: integer; utf8: shortstring; + action: boolean; begin - if Key <> 0 then - case Key of - {Backspace} - 8, 127: if Length(InputStr.s) > 0 then + action:= false; + if Sym <> 0 then + case Sym of + SDLK_BACKSPACE: begin - InputStr.s[0]:= InputStrL[byte(InputStr.s[0])]; - SetLine(InputStr, InputStr.s, true) + action:= true; + if Length(InputStr.s) > 0 then + begin + InputStr.s[0]:= InputStrL[byte(InputStr.s[0])]; + SetLine(InputStr, InputStr.s, true) + end + end; + SDLK_ESCAPE: + begin + action:= true; + if Length(InputStr.s) > 0 then + SetLine(InputStr, '', true) + else CleanupInput end; - {Esc} - 27: if Length(InputStr.s) > 0 then SetLine(InputStr, '', true) - else CleanupInput; - {Return} - 3, 13, 271: begin - if Length(InputStr.s) > 0 then + SDLK_RETURN: begin - AcceptChatString(InputStr.s); - SetLine(InputStr, '', false) + action:= true; + if Length(InputStr.s) > 0 then + begin + AcceptChatString(InputStr.s); + SetLine(InputStr, '', false) + end; + CleanupInput end; - CleanupInput; - end; - {arrow keys (up, down)} - 111, 116, //linux - 63232, 63233: //osx - begin - - if ((Key = 63232) or (Key = 111)) and (history < localLastStr) then inc(history); - if ((Key = 63233) or (Key = 116)) and (history > 0) then dec(history); + SDLK_UP, SDLK_DOWN: + begin + action:= true; + if (Sym = SDLK_UP) and (history < localLastStr) then inc(history); + if (Sym = SDLK_DOWN) and (history > 0) then dec(history); + index:= localLastStr - history + 1; + if (index > localLastStr) then + SetLine(InputStr, '', true) + else SetLine(InputStr, LocalStrs[index], true) + end + end; + if not action and (Key <> 0) then + begin + if (Key < $80) then + btw:= 1 + else if (Key < $800) then + btw:= 2 + else if (Key < $10000) then + btw:= 3 + else + btw:= 4; - index:= localLastStr - history + 1; - if (index > localLastStr) then - SetLine(InputStr, '', true) - else - SetLine(InputStr, LocalStrs[index], true); + utf8:= ''; + + for i:= btw downto 2 do + begin + utf8:= char((Key or $80) and $BF) + utf8; + Key:= Key shr 6 end; - {arrow keys (left, right)} - 63234, 63235: begin end; - else - if (Key < $80) then - btw:= 1 - else if (Key < $800) then - btw:= 2 - else if (Key < $10000) then - btw:= 3 - else - btw:= 4; - utf8:= ''; + utf8:= char(Key or firstByteMark[Pred(btw)]) + utf8; - for i:= btw downto 2 do - begin - utf8:= char((Key or $80) and $BF) + utf8; - Key:= Key shr 6 - end; + if byte(InputStr.s[0]) + btw > 240 then + exit; - utf8:= char(Key or firstByteMark[Pred(btw)]) + utf8; - - if byte(InputStr.s[0]) + btw > 240 then - exit; - - InputStrL[byte(InputStr.s[0]) + btw]:= InputStr.s[0]; - SetLine(InputStr, InputStr.s + utf8, true) + InputStrL[byte(InputStr.s[0]) + btw]:= InputStr.s[0]; + SetLine(InputStr, InputStr.s + utf8, true) end end;