author | sheepluva |
Fri, 13 Nov 2015 22:35:26 +0100 | |
branch | sdl2transition |
changeset 11372 | 208bc571f949 |
parent 11365 | b8b208501475 |
child 11476 | c4e1d39acc56 |
permissions | -rw-r--r-- |
942 | 1 |
(* |
1066 | 2 |
* Hedgewars, a free turn based strategy game |
11046 | 3 |
* Copyright (c) 2004-2015 Andrey Korotaev <unC0Rr@gmail.com> |
942 | 4 |
* |
5 |
* This program is free software; you can redistribute it and/or modify |
|
6 |
* it under the terms of the GNU General Public License as published by |
|
7 |
* the Free Software Foundation; version 2 of the License |
|
8 |
* |
|
9 |
* This program is distributed in the hope that it will be useful, |
|
10 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
11 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
12 |
* GNU General Public License for more details. |
|
13 |
* |
|
14 |
* You should have received a copy of the GNU General Public License |
|
15 |
* along with this program; if not, write to the Free Software |
|
10108
c68cf030eded
update FSF address. note: two sdl include files (by Sam Lantinga) still have the old FSF address in their copyright - but I ain't gonna touch their copyright headers
sheepluva
parents:
10104
diff
changeset
|
16 |
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
942 | 17 |
*) |
18 |
||
2630 | 19 |
{$INCLUDE "options.inc"} |
20 |
||
942 | 21 |
unit uChat; |
22 |
||
23 |
interface |
|
9699
fab319c85a39
Accept SDL_TEXTINPUT events for chat (why first and only first chat invocation receives event for 't' key?)
unc0rr
parents:
9697
diff
changeset
|
24 |
uses SDLh; |
942 | 25 |
|
3038 | 26 |
procedure initModule; |
27 |
procedure freeModule; |
|
6379 | 28 |
procedure ReloadLines; |
8738 | 29 |
procedure CleanupInput; |
942 | 30 |
procedure AddChatString(s: shortstring); |
31 |
procedure DrawChat; |
|
11365 | 32 |
procedure KeyPressChat(keysym: TSDL_Keysym); |
9669 | 33 |
procedure SendHogSpeech(s: shortstring); |
10849
a772d342066a
copy&paste (wip), currently using only a local clipboard
sheepluva
parents:
10846
diff
changeset
|
34 |
procedure CopyToClipboard(var newContent: shortstring); |
9699
fab319c85a39
Accept SDL_TEXTINPUT events for chat (why first and only first chat invocation receives event for 't' key?)
unc0rr
parents:
9697
diff
changeset
|
35 |
procedure TextInput(var event: TSDL_TextInputEvent); |
fab319c85a39
Accept SDL_TEXTINPUT events for chat (why first and only first chat invocation receives event for 't' key?)
unc0rr
parents:
9697
diff
changeset
|
36 |
|
942 | 37 |
implementation |
11362 | 38 |
uses uInputHandler, uTypes, uVariables, uCommands, uUtils, uTextures, uRender, uIO, uScript, uRenderUtils; |
942 | 39 |
|
990
dfa6a6fe1542
Implement history for chat (27 entries), no key binding yet
unc0rr
parents:
988
diff
changeset
|
40 |
const MaxStrIndex = 27; |
10921 | 41 |
MaxInputStrLen = 200; |
942 | 42 |
|
946 | 43 |
type TChatLine = record |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset
|
44 |
Tex: PTexture; |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset
|
45 |
Time: Longword; |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset
|
46 |
Width: LongInt; |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset
|
47 |
s: shortstring; |
10303 | 48 |
Color: TSDL_Color; |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset
|
49 |
end; |
9954 | 50 |
TChatCmd = (ccQuit, ccPause, ccFinish, ccShowHistory, ccFullScreen); |
942 | 51 |
|
946 | 52 |
var Strs: array[0 .. MaxStrIndex] of TChatLine; |
3539 | 53 |
MStrs: array[0 .. MaxStrIndex] of shortstring; |
8740
3eb1891f81ef
use a local storage for chat history which prevents mix ups in netgame and simplifies code
koda
parents:
8739
diff
changeset
|
54 |
LocalStrs: array[0 .. MaxStrIndex] of shortstring; |
3539 | 55 |
missedCount: LongWord; |
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2699
diff
changeset
|
56 |
lastStr: LongWord; |
9145 | 57 |
localLastStr: LongInt; |
58 |
history: LongInt; |
|
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2699
diff
changeset
|
59 |
visibleCount: LongWord; |
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2699
diff
changeset
|
60 |
InputStr: TChatLine; |
4814
e19791f08443
smaller rearrangement of (non stereo related) variables
koda
parents:
4467
diff
changeset
|
61 |
ChatReady: boolean; |
e19791f08443
smaller rearrangement of (non stereo related) variables
koda
parents:
4467
diff
changeset
|
62 |
showAll: boolean; |
10312 | 63 |
liveLua: boolean; |
10514
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
64 |
ChatHidden: boolean; |
10842
a039464cbb4a
since fonts can be loaded in late, update cursor position before first chat display
sheepluva
parents:
10841
diff
changeset
|
65 |
firstDraw: boolean; |
10852
9e5763cb805e
render input prefix independent of inputstr so that e.g. a username will not lead to weirdnesses
sheepluva
parents:
10851
diff
changeset
|
66 |
InputLinePrefix: TChatLine; |
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
67 |
// cursor |
10836 | 68 |
cursorPos, cursorX, selectedPos, selectionDx: LongInt; |
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
69 |
LastKeyPressTick: LongWord; |
942 | 70 |
|
71 |
||
8152 | 72 |
const |
11022 | 73 |
colors: array[#0..#9] of TSDL_Color = ( |
74 |
(r:$FF; g:$FF; b:$FF; a:$FF), // #0 unused, feel free to take it for anything |
|
75 |
(r:$FF; g:$FF; b:$FF; a:$FF), // #1 chat message [White] |
|
76 |
(r:$FF; g:$00; b:$FF; a:$FF), // #2 action message [Purple] |
|
77 |
(r:$90; g:$FF; b:$90; a:$FF), // #3 join/leave message [Lime] |
|
78 |
(r:$FF; g:$FF; b:$A0; a:$FF), // #4 team message [Light Yellow] |
|
79 |
(r:$FF; g:$00; b:$00; a:$FF), // #5 error messages [Red] |
|
80 |
(r:$00; g:$FF; b:$FF; a:$FF), // #6 input line [Light Blue] |
|
81 |
(r:$FF; g:$80; b:$80; a:$FF), // #7 team gone [Light Red] |
|
82 |
(r:$FF; g:$D0; b:$80; a:$FF), // #8 team back [Light Orange] |
|
83 |
(r:$DF; g:$DF; b:$DF; a:$FF) // #9 hog speech [Light Gray] |
|
8152 | 84 |
); |
85 |
ChatCommandz: array [TChatCmd] of record |
|
86 |
ChatCmd: string[31]; |
|
87 |
ProcedureCallChatCmd: string[31]; |
|
88 |
end = ( |
|
89 |
(ChatCmd: '/quit'; ProcedureCallChatCmd: 'halt'), |
|
90 |
(ChatCmd: '/pause'; ProcedureCallChatCmd: 'pause'), |
|
91 |
(ChatCmd: '/finish'; ProcedureCallChatCmd: 'finish'), |
|
9569 | 92 |
(ChatCmd: '/history'; ProcedureCallChatCmd: 'history'), |
8152 | 93 |
(ChatCmd: '/fullscreen'; ProcedureCallChatCmd: 'fullscr') |
94 |
); |
|
2396 | 95 |
|
10303 | 96 |
|
97 |
const Padding = 2; |
|
98 |
ClHeight = 2 * Padding + 16; // font height |
|
99 |
||
10920
11a28d22985f
different implementation for utf-8 char detection/handling
sheepluva
parents:
10919
diff
changeset
|
100 |
// relevant for UTF-8 handling |
10921 | 101 |
function IsFirstCharByte(c: char): boolean; inline; |
10920
11a28d22985f
different implementation for utf-8 char detection/handling
sheepluva
parents:
10919
diff
changeset
|
102 |
begin |
11a28d22985f
different implementation for utf-8 char detection/handling
sheepluva
parents:
10919
diff
changeset
|
103 |
// based on https://en.wikipedia.org/wiki/UTF-8#Description |
10921 | 104 |
IsFirstCharByte:= (byte(c) and $C0) <> $80; |
10920
11a28d22985f
different implementation for utf-8 char detection/handling
sheepluva
parents:
10919
diff
changeset
|
105 |
end; |
11a28d22985f
different implementation for utf-8 char detection/handling
sheepluva
parents:
10919
diff
changeset
|
106 |
|
10866 | 107 |
function charIsForHogSpeech(c: char): boolean; |
108 |
begin |
|
109 |
exit((c = '"') or (c = '''') or (c = '-')); |
|
110 |
end; |
|
111 |
||
10836 | 112 |
procedure ResetSelection(); |
942 | 113 |
begin |
10836 | 114 |
selectedPos:= -1; |
115 |
end; |
|
116 |
||
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
117 |
procedure UpdateCursorCoords(); |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
118 |
var font: THWFont; |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
119 |
str : shortstring; |
10836 | 120 |
coff, soff: LongInt; |
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
121 |
begin |
10836 | 122 |
if cursorPos = selectedPos then |
123 |
ResetSelection(); |
|
2396 | 124 |
|
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
125 |
// calculate cursor offset |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
126 |
|
10852
9e5763cb805e
render input prefix independent of inputstr so that e.g. a username will not lead to weirdnesses
sheepluva
parents:
10851
diff
changeset
|
127 |
str:= InputStr.s; |
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
128 |
font:= CheckCJKFont(ansistring(str), fnt16); |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
129 |
|
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
130 |
// get only substring before cursor to determine length |
10852
9e5763cb805e
render input prefix independent of inputstr so that e.g. a username will not lead to weirdnesses
sheepluva
parents:
10851
diff
changeset
|
131 |
// SetLength(str, cursorPos); // makes pas2c unhappy |
9e5763cb805e
render input prefix independent of inputstr so that e.g. a username will not lead to weirdnesses
sheepluva
parents:
10851
diff
changeset
|
132 |
str[0]:= char(cursorPos); |
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
133 |
// get render size of text |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
134 |
TTF_SizeUTF8(Fontz[font].Handle, Str2PChar(str), @coff, nil); |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
135 |
|
10842
a039464cbb4a
since fonts can be loaded in late, update cursor position before first chat display
sheepluva
parents:
10841
diff
changeset
|
136 |
cursorX:= 2 + coff; |
990
dfa6a6fe1542
Implement history for chat (27 entries), no key binding yet
unc0rr
parents:
988
diff
changeset
|
137 |
|
10836 | 138 |
// calculate selection width on screen |
139 |
if selectedPos >= 0 then |
|
140 |
begin |
|
141 |
if selectedPos > cursorPos then |
|
10852
9e5763cb805e
render input prefix independent of inputstr so that e.g. a username will not lead to weirdnesses
sheepluva
parents:
10851
diff
changeset
|
142 |
str:= InputStr.s; |
9e5763cb805e
render input prefix independent of inputstr so that e.g. a username will not lead to weirdnesses
sheepluva
parents:
10851
diff
changeset
|
143 |
// SetLength(str, selectedPos); // makes pas2c unhappy |
9e5763cb805e
render input prefix independent of inputstr so that e.g. a username will not lead to weirdnesses
sheepluva
parents:
10851
diff
changeset
|
144 |
str[0]:= char(selectedPos); |
10836 | 145 |
TTF_SizeUTF8(Fontz[font].Handle, Str2PChar(str), @soff, nil); |
146 |
selectionDx:= soff - coff; |
|
147 |
end |
|
148 |
else |
|
149 |
selectionDx:= 0; |
|
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
150 |
end; |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
151 |
|
10836 | 152 |
|
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
153 |
procedure ResetCursor(); |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
154 |
begin |
10836 | 155 |
ResetSelection(); |
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
156 |
cursorPos:= 0; |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
157 |
UpdateCursorCoords(); |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
158 |
end; |
2396 | 159 |
|
10985
c5348fe9077c
fix chat lines losing color information on texture reload
sheepluva
parents:
10926
diff
changeset
|
160 |
(* This procedure [re]renders a texture showing str for the chat line cl. |
c5348fe9077c
fix chat lines losing color information on texture reload
sheepluva
parents:
10926
diff
changeset
|
161 |
* It will use the color stored in cl and update width |
c5348fe9077c
fix chat lines losing color information on texture reload
sheepluva
parents:
10926
diff
changeset
|
162 |
*) |
10303 | 163 |
procedure RenderChatLineTex(var cl: TChatLine; var str: shortstring); |
164 |
var strSurface, |
|
165 |
resSurface: PSDL_Surface; |
|
166 |
dstrect : TSDL_Rect; // destination rectangle for blitting |
|
167 |
font : THWFont; |
|
168 |
const |
|
169 |
shadowint = $80 shl AShift; |
|
170 |
begin |
|
171 |
||
10985
c5348fe9077c
fix chat lines losing color information on texture reload
sheepluva
parents:
10926
diff
changeset
|
172 |
FreeAndNilTexture(cl.Tex); |
c5348fe9077c
fix chat lines losing color information on texture reload
sheepluva
parents:
10926
diff
changeset
|
173 |
|
10303 | 174 |
font:= CheckCJKFont(ansistring(str), fnt16); |
175 |
||
176 |
// get render size of text |
|
177 |
TTF_SizeUTF8(Fontz[font].Handle, Str2PChar(str), @cl.Width, nil); |
|
945
4ead9cde4e14
- Start chat implementation: chat strings are on the screen
unc0rr
parents:
942
diff
changeset
|
178 |
|
10303 | 179 |
// calculate and save size |
180 |
cl.Width := cl.Width + 2 * Padding; |
|
181 |
||
182 |
// create surface to draw on |
|
183 |
resSurface:= SDL_CreateRGBSurface( |
|
184 |
0, toPowerOf2(cl.Width), toPowerOf2(ClHeight), |
|
185 |
32, RMask, GMask, BMask, AMask); |
|
945
4ead9cde4e14
- Start chat implementation: chat strings are on the screen
unc0rr
parents:
942
diff
changeset
|
186 |
|
10303 | 187 |
// define area we want to draw in |
188 |
dstrect.x:= 0; |
|
189 |
dstrect.y:= 0; |
|
190 |
dstrect.w:= cl.Width; |
|
191 |
dstrect.h:= ClHeight; |
|
192 |
||
193 |
// draw background |
|
194 |
SDL_FillRect(resSurface, @dstrect, shadowint); |
|
195 |
||
196 |
// create and blit text |
|
10370 | 197 |
strSurface:= TTF_RenderUTF8_Blended(Fontz[font].Handle, Str2PChar(str), cl.color); |
10737 | 198 |
//SDL_UpperBlit(strSurface, nil, resSurface, @dstrect); |
199 |
if strSurface <> nil then copyTOXY(strSurface, resSurface, Padding, Padding); |
|
1118 | 200 |
SDL_FreeSurface(strSurface); |
201 |
||
2290
bf87ca44782e
Selectively enable clamping - seeing if this helps avoid weird flake problems while still fixing vertical lines in waves and sky
nemo
parents:
2161
diff
changeset
|
202 |
cl.Tex:= Surface2Tex(resSurface, false); |
1431 | 203 |
|
1118 | 204 |
SDL_FreeSurface(resSurface) |
946 | 205 |
end; |
206 |
||
10303 | 207 |
const ClDisplayDuration = 12500; |
2396 | 208 |
|
990
dfa6a6fe1542
Implement history for chat (27 entries), no key binding yet
unc0rr
parents:
988
diff
changeset
|
209 |
procedure SetLine(var cl: TChatLine; str: shortstring; isInput: boolean); |
10303 | 210 |
var color : TSDL_Color; |
942 | 211 |
begin |
2396 | 212 |
if isInput then |
6379 | 213 |
begin |
10303 | 214 |
cl.s:= str; |
5392 | 215 |
color:= colors[#6]; |
10852
9e5763cb805e
render input prefix independent of inputstr so that e.g. a username will not lead to weirdnesses
sheepluva
parents:
10851
diff
changeset
|
216 |
str:= str + ' '; |
6379 | 217 |
end |
2664
949c189ba568
powerpc and gameserver compilation disabled temporarily
koda
parents:
2630
diff
changeset
|
218 |
else |
6379 | 219 |
begin |
10863
9d3e1123bd43
fallback to first color in colors array if there is no valid color specified
sheepluva
parents:
10853
diff
changeset
|
220 |
if str[1] <= High(colors) then |
9d3e1123bd43
fallback to first color in colors array if there is no valid color specified
sheepluva
parents:
10853
diff
changeset
|
221 |
begin |
9d3e1123bd43
fallback to first color in colors array if there is no valid color specified
sheepluva
parents:
10853
diff
changeset
|
222 |
color:= colors[str[1]]; |
9d3e1123bd43
fallback to first color in colors array if there is no valid color specified
sheepluva
parents:
10853
diff
changeset
|
223 |
delete(str, 1, 1); |
9d3e1123bd43
fallback to first color in colors array if there is no valid color specified
sheepluva
parents:
10853
diff
changeset
|
224 |
end |
9d3e1123bd43
fallback to first color in colors array if there is no valid color specified
sheepluva
parents:
10853
diff
changeset
|
225 |
// fallback if invalid color |
9d3e1123bd43
fallback to first color in colors array if there is no valid color specified
sheepluva
parents:
10853
diff
changeset
|
226 |
else |
9d3e1123bd43
fallback to first color in colors array if there is no valid color specified
sheepluva
parents:
10853
diff
changeset
|
227 |
color:= colors[Low(colors)]; |
9d3e1123bd43
fallback to first color in colors array if there is no valid color specified
sheepluva
parents:
10853
diff
changeset
|
228 |
|
10303 | 229 |
cl.s:= str; |
6379 | 230 |
end; |
2396 | 231 |
|
10303 | 232 |
cl.color:= color; |
945
4ead9cde4e14
- Start chat implementation: chat strings are on the screen
unc0rr
parents:
942
diff
changeset
|
233 |
|
10303 | 234 |
// set texture, note: variables cl.s and str will be different here if isInput |
235 |
RenderChatLineTex(cl, str); |
|
1118 | 236 |
|
10303 | 237 |
cl.Time:= RealTicks + ClDisplayDuration; |
946 | 238 |
end; |
239 |
||
6379 | 240 |
// For uStore texture recreation |
241 |
procedure ReloadLines; |
|
10985
c5348fe9077c
fix chat lines losing color information on texture reload
sheepluva
parents:
10926
diff
changeset
|
242 |
var i: LongWord; |
6379 | 243 |
begin |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset
|
244 |
if InputStr.s <> '' then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset
|
245 |
SetLine(InputStr, InputStr.s, true); |
6381 | 246 |
for i:= 0 to MaxStrIndex do |
247 |
if Strs[i].s <> '' then |
|
248 |
begin |
|
10985
c5348fe9077c
fix chat lines losing color information on texture reload
sheepluva
parents:
10926
diff
changeset
|
249 |
RenderChatLineTex(Strs[i], Strs[i].s); |
6381 | 250 |
end; |
6379 | 251 |
end; |
252 |
||
946 | 253 |
procedure AddChatString(s: shortstring); |
254 |
begin |
|
3539 | 255 |
if not ChatReady then |
256 |
begin |
|
257 |
if MissedCount < MaxStrIndex - 1 then |
|
258 |
MStrs[MissedCount]:= s |
|
259 |
else if MissedCount < MaxStrIndex then |
|
260 |
MStrs[MissedCount]:= #5 + '[...]'; |
|
261 |
inc(MissedCount); |
|
262 |
exit |
|
263 |
end; |
|
264 |
||
946 | 265 |
lastStr:= (lastStr + 1) mod (MaxStrIndex + 1); |
266 |
||
990
dfa6a6fe1542
Implement history for chat (27 entries), no key binding yet
unc0rr
parents:
988
diff
changeset
|
267 |
SetLine(Strs[lastStr], s, false); |
945
4ead9cde4e14
- Start chat implementation: chat strings are on the screen
unc0rr
parents:
942
diff
changeset
|
268 |
|
4ead9cde4e14
- Start chat implementation: chat strings are on the screen
unc0rr
parents:
942
diff
changeset
|
269 |
inc(visibleCount) |
942 | 270 |
end; |
271 |
||
10852
9e5763cb805e
render input prefix independent of inputstr so that e.g. a username will not lead to weirdnesses
sheepluva
parents:
10851
diff
changeset
|
272 |
procedure UpdateInputLinePrefix(); |
9e5763cb805e
render input prefix independent of inputstr so that e.g. a username will not lead to weirdnesses
sheepluva
parents:
10851
diff
changeset
|
273 |
begin |
9e5763cb805e
render input prefix independent of inputstr so that e.g. a username will not lead to weirdnesses
sheepluva
parents:
10851
diff
changeset
|
274 |
if liveLua then |
9e5763cb805e
render input prefix independent of inputstr so that e.g. a username will not lead to weirdnesses
sheepluva
parents:
10851
diff
changeset
|
275 |
begin |
9e5763cb805e
render input prefix independent of inputstr so that e.g. a username will not lead to weirdnesses
sheepluva
parents:
10851
diff
changeset
|
276 |
InputLinePrefix.color:= colors[#1]; |
9e5763cb805e
render input prefix independent of inputstr so that e.g. a username will not lead to weirdnesses
sheepluva
parents:
10851
diff
changeset
|
277 |
InputLinePrefix.s:= '[Lua] >'; |
9e5763cb805e
render input prefix independent of inputstr so that e.g. a username will not lead to weirdnesses
sheepluva
parents:
10851
diff
changeset
|
278 |
end |
9e5763cb805e
render input prefix independent of inputstr so that e.g. a username will not lead to weirdnesses
sheepluva
parents:
10851
diff
changeset
|
279 |
else |
9e5763cb805e
render input prefix independent of inputstr so that e.g. a username will not lead to weirdnesses
sheepluva
parents:
10851
diff
changeset
|
280 |
begin |
9e5763cb805e
render input prefix independent of inputstr so that e.g. a username will not lead to weirdnesses
sheepluva
parents:
10851
diff
changeset
|
281 |
InputLinePrefix.color:= colors[#6]; |
9e5763cb805e
render input prefix independent of inputstr so that e.g. a username will not lead to weirdnesses
sheepluva
parents:
10851
diff
changeset
|
282 |
InputLinePrefix.s:= UserNick + '>'; |
9e5763cb805e
render input prefix independent of inputstr so that e.g. a username will not lead to weirdnesses
sheepluva
parents:
10851
diff
changeset
|
283 |
end; |
9e5763cb805e
render input prefix independent of inputstr so that e.g. a username will not lead to weirdnesses
sheepluva
parents:
10851
diff
changeset
|
284 |
|
9e5763cb805e
render input prefix independent of inputstr so that e.g. a username will not lead to weirdnesses
sheepluva
parents:
10851
diff
changeset
|
285 |
FreeAndNilTexture(InputLinePrefix.Tex); |
9e5763cb805e
render input prefix independent of inputstr so that e.g. a username will not lead to weirdnesses
sheepluva
parents:
10851
diff
changeset
|
286 |
end; |
9e5763cb805e
render input prefix independent of inputstr so that e.g. a username will not lead to weirdnesses
sheepluva
parents:
10851
diff
changeset
|
287 |
|
942 | 288 |
procedure DrawChat; |
10514
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
289 |
var i, t, left, top, cnt: LongInt; |
10836 | 290 |
selRect: TSDL_Rect; |
10866 | 291 |
c: char; |
942 | 292 |
begin |
3539 | 293 |
ChatReady:= true; // maybe move to somewhere else? |
1431 | 294 |
|
10514
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
295 |
if ChatHidden and (not showAll) then |
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
296 |
visibleCount:= 0; |
1431 | 297 |
|
10514
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
298 |
// draw chat lines with some distance from screen border |
10303 | 299 |
left:= 4 - cScreenWidth div 2; |
10514
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
300 |
top := 10 + visibleCount * ClHeight; // we start with input line (if any) |
1431 | 301 |
|
10514
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
302 |
// draw chat input line first and under all other lines |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset
|
303 |
if (GameState = gsChat) and (InputStr.Tex <> nil) then |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2716
diff
changeset
|
304 |
begin |
10850
c76ea22ea249
copy to/paste from system clipboard (via frontend)
sheepluva
parents:
10849
diff
changeset
|
305 |
|
10852
9e5763cb805e
render input prefix independent of inputstr so that e.g. a username will not lead to weirdnesses
sheepluva
parents:
10851
diff
changeset
|
306 |
if InputLinePrefix.Tex = nil then |
9e5763cb805e
render input prefix independent of inputstr so that e.g. a username will not lead to weirdnesses
sheepluva
parents:
10851
diff
changeset
|
307 |
RenderChatLineTex(InputLinePrefix, InputLinePrefix.s); |
9e5763cb805e
render input prefix independent of inputstr so that e.g. a username will not lead to weirdnesses
sheepluva
parents:
10851
diff
changeset
|
308 |
|
9e5763cb805e
render input prefix independent of inputstr so that e.g. a username will not lead to weirdnesses
sheepluva
parents:
10851
diff
changeset
|
309 |
DrawTexture(left, top, InputLinePrefix.Tex); |
9e5763cb805e
render input prefix independent of inputstr so that e.g. a username will not lead to weirdnesses
sheepluva
parents:
10851
diff
changeset
|
310 |
inc(left, InputLinePrefix.Width); |
9e5763cb805e
render input prefix independent of inputstr so that e.g. a username will not lead to weirdnesses
sheepluva
parents:
10851
diff
changeset
|
311 |
DrawTexture(left, top, InputStr.Tex); |
9e5763cb805e
render input prefix independent of inputstr so that e.g. a username will not lead to weirdnesses
sheepluva
parents:
10851
diff
changeset
|
312 |
|
10842
a039464cbb4a
since fonts can be loaded in late, update cursor position before first chat display
sheepluva
parents:
10841
diff
changeset
|
313 |
if firstDraw then |
a039464cbb4a
since fonts can be loaded in late, update cursor position before first chat display
sheepluva
parents:
10841
diff
changeset
|
314 |
begin |
a039464cbb4a
since fonts can be loaded in late, update cursor position before first chat display
sheepluva
parents:
10841
diff
changeset
|
315 |
UpdateCursorCoords(); |
a039464cbb4a
since fonts can be loaded in late, update cursor position before first chat display
sheepluva
parents:
10841
diff
changeset
|
316 |
firstDraw:= false; |
a039464cbb4a
since fonts can be loaded in late, update cursor position before first chat display
sheepluva
parents:
10841
diff
changeset
|
317 |
end; |
a039464cbb4a
since fonts can be loaded in late, update cursor position before first chat display
sheepluva
parents:
10841
diff
changeset
|
318 |
|
10836 | 319 |
if selectedPos < 0 then |
320 |
begin |
|
321 |
// draw cursor |
|
322 |
if ((RealTicks - LastKeyPressTick) and 512) < 256 then |
|
10839
aa0ceb47da1d
make sure cursor drawing position does not get messed up by screen resize
sheepluva
parents:
10837
diff
changeset
|
323 |
DrawLineOnScreen(left + cursorX, top + 2, left + cursorX, top + ClHeight - 2, 2.0, $00, $FF, $FF, $FF); |
10836 | 324 |
end |
325 |
else // draw selection |
|
326 |
begin |
|
327 |
selRect.y:= top + 2; |
|
328 |
selRect.h:= clHeight - 4; |
|
329 |
if selectionDx < 0 then |
|
330 |
begin |
|
10839
aa0ceb47da1d
make sure cursor drawing position does not get messed up by screen resize
sheepluva
parents:
10837
diff
changeset
|
331 |
selRect.x:= left + cursorX + selectionDx; |
10836 | 332 |
selRect.w:= -selectionDx; |
333 |
end |
|
334 |
else |
|
335 |
begin |
|
10839
aa0ceb47da1d
make sure cursor drawing position does not get messed up by screen resize
sheepluva
parents:
10837
diff
changeset
|
336 |
selRect.x:= left + cursorX; |
10836 | 337 |
selRect.w:= selectionDx; |
338 |
end; |
|
1431 | 339 |
|
10836 | 340 |
DrawRect(selRect, $FF, $FF, $FF, $40, true); |
341 |
end; |
|
10852
9e5763cb805e
render input prefix independent of inputstr so that e.g. a username will not lead to weirdnesses
sheepluva
parents:
10851
diff
changeset
|
342 |
|
9e5763cb805e
render input prefix independent of inputstr so that e.g. a username will not lead to weirdnesses
sheepluva
parents:
10851
diff
changeset
|
343 |
dec(left, InputLinePrefix.Width); |
10866 | 344 |
|
1431 | 345 |
|
10866 | 346 |
if (Length(InputStr.s) > 0) and ((CursorPos = 1) or (CursorPos = 2)) then |
347 |
begin |
|
348 |
c:= InputStr.s[1]; |
|
349 |
if charIsForHogSpeech(c) then |
|
350 |
begin |
|
10868
acb03a9712c3
show correct default if current team is local team
sheepluva
parents:
10866
diff
changeset
|
351 |
SpeechHogNumber:= 0; |
10866 | 352 |
if Length(InputStr.s) > 1 then |
353 |
begin |
|
354 |
c:= InputStr.s[2]; |
|
355 |
if (c > '0') and (c < '9') then |
|
356 |
SpeechHogNumber:= byte(c) - 48; |
|
357 |
end; |
|
10868
acb03a9712c3
show correct default if current team is local team
sheepluva
parents:
10866
diff
changeset
|
358 |
// default to current hedgehog (if own) or first hedgehog |
acb03a9712c3
show correct default if current team is local team
sheepluva
parents:
10866
diff
changeset
|
359 |
if SpeechHogNumber = 0 then |
acb03a9712c3
show correct default if current team is local team
sheepluva
parents:
10866
diff
changeset
|
360 |
begin |
acb03a9712c3
show correct default if current team is local team
sheepluva
parents:
10866
diff
changeset
|
361 |
if not CurrentTeam^.ExtDriven then |
acb03a9712c3
show correct default if current team is local team
sheepluva
parents:
10866
diff
changeset
|
362 |
SpeechHogNumber:= CurrentTeam^.CurrHedgehog + 1 |
acb03a9712c3
show correct default if current team is local team
sheepluva
parents:
10866
diff
changeset
|
363 |
else |
acb03a9712c3
show correct default if current team is local team
sheepluva
parents:
10866
diff
changeset
|
364 |
SpeechHogNumber:= 1; |
acb03a9712c3
show correct default if current team is local team
sheepluva
parents:
10866
diff
changeset
|
365 |
end; |
10866 | 366 |
end; |
367 |
end |
|
368 |
else |
|
10868
acb03a9712c3
show correct default if current team is local team
sheepluva
parents:
10866
diff
changeset
|
369 |
SpeechHogNumber:= -1; |
10866 | 370 |
end |
371 |
else |
|
10868
acb03a9712c3
show correct default if current team is local team
sheepluva
parents:
10866
diff
changeset
|
372 |
SpeechHogNumber:= -1; |
1431 | 373 |
|
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
374 |
// draw chat lines |
10514
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
375 |
if ((not ChatHidden) or showAll) and (UIDisplay <> uiNone) then |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2716
diff
changeset
|
376 |
begin |
10375 | 377 |
if MissedCount <> 0 then // there are chat strings we missed, so print them now |
378 |
begin |
|
379 |
for i:= 0 to MissedCount - 1 do |
|
380 |
AddChatString(MStrs[i]); |
|
381 |
MissedCount:= 0; |
|
382 |
end; |
|
383 |
i:= lastStr; |
|
10303 | 384 |
|
10375 | 385 |
cnt:= 0; // count of lines displayed |
386 |
t := 1; // # of current line processed |
|
2376 | 387 |
|
10375 | 388 |
// draw lines in reverse order |
10514
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
389 |
while (((t < 7) and (Strs[i].Time > RealTicks)) or ((t <= MaxStrIndex + 1) and showAll)) |
10375 | 390 |
and (Strs[i].Tex <> nil) do |
391 |
begin |
|
10514
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
392 |
top:= top - ClHeight; |
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
393 |
// draw chatline only if not offscreen |
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
394 |
if top > 0 then |
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
395 |
DrawTexture(left, top, Strs[i].Tex); |
8745 | 396 |
|
10375 | 397 |
if i = 0 then |
398 |
i:= MaxStrIndex |
|
399 |
else |
|
400 |
dec(i); |
|
401 |
||
402 |
inc(cnt); |
|
403 |
inc(t) |
|
404 |
end; |
|
405 |
||
406 |
visibleCount:= cnt; |
|
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2716
diff
changeset
|
407 |
end; |
942 | 408 |
end; |
409 |
||
4467 | 410 |
procedure SendHogSpeech(s: shortstring); |
411 |
begin |
|
412 |
SendIPC('h' + s); |
|
413 |
ParseCommand('/hogsay '+s, true) |
|
414 |
end; |
|
415 |
||
10392 | 416 |
procedure SendConsoleCommand(s: shortstring); |
417 |
begin |
|
418 |
Delete(s, 1, 1); |
|
419 |
SendIPC('~' + s) |
|
420 |
end; |
|
421 |
||
1033 | 422 |
procedure AcceptChatString(s: shortstring); |
1035 | 423 |
var i: TWave; |
8152 | 424 |
j: TChatCmd; |
4465
743673c67d0c
Allow hog speech when not your turn. Currently is set to 40% opacity (could be fainter) and drawn behind the hogs instead of in front. Also allows hog targetting using a number.
nemo
parents:
4404
diff
changeset
|
425 |
c, t: LongInt; |
4467 | 426 |
x: byte; |
1033 | 427 |
begin |
10513
58fa783e0cfd
fixes to chat input history: remember all inputs, don not remember duplicates
sheepluva
parents:
10396
diff
changeset
|
428 |
if s <> LocalStrs[localLastStr] then |
58fa783e0cfd
fixes to chat input history: remember all inputs, don not remember duplicates
sheepluva
parents:
10396
diff
changeset
|
429 |
begin |
58fa783e0cfd
fixes to chat input history: remember all inputs, don not remember duplicates
sheepluva
parents:
10396
diff
changeset
|
430 |
// put in input history |
58fa783e0cfd
fixes to chat input history: remember all inputs, don not remember duplicates
sheepluva
parents:
10396
diff
changeset
|
431 |
localLastStr:= (localLastStr + 1) mod MaxStrIndex; |
58fa783e0cfd
fixes to chat input history: remember all inputs, don not remember duplicates
sheepluva
parents:
10396
diff
changeset
|
432 |
LocalStrs[localLastStr]:= s; |
58fa783e0cfd
fixes to chat input history: remember all inputs, don not remember duplicates
sheepluva
parents:
10396
diff
changeset
|
433 |
end; |
58fa783e0cfd
fixes to chat input history: remember all inputs, don not remember duplicates
sheepluva
parents:
10396
diff
changeset
|
434 |
|
4465
743673c67d0c
Allow hog speech when not your turn. Currently is set to 40% opacity (could be fainter) and drawn behind the hogs instead of in front. Also allows hog targetting using a number.
nemo
parents:
4404
diff
changeset
|
435 |
t:= LocalTeam; |
4467 | 436 |
x:= 0; |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset
|
437 |
if (s[1] = '"') and (s[Length(s)] = '"') |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset
|
438 |
then x:= 1 |
8745 | 439 |
|
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset
|
440 |
else if (s[1] = '''') and (s[Length(s)] = '''') then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset
|
441 |
x:= 2 |
8745 | 442 |
|
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset
|
443 |
else if (s[1] = '-') and (s[Length(s)] = '-') then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset
|
444 |
x:= 3; |
8745 | 445 |
|
8026
4a4f21070479
merge xymeng's gsoc engine with a few updates (and further checks on symbol definitions)
koda
parents:
7722
diff
changeset
|
446 |
if (not CurrentTeam^.ExtDriven) and (x <> 0) then |
4465
743673c67d0c
Allow hog speech when not your turn. Currently is set to 40% opacity (could be fainter) and drawn behind the hogs instead of in front. Also allows hog targetting using a number.
nemo
parents:
4404
diff
changeset
|
447 |
for c:= 0 to Pred(TeamsCount) do |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset
|
448 |
if (TeamsArray[c] = CurrentTeam) then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset
|
449 |
t:= c; |
4467 | 450 |
|
451 |
if x <> 0 then |
|
2017 | 452 |
begin |
4465
743673c67d0c
Allow hog speech when not your turn. Currently is set to 40% opacity (could be fainter) and drawn behind the hogs instead of in front. Also allows hog targetting using a number.
nemo
parents:
4404
diff
changeset
|
453 |
if t = -1 then |
2111 | 454 |
ParseCommand('/say ' + copy(s, 2, Length(s)-2), true) |
455 |
else |
|
4467 | 456 |
SendHogSpeech(char(x) + char(t) + copy(s, 2, Length(s)-2)); |
2017 | 457 |
exit |
458 |
end; |
|
4467 | 459 |
|
9669 | 460 |
if (s[1] = '/') then |
2017 | 461 |
begin |
9676 | 462 |
// These 3 are same as above, only are to make the hedgehog say it on next attack |
10304
7e40820b7ed6
fix gl2 build, further rendering cleanup WIP, also new chat command: /debugvl
sheepluva
parents:
10303
diff
changeset
|
463 |
if (copy(s, 2, 4) = 'hsa ') then |
9669 | 464 |
begin |
465 |
if CurrentTeam^.ExtDriven then |
|
466 |
ParseCommand('/say ' + copy(s, 6, Length(s)-5), true) |
|
467 |
else |
|
468 |
SendHogSpeech(#4 + copy(s, 6, Length(s)-5)); |
|
469 |
exit |
|
470 |
end; |
|
471 |
||
10304
7e40820b7ed6
fix gl2 build, further rendering cleanup WIP, also new chat command: /debugvl
sheepluva
parents:
10303
diff
changeset
|
472 |
if (copy(s, 2, 4) = 'hta ') then |
9669 | 473 |
begin |
474 |
if CurrentTeam^.ExtDriven then |
|
475 |
ParseCommand('/say ' + copy(s, 6, Length(s)-5), true) |
|
476 |
else |
|
477 |
SendHogSpeech(#5 + copy(s, 6, Length(s)-5)); |
|
478 |
exit |
|
479 |
end; |
|
480 |
||
10304
7e40820b7ed6
fix gl2 build, further rendering cleanup WIP, also new chat command: /debugvl
sheepluva
parents:
10303
diff
changeset
|
481 |
if (copy(s, 2, 4) = 'hya ') then |
9669 | 482 |
begin |
483 |
if CurrentTeam^.ExtDriven then |
|
484 |
ParseCommand('/say ' + copy(s, 6, Length(s)-5), true) |
|
485 |
else |
|
486 |
SendHogSpeech(#6 + copy(s, 6, Length(s)-5)); |
|
487 |
exit |
|
488 |
end; |
|
2111 | 489 |
|
10304
7e40820b7ed6
fix gl2 build, further rendering cleanup WIP, also new chat command: /debugvl
sheepluva
parents:
10303
diff
changeset
|
490 |
if (copy(s, 2, 5) = 'team ') and (length(s) > 6) then |
9669 | 491 |
begin |
492 |
ParseCommand(s, true); |
|
493 |
exit |
|
494 |
end; |
|
495 |
||
10304
7e40820b7ed6
fix gl2 build, further rendering cleanup WIP, also new chat command: /debugvl
sheepluva
parents:
10303
diff
changeset
|
496 |
if (copy(s, 2, 3) = 'me ') then |
9669 | 497 |
begin |
9680 | 498 |
ParseCommand('/say ' + s, true); |
499 |
exit |
|
500 |
end; |
|
2376 | 501 |
|
10514
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
502 |
if (copy(s, 2, 10) = 'togglechat') then |
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
503 |
begin |
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
504 |
ChatHidden:= (not ChatHidden); |
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
505 |
if ChatHidden then |
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
506 |
showAll:= false; |
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
507 |
exit |
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
508 |
end; |
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
509 |
|
10304
7e40820b7ed6
fix gl2 build, further rendering cleanup WIP, also new chat command: /debugvl
sheepluva
parents:
10303
diff
changeset
|
510 |
// debugging commands |
7e40820b7ed6
fix gl2 build, further rendering cleanup WIP, also new chat command: /debugvl
sheepluva
parents:
10303
diff
changeset
|
511 |
if (copy(s, 2, 7) = 'debugvl') then |
7e40820b7ed6
fix gl2 build, further rendering cleanup WIP, also new chat command: /debugvl
sheepluva
parents:
10303
diff
changeset
|
512 |
begin |
7e40820b7ed6
fix gl2 build, further rendering cleanup WIP, also new chat command: /debugvl
sheepluva
parents:
10303
diff
changeset
|
513 |
cViewLimitsDebug:= (not cViewLimitsDebug); |
7e40820b7ed6
fix gl2 build, further rendering cleanup WIP, also new chat command: /debugvl
sheepluva
parents:
10303
diff
changeset
|
514 |
UpdateViewLimits(); |
7e40820b7ed6
fix gl2 build, further rendering cleanup WIP, also new chat command: /debugvl
sheepluva
parents:
10303
diff
changeset
|
515 |
exit |
7e40820b7ed6
fix gl2 build, further rendering cleanup WIP, also new chat command: /debugvl
sheepluva
parents:
10303
diff
changeset
|
516 |
end; |
7e40820b7ed6
fix gl2 build, further rendering cleanup WIP, also new chat command: /debugvl
sheepluva
parents:
10303
diff
changeset
|
517 |
|
10312 | 518 |
if (copy(s, 2, 3) = 'lua') then |
519 |
begin |
|
520 |
AddFileLog('/lua issued'); |
|
521 |
if gameType <> gmtNet then |
|
522 |
begin |
|
523 |
liveLua:= (not liveLua); |
|
524 |
if liveLua then |
|
525 |
begin |
|
526 |
AddFileLog('[Lua] chat input string parsing enabled'); |
|
527 |
AddChatString(#3 + 'Lua parsing: ON'); |
|
528 |
end |
|
529 |
else |
|
530 |
begin |
|
531 |
AddFileLog('[Lua] chat input string parsing disabled'); |
|
532 |
AddChatString(#3 + 'Lua parsing: OFF'); |
|
533 |
end; |
|
10852
9e5763cb805e
render input prefix independent of inputstr so that e.g. a username will not lead to weirdnesses
sheepluva
parents:
10851
diff
changeset
|
534 |
UpdateInputLinePrefix(); |
10312 | 535 |
end; |
536 |
exit |
|
537 |
end; |
|
538 |
||
539 |
// hedghog animations/taunts and engine commands |
|
9680 | 540 |
if (not CurrentTeam^.ExtDriven) and (CurrentTeam^.Hedgehogs[0].BotLevel = 0) then |
541 |
begin |
|
9669 | 542 |
for i:= Low(TWave) to High(TWave) do |
543 |
if (s = Wavez[i].cmd) then |
|
544 |
begin |
|
545 |
ParseCommand('/taunt ' + char(i), true); |
|
546 |
exit |
|
547 |
end; |
|
10588
6189bb1c903d
don't forbid running regular chat commands during turns of other teams. that was probably only meant for emotes to begin with
sheepluva
parents:
10514
diff
changeset
|
548 |
end; |
8152 | 549 |
|
10588
6189bb1c903d
don't forbid running regular chat commands during turns of other teams. that was probably only meant for emotes to begin with
sheepluva
parents:
10514
diff
changeset
|
550 |
for j:= Low(TChatCmd) to High(TChatCmd) do |
6189bb1c903d
don't forbid running regular chat commands during turns of other teams. that was probably only meant for emotes to begin with
sheepluva
parents:
10514
diff
changeset
|
551 |
if (s = ChatCommandz[j].ChatCmd) then |
6189bb1c903d
don't forbid running regular chat commands during turns of other teams. that was probably only meant for emotes to begin with
sheepluva
parents:
10514
diff
changeset
|
552 |
begin |
6189bb1c903d
don't forbid running regular chat commands during turns of other teams. that was probably only meant for emotes to begin with
sheepluva
parents:
10514
diff
changeset
|
553 |
ParseCommand(ChatCommandz[j].ProcedureCallChatCmd, true); |
6189bb1c903d
don't forbid running regular chat commands during turns of other teams. that was probably only meant for emotes to begin with
sheepluva
parents:
10514
diff
changeset
|
554 |
exit |
6189bb1c903d
don't forbid running regular chat commands during turns of other teams. that was probably only meant for emotes to begin with
sheepluva
parents:
10514
diff
changeset
|
555 |
end; |
10392 | 556 |
|
557 |
if (gameType = gmtNet) then |
|
558 |
SendConsoleCommand(s) |
|
2017 | 559 |
end |
10312 | 560 |
else |
561 |
begin |
|
562 |
if liveLua then |
|
563 |
LuaParseString(s) |
|
9676 | 564 |
else |
565 |
ParseCommand('/say ' + s, true); |
|
2017 | 566 |
end; |
1033 | 567 |
end; |
568 |
||
8738 | 569 |
procedure CleanupInput; |
570 |
begin |
|
571 |
FreezeEnterKey; |
|
572 |
history:= 0; |
|
9697 | 573 |
SDL_StopTextInput(); |
11365 | 574 |
//SDL_EnableKeyRepeat(0,0); |
8738 | 575 |
GameState:= gsGame; |
576 |
ResetKbd; |
|
577 |
end; |
|
578 |
||
10836 | 579 |
procedure DelBytesFromInputStrBack(endIdx: integer; count: byte); |
10920
11a28d22985f
different implementation for utf-8 char detection/handling
sheepluva
parents:
10919
diff
changeset
|
580 |
var startIdx: integer; |
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
581 |
begin |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
582 |
// nothing to do if count is 0 |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
583 |
if count = 0 then |
4121 | 584 |
exit; |
2376 | 585 |
|
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
586 |
// first byte to delete |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
587 |
startIdx:= endIdx - (count - 1); |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
588 |
|
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
589 |
// delete bytes from string |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
590 |
Delete(InputStr.s, startIdx, count); |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
591 |
|
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
592 |
SetLine(InputStr, InputStr.s, true); |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
593 |
end; |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
594 |
|
10920
11a28d22985f
different implementation for utf-8 char detection/handling
sheepluva
parents:
10919
diff
changeset
|
595 |
procedure MoveCursorToPreviousChar(); |
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
596 |
begin |
10920
11a28d22985f
different implementation for utf-8 char detection/handling
sheepluva
parents:
10919
diff
changeset
|
597 |
if cursorPos > 0 then |
10926
43612076e989
chat: simplify some code and fix bugs I noticed during testing
sheepluva
parents:
10921
diff
changeset
|
598 |
repeat |
10920
11a28d22985f
different implementation for utf-8 char detection/handling
sheepluva
parents:
10919
diff
changeset
|
599 |
dec(cursorPos); |
10926
43612076e989
chat: simplify some code and fix bugs I noticed during testing
sheepluva
parents:
10921
diff
changeset
|
600 |
until ((cursorPos = 0) or IsFirstCharByte(InputStr.s[cursorPos + 1])); |
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
601 |
end; |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
602 |
|
10920
11a28d22985f
different implementation for utf-8 char detection/handling
sheepluva
parents:
10919
diff
changeset
|
603 |
procedure MoveCursorToNextChar(); |
10926
43612076e989
chat: simplify some code and fix bugs I noticed during testing
sheepluva
parents:
10921
diff
changeset
|
604 |
var len: integer; |
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
605 |
begin |
10926
43612076e989
chat: simplify some code and fix bugs I noticed during testing
sheepluva
parents:
10921
diff
changeset
|
606 |
len:= Length(InputStr.s); |
43612076e989
chat: simplify some code and fix bugs I noticed during testing
sheepluva
parents:
10921
diff
changeset
|
607 |
if cursorPos < len then |
43612076e989
chat: simplify some code and fix bugs I noticed during testing
sheepluva
parents:
10921
diff
changeset
|
608 |
repeat |
10920
11a28d22985f
different implementation for utf-8 char detection/handling
sheepluva
parents:
10919
diff
changeset
|
609 |
inc(cursorPos); |
10926
43612076e989
chat: simplify some code and fix bugs I noticed during testing
sheepluva
parents:
10921
diff
changeset
|
610 |
until ((cursorPos = len) or IsFirstCharByte(InputStr.s[cursorPos + 1])); |
10836 | 611 |
end; |
612 |
||
10921 | 613 |
procedure DeleteLastUTF8CharFromStr(var s: shortstring); |
614 |
var l: byte; |
|
615 |
begin |
|
616 |
l:= Length(s); |
|
617 |
||
618 |
while (l > 1) and (not IsFirstCharByte(s[l])) do |
|
619 |
begin |
|
620 |
dec(l); |
|
621 |
end; |
|
622 |
||
623 |
if l > 0 then |
|
624 |
dec(l); |
|
625 |
||
626 |
s[0]:= char(l); |
|
627 |
end; |
|
628 |
||
10836 | 629 |
procedure DeleteSelected(); |
630 |
begin |
|
631 |
if (selectedPos >= 0) and (cursorPos <> selectedPos) then |
|
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
632 |
begin |
10836 | 633 |
DelBytesFromInputStrBack(max(cursorPos, selectedPos), abs(selectedPos-cursorPos)); |
634 |
cursorPos:= min(cursorPos, selectedPos); |
|
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
635 |
end; |
10920
11a28d22985f
different implementation for utf-8 char detection/handling
sheepluva
parents:
10919
diff
changeset
|
636 |
ResetSelection(); |
10849
a772d342066a
copy&paste (wip), currently using only a local clipboard
sheepluva
parents:
10846
diff
changeset
|
637 |
UpdateCursorCoords(); |
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
638 |
end; |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
639 |
|
10836 | 640 |
procedure HandleSelection(enabled: boolean); |
641 |
begin |
|
642 |
if enabled then |
|
643 |
begin |
|
644 |
if selectedPos < 0 then |
|
645 |
selectedPos:= cursorPos; |
|
2017 | 646 |
end |
10836 | 647 |
else |
648 |
ResetSelection(); |
|
649 |
end; |
|
650 |
||
10844
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
651 |
type TCharSkip = ( none, wspace, numalpha, special ); |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
652 |
|
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
653 |
function GetInputCharSkipClass(index: LongInt): TCharSkip; |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
654 |
var c: char; |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
655 |
begin |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
656 |
c:= InputStr.s[index]; |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
657 |
|
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
658 |
// non-ascii counts as letter |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
659 |
if c > #127 then |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
660 |
exit(numalpha); |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
661 |
|
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
662 |
// low-ascii whitespaces and DEL |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
663 |
if (c < #33) or (c = #127) then |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
664 |
exit(wspace); |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
665 |
|
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
666 |
// low-ascii special chars |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
667 |
if c < #48 then |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
668 |
exit(special); |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
669 |
|
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
670 |
// digits |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
671 |
if c < #58 then |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
672 |
exit(numalpha); |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
673 |
|
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
674 |
// make c upper-case |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
675 |
if c > #96 then |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
676 |
c:= char(byte(c) - 32); |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
677 |
|
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
678 |
// letters |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
679 |
if (c > #64) and (c < #90) then |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
680 |
exit(numalpha); |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
681 |
|
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
682 |
// remaining ascii are special chars |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
683 |
exit(special); |
1033 | 684 |
end; |
685 |
||
10844
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
686 |
// skip from word to word, similar to Qt |
10845
1dbd50690951
quick word deletion while holding ctrl (qt style)
sheepluva
parents:
10844
diff
changeset
|
687 |
procedure SkipInputChars(skip: TCharSkip; backwards: boolean); |
10844
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
688 |
begin |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
689 |
if backwards then |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
690 |
begin |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
691 |
// skip trailing whitespace, similar to Qt |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
692 |
while (skip = wspace) and (cursorPos > 0) do |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
693 |
begin |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
694 |
skip:= GetInputCharSkipClass(cursorPos); |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
695 |
if skip = wspace then |
10920
11a28d22985f
different implementation for utf-8 char detection/handling
sheepluva
parents:
10919
diff
changeset
|
696 |
MoveCursorToPreviousChar(); |
10844
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
697 |
end; |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
698 |
// skip same-type chars |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
699 |
while (cursorPos > 0) and (GetInputCharSkipClass(cursorPos) = skip) do |
10920
11a28d22985f
different implementation for utf-8 char detection/handling
sheepluva
parents:
10919
diff
changeset
|
700 |
MoveCursorToPreviousChar(); |
10844
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
701 |
end |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
702 |
else |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
703 |
begin |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
704 |
// skip same-type chars |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
705 |
while cursorPos < Length(InputStr.s) do |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
706 |
begin |
10920
11a28d22985f
different implementation for utf-8 char detection/handling
sheepluva
parents:
10919
diff
changeset
|
707 |
MoveCursorToNextChar(); |
10844
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
708 |
if (GetInputCharSkipClass(cursorPos) <> skip) then |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
709 |
begin |
10920
11a28d22985f
different implementation for utf-8 char detection/handling
sheepluva
parents:
10919
diff
changeset
|
710 |
MoveCursorToPreviousChar(); |
10844
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
711 |
break; |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
712 |
end; |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
713 |
end; |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
714 |
// skip trailing whitespace, similar to Qt |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
715 |
while cursorPos < Length(InputStr.s) do |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
716 |
begin |
10920
11a28d22985f
different implementation for utf-8 char detection/handling
sheepluva
parents:
10919
diff
changeset
|
717 |
MoveCursorToNextChar(); |
10844
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
718 |
if (GetInputCharSkipClass(cursorPos) <> wspace) then |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
719 |
begin |
10920
11a28d22985f
different implementation for utf-8 char detection/handling
sheepluva
parents:
10919
diff
changeset
|
720 |
MoveCursorToPreviousChar(); |
10844
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
721 |
break; |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
722 |
end; |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
723 |
end; |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
724 |
end; |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
725 |
end; |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
726 |
|
10849
a772d342066a
copy&paste (wip), currently using only a local clipboard
sheepluva
parents:
10846
diff
changeset
|
727 |
procedure CopyToClipboard(var newContent: shortstring); |
a772d342066a
copy&paste (wip), currently using only a local clipboard
sheepluva
parents:
10846
diff
changeset
|
728 |
begin |
11364 | 729 |
// SDL2 clipboard |
730 |
SDL_SetClipboardText(Str2PChar(newContent)); |
|
10849
a772d342066a
copy&paste (wip), currently using only a local clipboard
sheepluva
parents:
10846
diff
changeset
|
731 |
end; |
a772d342066a
copy&paste (wip), currently using only a local clipboard
sheepluva
parents:
10846
diff
changeset
|
732 |
|
a772d342066a
copy&paste (wip), currently using only a local clipboard
sheepluva
parents:
10846
diff
changeset
|
733 |
procedure CopySelectionToClipboard(); |
a772d342066a
copy&paste (wip), currently using only a local clipboard
sheepluva
parents:
10846
diff
changeset
|
734 |
var selection: shortstring; |
a772d342066a
copy&paste (wip), currently using only a local clipboard
sheepluva
parents:
10846
diff
changeset
|
735 |
begin |
a772d342066a
copy&paste (wip), currently using only a local clipboard
sheepluva
parents:
10846
diff
changeset
|
736 |
if selectedPos >= 0 then |
a772d342066a
copy&paste (wip), currently using only a local clipboard
sheepluva
parents:
10846
diff
changeset
|
737 |
begin |
a772d342066a
copy&paste (wip), currently using only a local clipboard
sheepluva
parents:
10846
diff
changeset
|
738 |
selection:= copy(InputStr.s, min(CursorPos, selectedPos) + 1, abs(CursorPos - selectedPos)); |
a772d342066a
copy&paste (wip), currently using only a local clipboard
sheepluva
parents:
10846
diff
changeset
|
739 |
CopyToClipboard(selection); |
a772d342066a
copy&paste (wip), currently using only a local clipboard
sheepluva
parents:
10846
diff
changeset
|
740 |
end; |
a772d342066a
copy&paste (wip), currently using only a local clipboard
sheepluva
parents:
10846
diff
changeset
|
741 |
end; |
a772d342066a
copy&paste (wip), currently using only a local clipboard
sheepluva
parents:
10846
diff
changeset
|
742 |
|
10853 | 743 |
procedure InsertIntoInputStr(s: shortstring); |
10921 | 744 |
var limit: integer; |
946 | 745 |
begin |
10921 | 746 |
// we check limit for trailing stuff before insertion limit for a reason |
747 |
// (possible remaining space after too long UTF8-insertion has been shortened) |
|
748 |
||
749 |
// length limit for stuff to that will trail the insertion |
|
750 |
limit:= max(cursorPos, MaxInputStrLen-Length(s)); |
|
751 |
||
752 |
while Length(InputStr.s) > limit do |
|
753 |
begin |
|
754 |
DeleteLastUTF8CharFromStr(InputStr.s); |
|
755 |
end; |
|
756 |
||
757 |
// length limit for stuff to insert |
|
758 |
limit:= max(0, MaxInputStrLen-cursorPos); |
|
10849
a772d342066a
copy&paste (wip), currently using only a local clipboard
sheepluva
parents:
10846
diff
changeset
|
759 |
|
10921 | 760 |
if limit = 0 then |
761 |
s:= '' |
|
762 |
else while Length(s) > limit do |
|
763 |
begin |
|
764 |
DeleteLastUTF8CharFromStr(s); |
|
765 |
end; |
|
10851
f25dad9c3136
chat/copypaste: some adjustments and sanity checks
sheepluva
parents:
10850
diff
changeset
|
766 |
|
10921 | 767 |
if Length(s) > 0 then |
768 |
begin |
|
769 |
// insert string truncated to safe length |
|
770 |
Insert(s, InputStr.s, cursorPos + 1); |
|
10849
a772d342066a
copy&paste (wip), currently using only a local clipboard
sheepluva
parents:
10846
diff
changeset
|
771 |
|
10921 | 772 |
if Length(InputStr.s) > MaxInputStrLen then |
773 |
InputStr.s[0]:= char(MaxInputStrLen); |
|
774 |
||
775 |
SetLine(InputStr, InputStr.s, true); |
|
776 |
||
777 |
// move cursor to end of inserted string |
|
778 |
inc(cursorPos, Length(s)); |
|
779 |
UpdateCursorCoords(); |
|
780 |
end; |
|
10849
a772d342066a
copy&paste (wip), currently using only a local clipboard
sheepluva
parents:
10846
diff
changeset
|
781 |
end; |
a772d342066a
copy&paste (wip), currently using only a local clipboard
sheepluva
parents:
10846
diff
changeset
|
782 |
|
a772d342066a
copy&paste (wip), currently using only a local clipboard
sheepluva
parents:
10846
diff
changeset
|
783 |
procedure PasteFromClipboard(); |
11363 | 784 |
var clip: PChar; |
10849
a772d342066a
copy&paste (wip), currently using only a local clipboard
sheepluva
parents:
10846
diff
changeset
|
785 |
begin |
11363 | 786 |
// use SDL2 clipboard functions |
787 |
if SDL_HasClipboardText() then |
|
10850
c76ea22ea249
copy to/paste from system clipboard (via frontend)
sheepluva
parents:
10849
diff
changeset
|
788 |
begin |
11363 | 789 |
clip:= SDL_GetClipboardText(); |
790 |
// returns NULL if not enough memory for a copy of clipboard content |
|
791 |
if clip <> nil then |
|
792 |
begin |
|
793 |
InsertIntoInputStr(shortstring(clip)); |
|
794 |
SDL_free(Pointer(clip)); |
|
795 |
end; |
|
10850
c76ea22ea249
copy to/paste from system clipboard (via frontend)
sheepluva
parents:
10849
diff
changeset
|
796 |
end; |
9699
fab319c85a39
Accept SDL_TEXTINPUT events for chat (why first and only first chat invocation receives event for 't' key?)
unc0rr
parents:
9697
diff
changeset
|
797 |
end; |
fab319c85a39
Accept SDL_TEXTINPUT events for chat (why first and only first chat invocation receives event for 't' key?)
unc0rr
parents:
9697
diff
changeset
|
798 |
|
11365 | 799 |
procedure KeyPressChat(keysym: TSDL_Keysym); |
11372 | 800 |
const nonStateMask = (not (KMOD_NUM or KMOD_CAPS)); |
801 |
var i, index: integer; |
|
802 |
selMode, ctrl, ctrlonly: boolean; |
|
10844
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
803 |
skip: TCharSkip; |
11365 | 804 |
Scancode: TSDL_Scancode; |
805 |
Modifier: Word; |
|
946 | 806 |
begin |
11365 | 807 |
Scancode:= keysym.scancode; |
808 |
Modifier:= keysym.modifier; |
|
809 |
||
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
810 |
LastKeyPressTick:= RealTicks; |
10836 | 811 |
|
812 |
selMode:= (modifier and (KMOD_LSHIFT or KMOD_RSHIFT)) <> 0; |
|
813 |
ctrl:= (modifier and (KMOD_LCTRL or KMOD_RCTRL)) <> 0; |
|
11004
bd62cdbea391
chat: make sure that CTRL is the /only/ modifier key pressed when detecting ctrl+a etc
sheepluva
parents:
10985
diff
changeset
|
814 |
ctrlonly:= ctrl and ((modifier and nonStateMask and (not (KMOD_LCTRL or KMOD_RCTRL))) = 0); |
10844
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
815 |
skip:= none; |
10836 | 816 |
|
11365 | 817 |
case Scancode of |
818 |
SDL_SCANCODE_BACKSPACE: |
|
8743 | 819 |
begin |
10836 | 820 |
if selectedPos < 0 then |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2716
diff
changeset
|
821 |
begin |
10920
11a28d22985f
different implementation for utf-8 char detection/handling
sheepluva
parents:
10919
diff
changeset
|
822 |
HandleSelection(true); |
10845
1dbd50690951
quick word deletion while holding ctrl (qt style)
sheepluva
parents:
10844
diff
changeset
|
823 |
|
1dbd50690951
quick word deletion while holding ctrl (qt style)
sheepluva
parents:
10844
diff
changeset
|
824 |
// delete more if ctrl is held |
10920
11a28d22985f
different implementation for utf-8 char detection/handling
sheepluva
parents:
10919
diff
changeset
|
825 |
if ctrl then |
11a28d22985f
different implementation for utf-8 char detection/handling
sheepluva
parents:
10919
diff
changeset
|
826 |
SkipInputChars(GetInputCharSkipClass(cursorPos), true) |
10849
a772d342066a
copy&paste (wip), currently using only a local clipboard
sheepluva
parents:
10846
diff
changeset
|
827 |
else |
10920
11a28d22985f
different implementation for utf-8 char detection/handling
sheepluva
parents:
10919
diff
changeset
|
828 |
MoveCursorToPreviousChar(); |
10849
a772d342066a
copy&paste (wip), currently using only a local clipboard
sheepluva
parents:
10846
diff
changeset
|
829 |
|
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2716
diff
changeset
|
830 |
end; |
10920
11a28d22985f
different implementation for utf-8 char detection/handling
sheepluva
parents:
10919
diff
changeset
|
831 |
|
11a28d22985f
different implementation for utf-8 char detection/handling
sheepluva
parents:
10919
diff
changeset
|
832 |
DeleteSelected(); |
11a28d22985f
different implementation for utf-8 char detection/handling
sheepluva
parents:
10919
diff
changeset
|
833 |
UpdateCursorCoords(); |
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
834 |
end; |
11365 | 835 |
SDL_SCANCODE_DELETE: |
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
836 |
begin |
10836 | 837 |
if selectedPos < 0 then |
5100 | 838 |
begin |
10920
11a28d22985f
different implementation for utf-8 char detection/handling
sheepluva
parents:
10919
diff
changeset
|
839 |
HandleSelection(true); |
10845
1dbd50690951
quick word deletion while holding ctrl (qt style)
sheepluva
parents:
10844
diff
changeset
|
840 |
|
10920
11a28d22985f
different implementation for utf-8 char detection/handling
sheepluva
parents:
10919
diff
changeset
|
841 |
// delete more if ctrl is held |
11a28d22985f
different implementation for utf-8 char detection/handling
sheepluva
parents:
10919
diff
changeset
|
842 |
if ctrl then |
11a28d22985f
different implementation for utf-8 char detection/handling
sheepluva
parents:
10919
diff
changeset
|
843 |
SkipInputChars(GetInputCharSkipClass(cursorPos), false) |
10849
a772d342066a
copy&paste (wip), currently using only a local clipboard
sheepluva
parents:
10846
diff
changeset
|
844 |
else |
10920
11a28d22985f
different implementation for utf-8 char detection/handling
sheepluva
parents:
10919
diff
changeset
|
845 |
MoveCursorToNextChar(); |
11a28d22985f
different implementation for utf-8 char detection/handling
sheepluva
parents:
10919
diff
changeset
|
846 |
|
5100 | 847 |
end; |
10920
11a28d22985f
different implementation for utf-8 char detection/handling
sheepluva
parents:
10919
diff
changeset
|
848 |
|
11a28d22985f
different implementation for utf-8 char detection/handling
sheepluva
parents:
10919
diff
changeset
|
849 |
DeleteSelected(); |
11a28d22985f
different implementation for utf-8 char detection/handling
sheepluva
parents:
10919
diff
changeset
|
850 |
UpdateCursorCoords(); |
8743 | 851 |
end; |
11365 | 852 |
SDL_SCANCODE_ESCAPE: |
8743 | 853 |
begin |
8745 | 854 |
if Length(InputStr.s) > 0 then |
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
855 |
begin |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
856 |
SetLine(InputStr, '', true); |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
857 |
ResetCursor(); |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
858 |
end |
8743 | 859 |
else CleanupInput |
860 |
end; |
|
11365 | 861 |
SDL_SCANCODE_RETURN, SDL_SCANCODE_KP_ENTER: |
8743 | 862 |
begin |
863 |
if Length(InputStr.s) > 0 then |
|
8742
b7b8bd398c1b
Key returned 0 for arrows under linux. Sym works, clearer anyway.
nemo
parents:
8741
diff
changeset
|
864 |
begin |
8743 | 865 |
AcceptChatString(InputStr.s); |
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
866 |
SetLine(InputStr, '', false); |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
867 |
ResetCursor(); |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2716
diff
changeset
|
868 |
end; |
8743 | 869 |
CleanupInput |
870 |
end; |
|
11365 | 871 |
SDL_SCANCODE_UP, SDL_SCANCODE_DOWN: |
8743 | 872 |
begin |
11365 | 873 |
if (Scancode = SDL_SCANCODE_UP) and (history < localLastStr) then inc(history); |
874 |
if (Scancode = SDL_SCANCODE_DOWN) and (history > 0) then dec(history); |
|
8743 | 875 |
index:= localLastStr - history + 1; |
876 |
if (index > localLastStr) then |
|
10835
8ac09cd322b7
fix chat input history not restoring utf8-related info
sheepluva
parents:
10834
diff
changeset
|
877 |
begin |
8ac09cd322b7
fix chat input history not restoring utf8-related info
sheepluva
parents:
10834
diff
changeset
|
878 |
SetLine(InputStr, '', true); |
8ac09cd322b7
fix chat input history not restoring utf8-related info
sheepluva
parents:
10834
diff
changeset
|
879 |
end |
8ac09cd322b7
fix chat input history not restoring utf8-related info
sheepluva
parents:
10834
diff
changeset
|
880 |
else |
8ac09cd322b7
fix chat input history not restoring utf8-related info
sheepluva
parents:
10834
diff
changeset
|
881 |
begin |
8ac09cd322b7
fix chat input history not restoring utf8-related info
sheepluva
parents:
10834
diff
changeset
|
882 |
SetLine(InputStr, LocalStrs[index], true); |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2716
diff
changeset
|
883 |
end; |
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
884 |
cursorPos:= Length(InputStr.s); |
10836 | 885 |
ResetSelection(); |
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
886 |
UpdateCursorCoords(); |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
887 |
end; |
11365 | 888 |
SDL_SCANCODE_HOME: |
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
889 |
begin |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
890 |
if cursorPos > 0 then |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
891 |
begin |
10836 | 892 |
HandleSelection(selMode); |
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
893 |
cursorPos:= 0; |
10846
c76fd416eff6
attempt to move cursor now removes selection even if cursor cannot actually move in the specified direction
sheepluva
parents:
10845
diff
changeset
|
894 |
end |
c76fd416eff6
attempt to move cursor now removes selection even if cursor cannot actually move in the specified direction
sheepluva
parents:
10845
diff
changeset
|
895 |
else if (not selMode) then |
c76fd416eff6
attempt to move cursor now removes selection even if cursor cannot actually move in the specified direction
sheepluva
parents:
10845
diff
changeset
|
896 |
ResetSelection(); |
c76fd416eff6
attempt to move cursor now removes selection even if cursor cannot actually move in the specified direction
sheepluva
parents:
10845
diff
changeset
|
897 |
|
c76fd416eff6
attempt to move cursor now removes selection even if cursor cannot actually move in the specified direction
sheepluva
parents:
10845
diff
changeset
|
898 |
UpdateCursorCoords(); |
8745 | 899 |
end; |
11365 | 900 |
SDL_SCANCODE_END: |
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
901 |
begin |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
902 |
i:= Length(InputStr.s); |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
903 |
if cursorPos < i then |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
904 |
begin |
10836 | 905 |
HandleSelection(selMode); |
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
906 |
cursorPos:= i; |
10846
c76fd416eff6
attempt to move cursor now removes selection even if cursor cannot actually move in the specified direction
sheepluva
parents:
10845
diff
changeset
|
907 |
end |
c76fd416eff6
attempt to move cursor now removes selection even if cursor cannot actually move in the specified direction
sheepluva
parents:
10845
diff
changeset
|
908 |
else if (not selMode) then |
c76fd416eff6
attempt to move cursor now removes selection even if cursor cannot actually move in the specified direction
sheepluva
parents:
10845
diff
changeset
|
909 |
ResetSelection(); |
c76fd416eff6
attempt to move cursor now removes selection even if cursor cannot actually move in the specified direction
sheepluva
parents:
10845
diff
changeset
|
910 |
|
c76fd416eff6
attempt to move cursor now removes selection even if cursor cannot actually move in the specified direction
sheepluva
parents:
10845
diff
changeset
|
911 |
UpdateCursorCoords(); |
8745 | 912 |
end; |
11365 | 913 |
SDL_SCANCODE_LEFT: |
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
914 |
begin |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
915 |
if cursorPos > 0 then |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
916 |
begin |
10844
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
917 |
|
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
918 |
if ctrl then |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
919 |
skip:= GetInputCharSkipClass(cursorPos); |
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
920 |
|
10836 | 921 |
if selMode or (selectedPos < 0) then |
922 |
begin |
|
923 |
HandleSelection(selMode); |
|
924 |
// go to end of previous utf8-char |
|
10920
11a28d22985f
different implementation for utf-8 char detection/handling
sheepluva
parents:
10919
diff
changeset
|
925 |
MoveCursorToPreviousChar(); |
10836 | 926 |
end |
927 |
else // if we're leaving selection mode, jump to its left end |
|
928 |
begin |
|
929 |
cursorPos:= min(cursorPos, selectedPos); |
|
930 |
ResetSelection(); |
|
931 |
end; |
|
10844
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
932 |
|
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
933 |
if ctrl then |
10845
1dbd50690951
quick word deletion while holding ctrl (qt style)
sheepluva
parents:
10844
diff
changeset
|
934 |
SkipInputChars(skip, true); |
10844
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
935 |
|
10846
c76fd416eff6
attempt to move cursor now removes selection even if cursor cannot actually move in the specified direction
sheepluva
parents:
10845
diff
changeset
|
936 |
end |
c76fd416eff6
attempt to move cursor now removes selection even if cursor cannot actually move in the specified direction
sheepluva
parents:
10845
diff
changeset
|
937 |
else if (not selMode) then |
c76fd416eff6
attempt to move cursor now removes selection even if cursor cannot actually move in the specified direction
sheepluva
parents:
10845
diff
changeset
|
938 |
ResetSelection(); |
c76fd416eff6
attempt to move cursor now removes selection even if cursor cannot actually move in the specified direction
sheepluva
parents:
10845
diff
changeset
|
939 |
|
c76fd416eff6
attempt to move cursor now removes selection even if cursor cannot actually move in the specified direction
sheepluva
parents:
10845
diff
changeset
|
940 |
UpdateCursorCoords(); |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2716
diff
changeset
|
941 |
end; |
11365 | 942 |
SDL_SCANCODE_RIGHT: |
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
943 |
begin |
10836 | 944 |
if cursorPos < Length(InputStr.s) then |
945 |
begin |
|
10844
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
946 |
|
10836 | 947 |
if selMode or (selectedPos < 0) then |
948 |
begin |
|
949 |
HandleSelection(selMode); |
|
10920
11a28d22985f
different implementation for utf-8 char detection/handling
sheepluva
parents:
10919
diff
changeset
|
950 |
MoveCursorToNextChar(); |
10836 | 951 |
end |
952 |
else // if we're leaving selection mode, jump to its right end |
|
953 |
begin |
|
954 |
cursorPos:= max(cursorPos, selectedPos); |
|
955 |
ResetSelection(); |
|
956 |
end; |
|
10844
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
957 |
|
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
958 |
if ctrl then |
10845
1dbd50690951
quick word deletion while holding ctrl (qt style)
sheepluva
parents:
10844
diff
changeset
|
959 |
SkipInputChars(GetInputCharSkipClass(cursorPos), false); |
10844
953d85b7d529
holding ctrl will now make cursor skip words/etc in a fashion similar to Qt
sheepluva
parents:
10843
diff
changeset
|
960 |
|
10846
c76fd416eff6
attempt to move cursor now removes selection even if cursor cannot actually move in the specified direction
sheepluva
parents:
10845
diff
changeset
|
961 |
end |
c76fd416eff6
attempt to move cursor now removes selection even if cursor cannot actually move in the specified direction
sheepluva
parents:
10845
diff
changeset
|
962 |
else if (not selMode) then |
c76fd416eff6
attempt to move cursor now removes selection even if cursor cannot actually move in the specified direction
sheepluva
parents:
10845
diff
changeset
|
963 |
ResetSelection(); |
c76fd416eff6
attempt to move cursor now removes selection even if cursor cannot actually move in the specified direction
sheepluva
parents:
10845
diff
changeset
|
964 |
|
c76fd416eff6
attempt to move cursor now removes selection even if cursor cannot actually move in the specified direction
sheepluva
parents:
10845
diff
changeset
|
965 |
UpdateCursorCoords(); |
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
966 |
end; |
11365 | 967 |
SDL_SCANCODE_PAGEUP, SDL_SCANCODE_PAGEDOWN: |
8745 | 968 |
begin |
969 |
// ignore me!!! |
|
970 |
end; |
|
11365 | 971 |
// TODO: figure out how to determine those keys better |
972 |
SDL_SCANCODE_a: |
|
10836 | 973 |
begin |
974 |
// select all |
|
11004
bd62cdbea391
chat: make sure that CTRL is the /only/ modifier key pressed when detecting ctrl+a etc
sheepluva
parents:
10985
diff
changeset
|
975 |
if ctrlonly then |
10836 | 976 |
begin |
977 |
ResetSelection(); |
|
10846
c76fd416eff6
attempt to move cursor now removes selection even if cursor cannot actually move in the specified direction
sheepluva
parents:
10845
diff
changeset
|
978 |
cursorPos:= 0; |
10836 | 979 |
HandleSelection(true); |
10846
c76fd416eff6
attempt to move cursor now removes selection even if cursor cannot actually move in the specified direction
sheepluva
parents:
10845
diff
changeset
|
980 |
cursorPos:= Length(InputStr.s); |
10836 | 981 |
UpdateCursorCoords(); |
982 |
end |
|
983 |
end; |
|
11365 | 984 |
SDL_SCANCODE_c: |
10849
a772d342066a
copy&paste (wip), currently using only a local clipboard
sheepluva
parents:
10846
diff
changeset
|
985 |
begin |
a772d342066a
copy&paste (wip), currently using only a local clipboard
sheepluva
parents:
10846
diff
changeset
|
986 |
// copy |
11004
bd62cdbea391
chat: make sure that CTRL is the /only/ modifier key pressed when detecting ctrl+a etc
sheepluva
parents:
10985
diff
changeset
|
987 |
if ctrlonly then |
10849
a772d342066a
copy&paste (wip), currently using only a local clipboard
sheepluva
parents:
10846
diff
changeset
|
988 |
CopySelectionToClipboard() |
a772d342066a
copy&paste (wip), currently using only a local clipboard
sheepluva
parents:
10846
diff
changeset
|
989 |
end; |
11365 | 990 |
SDL_SCANCODE_v: |
10849
a772d342066a
copy&paste (wip), currently using only a local clipboard
sheepluva
parents:
10846
diff
changeset
|
991 |
begin |
a772d342066a
copy&paste (wip), currently using only a local clipboard
sheepluva
parents:
10846
diff
changeset
|
992 |
// paste |
11004
bd62cdbea391
chat: make sure that CTRL is the /only/ modifier key pressed when detecting ctrl+a etc
sheepluva
parents:
10985
diff
changeset
|
993 |
if ctrlonly then |
10921 | 994 |
begin |
995 |
DeleteSelected(); |
|
996 |
PasteFromClipboard(); |
|
997 |
end |
|
10849
a772d342066a
copy&paste (wip), currently using only a local clipboard
sheepluva
parents:
10846
diff
changeset
|
998 |
end; |
11365 | 999 |
SDL_SCANCODE_x: |
10849
a772d342066a
copy&paste (wip), currently using only a local clipboard
sheepluva
parents:
10846
diff
changeset
|
1000 |
begin |
a772d342066a
copy&paste (wip), currently using only a local clipboard
sheepluva
parents:
10846
diff
changeset
|
1001 |
// cut |
11004
bd62cdbea391
chat: make sure that CTRL is the /only/ modifier key pressed when detecting ctrl+a etc
sheepluva
parents:
10985
diff
changeset
|
1002 |
if ctrlonly then |
10849
a772d342066a
copy&paste (wip), currently using only a local clipboard
sheepluva
parents:
10846
diff
changeset
|
1003 |
begin |
a772d342066a
copy&paste (wip), currently using only a local clipboard
sheepluva
parents:
10846
diff
changeset
|
1004 |
CopySelectionToClipboard(); |
a772d342066a
copy&paste (wip), currently using only a local clipboard
sheepluva
parents:
10846
diff
changeset
|
1005 |
DeleteSelected(); |
a772d342066a
copy&paste (wip), currently using only a local clipboard
sheepluva
parents:
10846
diff
changeset
|
1006 |
end |
a772d342066a
copy&paste (wip), currently using only a local clipboard
sheepluva
parents:
10846
diff
changeset
|
1007 |
end; |
8742
b7b8bd398c1b
Key returned 0 for arrows under linux. Sym works, clearer anyway.
nemo
parents:
8741
diff
changeset
|
1008 |
end; |
946 | 1009 |
end; |
1010 |
||
11365 | 1011 |
procedure TextInput(var event: TSDL_TextInputEvent); |
1012 |
var s: shortstring; |
|
1013 |
l: byte; |
|
1014 |
begin |
|
1015 |
DeleteSelected(); |
|
1016 |
||
1017 |
l:= 0; |
|
1018 |
while event.text[l] <> #0 do |
|
1019 |
begin |
|
1020 |
s[l + 1]:= event.text[l]; |
|
1021 |
inc(l) |
|
1022 |
end; |
|
1023 |
||
1024 |
if l > 0 then |
|
1025 |
begin |
|
1026 |
if byte(InputStr.s[0]) + l > 240 then exit; |
|
1027 |
s[0]:= char(l); |
|
1028 |
InsertIntoInputStr(s); |
|
1029 |
end |
|
1030 |
end; |
|
1031 |
||
1032 |
||
4404 | 1033 |
procedure chChatMessage(var s: shortstring); |
1034 |
begin |
|
1035 |
AddChatString(s) |
|
1036 |
end; |
|
1037 |
||
4402 | 1038 |
procedure chSay(var s: shortstring); |
1039 |
begin |
|
1040 |
SendIPC('s' + s); |
|
1041 |
||
1042 |
if copy(s, 1, 4) = '/me ' then |
|
6453
11c578d30bd3
Countless imporvements to the parser and countless help to the parser in sources.
unc0rr
parents:
6381
diff
changeset
|
1043 |
s:= #2 + '* ' + UserNick + ' ' + copy(s, 5, Length(s) - 4) |
4402 | 1044 |
else |
1045 |
s:= #1 + UserNick + ': ' + s; |
|
1046 |
||
1047 |
AddChatString(s) |
|
1048 |
end; |
|
1049 |
||
1050 |
procedure chTeamSay(var s: shortstring); |
|
1051 |
begin |
|
1052 |
SendIPC('b' + s); |
|
1053 |
||
1054 |
s:= #4 + '[Team] ' + UserNick + ': ' + s; |
|
1055 |
||
1056 |
AddChatString(s) |
|
1057 |
end; |
|
1058 |
||
1059 |
procedure chHistory(var s: shortstring); |
|
10514
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
1060 |
var i: LongInt; |
4402 | 1061 |
begin |
1062 |
s:= s; // avoid compiler hint |
|
10514
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
1063 |
showAll:= not showAll; |
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
1064 |
// immediatly recount |
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
1065 |
visibleCount:= 0; |
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
1066 |
if showAll or (not ChatHidden) then |
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
1067 |
for i:= 0 to MaxStrIndex do |
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
1068 |
begin |
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
1069 |
if (Strs[i].Tex <> nil) and (showAll or (Strs[i].Time > RealTicks)) then |
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
1070 |
inc(visibleCount); |
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
1071 |
end; |
4402 | 1072 |
end; |
1073 |
||
1074 |
procedure chChat(var s: shortstring); |
|
1075 |
begin |
|
1076 |
s:= s; // avoid compiler hint |
|
1077 |
GameState:= gsChat; |
|
11365 | 1078 |
SDL_StopTextInput(); |
9697 | 1079 |
SDL_StartTextInput(); |
11365 | 1080 |
//SDL_EnableKeyRepeat(200,45); |
4402 | 1081 |
if length(s) = 0 then |
5100 | 1082 |
SetLine(InputStr, '', true) |
4402 | 1083 |
else |
1084 |
begin |
|
10843 | 1085 |
SetLine(InputStr, '/team ', true); |
10841 | 1086 |
cursorPos:= 6; |
1087 |
UpdateCursorCoords(); |
|
1088 |
end; |
|
4402 | 1089 |
end; |
1090 |
||
3038 | 1091 |
procedure initModule; |
4925 | 1092 |
var i: ShortInt; |
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2699
diff
changeset
|
1093 |
begin |
6898 | 1094 |
RegisterVariable('chatmsg', @chChatMessage, true); |
1095 |
RegisterVariable('say', @chSay, true); |
|
1096 |
RegisterVariable('team', @chTeamSay, true); |
|
1097 |
RegisterVariable('history', @chHistory, true ); |
|
1098 |
RegisterVariable('chat', @chChat, true ); |
|
4402 | 1099 |
|
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2699
diff
changeset
|
1100 |
lastStr:= 0; |
8740
3eb1891f81ef
use a local storage for chat history which prevents mix ups in netgame and simplifies code
koda
parents:
8739
diff
changeset
|
1101 |
localLastStr:= 0; |
8737
0d56265dd60a
implement up and down keys to navigate in the chat history, needs testing over network
koda
parents:
8736
diff
changeset
|
1102 |
history:= 0; |
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2699
diff
changeset
|
1103 |
visibleCount:= 0; |
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2699
diff
changeset
|
1104 |
showAll:= false; |
3539 | 1105 |
ChatReady:= false; |
1106 |
missedCount:= 0; |
|
10312 | 1107 |
liveLua:= false; |
10514
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
1108 |
ChatHidden:= false; |
10842
a039464cbb4a
since fonts can be loaded in late, update cursor position before first chat display
sheepluva
parents:
10841
diff
changeset
|
1109 |
firstDraw:= true; |
4925 | 1110 |
|
10852
9e5763cb805e
render input prefix independent of inputstr so that e.g. a username will not lead to weirdnesses
sheepluva
parents:
10851
diff
changeset
|
1111 |
InputLinePrefix.Tex:= nil; |
9e5763cb805e
render input prefix independent of inputstr so that e.g. a username will not lead to weirdnesses
sheepluva
parents:
10851
diff
changeset
|
1112 |
UpdateInputLinePrefix(); |
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
1113 |
inputStr.s:= ''; |
4925 | 1114 |
inputStr.Tex := nil; |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset
|
1115 |
for i:= 0 to MaxStrIndex do |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset
|
1116 |
Strs[i].Tex := nil; |
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
1117 |
|
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
1118 |
LastKeyPressTick:= 0; |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
1119 |
ResetCursor(); |
11365 | 1120 |
SDL_StopTextInput(); |
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2699
diff
changeset
|
1121 |
end; |
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2699
diff
changeset
|
1122 |
|
3038 | 1123 |
procedure freeModule; |
4901 | 1124 |
var i: ShortInt; |
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2699
diff
changeset
|
1125 |
begin |
10852
9e5763cb805e
render input prefix independent of inputstr so that e.g. a username will not lead to weirdnesses
sheepluva
parents:
10851
diff
changeset
|
1126 |
FreeAndNilTexture(InputLinePrefix.Tex); |
10634
35d059bd0932
Use FreeAndNil across the board. Even if we are immediately assigning after, probably avoids accidental mistakes. Also free neglected owner tex on shutdown, and delete hog gears using the normal deletion procedure if for any reason they still exist (EndGame call?).
nemo
parents:
10588
diff
changeset
|
1127 |
FreeAndNilTexture(InputStr.Tex); |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset
|
1128 |
for i:= 0 to MaxStrIndex do |
10634
35d059bd0932
Use FreeAndNil across the board. Even if we are immediately assigning after, probably avoids accidental mistakes. Also free neglected owner tex on shutdown, and delete hog gears using the normal deletion procedure if for any reason they still exist (EndGame call?).
nemo
parents:
10588
diff
changeset
|
1129 |
FreeAndNilTexture(Strs[i].Tex); |
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2699
diff
changeset
|
1130 |
end; |
946 | 1131 |
|
942 | 1132 |
end. |