private void HandleReceivedFileDrop(XSelectionEvent evt) { try { int ret = XGetWindowProperty(xConnection.XDisplay, xConnection.XCbWindow, evt.property, 0, 0, false, new IntPtr(0), out IntPtr retType, out int format, out int nItems, out int dataSize, out IntPtr prop_return); XFree(prop_return); XGetWindowProperty(xConnection.XDisplay, xConnection.XCbWindow, evt.property, 0, dataSize, false, new IntPtr(0), out IntPtr returned_type, out format, out nItems, out int remBytes, out prop_return); string rawFileList = Marshal.PtrToStringAuto(prop_return, nItems); ISLogger.Write(rawFileList); string[] list = rawFileList.Split('\n'); string[] sanList = new string[list.Length]; for (int i = 0; i < list.Length; i++) { sanList[i] = list[i].Trim().Replace("file://", ""); } XFree(prop_return); //Now we need to get the data for the listed files... ClipboardVirtualFileData files = ReadFileDrop(sanList); OnClipboardDataChanged(files); }catch (Exception ex) { ISLogger.Write("An error occurred while handling a clipboard file drop: " + ex.Message); } }
private void HandleReceivedImage(XSelectionEvent evt) { try { int ret = XGetWindowProperty(xConnection.XDisplay, xConnection.XCbWindow, evt.property, 0, 0, false, new IntPtr(0), out IntPtr retType, out int format, out int nItems, out int dataSize, out IntPtr prop_return); XFree(prop_return); XGetWindowProperty(xConnection.XDisplay, xConnection.XCbWindow, evt.property, 0, dataSize, false, new IntPtr(0), out IntPtr returned_type, out format, out nItems, out int remBytes, out prop_return); if (returned_type == XInternAtom(xConnection.XDisplay, "INCR", false)) { BeginImageINCRTransfer(evt, returned_type, prop_return); return; } byte[] imgData = new byte[nItems]; Marshal.Copy(prop_return, imgData, 0, nItems); XFree(prop_return); OnClipboardDataChanged(new ClipboardImageData(imgData, true)); } catch (Exception ex) { ISLogger.Write("{0}: failed to handle received image: {1}", ModuleName, ex.Message); } }
private void BeginImageINCRTransfer(XSelectionEvent evt, IntPtr returned_type, IntPtr prop_return) { ISLogger.Write("Begining INCR data transfer with {0} bytes", Marshal.ReadInt32(prop_return)); int size = Marshal.ReadInt32(prop_return); incrBuff = new byte[size]; incrBuffIndex = 0; XDeleteProperty(xConnection.XDisplay, xConnection.XCbWindow, evt.property); ISLogger.Write("Property deleted"); }
private void HandleReceivedTargets(XSelectionEvent evt) { IntPtr owner = evt.requestor; //Get the size in bytes of the return data. XGetWindowProperty(xConnection.XDisplay, owner, atomTargets, 0, 0, false, new IntPtr(0), out _, out _, out _, out int dataSize, out IntPtr _); XGetWindowProperty(xConnection.XDisplay, owner, atomTargets, 0, dataSize, false, new IntPtr(0), out IntPtr retType, out int format, out int numItems, out int remBytes, out IntPtr buff); //Even though XGetWindowProperty shows the return items as 32 bit, atoms are 64 bit on 64 bit systems and we //only support 64 bit if (format == 32) { format = 64; } long[] targets = new long[numItems]; for (int i = 0; i < numItems; i++) { int offset = i * (format / 8); targets[i] = Marshal.ReadInt64(buff, offset); if (IsFormatFileDrop((IntPtr)targets[i])) { RequestSelection((IntPtr)targets[i], owner, atomFileReturn); XFree(buff); return; } //TODO - implement priority if (IsFormatImage((IntPtr)targets[i])) { RequestSelection((IntPtr)targets[i], owner, atomImageReturn); XFree(buff); return; } else if (IsFormatText((IntPtr)targets[i])) { RequestSelection((IntPtr)targets[i], owner, atomTextReturn); XFree(buff); return; } } }
private void HandleSelectionNotify(XSelectionEvent evt) { if (evt.property == atomTargets) { HandleReceivedTargets(evt); } else if (evt.property == atomTextReturn) { HandleReceivedText(atomTextReturn); } else if (evt.property == atomImageReturn) { HandleReceivedImage(evt); } else if (evt.property == atomFileReturn) { HandleReceivedFileDrop(evt); } }