X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/77ffb5937e89927b621128789401db8921fe580f..59abfcf813ccca7366bfb6d830e1251be5514ac7:/src/mac/carbon/clipbrd.cpp diff --git a/src/mac/carbon/clipbrd.cpp b/src/mac/carbon/clipbrd.cpp index b97e0d2528..20c8f1acec 100644 --- a/src/mac/carbon/clipbrd.cpp +++ b/src/mac/carbon/clipbrd.cpp @@ -6,12 +6,12 @@ // Created: 1998-01-01 // RCS-ID: $Id$ // Copyright: (c) Stefan Csomor -// Licence: wxWidgets licence +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation "clipbrd.h" -#endif +#include "wx/wxprec.h" + +#if wxUSE_CLIPBOARD #include "wx/app.h" #include "wx/frame.h" @@ -60,10 +60,8 @@ void *wxGetClipboardData(wxDataFormat dataFormat, long *len) case wxDF_METAFILE : break ; default: - { - wxLogError(_("Unsupported clipboard format.")); - return NULL; - } + // custom datatype + break ; } #if TARGET_CARBON @@ -92,7 +90,12 @@ void *wxGetClipboardData(wxDataFormat dataFormat, long *len) if ( dataFormat.GetType() == wxDF_TEXT ) ((char*)data)[byteCount] = 0 ; if ( dataFormat.GetType() == wxDF_UNICODETEXT ) - ((wxChar*)data)[byteCount/2] = 0 ; + { + // "data" format is UTF16, so 2 bytes = one character + // wxChar size depends on platform, so just clear last 2 bytes + ((char*)data)[byteCount] = 0; + ((char*)data)[byteCount+1] = 0; + } } else { @@ -188,12 +191,12 @@ void wxClipboard::Clear() bool wxClipboard::Flush() { - return FALSE; + return false; } bool wxClipboard::Open() { - wxCHECK_MSG( !m_open, FALSE, wxT("clipboard already open") ); + wxCHECK_MSG( !m_open, false, wxT("clipboard already open") ); m_open = true ; return true ; } @@ -205,9 +208,9 @@ bool wxClipboard::IsOpened() const bool wxClipboard::SetData( wxDataObject *data ) { - wxCHECK_MSG( m_open, FALSE, wxT("clipboard not open") ); + wxCHECK_MSG( m_open, false, wxT("clipboard not open") ); - wxCHECK_MSG( data, FALSE, wxT("data is invalid") ); + wxCHECK_MSG( data, false, wxT("data is invalid") ); Clear(); // as we can only store one wxDataObject, this is the same in this @@ -217,16 +220,16 @@ bool wxClipboard::SetData( wxDataObject *data ) bool wxClipboard::AddData( wxDataObject *data ) { - wxCHECK_MSG( m_open, FALSE, wxT("clipboard not open") ); + wxCHECK_MSG( m_open, false, wxT("clipboard not open") ); - wxCHECK_MSG( data, FALSE, wxT("data is invalid") ); + wxCHECK_MSG( data, false, wxT("data is invalid") ); - /* we can only store one wxDataObject */ + // we can only store one wxDataObject Clear(); m_data = data; - /* get formats from wxDataObjects */ + // get formats from wxDataObjects wxDataFormat *array = new wxDataFormat[ m_data->GetFormatCount() ]; m_data->GetAllFormats( array ); @@ -239,7 +242,9 @@ bool wxClipboard::AddData( wxDataObject *data ) size_t sz = data->GetDataSize( array[i] ) ; void* buf = malloc( sz + 1 ) ; if ( buf ) - { + { + // empty the buffer because in some case GetDataHere does not fill buf + memset(buf, 0, sz+1); data->GetDataHere( array[i] , buf ) ; OSType mactype = 0 ; switch ( array[i].GetType() ) @@ -247,10 +252,12 @@ bool wxClipboard::AddData( wxDataObject *data ) case wxDF_TEXT: case wxDF_OEMTEXT: mactype = kScrapFlavorTypeText ; + sz -= 1; break ; #if wxUSE_UNICODE case wxDF_UNICODETEXT : mactype = kScrapFlavorTypeUnicode ; + sz -= 2; break ; #endif #if wxUSE_DRAG_AND_DROP @@ -263,6 +270,7 @@ bool wxClipboard::AddData( wxDataObject *data ) mactype = kScrapFlavorTypePicture ; break ; default: + mactype = (OSType)(array[i].GetFormatId()); break ; } UMAPutScrap( sz , mactype , buf ) ; @@ -280,23 +288,22 @@ void wxClipboard::Close() wxCHECK_RET( m_open, wxT("clipboard not open") ); m_open = false ; - - // Get rid of cached object. If this is not done copying from another application will - // only work once + + // Get rid of cached object. If this is not done copying from another application will + // only work once if (m_data) { delete m_data; m_data = (wxDataObject*) NULL; - } - + } } bool wxClipboard::IsSupported( const wxDataFormat &dataFormat ) { - if ( m_data ) - { - return m_data->IsSupported( dataFormat ) ; - } + if ( m_data ) + { + return m_data->IsSupported( dataFormat ) ; + } #if TARGET_CARBON OSStatus err = noErr; ScrapRef scrapRef; @@ -311,11 +318,11 @@ bool wxClipboard::IsSupported( const wxDataFormat &dataFormat ) { if (( err = GetScrapFlavorSize( scrapRef, dataFormat.GetFormatId(), &byteCount )) == noErr) { - return TRUE ; + return true ; } } } - return FALSE; + return false; #else long offset ; @@ -331,7 +338,7 @@ bool wxClipboard::IsSupported( const wxDataFormat &dataFormat ) bool wxClipboard::GetData( wxDataObject& data ) { - wxCHECK_MSG( m_open, FALSE, wxT("clipboard not open") ); + wxCHECK_MSG( m_open, false, wxT("clipboard not open") ); size_t formatcount = data.GetFormatCount() + 1 ; wxDataFormat *array = new wxDataFormat[ formatcount ]; @@ -342,60 +349,63 @@ bool wxClipboard::GetData( wxDataObject& data ) if ( m_data ) { - for (size_t i = 0; !transferred && i < formatcount ; i++) - { - wxDataFormat format = array[i] ; - if ( m_data->IsSupported( format ) ) - { - int size = m_data->GetDataSize( format ); - transferred = true ; - - if (size == 0) - { - data.SetData(format , 0 , 0 ) ; - } - else + for (size_t i = 0; !transferred && i < formatcount ; i++) + { + wxDataFormat format = array[i] ; + if ( m_data->IsSupported( format ) ) { - char *d = new char[size]; - m_data->GetDataHere( format , (void*) d ); - data.SetData( format , size , d ) ; - delete[] d ; + int size = m_data->GetDataSize( format ); + transferred = true ; + + if (size == 0) + { + data.SetData(format , 0 , 0 ) ; + } + else + { + char *d = new char[size]; + m_data->GetDataHere( format , (void*) d ); + data.SetData( format , size , d ) ; + delete[] d ; + } } - } - } + } } - /* get formats from wxDataObjects */ + + // get formats from wxDataObjects if ( !transferred ) { - for (size_t i = 0; !transferred && i < formatcount ; i++) - { - wxDataFormat format = array[i] ; - - switch ( format.GetType() ) - { - case wxDF_TEXT : - case wxDF_OEMTEXT : - case wxDF_BITMAP : - case wxDF_METAFILE : - { - long len ; - char* s = (char*)wxGetClipboardData(format, &len ); - if ( s ) - { - data.SetData( format , len , s ) ; - delete [] s; - - transferred = true ; - } - } - break ; - - default : + for (size_t i = 0; !transferred && i < formatcount ; i++) + { + wxDataFormat format = array[i] ; + + switch ( format.GetType() ) + { + // NOTE: this is usable for all data types + case wxDF_TEXT : + case wxDF_UNICODETEXT: + case wxDF_OEMTEXT : + case wxDF_BITMAP : + case wxDF_METAFILE : + default : + { + long len ; + char* s = (char*)wxGetClipboardData(format, &len ); + if ( s ) + { + data.SetData( format , len , s ) ; + delete [] s; + + transferred = true ; + } + } break ; - } - } + } + } } delete[] array ; return transferred ; } + +#endif