From: Robert Roebling Date: Mon, 15 Mar 2004 22:46:48 +0000 (+0000) Subject: Comitted GTK part of clipboard patch, that X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/c7d6d88330dac6c5c5b4b2ed94ec91b6a46066a1?hp=c19bd0a37acc8a5bf6b53aae81ad211e0a51f442 Comitted GTK part of clipboard patch, that enables non-unicode strings to be seen in Unicode apps. This is relevant since KDE apps paste non-Unicode text. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@26218 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/dataobj.h b/include/wx/dataobj.h index 958db8d706..085487c62f 100644 --- a/include/wx/dataobj.h +++ b/include/wx/dataobj.h @@ -335,21 +335,35 @@ public: // implement base class pure virtuals // ---------------------------------- + +#if wxUSE_UNICODE && defined(__WXGTK20__) + virtual size_t GetFormatCount(Direction WXUNUSED(dir) = Get) const { return 2; } + virtual void GetAllFormats(wxDataFormat *formats, + wxDataObjectBase::Direction WXUNUSED(dir) = Get) const; + + virtual size_t GetDataSize() const { return GetDataSize(GetPreferredFormat()); } + virtual bool GetDataHere(void *buf) const { return GetDataHere(GetPreferredFormat(), buf); } + virtual bool SetData(size_t len, const void *buf) { return SetData(GetPreferredFormat(), len, buf); } + + size_t GetDataSize(const wxDataFormat& format) const; + bool GetDataHere(const wxDataFormat& format, void *pBuf) const; + bool SetData(const wxDataFormat& format, size_t nLen, const void* pBuf); +#else virtual size_t GetDataSize() const; virtual bool GetDataHere(void *buf) const; virtual bool SetData(size_t len, const void *buf); -private: - wxString m_text; - - // virtual function hiding supression size_t GetDataSize(const wxDataFormat& format) const { return(wxDataObjectSimple::GetDataSize(format)); } bool GetDataHere(const wxDataFormat& format, void *pBuf) const { return(wxDataObjectSimple::GetDataHere(format, pBuf)); } bool SetData(const wxDataFormat& format, size_t nLen, const void* pBuf) { return(wxDataObjectSimple::SetData(format, nLen, pBuf)); } +#endif +private: + wxString m_text; + DECLARE_NO_COPY_CLASS(wxTextDataObject) }; diff --git a/src/common/dobjcmn.cpp b/src/common/dobjcmn.cpp index 55c16a3749..c70c712265 100644 --- a/src/common/dobjcmn.cpp +++ b/src/common/dobjcmn.cpp @@ -237,42 +237,74 @@ bool wxDataObjectComposite::SetData(const wxDataFormat& format, // wxTextDataObject // ---------------------------------------------------------------------------- -size_t wxTextDataObject::GetDataSize() const -{ #if defined(__WXGTK20__) && wxUSE_UNICODE - // Use UTF8 not UCS4 - wxCharBuffer buffer = wxConvUTF8.cWX2MB( GetText().c_str() ); - return strlen( (const char*) buffer ) + 1; + +size_t wxTextDataObject::GetDataSize(const wxDataFormat& format) const +{ + if (format == wxDF_UNICODETEXT) + { + // Use UTF8 not UCS4 + wxCharBuffer buffer = wxConvUTF8.cWX2MB( GetText().c_str() ); + return strlen( (const char*) buffer ) + 1; + } + else // == wxDF_TEXT + { + wxCharBuffer buffer = wxConvLibc.cWX2MB( GetText().c_str() ); + return strlen( (const char*) buffer ) + 1; + } +} + +bool wxTextDataObject::GetDataHere(const wxDataFormat& format, void *buf) const +{ + if (format == wxDF_UNICODETEXT) + { + // Use UTF8 not UCS4 + wxCharBuffer buffer = wxConvUTF8.cWX2MB( GetText().c_str() ); + strcpy( (char*) buf, (const char*) buffer ); + } + else + { + wxCharBuffer buffer = wxConvLibc.cWX2MB( GetText().c_str() ); + strcpy( (char*) buf, (const char*) buffer ); + } + + return TRUE; +} + +bool wxTextDataObject::SetData(const wxDataFormat& format, + size_t WXUNUSED(len), const void *buf) +{ + if (format == wxDF_UNICODETEXT) + SetText( wxConvUTF8.cMB2WX( (const char*) buf ) ); + else + SetText( wxConvLibc.cMB2WX( (const char*) buf ) ); + + return TRUE; +} + #else + +size_t wxTextDataObject::GetDataSize() const +{ return GetTextLength() * sizeof(wxChar); -#endif } bool wxTextDataObject::GetDataHere(void *buf) const { -#if defined(__WXGTK20__) && wxUSE_UNICODE - // Use UTF8 not UCS4 - wxCharBuffer buffer = wxConvUTF8.cWX2MB( GetText().c_str() ); - strcpy( (char*) buf, (const char*) buffer ); -#else wxStrcpy((wxChar *)buf, GetText().c_str()); -#endif return TRUE; } bool wxTextDataObject::SetData(size_t WXUNUSED(len), const void *buf) { -#if defined(__WXGTK20__) && wxUSE_UNICODE - // Use UTF8 not UCS4 - SetText( wxConvUTF8.cMB2WX( (const char*) buf ) ); -#else SetText(wxString((const wxChar *)buf)); -#endif return TRUE; } +#endif + // ---------------------------------------------------------------------------- // wxFileDataObjectBase // ---------------------------------------------------------------------------- diff --git a/src/gtk/bmpbuttn.cpp b/src/gtk/bmpbuttn.cpp index 6d463b364b..dda2040146 100644 --- a/src/gtk/bmpbuttn.cpp +++ b/src/gtk/bmpbuttn.cpp @@ -144,10 +144,8 @@ bool wxBitmapButton::Create( wxWindow *parent, m_widget = gtk_button_new(); -#if (GTK_MINOR_VERSION > 0) if (style & wxNO_BORDER) gtk_button_set_relief( GTK_BUTTON(m_widget), GTK_RELIEF_NONE ); -#endif if (m_bmpNormal.Ok()) { diff --git a/src/gtk/clipbrd.cpp b/src/gtk/clipbrd.cpp index 8ba52502f1..6faf83eaad 100644 --- a/src/gtk/clipbrd.cpp +++ b/src/gtk/clipbrd.cpp @@ -40,6 +40,10 @@ GdkAtom g_clipboardAtom = 0; GdkAtom g_targetsAtom = 0; +#if defined(__WXGTK20__) && wxUSE_UNICODE +extern GdkAtom g_altTextAtom; +#endif + // the trace mask we use with wxLogTrace() - call // wxLog::AddTraceMask(TRACE_CLIPBOARD) to enable the trace messages from here // (there will be a *lot* of them!) @@ -169,13 +173,16 @@ selection_received( GtkWidget *WXUNUSED(widget), return; } - /* make sure we got the data in the correct form (selection type). - if so, copy data to target object */ +#if 0 + This seems to cause problems somehow + // make sure we got the data in the correct form (selection type). + // if so, copy data to target object if (selection_data->type != GDK_SELECTION_TYPE_STRING) { clipboard->m_waiting = FALSE; return; } +#endif data_object->SetData( format, (size_t) selection_data->length, (const char*) selection_data->data ); @@ -499,6 +506,15 @@ bool wxClipboard::IsSupported( const wxDataFormat& format ) while (m_waiting) gtk_main_iteration(); +#if defined(__WXGTK20__) && wxUSE_UNICODE + if (!m_formatSupported && format == wxDataFormat(wxDF_UNICODETEXT)) + { + // Another try with plain STRING format + extern GdkAtom g_altTextAtom; + return IsSupported(g_altTextAtom); + } +#endif + if (!m_formatSupported) return FALSE; return TRUE; diff --git a/src/gtk/dataobj.cpp b/src/gtk/dataobj.cpp index 84b89dbef6..aa7455040f 100644 --- a/src/gtk/dataobj.cpp +++ b/src/gtk/dataobj.cpp @@ -28,6 +28,7 @@ //------------------------------------------------------------------------- GdkAtom g_textAtom = 0; +GdkAtom g_altTextAtom = 0; GdkAtom g_pngAtom = 0; GdkAtom g_fileAtom = 0; @@ -77,12 +78,9 @@ void wxDataFormat::SetType( wxDataFormatId type ) { PrepareFormats(); - if (type == wxDF_UNICODETEXT) - type = wxDF_TEXT; - m_type = type; - if (m_type == wxDF_TEXT) + if (m_type == wxDF_TEXT || m_type == wxDF_UNICODETEXT) m_format = g_textAtom; else if (m_type == wxDF_BITMAP) @@ -144,6 +142,7 @@ void wxDataFormat::PrepareFormats() if (!g_textAtom) #if wxUSE_UNICODE g_textAtom = gdk_atom_intern( "UTF8_STRING", FALSE ); + g_altTextAtom = gdk_atom_intern( "STRING", FALSE ); #else g_textAtom = gdk_atom_intern( "STRING" /* "text/plain" */, FALSE ); #endif @@ -192,6 +191,18 @@ bool wxDataObject::IsSupportedFormat(const wxDataFormat& format, Direction dir) } } +// ---------------------------------------------------------------------------- +// wxTextDataObject +// ---------------------------------------------------------------------------- + +#if defined(__WXGTK20__) && wxUSE_UNICODE +void wxTextDataObject::GetAllFormats(wxDataFormat *formats, wxDataObjectBase::Direction dir) const +{ + *formats++ = GetPreferredFormat(); + *formats = g_altTextAtom; +} +#endif + // ---------------------------------------------------------------------------- // wxFileDataObject // ---------------------------------------------------------------------------- diff --git a/src/gtk1/bmpbuttn.cpp b/src/gtk1/bmpbuttn.cpp index 6d463b364b..dda2040146 100644 --- a/src/gtk1/bmpbuttn.cpp +++ b/src/gtk1/bmpbuttn.cpp @@ -144,10 +144,8 @@ bool wxBitmapButton::Create( wxWindow *parent, m_widget = gtk_button_new(); -#if (GTK_MINOR_VERSION > 0) if (style & wxNO_BORDER) gtk_button_set_relief( GTK_BUTTON(m_widget), GTK_RELIEF_NONE ); -#endif if (m_bmpNormal.Ok()) { diff --git a/src/gtk1/clipbrd.cpp b/src/gtk1/clipbrd.cpp index 8ba52502f1..6faf83eaad 100644 --- a/src/gtk1/clipbrd.cpp +++ b/src/gtk1/clipbrd.cpp @@ -40,6 +40,10 @@ GdkAtom g_clipboardAtom = 0; GdkAtom g_targetsAtom = 0; +#if defined(__WXGTK20__) && wxUSE_UNICODE +extern GdkAtom g_altTextAtom; +#endif + // the trace mask we use with wxLogTrace() - call // wxLog::AddTraceMask(TRACE_CLIPBOARD) to enable the trace messages from here // (there will be a *lot* of them!) @@ -169,13 +173,16 @@ selection_received( GtkWidget *WXUNUSED(widget), return; } - /* make sure we got the data in the correct form (selection type). - if so, copy data to target object */ +#if 0 + This seems to cause problems somehow + // make sure we got the data in the correct form (selection type). + // if so, copy data to target object if (selection_data->type != GDK_SELECTION_TYPE_STRING) { clipboard->m_waiting = FALSE; return; } +#endif data_object->SetData( format, (size_t) selection_data->length, (const char*) selection_data->data ); @@ -499,6 +506,15 @@ bool wxClipboard::IsSupported( const wxDataFormat& format ) while (m_waiting) gtk_main_iteration(); +#if defined(__WXGTK20__) && wxUSE_UNICODE + if (!m_formatSupported && format == wxDataFormat(wxDF_UNICODETEXT)) + { + // Another try with plain STRING format + extern GdkAtom g_altTextAtom; + return IsSupported(g_altTextAtom); + } +#endif + if (!m_formatSupported) return FALSE; return TRUE; diff --git a/src/gtk1/dataobj.cpp b/src/gtk1/dataobj.cpp index 84b89dbef6..aa7455040f 100644 --- a/src/gtk1/dataobj.cpp +++ b/src/gtk1/dataobj.cpp @@ -28,6 +28,7 @@ //------------------------------------------------------------------------- GdkAtom g_textAtom = 0; +GdkAtom g_altTextAtom = 0; GdkAtom g_pngAtom = 0; GdkAtom g_fileAtom = 0; @@ -77,12 +78,9 @@ void wxDataFormat::SetType( wxDataFormatId type ) { PrepareFormats(); - if (type == wxDF_UNICODETEXT) - type = wxDF_TEXT; - m_type = type; - if (m_type == wxDF_TEXT) + if (m_type == wxDF_TEXT || m_type == wxDF_UNICODETEXT) m_format = g_textAtom; else if (m_type == wxDF_BITMAP) @@ -144,6 +142,7 @@ void wxDataFormat::PrepareFormats() if (!g_textAtom) #if wxUSE_UNICODE g_textAtom = gdk_atom_intern( "UTF8_STRING", FALSE ); + g_altTextAtom = gdk_atom_intern( "STRING", FALSE ); #else g_textAtom = gdk_atom_intern( "STRING" /* "text/plain" */, FALSE ); #endif @@ -192,6 +191,18 @@ bool wxDataObject::IsSupportedFormat(const wxDataFormat& format, Direction dir) } } +// ---------------------------------------------------------------------------- +// wxTextDataObject +// ---------------------------------------------------------------------------- + +#if defined(__WXGTK20__) && wxUSE_UNICODE +void wxTextDataObject::GetAllFormats(wxDataFormat *formats, wxDataObjectBase::Direction dir) const +{ + *formats++ = GetPreferredFormat(); + *formats = g_altTextAtom; +} +#endif + // ---------------------------------------------------------------------------- // wxFileDataObject // ----------------------------------------------------------------------------