示例#1
0
        private void Run()
        {
            bool stopped = false;

            while (!stopped)
            {
                LibX11.XNextEvent(display, out XEvent evt);
                // todo: log and handle exceptions
                if (evt.type == XEventType.SelectionClear)
                {
                    HandleSelectionClear(evt.SelectionClearEvent);
                }
                else if (evt.type == XEventType.SelectionRequest)
                {
                    HandleSelectionRequest(evt.SelectionRequestEvent);
                }
                else if (evt.type == XEventType.SelectionNotify)
                {
                    HandleSelectionNotify(evt.SelectionEvent);
                }
                else if (evt.type == XEventType.ClientMessage)
                {
                    if (evt.ClientMessageEvent.message_type == XA_NWINDOWS_CLIPBOARD_STOP)
                    {
                        stopped = true;
                    }
                }
            }

            LibX11.XCloseDisplay(display);
        }
示例#2
0
        public static X11Clipboard Create()
        {
            IntPtr display  = IntPtr.Zero;
            ulong  windowId = 0;

            try
            {
                display = LibX11.XOpenDisplay(null);
                if (display == IntPtr.Zero)
                {
                    throw new InvalidOperationException("Cannot open display.");
                }

                ulong  rootWindow    = LibX11.XDefaultRootWindow(display);
                int    defaultScreen = LibX11.XDefaultScreen(display);
                IntPtr defaultVisual = LibX11.XDefaultVisual(display, defaultScreen);

                XSetWindowAttributes attr = new XSetWindowAttributes();
                windowId = LibX11.XCreateWindow
                           (
                    display,
                    rootWindow,
                    0, 0,
                    10, 10,
                    0,
                    0,
                    WindowClass.InputOnly,
                    defaultVisual,
                    0,
                    ref attr
                           );

                LibX11.XFlush(display);

                X11Clipboard clipboard = new X11Clipboard(display, windowId);
                clipboard.Start();
                windowId = 0;
                display  = IntPtr.Zero;
                return(clipboard);
            }
            finally
            {
                if (windowId != 0)
                {
                    LibX11.XDestroyWindow(display, windowId);
                    LibX11.XFlush(display);
                }

                if (display != IntPtr.Zero)
                {
                    LibX11.XCloseDisplay(display);
                }
            }
        }
示例#3
0
        public static bool IsAvailable()
        {
            try
            {
                LibX11.XInitThreads();
                IntPtr display = LibX11.XOpenDisplay(null);
                if (display == IntPtr.Zero)
                {
                    return(false);
                }

                LibX11.XCloseDisplay(display);
                return(true);
            }
            catch (DllNotFoundException)
            {
                return(false);
            }
            catch (EntryPointNotFoundException)
            {
                return(false);
            }
        }
示例#4
0
 public void Dispose()
 {
     clipboard.Stop();
     graphics.Dispose();
     LibX11.XCloseDisplay(display);
 }