Exemple #1
0
        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);
            }
        }
Exemple #2
0
        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);
            }
        }
Exemple #3
0
        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");
        }
Exemple #4
0
        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;
                }
            }
        }
Exemple #5
0
 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);
     }
 }