// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
#pragma implementation
#pragma implementation "clipbrd.h"
#endif
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __VMS
+#include "wx/vms_x_fix.h"
+#define XtWindow XTWINDOW
+#define XtScreen XTSCREEN
+#define XtParent XTPARENT
+#define XtIsRealized XTISREALIZED
+#define XtDisplay XTDISPLAY
+#endif
+
#include "wx/defs.h"
#if wxUSE_CLIPBOARD
#include "wx/dataobj.h"
#include "wx/ptr_scpd.h"
-#include "wx/listimpl.cpp"
-WX_DEFINE_LIST(wxDataObjectList);
-
#ifdef __VMS__
#pragma message disable nosimpint
+
#endif
#include <Xm/Xm.h>
#include <Xm/CutPaste.h>
// wxClipboard
//-----------------------------------------------------------------------------
+struct wxDataIdToDataObject
+{
+ wxDataIdToDataObject( wxDataObject* o, long d, size_t s )
+ : object( o ), size( s ), dataId( d ) { }
+
+ wxDataObject* object;
+ size_t size;
+ long dataId;
+};
+
+#include "wx/listimpl.cpp"
+
+WX_DEFINE_LIST(wxDataObjectList);
+WX_DEFINE_LIST(wxDataIdToDataObjectList);
+
+extern "C"
+{
+#if wxCHECK_LESSTIF()
+static void wxClipboardCallback( Widget widget, int* data_id,
+ int* priv, int* reason );
+#else // Motif
+static void wxClipboardCallback( Widget widget, long* data_id,
+ long* priv, int* reason );
+#endif // Less/Motif
+}
+
IMPLEMENT_DYNAMIC_CLASS(wxClipboard,wxObject)
wxClipboard::wxClipboard()
void wxClipboard::Clear()
{
- wxDataObjectList::Node* node = m_data.GetFirst();
+ wxDataObjectList::compatibility_iterator node = m_data.GetFirst();
while (node)
{
- wxDataObject* data = node->GetData();
- delete data;
+ delete node->GetData();
node = node->GetNext();
}
m_data.Clear();
+
+ for( wxDataIdToDataObjectList::compatibility_iterator node2 = m_idToObject.GetFirst();
+ node2; node2 = node2->GetNext() )
+ {
+ delete node2->GetData();
+ }
+ m_idToObject.Clear();
}
bool wxClipboard::Open()
wxDECLARE_SCOPED_ARRAY( wxDataFormat, wxDataFormatScopedArray );
wxDEFINE_SCOPED_ARRAY( wxDataFormat, wxDataFormatScopedArray );
+#if wxCHECK_LESSTIF()
+void wxClipboardCallback( Widget xwidget, int* data_id,
+ int* priv, int* reason )
+#else
+void wxClipboardCallback( Widget xwidget, long* data_id,
+ long* priv, int* reason )
+#endif
+{
+ Display* xdisplay = XtDisplay( xwidget );
+ Window xwindow = XtWindow( xwidget );
+ wxDataObject* dobj = NULL;
+ size_t size = 0;
+
+ for( wxDataIdToDataObjectList::compatibility_iterator node2 =
+ wxTheClipboard->m_idToObject.GetFirst();
+ node2; node2 = node2->GetNext() )
+ {
+ wxDataIdToDataObject* dido = node2->GetData();
+ if( dido->dataId == *data_id )
+ {
+ dobj = dido->object;
+ size = dido->size;
+ break;
+ }
+ }
+
+ if( !dobj ) return;
+
+ wxCharBuffer buffer(size);
+ size_t count = dobj->GetFormatCount( wxDataObject::Get );
+ wxDataFormatScopedArray dfarr( new wxDataFormat[count] );
+ dobj->GetAllFormats( dfarr.get(), wxDataObject::Get );
+
+ if( !dobj->GetDataHere( dfarr[*priv], buffer.data() ) )
+ return;
+
+ while( XmClipboardCopyByName( xdisplay, xwindow, *data_id,
+ buffer.data(), size, 0 )
+ == XmClipboardLocked );
+}
+
bool wxClipboard::AddData( wxDataObject *data )
{
wxCHECK_MSG( data, false, "data is invalid" );
m_data.Append( data );
Display* xdisplay = wxGlobalDisplay();
- Window xwindow = XtWindow( (Widget)wxTheApp->GetTopLevelWidget() );
+ Widget xwidget = (Widget)wxTheApp->GetTopLevelRealizedWidget();
+ Window xwindow = XtWindow( xwidget );
wxXmString label( wxTheApp->GetAppName() );
Time timestamp = XtLastTimestampProcessed( xdisplay );
long itemId;
int retval;
while( ( retval = XmClipboardStartCopy( xdisplay, xwindow, label(),
- timestamp, (Widget)NULL,
- (XmCutPasteProc)NULL,
+ timestamp, xwidget,
+ wxClipboardCallback,
&itemId ) )
== XmClipboardLocked );
if( retval != XmClipboardSuccess )
for( size_t i = 0; i < count; ++i )
{
size_t size = data->GetDataSize( dfarr[i] );
- wxCharBuffer buffer(size);
-
- if( !data->GetDataHere( dfarr[i], buffer.data() ) )
- continue;
-
+ long data_id;
wxString id = dfarr[i].GetId();
while( ( retval = XmClipboardCopy( xdisplay, xwindow, itemId,
wxConstCast(id.c_str(), char),
- buffer.data(), size, 0, NULL ) )
+ NULL, size, i, &data_id ) )
== XmClipboardLocked );
+
+ m_idToObject.Append( new wxDataIdToDataObject( data, data_id, size ) );
}
while( XmClipboardEndCopy( xdisplay, xwindow, itemId )
bool wxClipboard::IsSupported(const wxDataFormat& format)
{
Display* xdisplay = wxGlobalDisplay();
- Window xwindow = XtWindow( (Widget)wxTheApp->GetTopLevelWidget() );
+ Window xwindow = XtWindow( (Widget)wxTheApp->GetTopLevelRealizedWidget() );
bool isSupported = false;
int retval, count;
unsigned long max_name_length;
wxCHECK_MSG( m_open, false, "clipboard not open" );
Display* xdisplay = wxGlobalDisplay();
- Window xwindow = XtWindow( (Widget)wxTheApp->GetTopLevelWidget() );
+ Window xwindow = XtWindow( (Widget)wxTheApp->GetTopLevelRealizedWidget() );
Time timestamp = XtLastTimestampProcessed( xdisplay );
wxDataFormat chosenFormat;