12
12
#include " StdInc.h"
13
13
#include " GuiCleanup.h"
14
14
#include " CEGUIExceptions.h"
15
+ #include < SharedUtil.Misc.h>
15
16
16
17
using std::list;
17
18
@@ -813,24 +814,22 @@ bool CGUI_Impl::Event_KeyDown(const CEGUI::EventArgs& Args)
813
814
// If we got something to copy
814
815
if (strTemp.length () > 0 )
815
816
{
816
- // Convert it to Unicode
817
- std::wstring strUTF = MbUTF8ToUTF16 (strTemp.c_str ());
818
-
819
- // Open and empty the clipboard
820
- OpenClipboard (NULL );
821
- EmptyClipboard ();
822
-
823
- // Allocate the clipboard buffer and copy the data
824
- HGLOBAL hBuf = GlobalAlloc (GMEM_DDESHARE, strUTF.length () * sizeof (wchar_t ) + sizeof (wchar_t ));
825
- wchar_t * buf = reinterpret_cast <wchar_t *>(GlobalLock (hBuf));
826
- wcscpy (buf, strUTF.c_str ());
827
- GlobalUnlock (hBuf);
828
-
829
- // Copy the data into the clipboard
830
- SetClipboardData (CF_UNICODETEXT, hBuf);
817
+ SString clipboardText;
818
+ try
819
+ {
820
+ clipboardText = UTF16ToMbUTF8 (MbUTF8ToUTF16 (strTemp.c_str ()));
821
+ }
822
+ catch (const std::exception&)
823
+ {
824
+ clipboardText.clear ();
825
+ }
826
+ catch (...)
827
+ {
828
+ clipboardText.clear ();
829
+ }
831
830
832
- // Close the clipboard
833
- CloseClipboard ( );
831
+ if (!clipboardText. empty ())
832
+ SharedUtil::SetClipboardText (clipboardText );
834
833
}
835
834
}
836
835
@@ -845,158 +844,150 @@ bool CGUI_Impl::Event_KeyDown(const CEGUI::EventArgs& Args)
845
844
CEGUI::Window* Wnd = reinterpret_cast <CEGUI::Window*>(KeyboardArgs.window );
846
845
if (Wnd->getType () == " CGUI/Editbox" || Wnd->getType () == " CGUI/MultiLineEditbox" )
847
846
{
848
- // Open the clipboard
849
- OpenClipboard (NULL );
847
+ SString clipboardUtf8 = SharedUtil::GetClipboardText ();
848
+ std::wstring strClipboardText;
849
+ try
850
+ {
851
+ strClipboardText = MbUTF8ToUTF16 (clipboardUtf8);
852
+ }
853
+ catch (const std::exception&)
854
+ {
855
+ strClipboardText.clear ();
856
+ }
857
+ catch (...)
858
+ {
859
+ strClipboardText.clear ();
860
+ }
850
861
851
- // Get the clipboard's data and lock it
852
- HANDLE hClipData = GetClipboardData (CF_UNICODETEXT);
853
- const wchar_t * ClipboardBuffer = nullptr ;
854
- if (hClipData)
855
- ClipboardBuffer = static_cast <const wchar_t *>(GlobalLock (hClipData));
862
+ if (clipboardUtf8.empty () && strClipboardText.empty ())
863
+ break ;
856
864
857
- // Check to make sure we have valid data.
858
- if (ClipboardBuffer)
859
- {
860
- size_t iSelectionStart, iSelectionLength, iMaxLength, iCaratIndex;
861
- CEGUI::String strEditText;
862
- bool bReplaceNewLines = true ;
863
- bool bIsBoxFull = false ;
865
+ size_t iSelectionStart, iSelectionLength, iMaxLength, iCaratIndex;
866
+ CEGUI::String strEditText;
867
+ bool bReplaceNewLines = true ;
868
+ bool bIsBoxFull = false ;
864
869
865
- if (Wnd->getType () == " CGUI/Editbox" )
870
+ if (Wnd->getType () == " CGUI/Editbox" )
871
+ {
872
+ // Turn our event window into an editbox
873
+ CEGUI::Editbox* WndEdit = reinterpret_cast <CEGUI::Editbox*>(Wnd);
874
+ // Don't paste if we're read only
875
+ if (WndEdit->isReadOnly ())
866
876
{
867
- // Turn our event window into an editbox
868
- CEGUI::Editbox* WndEdit = reinterpret_cast <CEGUI::Editbox*>(Wnd);
869
- // Don't paste if we're read only
870
- if (WndEdit->isReadOnly ())
871
- {
872
- if (hClipData)
873
- GlobalUnlock (hClipData);
874
- CloseClipboard ();
875
- return true ;
876
- }
877
- strEditText = WndEdit->getText ();
878
- iSelectionStart = WndEdit->getSelectionStartIndex ();
879
- iSelectionLength = WndEdit->getSelectionLength ();
880
- iMaxLength = WndEdit->getMaxTextLength ();
881
- iCaratIndex = WndEdit->getCaratIndex ();
877
+ return true ;
882
878
}
883
- else
879
+ strEditText = WndEdit->getText ();
880
+ iSelectionStart = WndEdit->getSelectionStartIndex ();
881
+ iSelectionLength = WndEdit->getSelectionLength ();
882
+ iMaxLength = WndEdit->getMaxTextLength ();
883
+ iCaratIndex = WndEdit->getCaratIndex ();
884
+ }
885
+ else
886
+ {
887
+ CEGUI::MultiLineEditbox* WndEdit = reinterpret_cast <CEGUI::MultiLineEditbox*>(Wnd);
888
+ // Don't paste if we're read only
889
+ if (WndEdit->isReadOnly ())
884
890
{
885
- CEGUI::MultiLineEditbox* WndEdit = reinterpret_cast <CEGUI::MultiLineEditbox*>(Wnd);
886
- // Don't paste if we're read only
887
- if (WndEdit->isReadOnly ())
888
- {
889
- if (hClipData)
890
- GlobalUnlock (hClipData);
891
- CloseClipboard ();
892
- return true ;
893
- }
894
-
895
- strEditText = WndEdit->getText ();
896
- iSelectionStart = WndEdit->getSelectionStartIndex ();
897
- iSelectionLength = WndEdit->getSelectionLength ();
898
- iMaxLength = WndEdit->getMaxTextLength ();
899
- iCaratIndex = WndEdit->getCaratIndex ();
900
- bReplaceNewLines = false ;
901
-
902
- // Plus one character, because there is always an extra '\n' in
903
- // MultiLineEditbox's text data and it causes MaxLength limit to
904
- // be exceeded during pasting the text
905
- iMaxLength += 1 ;
891
+ return true ;
906
892
}
907
893
908
- std::wstring strClipboardText = ClipboardBuffer;
909
- size_t iNewlineIndex;
894
+ strEditText = WndEdit->getText ();
895
+ iSelectionStart = WndEdit->getSelectionStartIndex ();
896
+ iSelectionLength = WndEdit->getSelectionLength ();
897
+ iMaxLength = WndEdit->getMaxTextLength ();
898
+ iCaratIndex = WndEdit->getCaratIndex ();
899
+ bReplaceNewLines = false ;
900
+
901
+ // Plus one character, because there is always an extra '\n' in
902
+ // MultiLineEditbox's text data and it causes MaxLength limit to
903
+ // be exceeded during pasting the text
904
+ iMaxLength += 1 ;
905
+ }
906
+
907
+ size_t iNewlineIndex;
910
908
911
- // Remove the newlines inserting spaces instead
912
- if (bReplaceNewLines)
909
+ // Remove the newlines inserting spaces instead
910
+ if (bReplaceNewLines)
911
+ {
912
+ do
913
913
{
914
- do
914
+ iNewlineIndex = strClipboardText.find (' \n ' );
915
+ if (iNewlineIndex != SString::npos)
915
916
{
916
- iNewlineIndex = strClipboardText.find (' \n ' );
917
- if (iNewlineIndex != SString::npos)
917
+ if (iNewlineIndex > 0 && strClipboardText[iNewlineIndex - 1 ] == ' \r ' )
918
918
{
919
- if (iNewlineIndex > 0 && strClipboardText[iNewlineIndex - 1 ] == ' \r ' )
920
- {
921
- // \r\n
922
- strClipboardText[iNewlineIndex - 1 ] = ' ' ;
923
- strClipboardText.replace (iNewlineIndex, strClipboardText.length () - iNewlineIndex, strClipboardText.c_str (),
924
- iNewlineIndex + 1 , strClipboardText.length () - iNewlineIndex - 1 );
925
- }
926
- else
927
- {
928
- strClipboardText[iNewlineIndex] = ' ' ;
929
- }
919
+ // \r\n
920
+ strClipboardText[iNewlineIndex - 1 ] = ' ' ;
921
+ strClipboardText.replace (iNewlineIndex, strClipboardText.length () - iNewlineIndex, strClipboardText.c_str (),
922
+ iNewlineIndex + 1 , strClipboardText.length () - iNewlineIndex - 1 );
930
923
}
931
- } while (iNewlineIndex != SString::npos);
932
- }
924
+ else
925
+ {
926
+ strClipboardText[iNewlineIndex] = ' ' ;
927
+ }
928
+ }
929
+ } while (iNewlineIndex != SString::npos);
930
+ }
933
931
934
- // Put the editbox's data into a string and insert the data if it has not reached it's maximum text length
935
- std::wstring tmp = MbUTF8ToUTF16 (strEditText.c_str ());
936
- if ((strClipboardText.length () + tmp.length () - iSelectionLength) <= iMaxLength)
932
+ // Put the editbox's data into a string and insert the data if it has not reached it's maximum text length
933
+ std::wstring tmp = MbUTF8ToUTF16 (strEditText.c_str ());
934
+ if ((strClipboardText.length () + tmp.length () - iSelectionLength) <= iMaxLength)
935
+ {
936
+ // Are there characters selected?
937
+ size_t sizeCaratIndex = 0 ;
938
+ if (iSelectionLength > 0 )
937
939
{
938
- // Are there characters selected?
939
- size_t sizeCaratIndex = 0 ;
940
- if (iSelectionLength > 0 )
941
- {
942
- // Replace what's selected with the pasted buffer and set the new carat index
943
- tmp.replace (iSelectionStart, iSelectionLength, strClipboardText.c_str (), strClipboardText.length ());
944
- sizeCaratIndex = iSelectionStart + strClipboardText.length ();
945
- }
946
- else
947
- {
948
- // If not, insert the clipboard buffer where we were and set the new carat index
949
- tmp.insert (iSelectionStart, strClipboardText.c_str (), strClipboardText.length ());
950
- sizeCaratIndex = iCaratIndex + strClipboardText.length ();
951
- }
940
+ // Replace what's selected with the pasted buffer and set the new carat index
941
+ tmp.replace (iSelectionStart, iSelectionLength, strClipboardText.c_str (), strClipboardText.length ());
942
+ sizeCaratIndex = iSelectionStart + strClipboardText.length ();
943
+ }
944
+ else
945
+ {
946
+ // If not, insert the clipboard buffer where we were and set the new carat index
947
+ tmp.insert (iSelectionStart, strClipboardText.c_str (), strClipboardText.length ());
948
+ sizeCaratIndex = iCaratIndex + strClipboardText.length ();
949
+ }
952
950
953
- // Set the new text and move the carat at the end of what we pasted
954
- CEGUI::String strText ((CEGUI::utf8*)UTF16ToMbUTF8 (tmp).c_str ());
955
- strEditText = strText;
956
- iCaratIndex = sizeCaratIndex;
951
+ // Set the new text and move the carat at the end of what we pasted
952
+ CEGUI::String strText ((CEGUI::utf8*)UTF16ToMbUTF8 (tmp).c_str ());
953
+ strEditText = strText;
954
+ iCaratIndex = sizeCaratIndex;
955
+ }
956
+ else
957
+ {
958
+ bIsBoxFull = true ;
959
+ }
960
+ if (bIsBoxFull)
961
+ {
962
+ // Fire an event if the editbox is full
963
+ if (Wnd->getType () == " CGUI/Editbox" )
964
+ {
965
+ CEGUI::Editbox* WndEdit = reinterpret_cast <CEGUI::Editbox*>(Wnd);
966
+ CEGUI::WindowEventArgs args (WndEdit);
967
+ WndEdit->fireEvent (CEGUI::Editbox::EventEditboxFull, args);
957
968
}
958
969
else
959
970
{
960
- bIsBoxFull = true ;
971
+ CEGUI::MultiLineEditbox* WndEdit = reinterpret_cast <CEGUI::MultiLineEditbox*>(Wnd);
972
+ CEGUI::WindowEventArgs args (WndEdit);
973
+ WndEdit->fireEvent (CEGUI::Editbox::EventEditboxFull, args);
961
974
}
962
- if (bIsBoxFull)
975
+ }
976
+ else
977
+ {
978
+ if (Wnd->getType () == " CGUI/Editbox" )
963
979
{
964
- // Fire an event if the editbox is full
965
- if (Wnd->getType () == " CGUI/Editbox" )
966
- {
967
- CEGUI::Editbox* WndEdit = reinterpret_cast <CEGUI::Editbox*>(Wnd);
968
- CEGUI::WindowEventArgs args (WndEdit);
969
- WndEdit->fireEvent (CEGUI::Editbox::EventEditboxFull, args);
970
- }
971
- else
972
- {
973
- CEGUI::MultiLineEditbox* WndEdit = reinterpret_cast <CEGUI::MultiLineEditbox*>(Wnd);
974
- CEGUI::WindowEventArgs args (WndEdit);
975
- WndEdit->fireEvent (CEGUI::Editbox::EventEditboxFull, args);
976
- }
980
+ CEGUI::Editbox* WndEdit = reinterpret_cast <CEGUI::Editbox*>(Wnd);
981
+ WndEdit->setText (strEditText);
982
+ WndEdit->setCaratIndex (iCaratIndex);
977
983
}
978
984
else
979
985
{
980
- if (Wnd->getType () == " CGUI/Editbox" )
981
- {
982
- CEGUI::Editbox* WndEdit = reinterpret_cast <CEGUI::Editbox*>(Wnd);
983
- WndEdit->setText (strEditText);
984
- WndEdit->setCaratIndex (iCaratIndex);
985
- }
986
- else
987
- {
988
- CEGUI::MultiLineEditbox* WndEdit = reinterpret_cast <CEGUI::MultiLineEditbox*>(Wnd);
989
- WndEdit->setText (strEditText);
990
- WndEdit->setCaratIndex (iCaratIndex);
991
- }
986
+ CEGUI::MultiLineEditbox* WndEdit = reinterpret_cast <CEGUI::MultiLineEditbox*>(Wnd);
987
+ WndEdit->setText (strEditText);
988
+ WndEdit->setCaratIndex (iCaratIndex);
992
989
}
993
990
}
994
-
995
- if (hClipData)
996
- GlobalUnlock (hClipData);
997
-
998
- // Close the clipboard
999
- CloseClipboard ();
1000
991
}
1001
992
}
1002
993
0 commit comments