# HG changeset patch # User sheepluva # Date 1425775887 -3600 # Node ID f25dad9c3136c1e10f67f6ed4e71a6c6d01ea014 # Parent c76ea22ea249cb6e7205f9d27ede318fd0b07dad chat/copypaste: some adjustments and sanity checks diff -r c76ea22ea249 -r f25dad9c3136 QTfrontend/game.cpp --- a/QTfrontend/game.cpp Sun Mar 08 01:04:41 2015 +0100 +++ b/QTfrontend/game.cpp Sun Mar 08 01:51:27 2015 +0100 @@ -213,18 +213,6 @@ SendIPC("!"); break; } - case 'Y': - { - // copy string to clipboard - QApplication::clipboard()->setText(QString::fromUtf8(msg.mid(2))); - break; - } - case 'P': - { - // paste clipboard to game - SendIPC(QString("P").toAscii() + QApplication::clipboard()->text().toUtf8().left(254).replace('\n', ' ')); - break; - } case 'C': { switch (gameType) @@ -273,6 +261,18 @@ .arg(QString::fromUtf8(msg.mid(2).left(size - 4)))); return; } + case 'y': + { + // copy string to clipboard + QApplication::clipboard()->setText(QString::fromUtf8(msg.mid(2))); + break; + } + case 'Y': + { + // paste clipboard to game + SendIPC(QString("Y").toAscii() + QApplication::clipboard()->text().toUtf8().left(250).replace('\n', ' ')); + break; + } case 'i': { emit GameStats(msg.at(2), QString::fromUtf8(msg.mid(3))); diff -r c76ea22ea249 -r f25dad9c3136 hedgewars/uChat.pas --- a/hedgewars/uChat.pas Sun Mar 08 01:04:41 2015 +0100 +++ b/hedgewars/uChat.pas Sun Mar 08 01:51:27 2015 +0100 @@ -36,6 +36,7 @@ uses SDLh, uInputHandler, uTypes, uVariables, uCommands, uUtils, uTextures, uRender, uIO, uScript, uRenderUtils; const MaxStrIndex = 27; + MaxInputStrLen = 240; type TChatLine = record Tex: PTexture; @@ -198,6 +199,7 @@ begin cl.s:= str; color:= colors[#6]; + // TODO FIX render InputLinePrefix seperately so that it doesn't mess up max len str:= InputLinePrefix + str + ' '; end else @@ -668,7 +670,7 @@ procedure CopyToClipboard(var newContent: shortstring); begin - SendIPC(_S'Y' + copy(newContent, 1, 253) + #0); + SendIPC(_S'y' + copy(newContent, 1, 253) + #0); end; procedure CopySelectionToClipboard(); @@ -683,9 +685,10 @@ // TODO: honor utf8, don't break utf8 chars when shifting chars beyond limit procedure InsertIntoInputStr(var s: shortstring); -var i, l, lastc: integer; +var i, l, il, lastc: integer; begin - l:= Length(s); + // safe length for string + l:= min(MaxInputStrLen-cursorPos, Length(s)); // if we insert rather than append, shift info in InputStrL accordingly if cursorPos < Length(InputStr.s) then @@ -694,25 +697,32 @@ begin if InputStrL[i] <> InputStrLNoPred then begin - InputStrL[i+l]:= InputStrL[i] + l; + il:= i + l; + // only shift if not overflowing + if il <= MaxInputStrLen then + InputStrL[il]:= InputStrL[i] + l; InputStrL[i]:= InputStrLNoPred; end; end; end; InputStrL[cursorPos + l]:= cursorPos; - Insert(s, InputStr.s, cursorPos + 1); + // insert string truncated to safe length + Insert(copy(s,1,l), InputStr.s, cursorPos + 1); + if Length(InputStr.s) > MaxInputStrLen then + InputStr.s[0]:= char(MaxInputStrLen); + SetLine(InputStr, InputStr.s, true); // move cursor to end of inserted string - lastc:= 255; + lastc:= MaxInputStrLen; cursorPos:= min(lastc, cursorPos + l); UpdateCursorCoords(); end; procedure PasteFromClipboard(); begin - SendIPC(_S'P'); + SendIPC(_S'Y'); end; procedure CheckPasteBuffer(); @@ -983,7 +993,7 @@ utf8:= char(Key or firstByteMark[Pred(btw)]) + utf8; - if Length(InputStr.s) + btw > 240 then + if Length(InputStr.s) + btw > MaxInputStrLen then exit; InsertIntoInputStr(utf8); @@ -1071,7 +1081,7 @@ ChatHidden:= false; firstDraw:= true; - InputLinePrefix:= UserNick + '> '; + InputLinePrefix:= ''; inputStr.s:= ''; inputStr.Tex := nil; for i:= 0 to MaxStrIndex do diff -r c76ea22ea249 -r f25dad9c3136 hedgewars/uIO.pas --- a/hedgewars/uIO.pas Sun Mar 08 01:04:41 2015 +0100 +++ b/hedgewars/uIO.pas Sun Mar 08 01:51:27 2015 +0100 @@ -138,7 +138,6 @@ case s[1] of '!': begin AddFileLog('Ping? Pong!'); isPonged:= true; end; '?': SendIPC(_S'!'); - 'P': ChatPasteBuffer:= copy(s, 2, Length(s) - 1); 'e': ParseCommand(copy(s, 2, Length(s) - 1), true); 'E': OutError(copy(s, 2, Length(s) - 1), true); 'W': OutError(copy(s, 2, Length(s) - 1), false); @@ -164,6 +163,7 @@ ParseChatCommand('chatmsg ' + #4, s, 2) else isProcessed:= false; + 'Y': ChatPasteBuffer:= copy(s, 2, Length(s) - 1); else isProcessed:= false; end;