From 9bd019fbf33abe6a66bec2f451431600a2df5eaf Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Sun, 4 Mar 2012 11:57:45 +0100 Subject: [PATCH 1/5] plClipboard --- .../pfGameGUIMgr/pfGUIEditBoxMod.cpp | 24 ++++ .../pfGameGUIMgr/pfGUIMultiLineEditCtrl.cpp | 17 ++- .../PubUtilLib/plClipboard/plClipboard.cpp | 114 ++++++++++++++++++ .../PubUtilLib/plClipboard/plClipboard.h | 62 ++++++++++ 4 files changed, 214 insertions(+), 3 deletions(-) create mode 100644 MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plClipboard/plClipboard.cpp create mode 100644 MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plClipboard/plClipboard.h diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfGameGUIMgr/pfGUIEditBoxMod.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfGameGUIMgr/pfGUIEditBoxMod.cpp index dcddf468..03444783 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfGameGUIMgr/pfGUIEditBoxMod.cpp +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfGameGUIMgr/pfGUIEditBoxMod.cpp @@ -61,6 +61,7 @@ You can contact Cyan Worlds, Inc. by email legal@cyan.com #include "plgDispatch.h" #include "hsResMgr.h" #include "../pnInputCore/plKeyMap.h" +#include "../plClipboard/plClipboard.h" #include @@ -501,6 +502,29 @@ hsBool pfGUIEditBoxMod::HandleKeyEvent( pfGameGUIMgr::EventType event, plKeyDef DoSomething(); // Query WasEscaped() to see if it was escape vs enter return true; } + else if (modifiers & pfGameGUIMgr::kCtrlDown) + { + if (key == KEY_C) + { + plClipboard::GetInstance().SetClipboardText(fBuffer); + } + else if (key == KEY_V) + { + wchar_t* contents = plClipboard::GetInstance().GetClipboardText(); + size_t len = wcslen(contents); + if (len > 0) { + wchar_t* insertTarget = fBuffer + fCursorPos; + size_t bufferTailLen = wcslen(insertTarget); + if (fCursorPos + len + bufferTailLen < fBufferSize) { + memmove(insertTarget + len, insertTarget, bufferTailLen * sizeof(wchar_t)); + memcpy(insertTarget, contents, len * sizeof(wchar_t)); + fCursorPos += len; + HandleExtendedEvent( kValueChanging ); + } + } + delete contents; + } + } else { fIgnoreNextKey = false; diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfGameGUIMgr/pfGUIMultiLineEditCtrl.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfGameGUIMgr/pfGUIMultiLineEditCtrl.cpp index 72e7863d..60b8c354 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfGameGUIMgr/pfGUIMultiLineEditCtrl.cpp +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfGameGUIMgr/pfGUIMultiLineEditCtrl.cpp @@ -60,6 +60,7 @@ You can contact Cyan Worlds, Inc. by email legal@cyan.com #include "../plGImage/plDynamicTextMap.h" #include "plgDispatch.h" #include "hsResMgr.h" +#include "../plClipboard/plClipboard.h" //// Tiny Helper Class /////////////////////////////////////////////////////// @@ -1172,9 +1173,6 @@ hsBool pfGUIMultiLineEditCtrl::HandleKeyEvent( pfGameGUIMgr::EventType event, pl if ((fPrevCtrl || fNextCtrl) && (fLineStarts.GetCount() <= GetFirstVisibleLine())) return true; // we're ignoring if we can't actually edit our visible frame (and we're linked) - if (modifiers & pfGameGUIMgr::kCtrlDown) - return true; // we're ignoring ctrl key events - if( event == pfGameGUIMgr::kKeyDown || event == pfGameGUIMgr::kKeyRepeat ) { // Use arrow keys to do our dirty work @@ -1219,6 +1217,19 @@ hsBool pfGUIMultiLineEditCtrl::HandleKeyEvent( pfGameGUIMgr::EventType event, pl // fEscapedFlag = true; DoSomething(); // Query WasEscaped() to see if it was escape vs enter } + else if (modifiers & pfGameGUIMgr::kCtrlDown) + { + if (key == KEY_C) + { + plClipboard::GetInstance().SetClipboardText(fBuffer.AcquireArray()); + } + else if (key == KEY_V) + { + wchar_t* contents = plClipboard::GetInstance().GetClipboardText(); + InsertString(contents); + delete contents; + } + } else { fIgnoreNextKey = false; diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plClipboard/plClipboard.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plClipboard/plClipboard.cpp new file mode 100644 index 00000000..c7e26fd7 --- /dev/null +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plClipboard/plClipboard.cpp @@ -0,0 +1,114 @@ +/*==LICENSE==* + +CyanWorlds.com Engine - MMOG client, server and tools +Copyright (C) 2011 Cyan Worlds, Inc. + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . + +Additional permissions under GNU GPL version 3 section 7 + +If you modify this Program, or any covered work, by linking or +combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, +NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent +JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK +(or a modified version of those libraries), +containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, +PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG +JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the +licensors of this Program grant you additional +permission to convey the resulting work. Corresponding Source for a +non-source form of such a combination shall include the source code for +the parts of OpenSSL and IJG JPEG Library used as well as that of the covered +work. + +You can contact Cyan Worlds, Inc. by email legal@cyan.com +or by snail mail at: +Cyan Worlds, Inc. +14617 N Newport Hwy +Mead, WA 99021 + +*==LICENSE==*/ + +#include "HeadSpin.h" +#include "plClipboard.h" + +plClipboard& plClipboard::GetInstance() +{ + static plClipboard theInstance; + return theInstance; +} + +bool plClipboard::IsTextInClipboard() +{ +#ifdef HS_BUILD_FOR_WIN32 + return ::IsClipboardFormatAvailable(CF_UNICODETEXT); +#else + return false; +#endif +} + +wchar_t* plClipboard::GetClipboardText() +{ + if (!IsTextInClipboard()) + return nil; + +#ifdef HS_BUILD_FOR_WIN32 + if (!::OpenClipboard(NULL)) + return nil; + + HANDLE clipboardData = ::GetClipboardData(CF_UNICODETEXT); + size_t size = ::GlobalSize(clipboardData) / sizeof(wchar_t); + wchar_t* clipboardDataPtr = (wchar_t*)::GlobalLock(clipboardData); + + wchar_t* result = new wchar_t[size]; + wcsncpy(result, clipboardDataPtr, size); + + ::GlobalUnlock(clipboardData); + ::CloseClipboard(); + + return result; +#else + return plString::Null; +#endif +} + +void plClipboard::SetClipboardText(const wchar_t* text) +{ + if (text == nil) + return; +#ifdef HS_BUILD_FOR_WIN32 + size_t len = wcslen(text); + + if (len == 0) + return; + + HGLOBAL copy = ::GlobalAlloc(GMEM_MOVEABLE, (len + 1) * sizeof(wchar_t)); + if (copy == NULL) + return; + + if (!::OpenClipboard(NULL)) + return; + + ::EmptyClipboard(); + + wchar_t* target = (wchar_t*)::GlobalLock(copy); + wcsncpy(target, text, len + 1); + ::GlobalUnlock(copy); + + // Place the handle on the clipboard. + ::SetClipboardData(CF_UNICODETEXT, target); + ::CloseClipboard(); +#endif +} + diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plClipboard/plClipboard.h b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plClipboard/plClipboard.h new file mode 100644 index 00000000..410a6fa0 --- /dev/null +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plClipboard/plClipboard.h @@ -0,0 +1,62 @@ +/*==LICENSE==* + +CyanWorlds.com Engine - MMOG client, server and tools +Copyright (C) 2011 Cyan Worlds, Inc. + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . + +Additional permissions under GNU GPL version 3 section 7 + +If you modify this Program, or any covered work, by linking or +combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, +NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent +JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK +(or a modified version of those libraries), +containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, +PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG +JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the +licensors of this Program grant you additional +permission to convey the resulting work. Corresponding Source for a +non-source form of such a combination shall include the source code for +the parts of OpenSSL and IJG JPEG Library used as well as that of the covered +work. + +You can contact Cyan Worlds, Inc. by email legal@cyan.com + or by snail mail at: + Cyan Worlds, Inc. + 14617 N Newport Hwy + Mead, WA 99021 + +*==LICENSE==*/ + +#ifndef _plClipboard_h +#define _plClipboard_h + +//// Class Definition ///////////////////////////////////////////////////////// + +class plClipboard +{ + private: + + plClipboard() {} + plClipboard(const plClipboard& rhs) {} + + public: + bool IsTextInClipboard(); + wchar_t* GetClipboardText(); + void SetClipboardText(const wchar_t* text); + static plClipboard& GetInstance( void ); +}; + +#endif // _Clipboard_h From 568b05fe7030f0194c5897502b0f36ba83aa3f99 Mon Sep 17 00:00:00 2001 From: Christian Walther Date: Sun, 4 Mar 2012 15:17:11 +0100 Subject: [PATCH 2/5] Add & integrate project file for plClipboard. --- .../Plasma/Apps/AllClient/AllClient.sln | 20 ++- .../PubUtilLib/plClipboard/plClipboard.vcproj | 139 ++++++++++++++++++ 2 files changed, 157 insertions(+), 2 deletions(-) create mode 100644 MOULOpenSourceClientPlugin/Plasma20/MsDevProjects/Plasma/PubUtilLib/plClipboard/plClipboard.vcproj diff --git a/MOULOpenSourceClientPlugin/Plasma20/MsDevProjects/Plasma/Apps/AllClient/AllClient.sln b/MOULOpenSourceClientPlugin/Plasma20/MsDevProjects/Plasma/Apps/AllClient/AllClient.sln index 19ca25f6..79809390 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/MsDevProjects/Plasma/Apps/AllClient/AllClient.sln +++ b/MOULOpenSourceClientPlugin/Plasma20/MsDevProjects/Plasma/Apps/AllClient/AllClient.sln @@ -135,6 +135,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "plClient", "..\plClient\plC {89316659-F4A9-4E92-8200-C36288A61B9B} = {89316659-F4A9-4E92-8200-C36288A61B9B} {1599855E-CC20-4C3A-A382-5290C40BE08E} = {1599855E-CC20-4C3A-A382-5290C40BE08E} {5C9C6E61-02D6-4BA6-A4F5-6E6AE440E477} = {5C9C6E61-02D6-4BA6-A4F5-6E6AE440E477} + {CA2D4E65-EA68-465F-843A-4AF75243B474} = {CA2D4E65-EA68-465F-843A-4AF75243B474} {8E44FB70-5EA0-4D33-B829-E4D16D7C11E3} = {8E44FB70-5EA0-4D33-B829-E4D16D7C11E3} {CA208971-6C77-47F6-AA4B-FB6ECC071132} = {CA208971-6C77-47F6-AA4B-FB6ECC071132} {7D83F872-F06C-4D42-A8F2-D77DC22C5981} = {7D83F872-F06C-4D42-A8F2-D77DC22C5981} @@ -500,6 +501,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "plPageOptimizer", "..\plPag {1599855E-CC20-4C3A-A382-5290C40BE08E} = {1599855E-CC20-4C3A-A382-5290C40BE08E} {A10FCF60-7425-48D7-9153-CB9D8AD94C8F} = {A10FCF60-7425-48D7-9153-CB9D8AD94C8F} {5C9C6E61-02D6-4BA6-A4F5-6E6AE440E477} = {5C9C6E61-02D6-4BA6-A4F5-6E6AE440E477} + {CA2D4E65-EA68-465F-843A-4AF75243B474} = {CA2D4E65-EA68-465F-843A-4AF75243B474} {8E44FB70-5EA0-4D33-B829-E4D16D7C11E3} = {8E44FB70-5EA0-4D33-B829-E4D16D7C11E3} {CA208971-6C77-47F6-AA4B-FB6ECC071132} = {CA208971-6C77-47F6-AA4B-FB6ECC071132} {7D83F872-F06C-4D42-A8F2-D77DC22C5981} = {7D83F872-F06C-4D42-A8F2-D77DC22C5981} @@ -596,6 +598,10 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "plClientPatcher", "..\plCli ProjectSection(ProjectDependencies) = postProject EndProjectSection EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "plClipboard", "..\..\PubUtilLib\plClipboard\plClipboard.vcproj", "{CA2D4E65-EA68-465F-843A-4AF75243B474}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject Global GlobalSection(SolutionConfiguration) = preSolution Debug = Debug @@ -605,8 +611,6 @@ Global Release_Patcher = Release_Patcher Release_Server = Release_Server EndGlobalSection - GlobalSection(ProjectDependencies) = postSolution - EndGlobalSection GlobalSection(ProjectConfiguration) = postSolution {0736D624-C5F6-4B44-96FC-B27C2841D2F9}.Debug.ActiveCfg = Debug|Win32 {0736D624-C5F6-4B44-96FC-B27C2841D2F9}.Debug.Build.0 = Debug|Win32 @@ -1796,6 +1800,18 @@ Global {F1DC998F-6B75-48FF-8446-D59AF448678E}.Release_Patcher.Build.0 = Release_Patcher|Win32 {F1DC998F-6B75-48FF-8446-D59AF448678E}.Release_Server.ActiveCfg = Release_Patcher|Win32 {F1DC998F-6B75-48FF-8446-D59AF448678E}.Release_Server.Build.0 = Release_Patcher|Win32 + {CA2D4E65-EA68-465F-843A-4AF75243B474}.Debug.ActiveCfg = Debug|Win32 + {CA2D4E65-EA68-465F-843A-4AF75243B474}.Debug.Build.0 = Debug|Win32 + {CA2D4E65-EA68-465F-843A-4AF75243B474}.Debug_Patcher.ActiveCfg = Debug|Win32 + {CA2D4E65-EA68-465F-843A-4AF75243B474}.Debug_Patcher.Build.0 = Debug|Win32 + {CA2D4E65-EA68-465F-843A-4AF75243B474}.Debug_Server.ActiveCfg = Debug|Win32 + {CA2D4E65-EA68-465F-843A-4AF75243B474}.Debug_Server.Build.0 = Debug|Win32 + {CA2D4E65-EA68-465F-843A-4AF75243B474}.Release.ActiveCfg = Release|Win32 + {CA2D4E65-EA68-465F-843A-4AF75243B474}.Release.Build.0 = Release|Win32 + {CA2D4E65-EA68-465F-843A-4AF75243B474}.Release_Patcher.ActiveCfg = Release|Win32 + {CA2D4E65-EA68-465F-843A-4AF75243B474}.Release_Patcher.Build.0 = Release|Win32 + {CA2D4E65-EA68-465F-843A-4AF75243B474}.Release_Server.ActiveCfg = Release|Win32 + {CA2D4E65-EA68-465F-843A-4AF75243B474}.Release_Server.Build.0 = Release|Win32 EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution EndGlobalSection diff --git a/MOULOpenSourceClientPlugin/Plasma20/MsDevProjects/Plasma/PubUtilLib/plClipboard/plClipboard.vcproj b/MOULOpenSourceClientPlugin/Plasma20/MsDevProjects/Plasma/PubUtilLib/plClipboard/plClipboard.vcproj new file mode 100644 index 00000000..ef5969db --- /dev/null +++ b/MOULOpenSourceClientPlugin/Plasma20/MsDevProjects/Plasma/PubUtilLib/plClipboard/plClipboard.vcproj @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From a99ed37f23aacd8ce0eeab70a7b4a788e5ce6ec8 Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Sun, 4 Mar 2012 18:55:44 +0100 Subject: [PATCH 3/5] Missing null checks and small style fixes --- .../pfGameGUIMgr/pfGUIEditBoxMod.cpp | 25 +++++++++++-------- .../pfGameGUIMgr/pfGUIMultiLineEditCtrl.cpp | 7 ++++-- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfGameGUIMgr/pfGUIEditBoxMod.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfGameGUIMgr/pfGUIEditBoxMod.cpp index 03444783..66b8c3db 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfGameGUIMgr/pfGUIEditBoxMod.cpp +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfGameGUIMgr/pfGUIEditBoxMod.cpp @@ -511,18 +511,23 @@ hsBool pfGUIEditBoxMod::HandleKeyEvent( pfGameGUIMgr::EventType event, plKeyDef else if (key == KEY_V) { wchar_t* contents = plClipboard::GetInstance().GetClipboardText(); - size_t len = wcslen(contents); - if (len > 0) { - wchar_t* insertTarget = fBuffer + fCursorPos; - size_t bufferTailLen = wcslen(insertTarget); - if (fCursorPos + len + bufferTailLen < fBufferSize) { - memmove(insertTarget + len, insertTarget, bufferTailLen * sizeof(wchar_t)); - memcpy(insertTarget, contents, len * sizeof(wchar_t)); - fCursorPos += len; - HandleExtendedEvent( kValueChanging ); + if (contents != nil) + { + size_t len = wcslen(contents); + if (len > 0) + { + wchar_t* insertTarget = fBuffer + fCursorPos; + size_t bufferTailLen = wcslen(insertTarget); + if (fCursorPos + len + bufferTailLen < fBufferSize) + { + memmove(insertTarget + len, insertTarget, bufferTailLen * sizeof(wchar_t)); + memcpy(insertTarget, contents, len * sizeof(wchar_t)); + fCursorPos += len; + HandleExtendedEvent( kValueChanging ); + } } + delete contents; } - delete contents; } } else diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfGameGUIMgr/pfGUIMultiLineEditCtrl.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfGameGUIMgr/pfGUIMultiLineEditCtrl.cpp index 60b8c354..9d5df62a 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfGameGUIMgr/pfGUIMultiLineEditCtrl.cpp +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfGameGUIMgr/pfGUIMultiLineEditCtrl.cpp @@ -1226,8 +1226,11 @@ hsBool pfGUIMultiLineEditCtrl::HandleKeyEvent( pfGameGUIMgr::EventType event, pl else if (key == KEY_V) { wchar_t* contents = plClipboard::GetInstance().GetClipboardText(); - InsertString(contents); - delete contents; + if (contents != nil) + { + InsertString(contents); + delete contents; + } } } else From e4458717c9435c17fca71823f5c390fa976fb9b8 Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Mon, 5 Mar 2012 11:06:05 +0100 Subject: [PATCH 4/5] Fix possible WinApi misuse --- .../Sources/Plasma/PubUtilLib/plClipboard/plClipboard.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plClipboard/plClipboard.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plClipboard/plClipboard.cpp index c7e26fd7..c00b06c2 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plClipboard/plClipboard.cpp +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plClipboard/plClipboard.cpp @@ -106,8 +106,7 @@ void plClipboard::SetClipboardText(const wchar_t* text) wcsncpy(target, text, len + 1); ::GlobalUnlock(copy); - // Place the handle on the clipboard. - ::SetClipboardData(CF_UNICODETEXT, target); + ::SetClipboardData(CF_UNICODETEXT, copy); ::CloseClipboard(); #endif } From bf6d2a4459214d5ba2bd1bafe15a5af7e5da6c36 Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Fri, 27 Apr 2012 21:50:33 +0200 Subject: [PATCH 5/5] Always copy terminating NULL when pasting --- .../Sources/Plasma/FeatureLib/pfGameGUIMgr/pfGUIEditBoxMod.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfGameGUIMgr/pfGUIEditBoxMod.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfGameGUIMgr/pfGUIEditBoxMod.cpp index 66b8c3db..10083906 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfGameGUIMgr/pfGUIEditBoxMod.cpp +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfGameGUIMgr/pfGUIEditBoxMod.cpp @@ -517,7 +517,7 @@ hsBool pfGUIEditBoxMod::HandleKeyEvent( pfGameGUIMgr::EventType event, plKeyDef if (len > 0) { wchar_t* insertTarget = fBuffer + fCursorPos; - size_t bufferTailLen = wcslen(insertTarget); + size_t bufferTailLen = wcslen(insertTarget) + 1; //include terminating \0 if (fCursorPos + len + bufferTailLen < fBufferSize) { memmove(insertTarget + len, insertTarget, bufferTailLen * sizeof(wchar_t));