X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a31a5f85341a2ef131d86a1dee12f3d6c8156118..ef4a634b1b90cb13426b9006d8e18380b9809fdb:/src/mac/carbon/clipbrd.cpp diff --git a/src/mac/carbon/clipbrd.cpp b/src/mac/carbon/clipbrd.cpp index 7854006d09..942a17c6fb 100644 --- a/src/mac/carbon/clipbrd.cpp +++ b/src/mac/carbon/clipbrd.cpp @@ -44,27 +44,29 @@ void *wxGetClipboardData(wxDataFormat dataFormat, long *len) #else OSStatus err = noErr ; #endif - void * data = NULL ; - Size byteCount; + void * data = NULL ; + Size byteCount; switch (dataFormat.GetType()) { - case wxDF_OEMTEXT: - dataFormat = wxDF_TEXT; - // fall through - - case wxDF_TEXT: - break; - case wxDF_BITMAP : - case wxDF_METAFILE : - break ; - default: - { - wxLogError(_("Unsupported clipboard format.")); - return NULL; - } + case wxDF_OEMTEXT: + dataFormat = wxDF_TEXT; + // fall through + + case wxDF_TEXT: + break; + case wxDF_UNICODETEXT: + break; + case wxDF_BITMAP : + case wxDF_METAFILE : + break ; + default: + { + wxLogError(_("Unsupported clipboard format.")); + return NULL; + } } - + #if TARGET_CARBON ScrapRef scrapRef; @@ -77,21 +79,27 @@ void *wxGetClipboardData(wxDataFormat dataFormat, long *len) { if (( err = GetScrapFlavorSize( scrapRef, dataFormat.GetFormatId(), &byteCount )) == noErr) { - if ( dataFormat.GetType() == wxDF_TEXT ) - byteCount++ ; - - data = new char[ byteCount ] ; - if (( err = GetScrapFlavorData( scrapRef, dataFormat.GetFormatId(), &byteCount , data )) == noErr ) - { - *len = byteCount ; + Size allocSize = byteCount ; if ( dataFormat.GetType() == wxDF_TEXT ) - ((char*)data)[byteCount] = 0 ; - } - else - { - delete[] ((char *)data) ; - data = NULL ; - } + allocSize += 1 ; + else if ( dataFormat.GetType() == wxDF_UNICODETEXT ) + allocSize += 2 ; + + data = new char[ allocSize ] ; + + if (( err = GetScrapFlavorData( scrapRef, dataFormat.GetFormatId(), &byteCount , data )) == noErr ) + { + *len = allocSize ; + if ( dataFormat.GetType() == wxDF_TEXT ) + ((char*)data)[byteCount] = 0 ; + if ( dataFormat.GetType() == wxDF_UNICODETEXT ) + ((wxChar*)data)[byteCount/2] = 0 ; + } + else + { + delete[] ((char *)data) ; + data = NULL ; + } } } } @@ -104,29 +112,45 @@ void *wxGetClipboardData(wxDataFormat dataFormat, long *len) HUnlock( datahandle ) ; if ( GetHandleSize( datahandle ) > 0 ) { - byteCount = GetHandleSize( datahandle ) ; - if ( dataFormat.GetType() == wxDF_TEXT ) - data = new char[ byteCount + 1] ; - else - data = new char[ byteCount ] ; - - memcpy( (char*) data , (char*) *datahandle , byteCount ) ; - if ( dataFormat.GetType() == wxDF_TEXT ) - ((char*)data)[byteCount] = 0 ; - *len = byteCount ; + byteCount = GetHandleSize( datahandle ) ; + Size allocSize = byteCount ; + if ( dataFormat.GetType() == wxDF_TEXT ) + allocSize += 1 ; + else if ( dataFormat.GetType() == wxDF_UNICODETEXT ) + allocSize += 2 ; + + data = new char[ allocSize ] ; + + memcpy( (char*) data , (char*) *datahandle , byteCount ) ; + if ( dataFormat.GetType() == wxDF_TEXT ) + ((char*)data)[byteCount] = 0 ; + if ( dataFormat.GetType() == wxDF_UNICODETEXT ) + ((wxChar*)data)[byteCount/2] = 0 ; + *len = byteCount ; } DisposeHandle( datahandle ) ; #endif if ( err ) { wxLogSysError(_("Failed to get clipboard data.")); - + return NULL ; } + if ( dataFormat.GetType() == wxDF_TEXT && wxApp::s_macDefaultEncodingIsPC ) { - wxMacConvertToPC((char*)data,(char*)data,byteCount) ; + wxString st = wxMacMakeStringFromCString( (char*) data ) ; +#if wxUSE_UNICODE + wxCharBuffer buf = st.ToAscii() ; +#else + char* buf = st ; +#endif + char* newdata = new char[strlen(buf)+1] ; + memcpy( newdata , buf , strlen(buf)+1 ) ; + delete[] ((char*) data ) ; + data = newdata ; } + return data; } @@ -139,8 +163,8 @@ IMPLEMENT_DYNAMIC_CLASS(wxClipboard, wxObject) wxClipboard::wxClipboard() { - m_open = false ; - m_data = NULL ; + m_open = false ; + m_data = NULL ; } wxClipboard::~wxClipboard() @@ -234,46 +258,46 @@ bool wxClipboard::AddData( wxDataObject *data ) { wxTextDataObject* textDataObject = (wxTextDataObject*) data; wxString str(textDataObject->GetText()); - wxString mac ; - if ( wxApp::s_macDefaultEncodingIsPC ) - { - mac = wxMacMakeMacStringFromPC(textDataObject->GetText()) ; - } - else - { - mac = textDataObject->GetText() ; - } - err = UMAPutScrap( mac.Length() , 'TEXT' , (void*) mac.c_str() ) ; + wxCharBuffer buf = wxMacStringToCString( str ) ; + err = UMAPutScrap( strlen(buf) , kScrapFlavorTypeText , (void*) buf.data() ) ; } break ; - +#if wxUSE_UNICODE + case wxDF_UNICODETEXT : + { + wxTextDataObject* textDataObject = (wxTextDataObject*) data; + wxString str(textDataObject->GetText()); + err = UMAPutScrap( str.Length() * sizeof(wxChar) , kScrapFlavorTypeUnicode , (void*) str.wc_str() ) ; + } + break ; +#endif #if wxUSE_DRAG_AND_DROP case wxDF_METAFILE: { - wxMetafileDataObject* metaFileDataObject = + wxMetafileDataObject* metaFileDataObject = (wxMetafileDataObject*) data; - wxMetafile metaFile = metaFileDataObject->GetMetafile(); - PicHandle pict = (PicHandle) metaFile.GetHMETAFILE() ; - HLock( (Handle) pict ) ; - err = UMAPutScrap( GetHandleSize( (Handle) pict ) , 'PICT' , *pict ) ; - HUnlock( (Handle) pict ) ; + wxMetafile metaFile = metaFileDataObject->GetMetafile(); + PicHandle pict = (PicHandle) metaFile.GetHMETAFILE() ; + HLock( (Handle) pict ) ; + err = UMAPutScrap( GetHandleSize( (Handle) pict ) , kScrapFlavorTypePicture , *pict ) ; + HUnlock( (Handle) pict ) ; } break ; #endif case wxDF_BITMAP: case wxDF_DIB: { - bool created = false ; - PicHandle pict = NULL ; - - wxBitmapDataObject* bitmapDataObject = (wxBitmapDataObject*) data ; - pict = (PicHandle) bitmapDataObject->GetBitmap().GetPict( &created ) ; - - HLock( (Handle) pict ) ; - err = UMAPutScrap( GetHandleSize( (Handle) pict ) , 'PICT' , *pict ) ; - HUnlock( (Handle) pict ) ; - if ( created ) - KillPicture( pict ) ; + bool created = false ; + PicHandle pict = NULL ; + + wxBitmapDataObject* bitmapDataObject = (wxBitmapDataObject*) data ; + pict = (PicHandle) bitmapDataObject->GetBitmap().GetPict( &created ) ; + + HLock( (Handle) pict ) ; + err = UMAPutScrap( GetHandleSize( (Handle) pict ) , kScrapFlavorTypePicture , *pict ) ; + HUnlock( (Handle) pict ) ; + if ( created ) + KillPicture( pict ) ; } default: break ; @@ -388,7 +412,7 @@ bool wxClipboard::GetData( wxDataObject& data ) transferred = true ; } } - break ; + break ; default : break ;