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); }
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); } } }
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); } }
public void Dispose() { clipboard.Stop(); graphics.Dispose(); LibX11.XCloseDisplay(display); }