JBoolean JXExprEditor::EIPGetExternalClipboard ( JString* text ) { text->Clear(); JBoolean gotData = kJFalse; JXSelectionManager* selManager = GetSelectionManager(); JArray<Atom> typeList; if (selManager->GetAvailableTypes(kJXClipboardName, CurrentTime, &typeList)) { JBoolean canGetText = kJFalse; Atom textType = None; const JSize typeCount = typeList.GetElementCount(); for (JIndex i=1; i<=typeCount; i++) { Atom type = typeList.GetElement(i); if (type == XA_STRING || (!canGetText && type == selManager->GetTextXAtom())) { canGetText = kJTrue; textType = type; break; } } Atom returnType; unsigned char* data = NULL; JSize dataLength; JXSelectionManager::DeleteMethod delMethod; if (canGetText && selManager->GetData(kJXClipboardName, CurrentTime, textType, &returnType, &data, &dataLength, &delMethod)) { if (returnType == XA_STRING) { *text = JString(reinterpret_cast<JCharacter*>(data), dataLength); gotData = kJTrue; } selManager->DeleteData(&data, delMethod); } else { (JGetUserNotification())->ReportError( "Unable to paste the current contents of the X Clipboard."); } } else { (JGetUserNotification())->ReportError("The X Clipboard is empty."); } return gotData; }
void ClipboardWidget::Paste() { // Get the window and selection manager for use below. JXWindow* window = GetWindow(); JXSelectionManager* selMgr = GetSelectionManager(); // If the clipboard is not empty, retrieve the available types. JArray<Atom> typeList; if (selMgr->GetAvailableTypes(kJXClipboardName, CurrentTime, &typeList)) { // Loop through the available types to see if the clipboard has // one that we want. const JSize typeCount = typeList.GetElementCount(); for (JIndex i=1; i<=typeCount; i++) { const Atom atom = typeList.GetElement(i); // Check if the i-th type is one we can use. if (atom == XA_STRING || atom == selMgr->GetTextXAtom()) { // Get the data of the appropriate type. unsigned char* data = NULL; JSize dataLength; Atom returnType; JXSelectionManager::DeleteMethod dMethod; if (selMgr->GetData(kJXClipboardName, CurrentTime, atom, &returnType, &data, &dataLength, &dMethod)) { // We can only handle the simplest format. if (returnType == XA_STRING) { // Copy the data into our text. itsText.Set(reinterpret_cast<JCharacter*>(data), dataLength); // Our text changed, so we need to refresh. Refresh(); } // This is required to delete the allocated data. // Forgetting to do this will cause a memory leak! selMgr->DeleteData(&data, dMethod); if (returnType == XA_STRING) { // We succeeded, so we return. return; } } else { (JGetUserNotification())->ReportError( "Unable to retrieve text from the clipboard."); } } } // If we got this far, the data type that we want wasn't on the // clipboard. (JGetUserNotification())->ReportError("Unable to paste from clipboard."); } else { // There isn't anything on the clipboard. (JGetUserNotification())->ReportError("Clipboard is empty."); } }