1 // Permission is hereby granted, free of charge, to any person obtaining
2 // a copy of this software and associated documentation files (the
3 // "Software"), to deal in the Software without restriction, including
4 // without limitation the rights to use, copy, modify, merge, publish,
5 // distribute, sublicense, and/or sell copies of the Software, and to
6 // permit persons to whom the Software is furnished to do so, subject to
7 // the following conditions:
9 // The above copyright notice and this permission notice shall be
10 // included in all copies or substantial portions of the Software.
12 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
13 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
14 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
15 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
16 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
17 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
18 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20 // Copyright (c) 2004 Novell, Inc.
23 // Peter Bartok pbartok@novell.com
30 using System.Threading;
32 using System.ComponentModel;
33 using System.Collections;
34 using System.Diagnostics;
35 using System.Runtime.InteropServices;
37 using System.Net.Sockets;
39 // Only do the poll when building with mono for now
45 namespace System.Windows.Forms {
46 internal class XplatUIX11 : XplatUIDriver {
47 #region Structure Definitions
48 internal struct Caret {
49 internal Timer timer; // Blink interval
50 internal IntPtr hwnd; // Window owning the caret
51 internal int x; // X position of the caret
52 internal int y; // Y position of the caret
53 internal int width; // Width of the caret; if no image used
54 internal int height; // Height of the caret, if no image used
55 internal int visible; // Counter for visible/hidden
56 internal bool on; // Caret blink display state: On/Off
57 internal IntPtr gc; // Graphics context
58 internal bool paused; // Don't update right now
61 internal struct Hover {
62 internal Timer timer; // for hovering
63 internal IntPtr hwnd; // Last window we entered; used to generate WM_MOUSEHOVER
64 internal int x; // Last MouseMove X coordinate; used to generate WM_MOUSEHOVER
65 internal int y; // Last MouseMove Y coordinate; used to generate WM_MOUSEHOVER
66 internal int interval; // in milliseconds, how long to hold before hover is generated
67 internal int hevent; // X Atom
69 #endregion // Structure Definitions
71 #region Local Variables
72 private static XplatUIX11 instance;
73 private static int ref_count;
74 private static bool themes_enabled;
76 private static IntPtr DisplayHandle; // X11 handle to display
77 private static int screen_num; // Screen number used
78 private static IntPtr root_window; // Handle of the root window for the screen/display
79 private static IntPtr FosterParent; // Container to hold child windows until their parent exists
80 private static int wm_protocols; // X Atom
81 private static int wm_delete_window; // X Atom
82 private static int mwm_hints; // X Atom
83 private static int wm_no_taskbar; // X Atom
84 private static int wm_state_above; // X Atom
85 private static int atom; // X Atom
86 private static int net_wm_state; // X Atom
87 private static int async_method;
89 private static int post_message;
91 private static uint default_colormap; // X Colormap ID
92 internal static Keys key_state;
93 internal static MouseButtons mouse_state;
94 internal static Point mouse_position;
95 internal static bool grab_confined; // Is the current grab (if any) confined to grab_area?
96 internal static IntPtr grab_hwnd; // The window that is grabbed
97 internal static Rectangle grab_area; // The area the current grab is confined to
98 internal static IntPtr click_pending_hwnd; //
99 internal static Msg click_pending_message; //
100 internal static IntPtr click_pending_lparam; //
101 internal static IntPtr click_pending_wparam; //
102 internal static int click_pending_time; // Last time we received a mouse click
103 internal static bool click_pending; // True if we haven't sent the last mouse click
104 internal static int double_click_interval; // in milliseconds, how fast one has to click for a double click
105 internal static Hover hover;
107 internal static Caret caret; // To display a blinking caret
109 private static Hashtable handle_data;
110 private static XEventQueue message_queue;
112 private X11Keyboard keyboard;
113 private ArrayList timer_list;
114 private Thread timer_thread;
115 private AutoResetEvent timer_wait;
116 private Socket listen;
120 private Pollfd [] pollfds;
123 private object xlib_lock = new object ();
125 private static readonly EventMask SelectInputMask = EventMask.ButtonPressMask |
126 EventMask.ButtonReleaseMask |
127 EventMask.KeyPressMask |
128 EventMask.KeyReleaseMask |
129 EventMask.EnterWindowMask |
130 EventMask.LeaveWindowMask |
131 EventMask.ExposureMask |
132 EventMask.PointerMotionMask |
133 EventMask.VisibilityChangeMask |
134 EventMask.StructureNotifyMask;
136 #endregion // Local Variables
139 internal override Keys ModifierKeys {
141 return keyboard.ModifierKeys;
145 internal override MouseButtons MouseButtons {
151 internal override Point MousePosition {
153 return mouse_position;
157 internal override bool DropTarget {
164 throw new NotImplementedException("Need to figure out D'n'D for X11");
169 internal override int KeyboardSpeed {
172 // A lot harder: need to do:
173 // XkbQueryExtension(0x08051008, 0xbfffdf4c, 0xbfffdf50, 0xbfffdf54, 0xbfffdf58) = 1
174 // XkbAllocKeyboard(0x08051008, 0xbfffdf4c, 0xbfffdf50, 0xbfffdf54, 0xbfffdf58) = 0x080517a8
175 // XkbGetControls(0x08051008, 1, 0x080517a8, 0xbfffdf54, 0xbfffdf58) = 0
177 // And from that we can tell the repetition rate
179 // Notice, the values must map to:
180 // [0, 31] which maps to 2.5 to 30 repetitions per second.
186 internal override int KeyboardDelay {
189 // Return values must range from 0 to 4, 0 meaning 250ms,
190 // and 4 meaning 1000 ms.
192 return 1; // ie, 500 ms
195 #endregion // Properties
197 #region Constructor & Destructor
198 // This is always called from a locked context
199 private XplatUIX11() {
200 // Handle singleton stuff first
203 message_queue = new XEventQueue ();
204 timer_list = new ArrayList ();
206 // Now regular initialization
207 SetDisplay(XOpenDisplay(IntPtr.Zero));
209 keyboard = new X11Keyboard (DisplayHandle);
211 listen = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
212 IPEndPoint ep = new IPEndPoint (IPAddress.Loopback, 0);
216 wake = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
217 wake.Connect (listen.LocalEndPoint);
219 double_click_interval = 500;
220 hover.interval = 500;
222 hover.timer = new Timer();
223 hover.timer.Enabled = false;
224 hover.timer.Interval = hover.interval; // FIXME - read this from somewhere
225 hover.timer.Tick +=new EventHandler(MouseHover);
230 pollfds = new Pollfd [2];
231 pollfds [0] = new Pollfd ();
232 pollfds [0].fd = XConnectionNumber (DisplayHandle);
233 pollfds [0].events = PollEvents.POLLIN;
235 pollfds [1] = new Pollfd ();
236 pollfds [1].fd = wake.Handle.ToInt32 ();
237 pollfds [1].events = PollEvents.POLLIN;
240 caret.timer = new Timer();
241 caret.timer.Interval = 500; // FIXME - where should this number come from?
242 caret.timer.Tick += new EventHandler(CaretCallback);
247 if (DisplayHandle!=IntPtr.Zero) {
248 XCloseDisplay(DisplayHandle);
249 DisplayHandle=IntPtr.Zero;
253 #endregion // Constructor & Destructor
255 #region Singleton Specific Code
256 public static XplatUIX11 GetInstance() {
257 lock (typeof (XplatUIX11)) {
258 if (instance==null) {
259 instance=new XplatUIX11();
266 public int Reference {
275 internal override event EventHandler Idle;
280 private void MouseHover(object sender, EventArgs e) {
\r
281 if ((hover.x == mouse_position.X) && (hover.y == mouse_position.Y)) {
\r
284 hover.timer.Enabled = false;
\r
286 if (hover.hwnd != IntPtr.Zero) {
\r
287 xevent = new XEvent ();
288 xevent.type = XEventName.ClientMessage;
289 xevent.ClientMessageEvent.display = DisplayHandle;
290 xevent.ClientMessageEvent.window = (IntPtr)hover.hwnd;
291 xevent.ClientMessageEvent.message_type = (IntPtr)hover.hevent;
292 xevent.ClientMessageEvent.format = 32;
293 xevent.ClientMessageEvent.ptr1 = (IntPtr) (hover.y << 16 | hover.x);
295 message_queue.EnqueueLocked (xevent);
302 private void CaretCallback(object sender, EventArgs e) {
\r
306 caret.on = !caret.on;
308 XDrawLine(DisplayHandle, caret.hwnd, caret.gc, caret.x, caret.y, caret.x, caret.y + caret.height);
310 #endregion // Callbacks
312 #region Public Static Methods
313 internal override IntPtr InitializeDriver() {
315 if (DisplayHandle==IntPtr.Zero) {
316 DisplayHandle=XOpenDisplay(IntPtr.Zero);
318 mouse_state=MouseButtons.None;
319 mouse_position=Point.Empty;
325 internal static void SetDisplay(IntPtr display_handle) {
326 if (display_handle != IntPtr.Zero) {
329 if (FosterParent != IntPtr.Zero) {
330 XDestroyWindow(DisplayHandle, FosterParent);
332 if (DisplayHandle != IntPtr.Zero) {
333 XCloseDisplay(DisplayHandle);
336 DisplayHandle=display_handle;
338 // We need to tell System.Drawing our DisplayHandle. FromHdcInternal has
339 // been hacked to do this for us.
340 Graphics.FromHdcInternal (DisplayHandle);
342 // Create a few things
343 key_state = Keys.None;
344 mouse_state = MouseButtons.None;
345 mouse_position = Point.Empty;
346 Screen = XDefaultScreenOfDisplay(DisplayHandle);
347 //screen_num = XScreenNumberOfScreen(DisplayHandle, Screen);
349 root_window = XRootWindow(display_handle, screen_num);
350 default_colormap = XDefaultColormap(display_handle, screen_num);
352 // Create the foster parent
353 FosterParent=XCreateSimpleWindow(display_handle, root_window, 0, 0, 1, 1, 4, 0, 0);
354 if (FosterParent==IntPtr.Zero) {
355 Console.WriteLine("XplatUIX11 Constructor failed to create FosterParent");
358 // Prepare for shutdown
359 wm_protocols=XInternAtom(display_handle, "WM_PROTOCOLS", false);
360 wm_delete_window=XInternAtom(display_handle, "WM_DELETE_WINDOW", false);
362 // handling decorations and such
363 mwm_hints=XInternAtom(display_handle, "_MOTIF_WM_HINTS", false);
364 net_wm_state=XInternAtom(display_handle, "_NET_WM_STATE", false);
365 wm_no_taskbar=XInternAtom(display_handle, "_NET_WM_STATE_NO_TASKBAR", false);
366 wm_state_above=XInternAtom(display_handle, "_NET_WM_STATE_ABOVE", false);
367 atom=XInternAtom(display_handle, "ATOM", false);
368 async_method = XInternAtom(display_handle, "_SWF_AsyncAtom", false);
369 post_message = XInternAtom (display_handle, "_SWF_PostMessageAtom", false);
370 hover.hevent = XInternAtom(display_handle, "_SWF_HoverAtom", false);
372 handle_data = new Hashtable ();
374 throw new ArgumentNullException("Display", "Could not open display (X-Server required. Check you DISPLAY environment variable)");
378 internal override void ShutdownDriver(IntPtr token) {
380 if (DisplayHandle!=IntPtr.Zero) {
381 XCloseDisplay(DisplayHandle);
382 DisplayHandle=IntPtr.Zero;
388 internal void Version() {
389 Console.WriteLine("Xplat version $revision: $");
392 internal override void Exit() {
393 Console.WriteLine("XplatUIX11.Exit");
396 internal override void GetDisplaySize(out Size size) {
397 XWindowAttributes attributes=new XWindowAttributes();
400 XGetWindowAttributes(DisplayHandle, XRootWindow(DisplayHandle, 0), ref attributes);
403 size = new Size(attributes.width, attributes.height);
406 internal override void EnableThemes() {
410 internal override IntPtr CreateWindow(CreateParams cp) {
417 MotifWmHints mwmHints;
422 XSetWindowAttributes attr;
424 ParentHandle=cp.Parent;
432 if (Width<1) Width=1;
433 if (Height<1) Height=1;
437 if (ParentHandle==IntPtr.Zero) {
438 if ((cp.Style & (int)(WindowStyles.WS_CHILD))!=0) {
439 // We need to use our foster parent window until
440 // this poor child gets it's parent assigned
441 ParentHandle=FosterParent;
442 } else if ((cp.Style & (int)(WindowStyles.WS_POPUP))!=0) {
444 ParentHandle=XRootWindow(DisplayHandle, 0);
449 ParentHandle=XRootWindow(DisplayHandle, 0);
453 attr = new XSetWindowAttributes();
455 if ((cp.ExStyle & ((int)WindowStyles.WS_EX_TOOLWINDOW)) != 0) {
456 attr.save_under = true;
459 attr.override_redirect = false;
461 if ((cp.Style & ((int)WindowStyles.WS_POPUP)) != 0) {
462 attr.override_redirect = true;
465 attr.bit_gravity = Gravity.NorthWestGravity;
466 attr.win_gravity = Gravity.NorthWestGravity;
468 WindowHandle=XCreateWindow(DisplayHandle, ParentHandle, X, Y, Width, Height, BorderWidth, (int)CreateWindowArgs.CopyFromParent, (int)CreateWindowArgs.InputOutput, IntPtr.Zero, SetWindowValuemask.BitGravity | SetWindowValuemask.WinGravity | SetWindowValuemask.SaveUnder | SetWindowValuemask.OverrideRedirect, ref attr);
470 // Set the appropriate window manager hints
471 if (((cp.Style & ((int)WindowStyles.WS_POPUP)) != 0) && (ParentHandle != IntPtr.Zero)) {
472 XSetTransientForHint(DisplayHandle, WindowHandle, ParentHandle);
475 mwmHints = new MotifWmHints();
476 mwmHints.flags = MotifFlags.Functions | MotifFlags.Decorations;
477 mwmHints.functions = 0;
478 mwmHints.decorations = 0;
480 if ((cp.Style & ((int)WindowStyles.WS_CAPTION)) != 0) {
481 mwmHints.functions |= MotifFunctions.Move;
482 mwmHints.decorations |= MotifDecorations.Title | MotifDecorations.Menu;
485 if ((cp.Style & ((int)WindowStyles.WS_THICKFRAME)) != 0) {
486 mwmHints.functions |= MotifFunctions.Move | MotifFunctions.Resize;
487 mwmHints.decorations |= MotifDecorations.Border | MotifDecorations.ResizeH;
490 if ((cp.Style & ((int)WindowStyles.WS_MINIMIZEBOX)) != 0) {
491 mwmHints.functions |= MotifFunctions.Minimize;
492 mwmHints.decorations |= MotifDecorations.Minimize;
495 if ((cp.Style & ((int)WindowStyles.WS_MAXIMIZEBOX)) != 0) {
496 mwmHints.functions |= MotifFunctions.Maximize;
497 mwmHints.decorations |= MotifDecorations.Maximize;
500 if ((cp.Style & ((int)WindowStyles.WS_SYSMENU)) != 0) {
501 mwmHints.functions |= MotifFunctions.Close;
504 if ((cp.ExStyle & ((int)WindowStyles.WS_EX_DLGMODALFRAME)) != 0) {
505 mwmHints.decorations |= MotifDecorations.Border;
508 if ((cp.Style & ((int)WindowStyles.WS_DLGFRAME)) != 0) {
509 mwmHints.decorations |= MotifDecorations.Border;
512 if ((cp.Style & ((int)WindowStyles.WS_BORDER)) != 0) {
513 mwmHints.decorations |= MotifDecorations.Border;
517 if ((cp.ExStyle & ((int)WindowStyles.WS_EX_TOOLWINDOW)) != 0) {
518 mwmHints.functions = 0;
519 mwmHints.decorations = 0;
522 XChangeProperty(DisplayHandle, WindowHandle, mwm_hints, mwm_hints, 32, PropertyMode.Replace, ref mwmHints, 5);
527 if ((cp.ExStyle & ((int)WindowStyles.WS_EX_TOOLWINDOW)) != 0) {
528 atoms[atom_count++] = (uint)wm_state_above;
529 atoms[atom_count++] = (uint)wm_no_taskbar;
531 XChangeProperty(DisplayHandle, WindowHandle, net_wm_state, atom, 32, PropertyMode.Replace, ref atoms, atom_count);
533 XMapWindow(DisplayHandle, WindowHandle);
535 XSelectInput(DisplayHandle, WindowHandle, SelectInputMask);
537 protocols=wm_delete_window;
538 XSetWMProtocols(DisplayHandle, WindowHandle, ref protocols, 1);
540 return(WindowHandle);
543 internal override IntPtr CreateWindow(IntPtr Parent, int X, int Y, int Width, int Height) {
544 CreateParams create_params = new CreateParams();
546 create_params.Caption = "";
549 create_params.Width = Width;
550 create_params.Height = Height;
552 create_params.ClassName=XplatUI.DefaultClassName;
553 create_params.ClassStyle = 0;
554 create_params.ExStyle=0;
555 create_params.Parent=IntPtr.Zero;
556 create_params.Param=0;
558 return CreateWindow(create_params);
561 internal override void DestroyWindow(IntPtr handle) {
563 HandleData data = (HandleData) handle_data [handle];
566 handle_data [handle] = null;
567 XDestroyWindow(DisplayHandle, handle);
572 internal override void RefreshWindow(IntPtr handle) {
573 XEvent xevent = new XEvent();
584 // We need info about our window to generate the expose
585 XGetGeometry(DisplayHandle, handle, out root, out x, out y,
586 out width, out height, out border_width, out depth);
588 xevent.type=XEventName.Expose;
589 xevent.ExposeEvent.display=DisplayHandle;
590 xevent.ExposeEvent.window=handle;
591 xevent.ExposeEvent.x=0;
592 xevent.ExposeEvent.y=0;
593 xevent.ExposeEvent.width=width;
594 xevent.ExposeEvent.height=height;
596 XSendEvent(DisplayHandle, handle, false, EventMask.ExposureMask, ref xevent);
597 XFlush(DisplayHandle);
601 internal override void SetWindowBackground(IntPtr handle, Color color) {
604 xcolor = new XColor();
606 xcolor.red = (ushort)(color.R * 257);
607 xcolor.green = (ushort)(color.G * 257);
608 xcolor.blue = (ushort)(color.B * 257);
609 XAllocColor(DisplayHandle, default_colormap, ref xcolor);
612 XSetWindowBackground(DisplayHandle, handle, xcolor.pixel);
613 XClearWindow(DisplayHandle, handle);
617 [MonoTODO("Add support for internal table of windows/DCs for looking up paint area and cleanup")]
618 internal override PaintEventArgs PaintEventStart(IntPtr handle) {
619 PaintEventArgs paint_event;
621 HandleData data = (HandleData) handle_data [handle];
623 throw new Exception ("null data on paint event start: " + handle);
627 if (caret.visible == 1) {
632 data.DeviceContext = Graphics.FromHwnd (handle);
633 paint_event = new PaintEventArgs((Graphics)data.DeviceContext, data.InvalidArea);
638 internal override void PaintEventEnd(IntPtr handle) {
639 HandleData data = (HandleData) handle_data [handle];
641 throw new Exception ("null data on PaintEventEnd");
642 data.ClearInvalidArea ();
643 Graphics g = (Graphics) data.DeviceContext;
647 if (caret.visible == 1) {
649 caret.paused = false;
653 internal override void SetWindowPos(IntPtr handle, int x, int y, int width, int height) {
654 // X requires a sanity check for width & height; otherwise it dies
664 XMoveResizeWindow(DisplayHandle, handle, x, y, width, height);
669 internal override void GetWindowPos(IntPtr handle, out int x, out int y, out int width, out int height, out int client_width, out int client_height) {
676 XGetGeometry(DisplayHandle, handle, out root, out x,
677 out y, out width, out height, out border_width, out depth);
680 client_width = width;
681 client_height = height;
685 internal override void Activate(IntPtr handle) {
688 // Not sure this is the right method, but we don't use ICs either...
689 XRaiseWindow(DisplayHandle, handle);
694 internal override void EnableWindow(IntPtr handle, bool Enable) {
695 // We do nothing; On X11 SetModal is used to create modal dialogs, on Win32 this function is used (see comment there)
698 internal override void SetModal(IntPtr handle, bool Modal) {
699 // We need to use the Motif window manager hints to build modal stuff; see freedesktop.org
700 throw new NotImplementedException("Finish me");
703 internal override void Invalidate (IntPtr handle, Rectangle rc, bool clear) {
705 XClearArea (DisplayHandle, handle, rc.Left, rc.Top, (uint)rc.Width, (uint)rc.Height, true);
707 XEvent xevent = new XEvent ();
708 xevent.type = XEventName.Expose;
709 xevent.ExposeEvent.display = DisplayHandle;
710 xevent.ExposeEvent.window = handle;
711 xevent.ExposeEvent.x = rc.X;
712 xevent.ExposeEvent.y = rc.Y;
713 xevent.ExposeEvent.width = rc.Width;
714 xevent.ExposeEvent.height = rc.Height;
720 internal override IntPtr DefWndProc(ref Message msg) {
721 switch((Msg)msg.Msg) {
722 case Msg.WM_ERASEBKGND: {
723 HandleData data = (HandleData) handle_data [msg.HWnd];
725 throw new Exception ("null data on WM_ERASEBKGND: " + msg.HWnd);
729 XClearArea(DisplayHandle, msg.HWnd, data.InvalidArea.Left, data.InvalidArea.Top, (uint)data.InvalidArea.Width, (uint)data.InvalidArea.Height, false);
737 internal override void HandleException(Exception e) {
738 StackTrace st = new StackTrace(e);
739 Console.WriteLine("Exception '{0}'", e.Message+st.ToString());
740 Console.WriteLine("{0}{1}", e.Message, st.ToString());
743 internal override void DoEvents() {
744 Console.WriteLine("XplatUIX11.DoEvents");
747 internal override bool PeekMessage(ref MSG msg, IntPtr hWnd, int wFilterMin, int wFilterMax, uint flags) {
748 Console.WriteLine("XplatUIX11.PeekMessage");
752 private void CreateKeyBoardMsg (XEvent xevent, ref MSG msg)
754 IntPtr buffer = Marshal.AllocHGlobal(24);
758 msg.wParam = IntPtr.Zero;
761 len = XLookupString(ref xevent, buffer, 24, out keysym, IntPtr.Zero);
764 if ((keysym==XKeySym.XK_Control_L) || (keysym==XKeySym.XK_Control_R)) {
765 if (xevent.type==XEventName.KeyPress) {
766 key_state |= Keys.Control;
768 key_state &= ~Keys.Control;
772 if ((keysym==XKeySym.XK_Shift_L) || (keysym==XKeySym.XK_Shift_R)) {
773 if (xevent.type==XEventName.KeyPress) {
774 key_state |= Keys.Shift;
776 key_state &= ~Keys.Shift;
780 if ((keysym==XKeySym.XK_Alt_L) || (keysym==XKeySym.XK_Alt_R)) {
781 if (xevent.type==XEventName.KeyPress) {
782 key_state |= Keys.Alt;
784 key_state &= ~Keys.Alt;
788 if (len>0) { /* String is not zero terminated*/
789 Marshal.WriteByte (buffer, len, 0);
792 keys=Marshal.PtrToStringAuto(buffer);
794 for (int i = 0; i < KeyMapping.Length; i++) {
795 if (KeyMapping[i].X11Key == keysym) {
796 msg.wParam = (IntPtr) KeyMapping[i].Win32Key;
797 // Console.WriteLine("Got special key {0} {1:x} ", (VirtualKeys) keysym, keysym);
802 if ((msg.wParam == IntPtr.Zero) && (keys.Length>0)) {
804 keychars=keys.ToCharArray(0, 1);
805 msg.wParam=(IntPtr)keychars[0];
806 // Console.WriteLine("Got key {0} {1:x} ", (VirtualKeys) keysym, keysym);
809 Marshal.FreeHGlobal (buffer);
810 msg.lParam = (IntPtr) 1;
813 private IntPtr GetMousewParam(int Delta) {
816 if ((mouse_state & MouseButtons.Left) != 0) {
817 result |= (int)MsgButtons.MK_LBUTTON;
820 if ((mouse_state & MouseButtons.Middle) != 0) {
821 result |= (int)MsgButtons.MK_MBUTTON;
824 if ((mouse_state & MouseButtons.Right) != 0) {
825 result |= (int)MsgButtons.MK_RBUTTON;
828 if ((key_state & Keys.Control) != 0) {
829 result |= (int)MsgButtons.MK_CONTROL;
832 if ((key_state & Keys.Shift) != 0) {
833 result |= (int)MsgButtons.MK_SHIFT;
836 result |= Delta << 16;
838 return (IntPtr)result;
841 private int NextTimeout (DateTime now)
843 int timeout = Int32.MaxValue;
845 foreach (Timer timer in timer_list) {
846 int next = (int) (timer.Expires - now).TotalMilliseconds;
848 return 0; // Have a timer that has already expired
853 if (timeout < Timer.Minimum)
854 timeout = Timer.Minimum;
858 private void CheckTimers (DateTime now)
861 int count = timer_list.Count;
864 for (int i = 0; i < timer_list.Count; i++) {
865 Timer timer = (Timer) timer_list [i];
866 if (timer.Enabled && timer.Expires <= now) {
874 private void AddExpose (XEvent xevent)
876 HandleData data = (HandleData) handle_data [xevent.AnyEvent.window];
878 data = new HandleData ();
879 handle_data [xevent.AnyEvent.window] = data;
882 if (!data.IsVisible) {
886 data.AddToInvalidArea (xevent.ExposeEvent.x, xevent.ExposeEvent.y,
887 xevent.ExposeEvent.width, xevent.ExposeEvent.height);
889 if (!data.HasExpose) {
890 message_queue.Enqueue (xevent);
891 data.HasExpose = true;
895 private void UpdateMessageQueue ()
897 DateTime now = DateTime.Now;
901 pending = XPending (DisplayHandle);
905 Idle (this, EventArgs.Empty);
908 pending = XPending (DisplayHandle);
913 int timeout = NextTimeout (now);
916 Syscall.poll (pollfds, (uint) pollfds.Length, timeout);
918 pending = XPending (DisplayHandle);
926 pending = XPending (DisplayHandle);
930 while (pending > 0) {
931 XEvent xevent = new XEvent ();
934 XNextEvent (DisplayHandle, ref xevent);
937 switch (xevent.type) {
938 case XEventName.Expose:
941 case XEventName.KeyPress:
942 case XEventName.KeyRelease:
943 case XEventName.ButtonPress:
944 case XEventName.ButtonRelease:
945 case XEventName.MotionNotify:
946 case XEventName.EnterNotify:
947 case XEventName.LeaveNotify:
948 case XEventName.ConfigureNotify:
949 case XEventName.DestroyNotify:
950 case XEventName.FocusIn:
951 case XEventName.FocusOut:
952 case XEventName.ClientMessage:
953 message_queue.Enqueue (xevent);
958 pending = XPending (DisplayHandle);
963 internal override bool GetMessage(ref MSG msg, IntPtr hWnd, int wFilterMin, int wFilterMax) {
966 if (message_queue.Count > 0) {
967 xevent = (XEvent) message_queue.Dequeue ();
969 UpdateMessageQueue ();
970 if (message_queue.Count > 0) {
971 xevent = (XEvent) message_queue.Dequeue ();
973 msg.hwnd= IntPtr.Zero;
974 msg.message = Msg.WM_ENTERIDLE;
979 msg.hwnd=xevent.AnyEvent.window;
982 // If you add a new event to this switch make sure to add it in
983 // UpdateMessage also unless it is not coming through the X event system.
985 switch(xevent.type) {
986 case XEventName.KeyPress: {
987 keyboard.KeyEvent (xevent.AnyEvent.window, xevent, ref msg);
991 case XEventName.KeyRelease: {
992 keyboard.KeyEvent (xevent.AnyEvent.window, xevent, ref msg);
996 case XEventName.ButtonPress: {
997 switch(xevent.ButtonEvent.button) {
999 mouse_state |= MouseButtons.Left;
1000 msg.message=Msg.WM_LBUTTONDOWN;
1001 msg.wParam=GetMousewParam(0);
1006 mouse_state |= MouseButtons.Middle;
1007 msg.message=Msg.WM_MBUTTONDOWN;
1008 msg.wParam=GetMousewParam(0);
1013 mouse_state |= MouseButtons.Right;
1014 msg.message=Msg.WM_RBUTTONDOWN;
1015 msg.wParam=GetMousewParam(0);
1020 msg.message=Msg.WM_MOUSEWHEEL;
1021 msg.wParam=GetMousewParam(120);
1026 msg.message=Msg.WM_MOUSEWHEEL;
1027 msg.wParam=GetMousewParam(-120);
1033 msg.lParam=(IntPtr) (xevent.ButtonEvent.y << 16 | xevent.ButtonEvent.x);
1034 mouse_position.X=xevent.ButtonEvent.x;
1035 mouse_position.Y=xevent.ButtonEvent.y;
1037 if (!click_pending) {
1038 click_pending = true;
1039 click_pending_hwnd = msg.hwnd;
1040 click_pending_message = msg.message;
1041 click_pending_wparam = msg.wParam;
1042 click_pending_lparam = msg.lParam;
1043 click_pending_time = xevent.ButtonEvent.time;
1045 if (((xevent.ButtonEvent.time - click_pending_time)<double_click_interval) && (msg.wParam == click_pending_wparam) && (msg.lParam == click_pending_lparam) && (msg.message == click_pending_message)) {
1046 // Looks like a genuine double click, clicked twice on the same spot with the same keys
1047 switch(xevent.ButtonEvent.button) {
1049 msg.message=Msg.WM_LBUTTONDBLCLK;
1054 msg.message=Msg.WM_MBUTTONDBLCLK;
1059 msg.message=Msg.WM_RBUTTONDBLCLK;
1064 click_pending = false;
1070 case XEventName.ButtonRelease: {
1071 switch(xevent.ButtonEvent.button) {
1073 mouse_state &= ~MouseButtons.Left;
1074 msg.message=Msg.WM_LBUTTONUP;
1075 msg.wParam=GetMousewParam(0);
1080 mouse_state &= ~MouseButtons.Middle;
1081 msg.message=Msg.WM_MBUTTONUP;
1082 msg.wParam=GetMousewParam(0);
1087 mouse_state &= ~MouseButtons.Right;
1088 msg.message=Msg.WM_RBUTTONUP;
1089 msg.wParam=GetMousewParam(0);
1102 msg.lParam=(IntPtr) (xevent.ButtonEvent.y << 16 | xevent.ButtonEvent.x);
1103 mouse_position.X=xevent.ButtonEvent.x;
1104 mouse_position.Y=xevent.ButtonEvent.y;
1108 case XEventName.MotionNotify: {
1109 msg.message = Msg.WM_MOUSEMOVE;
1110 msg.wParam = GetMousewParam(0);
1111 msg.lParam = (IntPtr) (xevent.MotionEvent.y << 16 | xevent.MotionEvent.x);
1112 mouse_position.X = xevent.MotionEvent.x;
1113 mouse_position.Y = xevent.MotionEvent.y;
1114 hover.x = mouse_position.X;
1115 hover.y = mouse_position.Y;
1116 hover.timer.Interval = hover.interval;
1120 case XEventName.EnterNotify: {
1121 if (xevent.CrossingEvent.mode != NotifyMode.NotifyNormal) {
1124 msg.message=Msg.WM_MOUSE_ENTER;
1125 hover.timer.Enabled = true;
1126 hover.hwnd = msg.hwnd;
1130 case XEventName.LeaveNotify: {
1131 if (xevent.CrossingEvent.mode != NotifyMode.NotifyNormal) {
1134 msg.message=Msg.WM_MOUSE_LEAVE;
1135 hover.timer.Enabled = false;
1136 hover.hwnd = IntPtr.Zero;
1140 case XEventName.ConfigureNotify: {
1141 msg.message=Msg.WM_WINDOWPOSCHANGED;
1142 msg.wParam=IntPtr.Zero;
1143 msg.lParam=IntPtr.Zero;
1148 case XEventName.FocusIn: {
1149 msg.message=Msg.WM_ACTIVATE;
1150 msg.wParam=(IntPtr)WindowActiveFlags.WA_ACTIVE;
1151 msg.lParam=IntPtr.Zero;
1155 case XEventName.FocusOut: {
1156 msg.message=Msg.WM_ACTIVATE;
1157 msg.wParam=(IntPtr)WindowActiveFlags.WA_INACTIVE;
1158 msg.lParam=IntPtr.Zero;
1162 case XEventName.Expose: {
1163 if (caret.visible == 1) {
1164 caret.paused = true;
1168 NativeWindow.WndProc(msg.hwnd, Msg.WM_ERASEBKGND, msg.hwnd, IntPtr.Zero);
1170 if (caret.visible == 1) {
1172 caret.paused = false;
1175 msg.message=Msg.WM_PAINT;
1176 msg.wParam=IntPtr.Zero;
1177 msg.lParam=IntPtr.Zero;
1181 case XEventName.DestroyNotify: {
1182 msg.message=Msg.WM_DESTROY;
1183 msg.wParam=IntPtr.Zero;
1184 msg.lParam=IntPtr.Zero;
1188 case XEventName.ClientMessage: {
1189 if (xevent.ClientMessageEvent.message_type == (IntPtr)async_method) {
1190 GCHandle handle = (GCHandle)xevent.ClientMessageEvent.ptr1;
1191 AsyncMethodData data = (AsyncMethodData) handle.Target;
1192 AsyncMethodResult result = data.Result.Target as AsyncMethodResult;
1193 object ret = data.Method.DynamicInvoke (data.Args);
1195 result.Complete (ret);
1197 } else if (xevent.ClientMessageEvent.message_type == (IntPtr)hover.hevent) {
1198 msg.message = Msg.WM_MOUSEHOVER;
1199 msg.wParam = GetMousewParam(0);
1200 msg.lParam = (IntPtr) (xevent.ClientMessageEvent.ptr1);
1201 } else if (xevent.ClientMessageEvent.message_type == (IntPtr) post_message) {
1202 msg.message = (Msg) xevent.ClientMessageEvent.ptr1.ToInt32 ();
1203 msg.hwnd = xevent.ClientMessageEvent.window;
1204 msg.wParam = xevent.ClientMessageEvent.ptr2;
1205 msg.lParam = xevent.ClientMessageEvent.ptr3;
1207 msg.message=Msg.WM_QUIT;
1208 msg.wParam=IntPtr.Zero;
1209 msg.lParam=IntPtr.Zero;
1215 case XEventName.TimerNotify: {
1216 xevent.TimerNotifyEvent.handler (this, EventArgs.Empty);
1221 msg.message = Msg.WM_NULL;
1229 internal override bool TranslateMessage(ref MSG msg) {
1230 return keyboard.TranslateMessage (ref msg);
1233 internal override IntPtr DispatchMessage(ref MSG msg) {
1234 return NativeWindow.WndProc(msg.hwnd, msg.message, msg.wParam, msg.lParam);
1237 internal override bool SetZOrder(IntPtr hWnd, IntPtr AfterhWnd, bool Top, bool Bottom) {
1239 XRaiseWindow(DisplayHandle, hWnd);
1241 } else if (!Bottom) {
1242 XWindowChanges values = new XWindowChanges();
1244 values.sibling = AfterhWnd;
1245 values.stack_mode = StackMode.Below;
1246 XConfigureWindow(DisplayHandle, hWnd, ChangeWindowFlags.CWStackMode, ref values);
1248 XLowerWindow(DisplayHandle, hWnd);
1254 internal override bool SetTopmost(IntPtr hWnd, IntPtr hWndOwner, bool Enabled) {
1256 if (hWndOwner == IntPtr.Zero) {
1257 hWndOwner = FosterParent;
1259 XSetTransientForHint(DisplayHandle, hWnd, hWndOwner);
1263 trans_prop = XInternAtom(DisplayHandle, "WM_TRANSIENT_FOR", false);
1264 XDeleteProperty(DisplayHandle, hWnd, trans_prop);
1269 internal override bool Text(IntPtr handle, string text) {
1271 XTextProperty property = new XTextProperty();
1274 XSetWMName(DisplayHandle, handle, ref property);
1277 XStoreName(DisplayHandle, handle, text);
1283 internal override bool GetText(IntPtr handle, out string text) {
1286 textptr = IntPtr.Zero;
1289 XFetchName(DisplayHandle, handle, ref textptr);
1291 if (textptr != IntPtr.Zero) {
1292 text = Marshal.PtrToStringAnsi(textptr);
1301 internal override bool SetVisible(IntPtr handle, bool visible) {
1302 HandleData data = (HandleData) handle_data [handle];
1305 data = new HandleData ();
1306 handle_data [handle] = data;
1309 data.IsVisible = visible;
1313 XMapWindow(DisplayHandle, handle);
1315 XUnmapWindow(DisplayHandle, handle);
1321 internal override bool IsVisible(IntPtr handle) {
1322 HandleData data = (HandleData) handle_data [handle];
1324 if (data == null || data.IsVisible == true) {
1330 internal override IntPtr SetParent(IntPtr handle, IntPtr parent) {
1331 XWindowAttributes attributes=new XWindowAttributes();
1334 XGetWindowAttributes(DisplayHandle, handle, ref attributes);
1335 XReparentWindow(DisplayHandle, handle, parent, attributes.x, attributes.y);
1340 internal override IntPtr GetParent(IntPtr handle) {
1348 Children=IntPtr.Zero;
1352 XQueryTree(DisplayHandle, handle, ref Root, ref Parent, ref Children, ref ChildCount);
1355 if (Children!=IntPtr.Zero) {
1363 internal override void GrabWindow(IntPtr hWnd, IntPtr confine_hwnd) {
1364 if (confine_hwnd != IntPtr.Zero) {
1365 XWindowAttributes attributes = new XWindowAttributes();
1368 XGetWindowAttributes(DisplayHandle, confine_hwnd, ref attributes);
1370 grab_area.X = attributes.x;
1371 grab_area.Y = attributes.y;
1372 grab_area.Width = attributes.width;
1373 grab_area.Height = attributes.height;
1374 grab_confined = true;
1378 XGrabPointer(DisplayHandle, hWnd, false,
1379 EventMask.ButtonPressMask | EventMask.ButtonMotionMask |
1380 EventMask.ButtonReleaseMask | EventMask.PointerMotionMask,
1381 GrabMode.GrabModeAsync, GrabMode.GrabModeAsync, confine_hwnd, 0, 0);
1385 internal override void GrabInfo(out IntPtr hWnd, out bool GrabConfined, out Rectangle GrabArea) {
1387 GrabConfined = grab_confined;
1388 GrabArea = grab_area;
1391 internal override void ReleaseWindow(IntPtr hWnd) {
1393 XUngrabPointer(DisplayHandle, 0);
1394 grab_hwnd = IntPtr.Zero;
1395 grab_confined = false;
1399 internal override bool CalculateWindowRect(IntPtr hWnd, ref Rectangle ClientRect, int Style, bool HasMenu, out Rectangle WindowRect) {
1400 WindowRect = new Rectangle(ClientRect.Left, ClientRect.Top, ClientRect.Width, ClientRect.Height);
1404 internal override void SetCursorPos(IntPtr handle, int x, int y) {
1406 XWarpPointer(DisplayHandle, IntPtr.Zero, (handle!=IntPtr.Zero) ? handle : IntPtr.Zero, 0, 0, 0, 0, x, y);
1410 internal override void GetCursorPos(IntPtr handle, out int x, out int y) {
1420 XQueryPointer(DisplayHandle, (handle!=IntPtr.Zero) ? handle : root_window,
1421 out root, out child, out root_x, out root_y,
1422 out win_x, out win_y, out keys_buttons);
1425 if (handle != IntPtr.Zero) {
1434 internal override void ScreenToClient(IntPtr handle, ref int x, ref int y)
1441 XTranslateCoordinates (DisplayHandle, root_window,
1442 handle, x, y, out dest_x_return, out dest_y_return, out child);
1449 internal override void ClientToScreen(IntPtr handle, ref int x, ref int y) {
1455 XTranslateCoordinates (DisplayHandle, handle, root_window,
1456 x, y, out dest_x_return, out dest_y_return, out child);
1463 internal override void SendAsyncMethod (AsyncMethodData method)
1465 XEvent xevent = new XEvent ();
1467 xevent.type = XEventName.ClientMessage;
1468 xevent.ClientMessageEvent.display = DisplayHandle;
1469 xevent.ClientMessageEvent.window = IntPtr.Zero;
1470 xevent.ClientMessageEvent.message_type = (IntPtr)async_method;
1471 xevent.ClientMessageEvent.format = 32;
1472 xevent.ClientMessageEvent.ptr1 = (IntPtr) GCHandle.Alloc (method);
1474 message_queue.EnqueueLocked (xevent);
1479 // must be called from main thread
1480 public static void PostMessage (IntPtr hwnd, Msg message, IntPtr wparam, IntPtr lparam)
1482 XEvent xevent = new XEvent ();
1484 xevent.type = XEventName.ClientMessage;
1485 xevent.ClientMessageEvent.display = DisplayHandle;
1486 xevent.ClientMessageEvent.window = hwnd;
1487 xevent.ClientMessageEvent.message_type = (IntPtr) post_message;
1488 xevent.ClientMessageEvent.format = 32;
1489 xevent.ClientMessageEvent.ptr1 = (IntPtr) message;
1490 xevent.ClientMessageEvent.ptr2 = wparam;
1491 xevent.ClientMessageEvent.ptr3 = lparam;
1493 message_queue.Enqueue (xevent);
1496 private void WakeupMain ()
1498 wake.BeginSend (new byte [] { 0xFF }, 0, 1, SocketFlags.None, null, null);
1501 internal override void SetTimer (Timer timer)
1504 timer_list.Add (timer);
1509 internal override void KillTimer (Timer timer)
1512 timer_list.Remove (timer);
1516 internal static void ShowCaret() {
1517 if ((caret.gc == IntPtr.Zero) || caret.on) {
1522 XDrawLine(DisplayHandle, caret.hwnd, caret.gc, caret.x, caret.y, caret.x, caret.y + caret.height);
1525 internal static void HideCaret() {
1526 if ((caret.gc == IntPtr.Zero) || !caret.on) {
1531 XDrawLine(DisplayHandle, caret.hwnd, caret.gc, caret.x, caret.y, caret.x, caret.y + caret.height);
1534 // Automatically destroys any previous caret
1535 internal override void CreateCaret(IntPtr hwnd, int width, int height) {
1536 XGCValues gc_values;
1538 if (caret.hwnd != IntPtr.Zero) {
1539 DestroyCaret(caret.hwnd);
1542 caret.width = width;
1543 caret.height = height;
1547 gc_values = new XGCValues();
1549 gc_values.line_width = caret.width;
1550 caret.gc = XCreateGC(DisplayHandle, hwnd, GCFunction.GCLineWidth, ref gc_values);
1551 if (caret.gc == IntPtr.Zero) {
1552 caret.hwnd = IntPtr.Zero;
1556 XSetFunction(DisplayHandle, caret.gc, GXFunction.GXinvert);
1559 // Only destroy if the hwnd is the hwnd of the current caret
1560 internal override void DestroyCaret(IntPtr hwnd) {
1561 if (caret.hwnd == hwnd) {
1562 if (caret.visible == 1) {
1566 if (caret.gc != IntPtr.Zero) {
1567 XFreeGC(DisplayHandle, caret.gc);
1568 caret.gc = IntPtr.Zero;
1570 caret.hwnd = IntPtr.Zero;
1576 // When setting the position we restart the blink interval
1577 internal override void SetCaretPos(IntPtr hwnd, int x, int y) {
1578 if (caret.hwnd == hwnd) {
1585 if (caret.visible == 1) {
1587 caret.timer.Start();
1592 // Visible is cumulative; two hides require two shows before the caret is visible again
1593 internal override void CaretVisible(IntPtr hwnd, bool visible) {
1594 if (caret.hwnd == hwnd) {
1596 if (caret.visible < 1) {
1599 if (caret.visible == 1) {
1601 caret.timer.Start();
1606 if (caret.visible == 0) {
1614 // Santa's little helper
1617 Console.WriteLine("Here: {0}", new StackTrace().ToString());
1619 #endregion // Public Static Methods
1621 internal struct X11ToWin32KeyMapping {
1622 internal XKeySym X11Key;
1623 internal VirtualKeys Win32Key;
1625 internal X11ToWin32KeyMapping (XKeySym x11, VirtualKeys win32)
1632 /* X11 to Win32 VK mapping */
1633 static readonly X11ToWin32KeyMapping[] KeyMapping = new X11ToWin32KeyMapping[]
1635 /* Cursor navigation*/
1636 new X11ToWin32KeyMapping (XKeySym.XK_Left, VirtualKeys.VK_LEFT),
1637 new X11ToWin32KeyMapping (XKeySym.XK_Right, VirtualKeys.VK_RIGHT),
1638 new X11ToWin32KeyMapping (XKeySym.XK_Up, VirtualKeys.VK_UP),
1639 new X11ToWin32KeyMapping (XKeySym.XK_Down, VirtualKeys.VK_DOWN),
1641 new X11ToWin32KeyMapping (XKeySym.XK_Page_Up, VirtualKeys.VK_PRIOR),
1642 new X11ToWin32KeyMapping (XKeySym.XK_Page_Down, VirtualKeys.VK_NEXT),
1643 new X11ToWin32KeyMapping (XKeySym.XK_End, VirtualKeys.VK_END),
1644 new X11ToWin32KeyMapping (XKeySym.XK_Home, VirtualKeys.VK_HOME),
1647 new X11ToWin32KeyMapping (XKeySym.XK_Shift_R, VirtualKeys.VK_SHIFT),
1648 new X11ToWin32KeyMapping (XKeySym.XK_Shift_L, VirtualKeys.VK_SHIFT),
1649 new X11ToWin32KeyMapping (XKeySym.XK_Control_R, VirtualKeys.VK_CONTROL),
1650 new X11ToWin32KeyMapping (XKeySym.XK_Control_L, VirtualKeys.VK_CONTROL),
1653 new X11ToWin32KeyMapping (XKeySym.XK_Return, VirtualKeys.VK_RETURN),
1654 new X11ToWin32KeyMapping (XKeySym.XK_Tab, VirtualKeys.VK_TAB),
1655 new X11ToWin32KeyMapping (XKeySym.XK_Menu, VirtualKeys.VK_MENU),
1656 new X11ToWin32KeyMapping (XKeySym.XK_BackSpace, VirtualKeys.VK_BACK),
1657 new X11ToWin32KeyMapping (XKeySym.XK_Clear, VirtualKeys.VK_CLEAR),
1664 [DllImport ("libX11", EntryPoint="XOpenDisplay")]
1665 internal extern static IntPtr XOpenDisplay(IntPtr display);
1666 [DllImport ("libX11", EntryPoint="XCloseDisplay")]
1667 internal extern static void XCloseDisplay(IntPtr display);
1669 [DllImport ("libX11", EntryPoint="XCreateWindow")]
1670 internal extern static IntPtr XCreateWindow(IntPtr display, IntPtr parent, int x, int y, int width, int height, int border_width, int depth, int xclass, IntPtr visual, SetWindowValuemask valuemask, ref XSetWindowAttributes attributes);
1671 [DllImport ("libX11", EntryPoint="XCreateSimpleWindow")]
1672 internal extern static IntPtr XCreateSimpleWindow(IntPtr display, IntPtr parent, int x, int y, int width, int height, int border_width, int border, int background);
1673 [DllImport ("libX11", EntryPoint="XMapWindow")]
1674 internal extern static int XMapWindow(IntPtr display, IntPtr window);
1675 [DllImport ("libX11", EntryPoint="XUnmapWindow")]
1676 internal extern static int XUnmapWindow(IntPtr display, IntPtr window);
1677 [DllImport ("libX11", EntryPoint="XMapSubwindows")]
1678 internal extern static int XMapSubindows(IntPtr display, IntPtr window);
1679 [DllImport ("libX11", EntryPoint="XUnmapSubwindows")]
1680 internal extern static int XUnmapSubwindows(IntPtr display, IntPtr window);
1681 [DllImport ("libX11", EntryPoint="XRootWindow")]
1682 internal extern static IntPtr XRootWindow(IntPtr display, int screen_number);
1683 [DllImport ("libX11", EntryPoint="XNextEvent")]
1684 internal extern static IntPtr XNextEvent(IntPtr display, ref XEvent xevent);
1685 [DllImport ("libX11")]
1686 internal extern static int XConnectionNumber (IntPtr diplay);
1687 [DllImport ("libX11")]
1688 internal extern static int XPending (IntPtr diplay);
1689 [DllImport ("libX11")]
1690 internal extern static bool XCheckWindowEvent (IntPtr display, IntPtr window, EventMask mask, ref XEvent xevent);
1691 [DllImport ("libX11")]
1692 internal extern static bool XCheckMaskEvent (IntPtr display, EventMask mask, ref XEvent xevent);
1693 [DllImport ("libX11", EntryPoint="XSelectInput")]
1694 internal extern static IntPtr XSelectInput(IntPtr display, IntPtr window, EventMask mask);
1695 [DllImport ("libX11", EntryPoint="XLookupString")]
1696 internal extern static int XLookupString(ref XEvent xevent, IntPtr buffer, int num_bytes, out XKeySym keysym, IntPtr status);
1698 [DllImport ("libX11", EntryPoint="XDestroyWindow")]
1699 internal extern static int XDestroyWindow(IntPtr display, IntPtr window);
1701 [DllImport ("libX11", EntryPoint="XReparentWindow")]
1702 internal extern static int XReparentWindow(IntPtr display, IntPtr window, IntPtr parent, int x, int y);
1703 [DllImport ("libX11", EntryPoint="XMoveResizeWindow")]
1704 internal extern static int XMoveResizeWindow(IntPtr display, IntPtr window, int x, int y, int width, int height);
1706 [DllImport ("libX11", EntryPoint="XResizeWindow")]
1707 internal extern static int XResizeWindow(IntPtr display, IntPtr window, int width, int height);
1709 [DllImport ("libX11", EntryPoint="XGetWindowAttributes")]
1710 internal extern static int XGetWindowAttributes(IntPtr display, IntPtr window, ref XWindowAttributes attributes);
1712 [DllImport ("libX11", EntryPoint="XFlush")]
1713 internal extern static int XFlush(IntPtr display);
1715 [DllImport ("libX11", EntryPoint="XSetWMName")]
1716 internal extern static int XSetWMName(IntPtr display, IntPtr window, ref XTextProperty text_prop);
1718 [DllImport ("libX11", EntryPoint="XStoreName")]
1719 internal extern static int XStoreName(IntPtr display, IntPtr window, string window_name);
1721 [DllImport ("libX11", EntryPoint="XFetchName")]
1722 internal extern static int XFetchName(IntPtr display, IntPtr window, ref IntPtr window_name);
1724 [DllImport ("libX11", EntryPoint="XSendEvent")]
1725 internal extern static int XSendEvent(IntPtr display, IntPtr window, bool propagate, EventMask event_mask, ref XEvent send_event);
1727 [DllImport ("libX11", EntryPoint="XQueryTree")]
1728 internal extern static int XQueryTree(IntPtr display, IntPtr window, ref IntPtr root_return, ref IntPtr parent_return, ref IntPtr children_return, ref int nchildren_return);
1730 [DllImport ("libX11", EntryPoint="XFree")]
1731 internal extern static int XFree(IntPtr data);
1733 [DllImport ("libX11", EntryPoint="XRaiseWindow")]
1734 internal extern static int XRaiseWindow(IntPtr display, IntPtr window);
1736 [DllImport ("libX11", EntryPoint="XLowerWindow")]
1737 internal extern static uint XLowerWindow(IntPtr display, IntPtr window);
1739 [DllImport ("libX11", EntryPoint="XConfigureWindow")]
1740 internal extern static uint XConfigureWindow(IntPtr display, IntPtr window, ChangeWindowFlags value_mask, ref XWindowChanges values);
1742 [DllImport ("libX11", EntryPoint="XInternAtom")]
1743 internal extern static int XInternAtom(IntPtr display, string atom_name, bool only_if_exists);
1745 [DllImport ("libX11", EntryPoint="XSetWMProtocols")]
1746 internal extern static int XSetWMProtocols(IntPtr display, IntPtr window, ref int protocols, int count);
1748 [DllImport ("libX11", EntryPoint="XGrabPointer")]
1749 internal extern static int XGrabPointer(IntPtr display, IntPtr window, bool owner_events, EventMask event_mask, GrabMode pointer_mode, GrabMode keyboard_mode, IntPtr confine_to, uint cursor, uint timestamp);
1751 [DllImport ("libX11", EntryPoint="XUngrabPointer")]
1752 internal extern static int XUngrabPointer(IntPtr display, uint timestamp);
1754 [DllImport ("libX11", EntryPoint="XQueryPointer")]
1755 internal extern static bool XQueryPointer(IntPtr display, IntPtr window, out IntPtr root, out IntPtr child, out int root_x, out int root_y, out int win_x, out int win_y, out int keys_buttons);
1757 [DllImport ("libX11", EntryPoint="XTranslateCoordinates")]
1758 internal extern static bool XTranslateCoordinates (IntPtr display, IntPtr src_w, IntPtr dest_w, int src_x, int src_y, out int intdest_x_return, out int dest_y_return, out IntPtr child_return);
1760 [DllImport ("libX11", EntryPoint="XGetGeometry")]
1761 internal extern static bool XGetGeometry(IntPtr display, IntPtr window, out IntPtr root, out int x, out int y, out int width, out int height, out int border_width, out int depth);
1763 [DllImport ("libX11", EntryPoint="XWarpPointer")]
1764 internal extern static uint XWarpPointer(IntPtr display, IntPtr src_w, IntPtr dest_w, int src_x, int src_y, uint src_width, uint src_height, int dest_x, int dest_y);
1766 [DllImport ("libX11", EntryPoint="XClearWindow")]
1767 internal extern static int XClearWindow(IntPtr display, IntPtr window);
1769 [DllImport ("libX11", EntryPoint="XClearArea")]
1770 internal extern static int XClearArea(IntPtr display, IntPtr window, int x, int y, uint width, uint height, bool exposures);
1773 [DllImport ("libX11", EntryPoint="XDefaultScreenOfDisplay")]
1774 internal extern static IntPtr XDefaultScreenOfDisplay(IntPtr display);
1776 [DllImport ("libX11", EntryPoint="XScreenNumberOfScreen")]
1777 internal extern static int XScreenNumberOfScreen(IntPtr display, IntPtr Screen);
1779 [DllImport ("libX11", EntryPoint="XDefaultVisual")]
1780 internal extern static uint XDefaultVisual(IntPtr display, int screen_number);
1782 [DllImport ("libX11", EntryPoint="XDefaultDepth")]
1783 internal extern static uint XDefaultDepth(IntPtr display, int screen_number);
1785 [DllImport ("libX11", EntryPoint="XDefaultColormap")]
1786 internal extern static uint XDefaultColormap(IntPtr display, int screen_number);
1788 [DllImport ("libX11", EntryPoint="XLookupColor")]
1789 internal extern static int XLookupColor(IntPtr display, uint Colormap, string Coloranem, ref XColor exact_def_color, ref XColor screen_def_color);
1791 [DllImport ("libX11", EntryPoint="XAllocColor")]
1792 internal extern static int XAllocColor(IntPtr display, uint Colormap, ref XColor colorcell_def);
1794 [DllImport ("libX11.so", EntryPoint="XSetTransientForHint")]
1795 internal extern static int XSetTransientForHint(IntPtr display, IntPtr window, IntPtr prop_window);
1797 [DllImport ("libX11.so", EntryPoint="XChangeProperty")]
1798 internal extern static int XChangeProperty(IntPtr display, IntPtr window, int property, int type, int format, PropertyMode mode, ref MotifWmHints data, int nelements);
1800 [DllImport ("libX11.so", EntryPoint="XChangeProperty")]
1801 internal extern static int XChangeProperty(IntPtr display, IntPtr window, int property, int format, int type, PropertyMode mode, ref uint[] atoms, int nelements);
1803 [DllImport ("libX11.so", EntryPoint="XChangeProperty")]
1804 internal extern static int XChangeProperty(IntPtr display, IntPtr window, int property, int format, int type, PropertyMode mode, IntPtr data, int nelements);
1806 [DllImport ("libX11.so", EntryPoint="XDeleteProperty")]
1807 internal extern static int XDeleteProperty(IntPtr display, IntPtr window, int property);
1809 [DllImport ("libX11", EntryPoint="XGetKeyboardControl")]
1810 internal extern static int XGetKeyboardControl (IntPtr display, out XKeyBoardState state);
1813 [DllImport ("libX11", EntryPoint="XCreateGC")]
1814 internal extern static IntPtr XCreateGC(IntPtr display, IntPtr window, GCFunction valuemask, ref XGCValues values);
1816 [DllImport ("libX11", EntryPoint="XFreeGC")]
1817 internal extern static int XFreeGC(IntPtr display, IntPtr gc);
1819 [DllImport ("libX11", EntryPoint="XSetFunction")]
1820 internal extern static int XSetFunction(IntPtr display, IntPtr gc, GXFunction function);
1822 [DllImport ("libX11", EntryPoint="XDrawLine")]
1823 internal extern static int XDrawLine(IntPtr display, IntPtr drawable, IntPtr gc, int x1, int y1, int x2, int y2);
1825 [DllImport ("libX11", EntryPoint="XSetWindowBackground")]
1826 internal extern static int XSetWindowBackground(IntPtr display, IntPtr window, uint background);