static void from_clipbd(Widget w, XtPointer client_data, XtPointer call_data) { int status; long private_id; char buf[32]; Display *dpy = XtDisplayOfObject(w); Window window = XtWindowOfObject(w); do { status = XmClipboardRetrieve(dpy, window, "STRING", buf, sizeof(buf), NULL, &private_id); } while (status == ClipboardLocked); if (status == ClipboardSuccess) fprintf(stderr, "Retrieved '%s' (private_id %ld) from clipboard.\n", buf, private_id); else fprintf(stderr, "Status was %s\n", (status == XmClipboardFail) ? "XmClipboardFail" : (status == XmClipboardSuccess) ? "XmClipboardSuccess" : (status == XmClipboardTruncate) ? "XmClipboardTruncate" : (status == XmClipboardLocked) ? "XmClipboardLocked" : (status == XmClipboardBadFormat) ? "XmClipboardBadFormat" : (status == XmClipboardNoData) ? "XmClipboardNoData" : "???"); }
static char* motClipboardGetTextAttrib(Ihandle *ih) { unsigned long size; char* str; Window window = motClipboardGetWindow(); (void)ih; if (XmClipboardInquireLength(iupmot_display, window, "STRING", &size)!=ClipboardSuccess) return NULL; str = iupStrGetMemory(size+1); if (XmClipboardRetrieve(iupmot_display, window, "STRING", str, size+1, NULL, NULL)!=ClipboardSuccess) return NULL; return str; }
static char* motClipboardGetNativeImageAttrib(Ihandle *ih) { unsigned long size; void* data; Pixmap pixmap; Window window = motClipboardGetWindow(); (void)ih; if (XmClipboardInquireLength(iupmot_display, window, "PIXMAP", &size)!=ClipboardSuccess) return NULL; data = XtMalloc(size); if (XmClipboardRetrieve(iupmot_display, window, "PIXMAP", data, size, NULL, NULL)!=ClipboardSuccess) return NULL; pixmap = *((Pixmap*)data); XtFree(data); return (char*)pixmap; }
static char* motClipboardGetFormatDataAttrib(Ihandle *ih) { unsigned long size; void* data; Window window = motClipboardGetWindow(); char* format = iupAttribGetStr(ih, "FORMAT"); if (!format) return 0; /* number of bytes of data */ if (XmClipboardInquireLength(iupmot_display, window, format, &size)!=ClipboardSuccess) return NULL; data = iupStrGetMemory(size); if (XmClipboardRetrieve(iupmot_display, window, format, data, size, NULL, NULL)!=ClipboardSuccess) return NULL; iupAttribSetStrf(ih, "FORMATDATASIZE", "%d", size); return data; }
bool wxClipboard::GetData( wxDataObject& data ) { wxCHECK_MSG( m_open, false, "clipboard not open" ); Display* xdisplay = wxGlobalDisplay(); Window xwindow = XtWindow( (Widget)wxTheApp->GetTopLevelRealizedWidget() ); Time timestamp = XtLastTimestampProcessed( xdisplay ); wxDataFormat chosenFormat; int retval; /////////////////////////////////////////////////////////////////////////// // determine if the cliboard holds any format we like /////////////////////////////////////////////////////////////////////////// while( ( retval = XmClipboardStartRetrieve( xdisplay, xwindow, timestamp ) ) == XmClipboardLocked ); if( retval != XmClipboardSuccess ) return false; wxClipboardEndRetrieve endRetrieve( xdisplay, xwindow ); int count; unsigned long max_name_length; size_t dfcount = data.GetFormatCount( wxDataObject::Set ); wxDataFormatScopedArray dfarr(dfcount); data.GetAllFormats( dfarr.get(), wxDataObject::Set ); if( XmClipboardInquireCount( xdisplay, xwindow, &count, &max_name_length ) == XmClipboardSuccess ) { wxCharBuffer buf( max_name_length + 1 ); unsigned long copied; for( int i = 0; i < count; ++i ) { if( XmClipboardInquireFormat( xdisplay, xwindow, i + 1, (XtPointer)buf.data(), max_name_length, &copied ) != XmClipboardSuccess ) continue; buf.data()[copied] = '\0'; // try preferred format if( buf == data.GetPreferredFormat( wxDataObject::Set ).GetId() ) { chosenFormat = data.GetPreferredFormat( wxDataObject::Set ); break; } // try all other formats for( size_t i = 0; i < dfcount; ++i ) { if( buf == dfarr[i].GetId() ) chosenFormat = dfarr[i]; } } } if( chosenFormat == wxDF_INVALID ) return false; /////////////////////////////////////////////////////////////////////////// // now retrieve the data /////////////////////////////////////////////////////////////////////////// unsigned long length, dummy1; long dummy2; wxString id = chosenFormat.GetId(); while( ( retval = XmClipboardInquireLength( xdisplay, xwindow, id.char_str(), &length ) ) == XmClipboardLocked ); if( retval != XmClipboardSuccess ) return false; wxCharBuffer buf(length); while( ( retval = XmClipboardRetrieve( xdisplay, xwindow, id.char_str(), (XtPointer)buf.data(), length, &dummy1, &dummy2 ) ) == XmClipboardLocked ); if( retval != XmClipboardSuccess ) return false; if( !data.SetData( chosenFormat, length, buf.data() ) ) return false; return true; }