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-2006 Novell, Inc.
23 // Peter Bartok pbartok@novell.com
28 // This driver understands the following environment variables: (Set the var to enable feature)
30 // MONO_XEXCEPTIONS = throw an exception when a X11 error is encountered;
31 // by default a message is displayed but execution continues
33 // MONO_XSYNC = perform all X11 commands synchronous; this is slower but
34 // helps in debugging errors
39 // define to log Window handles and relationships to stdout
42 // Extra detailed debug
43 #undef DriverDebugExtra
44 #undef DriverDebugParent
45 #undef DriverDebugCreate
46 #undef DriverDebugDestroy
47 #undef DriverDebugThreads
48 #undef DriverDebugXEmbed
54 using System.ComponentModel;
55 using System.Collections;
56 using System.Diagnostics;
58 using System.Drawing.Drawing2D;
59 using System.Drawing.Imaging;
62 using System.Net.Sockets;
63 using System.Reflection;
64 using System.Runtime.InteropServices;
65 using System.Runtime.Serialization;
66 using System.Runtime.Serialization.Formatters.Binary;
68 using System.Threading;
70 // Only do the poll when building with mono for now
72 using Mono.Unix.Native;
76 namespace System.Windows.Forms {
77 internal class XplatUIX11 : XplatUIDriver {
78 #region Local Variables
80 static volatile XplatUIX11 Instance;
81 private static int RefCount;
82 private static object XlibLock; // Our locking object
83 private static bool themes_enabled;
86 private static IntPtr DisplayHandle; // X11 handle to display
87 private static int ScreenNo; // Screen number used
88 private static IntPtr DefaultColormap; // Colormap for screen
89 private static IntPtr CustomVisual; // Visual for window creation
90 private static IntPtr CustomColormap; // Colormap for window creation
91 private static IntPtr RootWindow; // Handle of the root window for the screen/display
92 private static IntPtr FosterParent; // Container to hold child windows until their parent exists
93 private static XErrorHandler ErrorHandler; // Error handler delegate
94 private static bool ErrorExceptions; // Throw exceptions on X errors
95 private int render_major_opcode;
96 private int render_first_event;
97 private int render_first_error;
100 private static IntPtr ClipMagic;
101 private static ClipboardData Clipboard; // Our clipboard
104 private static IntPtr PostAtom; // PostMessage atom
105 private static IntPtr AsyncAtom; // Support for async messages
108 private static Hashtable MessageQueues; // Holds our thread-specific XEventQueues
109 private static ArrayList unattached_timer_list; // holds timers that are enabled but not attached to a window.
111 private static Pollfd[] pollfds; // For watching the X11 socket
112 private static bool wake_waiting;
113 private static object wake_waiting_lock = new object ();
115 private static X11Keyboard Keyboard; //
116 private static X11Dnd Dnd;
117 private static Socket listen; //
118 private static Socket wake; //
119 private static Socket wake_receive; //
120 private static byte[] network_buffer; //
121 private static bool detectable_key_auto_repeat;
124 private static IntPtr ActiveWindow; // Handle of the active window
125 private static IntPtr FocusWindow; // Handle of the window with keyboard focus (if any)
128 private static Stack ModalWindows; // Stack of our modal windows
131 private static IntPtr SystrayMgrWindow; // Handle of the Systray Manager window
134 private static IntPtr LastCursorWindow; // The last window we set the cursor on
135 private static IntPtr LastCursorHandle; // The handle that was last set on LastCursorWindow
136 private static IntPtr OverrideCursorHandle; // The cursor that is set to override any other cursors
139 private static CaretStruct Caret; //
141 // Last window containing the pointer
142 private static IntPtr LastPointerWindow; // The last window containing the pointer
145 private static IntPtr WM_PROTOCOLS;
146 private static IntPtr WM_DELETE_WINDOW;
147 private static IntPtr WM_TAKE_FOCUS;
148 //private static IntPtr _NET_SUPPORTED;
149 //private static IntPtr _NET_CLIENT_LIST;
150 //private static IntPtr _NET_NUMBER_OF_DESKTOPS;
151 private static IntPtr _NET_DESKTOP_GEOMETRY;
152 //private static IntPtr _NET_DESKTOP_VIEWPORT;
153 private static IntPtr _NET_CURRENT_DESKTOP;
154 //private static IntPtr _NET_DESKTOP_NAMES;
155 private static IntPtr _NET_ACTIVE_WINDOW;
156 private static IntPtr _NET_WORKAREA;
157 //private static IntPtr _NET_SUPPORTING_WM_CHECK;
158 //private static IntPtr _NET_VIRTUAL_ROOTS;
159 //private static IntPtr _NET_DESKTOP_LAYOUT;
160 //private static IntPtr _NET_SHOWING_DESKTOP;
161 //private static IntPtr _NET_CLOSE_WINDOW;
162 //private static IntPtr _NET_MOVERESIZE_WINDOW;
163 private static IntPtr _NET_WM_MOVERESIZE;
164 //private static IntPtr _NET_RESTACK_WINDOW;
165 //private static IntPtr _NET_REQUEST_FRAME_EXTENTS;
166 private static IntPtr _NET_WM_NAME;
167 //private static IntPtr _NET_WM_VISIBLE_NAME;
168 //private static IntPtr _NET_WM_ICON_NAME;
169 //private static IntPtr _NET_WM_VISIBLE_ICON_NAME;
170 //private static IntPtr _NET_WM_DESKTOP;
171 private static IntPtr _NET_WM_WINDOW_TYPE;
172 private static IntPtr _NET_WM_STATE;
173 //private static IntPtr _NET_WM_ALLOWED_ACTIONS;
174 //private static IntPtr _NET_WM_STRUT;
175 //private static IntPtr _NET_WM_STRUT_PARTIAL;
176 //private static IntPtr _NET_WM_ICON_GEOMETRY;
177 private static IntPtr _NET_WM_ICON;
178 //private static IntPtr _NET_WM_PID;
179 //private static IntPtr _NET_WM_HANDLED_ICONS;
180 private static IntPtr _NET_WM_USER_TIME;
181 private static IntPtr _NET_FRAME_EXTENTS;
182 //private static IntPtr _NET_WM_PING;
183 //private static IntPtr _NET_WM_SYNC_REQUEST;
184 private static IntPtr _NET_SYSTEM_TRAY_S;
185 //private static IntPtr _NET_SYSTEM_TRAY_ORIENTATION;
186 private static IntPtr _NET_SYSTEM_TRAY_OPCODE;
187 private static IntPtr _NET_WM_STATE_MAXIMIZED_HORZ;
188 private static IntPtr _NET_WM_STATE_MAXIMIZED_VERT;
189 private static IntPtr _XEMBED;
190 private static IntPtr _XEMBED_INFO;
191 private static IntPtr _MOTIF_WM_HINTS;
192 private static IntPtr _NET_WM_STATE_SKIP_TASKBAR;
193 private static IntPtr _NET_WM_STATE_ABOVE;
194 private static IntPtr _NET_WM_STATE_MODAL;
195 private static IntPtr _NET_WM_STATE_HIDDEN;
196 private static IntPtr _NET_WM_CONTEXT_HELP;
197 private static IntPtr _NET_WM_WINDOW_OPACITY;
198 //private static IntPtr _NET_WM_WINDOW_TYPE_DESKTOP;
199 //private static IntPtr _NET_WM_WINDOW_TYPE_DOCK;
200 //private static IntPtr _NET_WM_WINDOW_TYPE_TOOLBAR;
201 //private static IntPtr _NET_WM_WINDOW_TYPE_MENU;
202 private static IntPtr _NET_WM_WINDOW_TYPE_UTILITY;
203 //private static IntPtr _NET_WM_WINDOW_TYPE_SPLASH;
204 // private static IntPtr _NET_WM_WINDOW_TYPE_DIALOG;
205 private static IntPtr _NET_WM_WINDOW_TYPE_NORMAL;
206 private static IntPtr CLIPBOARD;
207 private static IntPtr PRIMARY;
208 //private static IntPtr DIB;
209 private static IntPtr OEMTEXT;
210 private static IntPtr UTF8_STRING;
211 private static IntPtr UTF16_STRING;
212 private static IntPtr RICHTEXTFORMAT;
213 private static IntPtr TARGETS;
215 // mouse hover message generation
216 private static HoverStruct HoverState; //
218 // double click message generation
219 private static ClickStruct ClickPending; //
221 // Support for mouse grab
222 private static GrabStruct Grab; //
225 Point mouse_position; // Last position of mouse, in screen coords
226 internal static MouseButtons MouseState; // Last state of mouse buttons
227 internal static bool in_doevents;
229 private static int DoubleClickInterval; // msec; max interval between clicks to count as double click
231 const EventMask SelectInputMask = (EventMask.ButtonPressMask |
232 EventMask.ButtonReleaseMask |
233 EventMask.KeyPressMask |
234 EventMask.KeyReleaseMask |
235 EventMask.EnterWindowMask |
236 EventMask.LeaveWindowMask |
237 EventMask.ExposureMask |
238 EventMask.FocusChangeMask |
239 EventMask.PointerMotionMask |
240 EventMask.PointerMotionHintMask |
241 EventMask.SubstructureNotifyMask);
243 static readonly object lockobj = new object ();
245 // messages WaitForHwndMwssage is waiting on
246 static Hashtable messageHold;
248 #endregion // Local Variables
250 private XplatUIX11() {
251 // Handle singleton stuff first
255 // Now regular initialization
256 XlibLock = new object ();
257 X11Keyboard.XlibLock = XlibLock;
258 MessageQueues = Hashtable.Synchronized (new Hashtable(7));
259 unattached_timer_list = ArrayList.Synchronized (new ArrayList (3));
260 messageHold = Hashtable.Synchronized (new Hashtable(3));
261 Clipboard = new ClipboardData ();
264 ErrorExceptions = false;
266 // X11 Initialization
267 SetDisplay(XOpenDisplay(IntPtr.Zero));
268 X11DesktopColors.Initialize();
271 // Disable keyboard autorepeat
273 XkbSetDetectableAutoRepeat (DisplayHandle, true, IntPtr.Zero);
274 detectable_key_auto_repeat = true;
276 Console.Error.WriteLine ("Could not disable keyboard auto repeat, will attempt to disable manually.");
277 detectable_key_auto_repeat = false;
280 // Handle any upcoming errors; we re-set it here, X11DesktopColor stuff might have stolen it (gtk does)
281 ErrorHandler = new XErrorHandler(HandleError);
282 XSetErrorHandler(ErrorHandler);
286 // Remove our display handle from S.D
287 Graphics.FromHdcInternal (IntPtr.Zero);
290 #endregion // Constructors
292 #region Singleton Specific Code
293 public static XplatUIX11 GetInstance() {
295 if (Instance == null) {
296 Instance=new XplatUIX11();
303 public int Reference {
310 #region Internal Properties
311 internal static IntPtr Display {
313 return DisplayHandle;
317 XplatUIX11.GetInstance().SetDisplay(value);
321 internal static int Screen {
331 internal static IntPtr RootWindowHandle {
341 internal static IntPtr Visual {
347 CustomVisual = value;
351 internal static IntPtr ColorMap {
353 return CustomColormap;
357 CustomColormap = value;
362 internal static IntPtr DefaultColorMap {
364 return DefaultColormap;
370 #region XExceptionClass
371 internal class XException : ApplicationException {
375 XRequest RequestCode;
379 public XException(IntPtr Display, IntPtr ResourceID, IntPtr Serial, byte ErrorCode, XRequest RequestCode, byte MinorCode) {
380 this.Display = Display;
381 this.ResourceID = ResourceID;
382 this.Serial = Serial;
383 this.RequestCode = RequestCode;
384 this.ErrorCode = ErrorCode;
385 this.MinorCode = MinorCode;
388 public override string Message {
390 return GetMessage(Display, ResourceID, Serial, ErrorCode, RequestCode, MinorCode);
394 public static string GetMessage(IntPtr Display, IntPtr ResourceID, IntPtr Serial, byte ErrorCode, XRequest RequestCode, byte MinorCode) {
403 sb = new StringBuilder(160);
404 XGetErrorText(Display, ErrorCode, sb, sb.Capacity);
405 x_error_text = sb.ToString();
406 hwnd = Hwnd.ObjectFromHandle(ResourceID);
408 hwnd_text = hwnd.ToString();
409 c = Control.FromHandle(hwnd.Handle);
411 control_text = c.ToString();
413 control_text = String.Format("<handle {0:X} non-existant>", hwnd.Handle.ToInt32());
416 hwnd_text = "<null>";
417 control_text = "<null>";
421 error = String.Format("\n Error: {0}\n Request: {1:D} ({2})\n Resource ID: 0x{3:X}\n Serial: {4}\n Hwnd: {5}\n Control: {6}", x_error_text, RequestCode, MinorCode, ResourceID.ToInt32(), Serial, hwnd_text, control_text);
425 #endregion // XExceptionClass
427 #region Internal Methods
428 internal void SetDisplay(IntPtr display_handle) {
429 if (display_handle != IntPtr.Zero) {
432 if ((DisplayHandle != IntPtr.Zero) && (FosterParent != IntPtr.Zero)) {
433 hwnd = Hwnd.ObjectFromHandle(FosterParent);
434 XDestroyWindow(DisplayHandle, FosterParent);
438 if (DisplayHandle != IntPtr.Zero) {
439 XCloseDisplay(DisplayHandle);
442 DisplayHandle=display_handle;
444 // We need to tell System.Drawing our DisplayHandle. FromHdcInternal has
445 // been hacked to do this for us.
446 Graphics.FromHdcInternal (DisplayHandle);
448 // query for the render extension so
449 // we can ignore the spurious
450 // BadPicture errors that are
451 // generated by cairo/render.
452 XQueryExtension (DisplayHandle, "RENDER",
453 ref render_major_opcode, ref render_first_event, ref render_first_error);
456 if (Environment.GetEnvironmentVariable ("MONO_XSYNC") != null) {
457 XSynchronize(DisplayHandle, true);
460 if (Environment.GetEnvironmentVariable ("MONO_XEXCEPTIONS") != null) {
461 ErrorExceptions = true;
465 ScreenNo = XDefaultScreen(DisplayHandle);
466 RootWindow = XRootWindow(DisplayHandle, ScreenNo);
467 DefaultColormap = XDefaultColormap(DisplayHandle, ScreenNo);
469 // Create the foster parent
470 // it is important that border_width is kept in synch with the other XCreateWindow calls
471 FosterParent=XCreateSimpleWindow(DisplayHandle, RootWindow, 0, 0, 1, 1, 0, UIntPtr.Zero, UIntPtr.Zero);
472 if (FosterParent==IntPtr.Zero) {
473 Console.WriteLine("XplatUIX11 Constructor failed to create FosterParent");
476 DebugHelper.WriteLine ("FosterParent created 0x{0:x}", FosterParent.ToInt32());
479 hwnd.Queue = ThreadQueue(Thread.CurrentThread);
480 hwnd.WholeWindow = FosterParent;
481 hwnd.ClientWindow = FosterParent;
483 // Create a HWND for RootWIndow as well, so our queue doesn't eat the events
485 hwnd.Queue = ThreadQueue(Thread.CurrentThread);
486 hwnd.whole_window = RootWindow;
487 hwnd.ClientWindow = RootWindow;
489 // For sleeping on the X11 socket
490 listen = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
491 IPEndPoint ep = new IPEndPoint(IPAddress.Loopback, 0);
495 // To wake up when a timer is ready
496 network_buffer = new byte[10];
498 wake = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
499 wake.Connect(listen.LocalEndPoint);
500 wake_receive = listen.Accept();
503 pollfds = new Pollfd [2];
504 pollfds [0] = new Pollfd ();
505 pollfds [0].fd = XConnectionNumber (DisplayHandle);
506 pollfds [0].events = PollEvents.POLLIN;
508 pollfds [1] = new Pollfd ();
509 pollfds [1].fd = wake_receive.Handle.ToInt32 ();
510 pollfds [1].events = PollEvents.POLLIN;
513 Keyboard = new X11Keyboard(DisplayHandle, FosterParent);
514 Dnd = new X11Dnd (DisplayHandle, Keyboard);
516 DoubleClickInterval = 500;
518 HoverState.Interval = 500;
519 HoverState.Timer = new Timer();
520 HoverState.Timer.Enabled = false;
521 HoverState.Timer.Interval = HoverState.Interval;
522 HoverState.Timer.Tick += new EventHandler(MouseHover);
523 HoverState.Size = new Size(4, 4);
527 ActiveWindow = IntPtr.Zero;
528 FocusWindow = IntPtr.Zero;
529 ModalWindows = new Stack(3);
531 MouseState = MouseButtons.None;
532 mouse_position = new Point(0, 0);
534 Caret.Timer = new Timer();
535 Caret.Timer.Interval = 500; // FIXME - where should this number come from?
536 Caret.Timer.Tick += new EventHandler(CaretCallback);
540 // Grab atom changes off the root window to catch certain WM events
541 XSelectInput(DisplayHandle, RootWindow, new IntPtr ((int) (EventMask.PropertyChangeMask | Keyboard.KeyEventMask)));
543 // Handle any upcoming errors
544 ErrorHandler = new XErrorHandler(HandleError);
545 XSetErrorHandler(ErrorHandler);
547 throw new ArgumentNullException("Display", "Could not open display (X-Server required. Check you DISPLAY environment variable)");
550 #endregion // Internal Methods
552 #region Private Methods
553 private int unixtime() {
554 TimeSpan t = (DateTime.UtcNow - new DateTime(1970, 1, 1));
556 return (int) t.TotalSeconds;
559 private static void SetupAtoms() {
560 // make sure this array stays in sync with the statements below
561 string [] atom_names = new string[] {
566 //"_NET_CLIENT_LIST",
567 //"_NET_NUMBER_OF_DESKTOPS",
568 "_NET_DESKTOP_GEOMETRY",
569 //"_NET_DESKTOP_VIEWPORT",
570 "_NET_CURRENT_DESKTOP",
571 //"_NET_DESKTOP_NAMES",
572 "_NET_ACTIVE_WINDOW",
574 //"_NET_SUPPORTING_WM_CHECK",
575 //"_NET_VIRTUAL_ROOTS",
576 //"_NET_DESKTOP_LAYOUT",
577 //"_NET_SHOWING_DESKTOP",
578 //"_NET_CLOSE_WINDOW",
579 //"_NET_MOVERESIZE_WINDOW",
580 "_NET_WM_MOVERESIZE",
581 //"_NET_RESTACK_WINDOW",
582 //"_NET_REQUEST_FRAME_EXTENTS",
584 //"_NET_WM_VISIBLE_NAME",
585 //"_NET_WM_ICON_NAME",
586 //"_NET_WM_VISIBLE_ICON_NAME",
588 "_NET_WM_WINDOW_TYPE",
590 //"_NET_WM_ALLOWED_ACTIONS",
592 //"_NET_WM_STRUT_PARTIAL",
593 //"_NET_WM_ICON_GEOMETRY",
596 //"_NET_WM_HANDLED_ICONS",
598 "_NET_FRAME_EXTENTS",
600 //"_NET_WM_SYNC_REQUEST",
601 "_NET_SYSTEM_TRAY_OPCODE",
602 //"_NET_SYSTEM_TRAY_ORIENTATION",
603 "_NET_WM_STATE_MAXIMIZED_HORZ",
604 "_NET_WM_STATE_MAXIMIZED_VERT",
605 "_NET_WM_STATE_HIDDEN",
609 "_NET_WM_STATE_SKIP_TASKBAR",
610 "_NET_WM_STATE_ABOVE",
611 "_NET_WM_STATE_MODAL",
612 "_NET_WM_CONTEXT_HELP",
613 "_NET_WM_WINDOW_OPACITY",
614 //"_NET_WM_WINDOW_TYPE_DESKTOP",
615 //"_NET_WM_WINDOW_TYPE_DOCK",
616 //"_NET_WM_WINDOW_TYPE_TOOLBAR",
617 //"_NET_WM_WINDOW_TYPE_MENU",
618 "_NET_WM_WINDOW_TYPE_UTILITY",
619 // "_NET_WM_WINDOW_TYPE_DIALOG",
620 //"_NET_WM_WINDOW_TYPE_SPLASH",
621 "_NET_WM_WINDOW_TYPE_NORMAL",
630 "_SWF_PostMessageAtom",
633 IntPtr[] atoms = new IntPtr [atom_names.Length];;
635 XInternAtoms (DisplayHandle, atom_names, atom_names.Length, false, atoms);
638 WM_PROTOCOLS = atoms [off++];
639 WM_DELETE_WINDOW = atoms [off++];
640 WM_TAKE_FOCUS = atoms [off++];
641 //_NET_SUPPORTED = atoms [off++];
642 //_NET_CLIENT_LIST = atoms [off++];
643 //_NET_NUMBER_OF_DESKTOPS = atoms [off++];
644 _NET_DESKTOP_GEOMETRY = atoms [off++];
645 //_NET_DESKTOP_VIEWPORT = atoms [off++];
646 _NET_CURRENT_DESKTOP = atoms [off++];
647 //_NET_DESKTOP_NAMES = atoms [off++];
648 _NET_ACTIVE_WINDOW = atoms [off++];
649 _NET_WORKAREA = atoms [off++];
650 //_NET_SUPPORTING_WM_CHECK = atoms [off++];
651 //_NET_VIRTUAL_ROOTS = atoms [off++];
652 //_NET_DESKTOP_LAYOUT = atoms [off++];
653 //_NET_SHOWING_DESKTOP = atoms [off++];
654 //_NET_CLOSE_WINDOW = atoms [off++];
655 //_NET_MOVERESIZE_WINDOW = atoms [off++];
656 _NET_WM_MOVERESIZE = atoms [off++];
657 //_NET_RESTACK_WINDOW = atoms [off++];
658 //_NET_REQUEST_FRAME_EXTENTS = atoms [off++];
659 _NET_WM_NAME = atoms [off++];
660 //_NET_WM_VISIBLE_NAME = atoms [off++];
661 //_NET_WM_ICON_NAME = atoms [off++];
662 //_NET_WM_VISIBLE_ICON_NAME = atoms [off++];
663 //_NET_WM_DESKTOP = atoms [off++];
664 _NET_WM_WINDOW_TYPE = atoms [off++];
665 _NET_WM_STATE = atoms [off++];
666 //_NET_WM_ALLOWED_ACTIONS = atoms [off++];
667 //_NET_WM_STRUT = atoms [off++];
668 //_NET_WM_STRUT_PARTIAL = atoms [off++];
669 //_NET_WM_ICON_GEOMETRY = atoms [off++];
670 _NET_WM_ICON = atoms [off++];
671 //_NET_WM_PID = atoms [off++];
672 //_NET_WM_HANDLED_ICONS = atoms [off++];
673 _NET_WM_USER_TIME = atoms [off++];
674 _NET_FRAME_EXTENTS = atoms [off++];
675 //_NET_WM_PING = atoms [off++];
676 //_NET_WM_SYNC_REQUEST = atoms [off++];
677 _NET_SYSTEM_TRAY_OPCODE = atoms [off++];
678 //_NET_SYSTEM_TRAY_ORIENTATION = atoms [off++];
679 _NET_WM_STATE_MAXIMIZED_HORZ = atoms [off++];
680 _NET_WM_STATE_MAXIMIZED_VERT = atoms [off++];
681 _NET_WM_STATE_HIDDEN = atoms [off++];
682 _XEMBED = atoms [off++];
683 _XEMBED_INFO = atoms [off++];
684 _MOTIF_WM_HINTS = atoms [off++];
685 _NET_WM_STATE_SKIP_TASKBAR = atoms [off++];
686 _NET_WM_STATE_ABOVE = atoms [off++];
687 _NET_WM_STATE_MODAL = atoms [off++];
688 _NET_WM_CONTEXT_HELP = atoms [off++];
689 _NET_WM_WINDOW_OPACITY = atoms [off++];
690 //_NET_WM_WINDOW_TYPE_DESKTOP = atoms [off++];
691 //_NET_WM_WINDOW_TYPE_DOCK = atoms [off++];
692 //_NET_WM_WINDOW_TYPE_TOOLBAR = atoms [off++];
693 //_NET_WM_WINDOW_TYPE_MENU = atoms [off++];
694 _NET_WM_WINDOW_TYPE_UTILITY = atoms [off++];
695 // _NET_WM_WINDOW_TYPE_DIALOG = atoms [off++];
696 //_NET_WM_WINDOW_TYPE_SPLASH = atoms [off++];
697 _NET_WM_WINDOW_TYPE_NORMAL = atoms [off++];
698 CLIPBOARD = atoms [off++];
699 PRIMARY = atoms [off++];
700 OEMTEXT = atoms [off++];
701 UTF8_STRING = atoms [off++];
702 UTF16_STRING = atoms [off++];
703 RICHTEXTFORMAT = atoms [off++];
704 TARGETS = atoms [off++];
705 AsyncAtom = atoms [off++];
706 PostAtom = atoms [off++];
707 HoverState.Atom = atoms [off++];
709 //DIB = (IntPtr)Atom.XA_PIXMAP;
710 _NET_SYSTEM_TRAY_S = XInternAtom (DisplayHandle, "_NET_SYSTEM_TRAY_S" + ScreenNo.ToString(), false);
713 private void GetSystrayManagerWindow() {
714 XGrabServer(DisplayHandle);
715 SystrayMgrWindow = XGetSelectionOwner(DisplayHandle, _NET_SYSTEM_TRAY_S);
716 XUngrabServer(DisplayHandle);
717 XFlush(DisplayHandle);
720 private void SendNetWMMessage(IntPtr window, IntPtr message_type, IntPtr l0, IntPtr l1, IntPtr l2) {
721 SendNetWMMessage (window, message_type, l0, l1, l2, IntPtr.Zero);
724 private void SendNetWMMessage(IntPtr window, IntPtr message_type, IntPtr l0, IntPtr l1, IntPtr l2, IntPtr l3) {
728 xev.ClientMessageEvent.type = XEventName.ClientMessage;
729 xev.ClientMessageEvent.send_event = true;
730 xev.ClientMessageEvent.window = window;
731 xev.ClientMessageEvent.message_type = message_type;
732 xev.ClientMessageEvent.format = 32;
733 xev.ClientMessageEvent.ptr1 = l0;
734 xev.ClientMessageEvent.ptr2 = l1;
735 xev.ClientMessageEvent.ptr3 = l2;
736 xev.ClientMessageEvent.ptr4 = l3;
737 XSendEvent(DisplayHandle, RootWindow, false, new IntPtr ((int) (EventMask.SubstructureRedirectMask | EventMask.SubstructureNotifyMask)), ref xev);
740 private void SendNetClientMessage(IntPtr window, IntPtr message_type, IntPtr l0, IntPtr l1, IntPtr l2) {
744 xev.ClientMessageEvent.type = XEventName.ClientMessage;
745 xev.ClientMessageEvent.send_event = true;
746 xev.ClientMessageEvent.window = window;
747 xev.ClientMessageEvent.message_type = message_type;
748 xev.ClientMessageEvent.format = 32;
749 xev.ClientMessageEvent.ptr1 = l0;
750 xev.ClientMessageEvent.ptr2 = l1;
751 xev.ClientMessageEvent.ptr3 = l2;
752 XSendEvent(DisplayHandle, window, false, new IntPtr ((int)EventMask.NoEventMask), ref xev);
755 // For WM_LBUTTONDOWN, WM_MBUTTONDOWN, WM_RBUTTONDOWN, WM_XBUTTONDOWN
756 // WM_CREATE and WM_DESTROY causes
757 void SendParentNotify(IntPtr child, Msg cause, int x, int y)
761 if (child == IntPtr.Zero) {
765 hwnd = Hwnd.GetObjectFromWindow (child);
771 if (hwnd.Handle == IntPtr.Zero) {
775 if (ExStyleSet ((int) hwnd.initial_ex_style, WindowExStyles.WS_EX_NOPARENTNOTIFY)) {
779 if (hwnd.Parent == null) {
783 if (hwnd.Parent.Handle == IntPtr.Zero) {
787 if (cause == Msg.WM_CREATE || cause == Msg.WM_DESTROY) {
788 SendMessage(hwnd.Parent.Handle, Msg.WM_PARENTNOTIFY, Control.MakeParam((int)cause, 0), child);
790 SendMessage(hwnd.Parent.Handle, Msg.WM_PARENTNOTIFY, Control.MakeParam((int)cause, 0), Control.MakeParam(x, y));
793 SendParentNotify (hwnd.Parent.Handle, cause, x, y);
796 bool StyleSet (int s, WindowStyles ws)
798 return (s & (int)ws) == (int)ws;
801 bool ExStyleSet (int ex, WindowExStyles exws)
803 return (ex & (int)exws) == (int)exws;
806 internal static Rectangle TranslateClientRectangleToXClientRectangle (Hwnd hwnd)
808 return TranslateClientRectangleToXClientRectangle (hwnd, Control.FromHandle (hwnd.Handle));
811 internal static Rectangle TranslateClientRectangleToXClientRectangle (Hwnd hwnd, Control ctrl)
814 * If this is a form with no window manager, X is handling all the border and caption painting
815 * so remove that from the area (since the area we set of the window here is the part of the window
816 * we're painting in only)
818 Rectangle rect = hwnd.ClientRect;
819 Form form = ctrl as Form;
820 CreateParams cp = null;
823 cp = form.GetCreateParams ();
825 if (form != null && (form.window_manager == null && !cp.IsSet (WindowExStyles.WS_EX_TOOLWINDOW))) {
826 Hwnd.Borders borders = Hwnd.GetBorders (cp, null);
827 Rectangle xrect = rect;
829 xrect.Y -= borders.top;
830 xrect.X -= borders.left;
831 xrect.Width += borders.left + borders.right;
832 xrect.Height += borders.top + borders.bottom;
837 if (rect.Width < 1 || rect.Height < 1) {
847 internal static Size TranslateWindowSizeToXWindowSize (CreateParams cp)
849 return TranslateWindowSizeToXWindowSize (cp, new Size (cp.Width, cp.Height));
852 internal static Size TranslateWindowSizeToXWindowSize (CreateParams cp, Size size)
855 * If this is a form with no window manager, X is handling all the border and caption painting
856 * so remove that from the area (since the area we set of the window here is the part of the window
857 * we're painting in only)
859 Form form = cp.control as Form;
860 if (form != null && (form.window_manager == null && !cp.IsSet (WindowExStyles.WS_EX_TOOLWINDOW))) {
861 Hwnd.Borders borders = Hwnd.GetBorders (cp, null);
864 xrect.Width -= borders.left + borders.right;
865 xrect.Height -= borders.top + borders.bottom;
869 if (size.Height == 0)
876 internal static Size TranslateXWindowSizeToWindowSize (CreateParams cp, int xWidth, int xHeight)
879 * If this is a form with no window manager, X is handling all the border and caption painting
880 * so remove that from the area (since the area we set of the window here is the part of the window
881 * we're painting in only)
883 Size rect = new Size (xWidth, xHeight);
884 Form form = cp.control as Form;
885 if (form != null && (form.window_manager == null && !cp.IsSet (WindowExStyles.WS_EX_TOOLWINDOW))) {
886 Hwnd.Borders borders = Hwnd.GetBorders (cp, null);
889 xrect.Width += borders.left + borders.right;
890 xrect.Height += borders.top + borders.bottom;
897 internal static Point GetTopLevelWindowLocation (Hwnd hwnd)
903 XTranslateCoordinates (DisplayHandle, hwnd.whole_window, RootWindow, 0, 0, out x, out y, out dummy);
904 frame = FrameExtents (hwnd.whole_window);
909 return new Point (x, y);
912 private void DeriveStyles(int Style, int ExStyle, out FormBorderStyle border_style, out bool border_static, out TitleStyle title_style, out int caption_height, out int tool_caption_height) {
915 tool_caption_height = 19;
916 border_static = false;
918 if (StyleSet (Style, WindowStyles.WS_CHILD)) {
919 if (ExStyleSet (ExStyle, WindowExStyles.WS_EX_CLIENTEDGE)) {
920 border_style = FormBorderStyle.Fixed3D;
921 } else if (ExStyleSet (ExStyle, WindowExStyles.WS_EX_STATICEDGE)) {
922 border_style = FormBorderStyle.Fixed3D;
923 border_static = true;
924 } else if (!StyleSet (Style, WindowStyles.WS_BORDER)) {
925 border_style = FormBorderStyle.None;
927 border_style = FormBorderStyle.FixedSingle;
929 title_style = TitleStyle.None;
931 if (StyleSet (Style, WindowStyles.WS_CAPTION)) {
933 if (ExStyleSet (ExStyle, WindowExStyles.WS_EX_TOOLWINDOW)) {
934 title_style = TitleStyle.Tool;
936 title_style = TitleStyle.Normal;
940 if (ExStyleSet (ExStyle, WindowExStyles.WS_EX_MDICHILD)) {
943 if (StyleSet (Style, WindowStyles.WS_OVERLAPPEDWINDOW) ||
944 ExStyleSet (ExStyle, WindowExStyles.WS_EX_TOOLWINDOW)) {
945 border_style = (FormBorderStyle) 0xFFFF;
947 border_style = FormBorderStyle.None;
952 title_style = TitleStyle.None;
953 if (StyleSet (Style, WindowStyles.WS_CAPTION)) {
954 if (ExStyleSet (ExStyle, WindowExStyles.WS_EX_TOOLWINDOW)) {
955 title_style = TitleStyle.Tool;
957 title_style = TitleStyle.Normal;
961 border_style = FormBorderStyle.None;
963 if (StyleSet (Style, WindowStyles.WS_THICKFRAME)) {
964 if (ExStyleSet (ExStyle, WindowExStyles.WS_EX_TOOLWINDOW)) {
965 border_style = FormBorderStyle.SizableToolWindow;
967 border_style = FormBorderStyle.Sizable;
970 if (StyleSet (Style, WindowStyles.WS_CAPTION)) {
971 if (ExStyleSet (ExStyle, WindowExStyles.WS_EX_CLIENTEDGE)) {
972 border_style = FormBorderStyle.Fixed3D;
973 } else if (ExStyleSet (ExStyle, WindowExStyles.WS_EX_STATICEDGE)) {
974 border_style = FormBorderStyle.Fixed3D;
975 border_static = true;
976 } else if (ExStyleSet (ExStyle, WindowExStyles.WS_EX_DLGMODALFRAME)) {
977 border_style = FormBorderStyle.FixedDialog;
978 } else if (ExStyleSet (ExStyle, WindowExStyles.WS_EX_TOOLWINDOW)) {
979 border_style = FormBorderStyle.FixedToolWindow;
980 } else if (StyleSet (Style, WindowStyles.WS_BORDER)) {
981 border_style = FormBorderStyle.FixedSingle;
984 if (StyleSet (Style, WindowStyles.WS_BORDER)) {
985 border_style = FormBorderStyle.FixedSingle;
992 private void SetHwndStyles(Hwnd hwnd, CreateParams cp) {
993 DeriveStyles(cp.Style, cp.ExStyle, out hwnd.border_style, out hwnd.border_static, out hwnd.title_style, out hwnd.caption_height, out hwnd.tool_caption_height);
996 private void SetWMStyles(Hwnd hwnd, CreateParams cp) {
997 MotifWmHints mwmHints;
998 MotifFunctions functions;
999 MotifDecorations decorations;
1002 Rectangle client_rect;
1005 bool hide_from_taskbar;
1006 IntPtr transient_for_parent;
1008 // Windows we manage ourselves don't need WM window styles.
1009 if (cp.HasWindowManager && !cp.IsSet (WindowExStyles.WS_EX_TOOLWINDOW)) {
1014 mwmHints = new MotifWmHints();
1017 window_type = _NET_WM_WINDOW_TYPE_NORMAL;
1018 transient_for_parent = IntPtr.Zero;
1020 mwmHints.flags = (IntPtr)(MotifFlags.Functions | MotifFlags.Decorations);
1021 mwmHints.functions = (IntPtr)0;
1022 mwmHints.decorations = (IntPtr)0;
1024 form = cp.control as Form;
1026 if (ExStyleSet (cp.ExStyle, WindowExStyles.WS_EX_TOOLWINDOW)) {
1027 /* tool windows get no window manager
1031 /* just because the window doesn't get any decorations doesn't
1032 mean we should disable the functions. for instance, without
1033 MotifFunctions.Maximize, changing the windowstate to Maximized
1034 is ignored by metacity. */
1035 functions |= MotifFunctions.Move | MotifFunctions.Resize | MotifFunctions.Minimize | MotifFunctions.Maximize;
1036 } else if (form != null && form.FormBorderStyle == FormBorderStyle.None) {
1037 /* allow borderless window to be maximized */
1038 functions |= MotifFunctions.All | MotifFunctions.Resize;
1040 if (StyleSet (cp.Style, WindowStyles.WS_CAPTION)) {
1041 functions |= MotifFunctions.Move;
1042 decorations |= MotifDecorations.Title | MotifDecorations.Menu;
1045 if (StyleSet (cp.Style, WindowStyles.WS_THICKFRAME)) {
1046 functions |= MotifFunctions.Move | MotifFunctions.Resize;
1047 decorations |= MotifDecorations.Border | MotifDecorations.ResizeH;
1050 if (StyleSet (cp.Style, WindowStyles.WS_MINIMIZEBOX)) {
1051 functions |= MotifFunctions.Minimize;
1052 decorations |= MotifDecorations.Minimize;
1055 if (StyleSet (cp.Style, WindowStyles.WS_MAXIMIZEBOX)) {
1056 functions |= MotifFunctions.Maximize;
1057 decorations |= MotifDecorations.Maximize;
1060 if (StyleSet (cp.Style, WindowStyles.WS_SIZEBOX)) {
1061 functions |= MotifFunctions.Resize;
1062 decorations |= MotifDecorations.ResizeH;
1065 if (ExStyleSet (cp.ExStyle, WindowExStyles.WS_EX_DLGMODALFRAME)) {
1066 decorations |= MotifDecorations.Border;
1069 if (StyleSet (cp.Style, WindowStyles.WS_BORDER)) {
1070 decorations |= MotifDecorations.Border;
1073 if (StyleSet (cp.Style, WindowStyles.WS_DLGFRAME)) {
1074 decorations |= MotifDecorations.Border;
1077 if (StyleSet (cp.Style, WindowStyles.WS_SYSMENU)) {
1078 functions |= MotifFunctions.Close;
1081 functions &= ~(MotifFunctions.Maximize | MotifFunctions.Minimize | MotifFunctions.Close);
1082 decorations &= ~(MotifDecorations.Menu | MotifDecorations.Maximize | MotifDecorations.Minimize);
1083 if (cp.Caption == "") {
1084 functions &= ~MotifFunctions.Move;
1085 decorations &= ~(MotifDecorations.Title | MotifDecorations.ResizeH);
1090 if ((functions & MotifFunctions.Resize) == 0) {
1091 hwnd.fixed_size = true;
1092 Rectangle fixed_rectangle = new Rectangle (cp.X, cp.Y, cp.Width, cp.Height);
1093 SetWindowMinMax(hwnd.Handle, fixed_rectangle, fixed_rectangle.Size, fixed_rectangle.Size, cp);
1095 hwnd.fixed_size = false;
1098 mwmHints.functions = (IntPtr)functions;
1099 mwmHints.decorations = (IntPtr)decorations;
1102 Console.WriteLine ("SetWMStyles ({0}, {1}) functions = {2}, decorations = {3}", hwnd, cp, functions, decorations);
1105 if (cp.IsSet (WindowExStyles.WS_EX_TOOLWINDOW)) {
1106 // needed! map toolwindows to _NET_WM_WINDOW_TYPE_UTILITY to make newer metacity versions happy
1107 // and get those windows in front of their parents
1108 window_type = _NET_WM_WINDOW_TYPE_UTILITY;
1110 window_type = _NET_WM_WINDOW_TYPE_NORMAL;
1113 if (!cp.IsSet (WindowExStyles.WS_EX_APPWINDOW)) {
1114 hide_from_taskbar = true;
1115 } else if (cp.IsSet (WindowExStyles.WS_EX_TOOLWINDOW) && form != null && form.Parent != null && !form.ShowInTaskbar) {
1116 hide_from_taskbar = true;
1118 hide_from_taskbar = false;
1121 if (ExStyleSet (cp.ExStyle, WindowExStyles.WS_EX_TOOLWINDOW)) {
1122 if (form != null && !hwnd.reparented) {
1123 if (form.Owner != null && form.Owner.Handle != IntPtr.Zero) {
1124 Hwnd owner_hwnd = Hwnd.ObjectFromHandle (form.Owner.Handle);
1125 if (owner_hwnd != null)
1126 transient_for_parent = owner_hwnd.whole_window;
1130 if (StyleSet (cp.Style, WindowStyles.WS_POPUP) && (hwnd.parent != null) && (hwnd.parent.whole_window != IntPtr.Zero)) {
1131 transient_for_parent = hwnd.parent.whole_window;
1134 FormWindowState current_state = GetWindowState (hwnd.Handle);
1135 if (current_state == (FormWindowState)(-1))
1136 current_state = FormWindowState.Normal;
1138 client_rect = TranslateClientRectangleToXClientRectangle (hwnd);
1143 atoms [0] = window_type.ToInt32 ();
1144 XChangeProperty (DisplayHandle, hwnd.whole_window, _NET_WM_WINDOW_TYPE, (IntPtr)Atom.XA_ATOM, 32, PropertyMode.Replace, atoms, 1);
1146 XChangeProperty(DisplayHandle, hwnd.whole_window, _MOTIF_WM_HINTS, _MOTIF_WM_HINTS, 32, PropertyMode.Replace, ref mwmHints, 5);
1148 if (transient_for_parent != IntPtr.Zero) {
1149 XSetTransientForHint (DisplayHandle, hwnd.whole_window, transient_for_parent);
1152 MoveResizeWindow(DisplayHandle, hwnd.client_window, client_rect.X, client_rect.Y, client_rect.Width, client_rect.Height);
1154 if (hide_from_taskbar) {
1155 /* this line keeps the window from showing up in gnome's taskbar */
1156 atoms[atom_count++] = _NET_WM_STATE_SKIP_TASKBAR.ToInt32();
1158 /* we need to add these atoms in the
1159 * event we're maximized, since we're
1160 * replacing the existing
1161 * _NET_WM_STATE here. If we don't
1162 * add them, future calls to
1163 * GetWindowState will return Normal
1164 * for a window which is maximized. */
1165 if (current_state == FormWindowState.Maximized) {
1166 atoms[atom_count++] = _NET_WM_STATE_MAXIMIZED_HORZ.ToInt32();
1167 atoms[atom_count++] = _NET_WM_STATE_MAXIMIZED_VERT.ToInt32();
1170 if (form != null && form.Modal) {
1171 atoms[atom_count++] = _NET_WM_STATE_MODAL.ToInt32 ();
1174 XChangeProperty(DisplayHandle, hwnd.whole_window, _NET_WM_STATE, (IntPtr)Atom.XA_ATOM, 32, PropertyMode.Replace, atoms, atom_count);
1177 IntPtr[] atom_ptrs = new IntPtr[2];
1178 atom_ptrs[atom_count++] = WM_DELETE_WINDOW;
1179 if (ExStyleSet (cp.ExStyle, WindowExStyles.WS_EX_CONTEXTHELP)) {
1180 atom_ptrs[atom_count++] = _NET_WM_CONTEXT_HELP;
1183 XSetWMProtocols(DisplayHandle, hwnd.whole_window, atom_ptrs, atom_count);
1187 private void SetIcon(Hwnd hwnd, Icon icon)
1192 // This really needs to do whatever it
1193 // takes to remove the window manager
1194 // menu, not just delete the ICON
1195 // property. This will cause metacity
1196 // to use the "no icon set" icon, and
1197 // we'll still have an icon.
1198 XDeleteProperty (DisplayHandle, hwnd.whole_window, _NET_WM_ICON);
1206 bitmap = icon.ToBitmap();
1208 size = bitmap.Width * bitmap.Height + 2;
1209 data = new IntPtr[size];
1211 data[index++] = (IntPtr)bitmap.Width;
1212 data[index++] = (IntPtr)bitmap.Height;
1214 for (int y = 0; y < bitmap.Height; y++) {
1215 for (int x = 0; x < bitmap.Width; x++) {
1216 data[index++] = (IntPtr)bitmap.GetPixel (x, y).ToArgb ();
1220 XChangeProperty (DisplayHandle, hwnd.whole_window,
1221 _NET_WM_ICON, (IntPtr)Atom.XA_CARDINAL, 32,
1222 PropertyMode.Replace, data, size);
1226 private void WakeupMain () {
1227 wake.Send (new byte [] { 0xFF });
1230 private XEventQueue ThreadQueue(Thread thread) {
1233 queue = (XEventQueue)MessageQueues[thread];
1234 if (queue == null) {
1235 queue = new XEventQueue(thread);
1236 MessageQueues[thread] = queue;
1242 private void TranslatePropertyToClipboard(IntPtr property) {
1247 IntPtr prop = IntPtr.Zero;
1249 Clipboard.Item = null;
1251 XGetWindowProperty(DisplayHandle, FosterParent, property, IntPtr.Zero, new IntPtr (0x7fffffff), true, (IntPtr)Atom.AnyPropertyType, out actual_atom, out actual_format, out nitems, out bytes_after, ref prop);
1253 if ((long)nitems > 0) {
1254 if (property == (IntPtr)Atom.XA_STRING) {
1255 Clipboard.Item = Marshal.PtrToStringAnsi(prop);
1256 } else if (property == (IntPtr)Atom.XA_BITMAP) {
1257 // FIXME - convert bitmap to image
1258 } else if (property == (IntPtr)Atom.XA_PIXMAP) {
1259 // FIXME - convert pixmap to image
1260 } else if (property == OEMTEXT) {
1261 Clipboard.Item = Marshal.PtrToStringAnsi(prop);
1262 } else if (property == UTF8_STRING) {
1263 byte [] buffer = new byte [(int)nitems];
1264 for (int i = 0; i < (int)nitems; i++)
1265 buffer [i] = Marshal.ReadByte (prop, i);
1266 Clipboard.Item = Encoding.UTF8.GetString (buffer);
1267 } else if (property == UTF16_STRING) {
1268 Clipboard.Item = Marshal.PtrToStringUni (prop, Encoding.Unicode.GetMaxCharCount ((int)nitems));
1269 } else if (property == RICHTEXTFORMAT)
1270 Clipboard.Item = Marshal.PtrToStringAnsi(prop);
1271 else if (DataFormats.ContainsFormat (property.ToInt32 ())) {
1272 if (DataFormats.GetFormat (property.ToInt32 ()).is_serializable) {
1273 MemoryStream memory_stream = new MemoryStream ((int)nitems);
1274 for (int i = 0; i < (int)nitems; i++)
1275 memory_stream.WriteByte (Marshal.ReadByte (prop, i));
1277 memory_stream.Position = 0;
1278 BinaryFormatter formatter = new BinaryFormatter ();
1279 Clipboard.Item = formatter.Deserialize (memory_stream);
1280 memory_stream.Close ();
1288 private void AddExpose (Hwnd hwnd, bool client, int x, int y, int width, int height) {
1290 if ((hwnd == null) || (x > hwnd.Width) || (y > hwnd.Height) || ((x + width) < 0) || ((y + height) < 0)) {
1294 // Keep the invalid area as small as needed
1295 if ((x + width) > hwnd.width) {
1296 width = hwnd.width - x;
1299 if ((y + height) > hwnd.height) {
1300 height = hwnd.height - y;
1304 hwnd.AddInvalidArea(x, y, width, height);
1305 if (!hwnd.expose_pending) {
1306 if (!hwnd.nc_expose_pending) {
1307 hwnd.Queue.Paint.Enqueue(hwnd);
1309 hwnd.expose_pending = true;
1312 hwnd.AddNcInvalidArea (x, y, width, height);
1314 if (!hwnd.nc_expose_pending) {
1315 if (!hwnd.expose_pending) {
1316 hwnd.Queue.Paint.Enqueue(hwnd);
1318 hwnd.nc_expose_pending = true;
1323 private static Hwnd.Borders FrameExtents (IntPtr window)
1329 IntPtr prop = IntPtr.Zero;
1330 Hwnd.Borders rect = new Hwnd.Borders ();
1332 XGetWindowProperty (DisplayHandle, window, _NET_FRAME_EXTENTS, IntPtr.Zero, new IntPtr (16), false, (IntPtr)Atom.XA_CARDINAL, out actual_atom, out actual_format, out nitems, out bytes_after, ref prop);
1333 if (prop != IntPtr.Zero) {
1334 if (nitems.ToInt32 () == 4) {
1335 rect.left = Marshal.ReadInt32 (prop, 0);
1336 rect.right = Marshal.ReadInt32 (prop, IntPtr.Size);
1337 rect.top = Marshal.ReadInt32 (prop, 2 * IntPtr.Size);
1338 rect.bottom = Marshal.ReadInt32 (prop, 3 * IntPtr.Size);
1346 private void AddConfigureNotify (XEvent xevent) {
1349 hwnd = Hwnd.GetObjectFromWindow(xevent.ConfigureEvent.window);
1352 if (hwnd == null || hwnd.zombie) {
1355 if ((xevent.ConfigureEvent.window == hwnd.whole_window)/* && (xevent.ConfigureEvent.window == xevent.ConfigureEvent.xevent)*/) {
1356 if (hwnd.parent == null) {
1357 // The location given by the event is not reliable between different wm's,
1358 // so use an alternative way of getting it.
1359 Point location = GetTopLevelWindowLocation (hwnd);
1360 hwnd.x = location.X;
1361 hwnd.y = location.Y;
1364 // XXX this sucks. this isn't thread safe
1365 Control ctrl = Control.FromHandle (hwnd.Handle);
1366 Size TranslatedSize;
1368 TranslatedSize = TranslateXWindowSizeToWindowSize (ctrl.GetCreateParams (), xevent.ConfigureEvent.width, xevent.ConfigureEvent.height);
1370 TranslatedSize = new Size (xevent.ConfigureEvent.width, xevent.ConfigureEvent.height);
1372 hwnd.width = TranslatedSize.Width;
1373 hwnd.height = TranslatedSize.Height;
1374 hwnd.ClientRect = Rectangle.Empty;
1377 Console.WriteLine ("AddConfigureNotify (hwnd.Handle = {1}, final hwnd.rect = {0}, reported rect={2})", new Rectangle (hwnd.x, hwnd.y, hwnd.width, hwnd.height), hwnd.Handle, new Rectangle (xevent.ConfigureEvent.x, xevent.ConfigureEvent.y, xevent.ConfigureEvent.width, xevent.ConfigureEvent.width));
1379 lock (hwnd.configure_lock) {
1380 if (!hwnd.configure_pending) {
1381 hwnd.Queue.EnqueueLocked (xevent);
1382 hwnd.configure_pending = true;
1386 // We drop configure events for Client windows
1389 private void ShowCaret() {
1390 if ((Caret.gc == IntPtr.Zero) || Caret.On) {
1396 XDrawLine(DisplayHandle, Caret.Window, Caret.gc, Caret.X, Caret.Y, Caret.X, Caret.Y + Caret.Height);
1400 private void HideCaret() {
1401 if ((Caret.gc == IntPtr.Zero) || !Caret.On) {
1407 XDrawLine(DisplayHandle, Caret.Window, Caret.gc, Caret.X, Caret.Y, Caret.X, Caret.Y + Caret.Height);
1411 private int NextTimeout (ArrayList timers, DateTime now) {
1414 foreach (Timer timer in timers) {
1415 int next = (int) (timer.Expires - now).TotalMilliseconds;
1417 return 0; // Have a timer that has already expired
1420 if (next < timeout) {
1424 if (timeout < Timer.Minimum) {
1425 timeout = Timer.Minimum;
1433 private void CheckTimers (ArrayList timers, DateTime now) {
1436 count = timers.Count;
1441 for (int i = 0; i < timers.Count; i++) {
1444 timer = (Timer) timers [i];
1446 if (timer.Enabled && timer.Expires <= now && !timer.Busy) {
1448 // - Before MainForm.OnLoad if DoEvents () is called.
1449 // - After MainForm.OnLoad if not.
1452 (Application.MWFThread.Current.Context != null &&
1453 (Application.MWFThread.Current.Context.MainForm == null ||
1454 Application.MWFThread.Current.Context.MainForm.IsLoaded))) {
1464 private void WaitForHwndMessage (Hwnd hwnd, Msg message) {
1465 WaitForHwndMessage (hwnd, message, false);
1469 private void WaitForHwndMessage (Hwnd hwnd, Msg message, bool process) {
1470 MSG msg = new MSG ();
1473 queue = ThreadQueue(Thread.CurrentThread);
1475 queue.DispatchIdle = false;
1478 string key = hwnd.Handle + ":" + message;
1479 if (!messageHold.ContainsKey (key))
1480 messageHold.Add (key, 1);
1482 messageHold[key] = ((int)messageHold[key]) + 1;
1487 DebugHelper.WriteLine ("Waiting for message " + message + " on hwnd " + String.Format("0x{0:x}", hwnd.Handle.ToInt32 ()));
1488 DebugHelper.Indent ();
1490 if (PeekMessage(queue, ref msg, IntPtr.Zero, 0, 0, (uint)PeekMessageFlags.PM_REMOVE)) {
1491 if ((Msg)msg.message == Msg.WM_QUIT) {
1492 PostQuitMessage (0);
1497 DebugHelper.WriteLine ("PeekMessage got " + msg);
1499 if (msg.hwnd == hwnd.Handle) {
1500 if ((Msg)msg.message == message) {
1502 TranslateMessage (ref msg);
1503 DispatchMessage (ref msg);
1507 else if ((Msg)msg.message == Msg.WM_DESTROY)
1511 TranslateMessage (ref msg);
1512 DispatchMessage (ref msg);
1516 done = !messageHold.ContainsKey (key) || ((int)messageHold[key] < 1) || done;
1519 messageHold.Remove (key);
1521 DebugHelper.Unindent ();
1522 DebugHelper.WriteLine ("Finished waiting for " + key);
1524 queue.DispatchIdle = true;
1528 private void MapWindow(Hwnd hwnd, WindowType windows) {
1530 Form f = Control.FromHandle(hwnd.Handle) as Form;
1532 if (f.WindowState == FormWindowState.Normal) {
1533 f.waiting_showwindow = true;
1534 SendMessage(hwnd.Handle, Msg.WM_SHOWWINDOW, (IntPtr)1, IntPtr.Zero);
1538 // it's possible that our Hwnd is no
1539 // longer valid after making that
1540 // SendMessage call, so check here.
1544 if ((windows & WindowType.Whole) != 0) {
1545 XMapWindow(DisplayHandle, hwnd.whole_window);
1547 if ((windows & WindowType.Client) != 0) {
1548 XMapWindow(DisplayHandle, hwnd.client_window);
1554 if (f.waiting_showwindow) {
1555 WaitForHwndMessage (hwnd, Msg.WM_SHOWWINDOW);
1556 CreateParams cp = f.GetCreateParams();
1557 if (!ExStyleSet (cp.ExStyle, WindowExStyles.WS_EX_MDICHILD) &&
1558 !StyleSet (cp.Style, WindowStyles.WS_CHILD)) {
1559 WaitForHwndMessage (hwnd, Msg.WM_ACTIVATE, true);
1566 private void UnmapWindow(Hwnd hwnd, WindowType windows) {
1569 if (Control.FromHandle(hwnd.Handle) is Form) {
1570 f = Control.FromHandle(hwnd.Handle) as Form;
1571 if (f.WindowState == FormWindowState.Normal) {
1572 f.waiting_showwindow = true;
1573 SendMessage(hwnd.Handle, Msg.WM_SHOWWINDOW, IntPtr.Zero, IntPtr.Zero);
1577 // it's possible that our Hwnd is no
1578 // longer valid after making that
1579 // SendMessage call, so check here.
1580 // FIXME: it is likely wrong, as it has already sent WM_SHOWWINDOW
1584 if ((windows & WindowType.Client) != 0) {
1585 XUnmapWindow(DisplayHandle, hwnd.client_window);
1587 if ((windows & WindowType.Whole) != 0) {
1588 XUnmapWindow(DisplayHandle, hwnd.whole_window);
1591 hwnd.mapped = false;
1594 if (f.waiting_showwindow) {
1595 WaitForHwndMessage (hwnd, Msg.WM_SHOWWINDOW);
1596 CreateParams cp = f.GetCreateParams();
1597 if (!ExStyleSet (cp.ExStyle, WindowExStyles.WS_EX_MDICHILD) &&
1598 !StyleSet (cp.Style, WindowStyles.WS_CHILD)) {
1599 WaitForHwndMessage (hwnd, Msg.WM_ACTIVATE, true);
1606 private void UpdateMessageQueue (XEventQueue queue) {
1611 now = DateTime.UtcNow;
1614 pending = XPending (DisplayHandle);
1618 if ((queue == null || queue.DispatchIdle) && Idle != null) {
1619 Idle (this, EventArgs.Empty);
1623 pending = XPending (DisplayHandle);
1630 if (queue != null) {
1631 if (queue.Paint.Count > 0)
1634 timeout = NextTimeout (queue.timer_list, now);
1639 int length = pollfds.Length - 1;
1640 lock (wake_waiting_lock) {
1641 if (wake_waiting == false) {
1643 wake_waiting = true;
1647 Syscall.poll (pollfds, (uint)length, timeout);
1648 // Clean out buffer, so we're not busy-looping on the same data
1649 if (length == pollfds.Length) {
1650 if (pollfds[1].revents != 0)
1651 wake_receive.Receive(network_buffer, 0, 1, SocketFlags.None);
1652 lock (wake_waiting_lock) {
1653 wake_waiting = false;
1658 pending = XPending (DisplayHandle);
1664 CheckTimers (queue.timer_list, now);
1667 XEvent xevent = new XEvent ();
1670 if (XPending (DisplayHandle) == 0)
1673 XNextEvent (DisplayHandle, ref xevent);
1675 if (xevent.AnyEvent.type == XEventName.KeyPress ||
1676 xevent.AnyEvent.type == XEventName.KeyRelease) {
1677 // PreFilter() handles "shift key state updates.
1678 Keyboard.PreFilter (xevent);
1679 if (XFilterEvent (ref xevent, Keyboard.ClientWindow)) {
1680 // probably here we could raise WM_IME_KEYDOWN and
1681 // WM_IME_KEYUP, but I'm not sure it is worthy.
1685 else if (XFilterEvent (ref xevent, IntPtr.Zero))
1689 hwnd = Hwnd.GetObjectFromWindow(xevent.AnyEvent.window);
1694 Console.WriteLine ("UpdateMessageQueue (), got Event: {0}", xevent.ToString ());
1696 DebugHelper.WriteLine ("UpdateMessageQueue got Event: " + xevent.ToString ());
1698 switch (xevent.type) {
1699 case XEventName.Expose:
1700 AddExpose (hwnd, xevent.ExposeEvent.window == hwnd.ClientWindow, xevent.ExposeEvent.x, xevent.ExposeEvent.y, xevent.ExposeEvent.width, xevent.ExposeEvent.height);
1703 case XEventName.SelectionClear: {
1704 // Should we do something?
1708 case XEventName.SelectionRequest: {
1709 if (Dnd.HandleSelectionRequestEvent (ref xevent))
1713 sel_event = new XEvent();
1714 sel_event.SelectionEvent.type = XEventName.SelectionNotify;
1715 sel_event.SelectionEvent.send_event = true;
1716 sel_event.SelectionEvent.display = DisplayHandle;
1717 sel_event.SelectionEvent.selection = xevent.SelectionRequestEvent.selection;
1718 sel_event.SelectionEvent.target = xevent.SelectionRequestEvent.target;
1719 sel_event.SelectionEvent.requestor = xevent.SelectionRequestEvent.requestor;
1720 sel_event.SelectionEvent.time = xevent.SelectionRequestEvent.time;
1721 sel_event.SelectionEvent.property = IntPtr.Zero;
1723 IntPtr format_atom = xevent.SelectionRequestEvent.target;
1725 // Seems that some apps support asking for supported types
1726 if (format_atom == TARGETS) {
1733 if (Clipboard.IsSourceText) {
1734 atoms[atom_count++] = (int)Atom.XA_STRING;
1735 atoms[atom_count++] = (int)OEMTEXT;
1736 atoms[atom_count++] = (int)UTF8_STRING;
1737 atoms[atom_count++] = (int)UTF16_STRING;
1738 atoms[atom_count++] = (int)RICHTEXTFORMAT;
1739 } else if (Clipboard.IsSourceImage) {
1740 atoms[atom_count++] = (int)Atom.XA_PIXMAP;
1741 atoms[atom_count++] = (int)Atom.XA_BITMAP;
1743 // FIXME - handle other types
1746 XChangeProperty(DisplayHandle, xevent.SelectionRequestEvent.requestor, (IntPtr)xevent.SelectionRequestEvent.property,
1747 (IntPtr)xevent.SelectionRequestEvent.target, 32, PropertyMode.Replace, atoms, atom_count);
1748 sel_event.SelectionEvent.property = xevent.SelectionRequestEvent.property;
1749 } else if (format_atom == (IntPtr)RICHTEXTFORMAT) {
1750 string rtf_text = Clipboard.GetRtfText ();
1751 if (rtf_text != null) {
1752 // The RTF spec mentions that ascii is enough to contain it
1753 Byte [] bytes = Encoding.ASCII.GetBytes (rtf_text);
1754 int buflen = bytes.Length;
1755 IntPtr buffer = Marshal.AllocHGlobal (buflen);
1757 for (int i = 0; i < buflen; i++)
1758 Marshal.WriteByte (buffer, i, bytes[i]);
1760 XChangeProperty(DisplayHandle, xevent.SelectionRequestEvent.requestor, (IntPtr)xevent.SelectionRequestEvent.property,
1761 (IntPtr)xevent.SelectionRequestEvent.target, 8, PropertyMode.Replace, buffer, buflen);
1762 sel_event.SelectionEvent.property = xevent.SelectionRequestEvent.property;
1763 Marshal.FreeHGlobal(buffer);
1765 } else if (Clipboard.IsSourceText &&
1766 (format_atom == (IntPtr)Atom.XA_STRING
1767 || format_atom == OEMTEXT
1768 || format_atom == UTF16_STRING
1769 || format_atom == UTF8_STRING)) {
1770 IntPtr buffer = IntPtr.Zero;
1772 Encoding encoding = null;
1776 // Select an encoding depending on the target
1777 IntPtr target_atom = xevent.SelectionRequestEvent.target;
1778 if (target_atom == (IntPtr)Atom.XA_STRING || target_atom == OEMTEXT)
1779 // FIXME - EOMTEXT should encode into ISO2022
1780 encoding = Encoding.ASCII;
1781 else if (target_atom == UTF16_STRING)
1782 encoding = Encoding.Unicode;
1783 else if (target_atom == UTF8_STRING)
1784 encoding = Encoding.UTF8;
1788 bytes = encoding.GetBytes (Clipboard.GetPlainText ());
1789 buffer = Marshal.AllocHGlobal (bytes.Length);
1790 buflen = bytes.Length;
1792 for (int i = 0; i < buflen; i++)
1793 Marshal.WriteByte (buffer, i, bytes [i]);
1795 if (buffer != IntPtr.Zero) {
1796 XChangeProperty(DisplayHandle, xevent.SelectionRequestEvent.requestor, (IntPtr)xevent.SelectionRequestEvent.property, (IntPtr)xevent.SelectionRequestEvent.target, 8, PropertyMode.Replace, buffer, buflen);
1797 sel_event.SelectionEvent.property = xevent.SelectionRequestEvent.property;
1798 Marshal.FreeHGlobal(buffer);
1800 } else if (Clipboard.GetSource (format_atom.ToInt32 ()) != null) { // check if we have an available value of this format
1801 if (DataFormats.GetFormat (format_atom.ToInt32 ()).is_serializable) {
1802 object serializable = Clipboard.GetSource (format_atom.ToInt32 ());
1804 BinaryFormatter formatter = new BinaryFormatter ();
1805 MemoryStream memory_stream = new MemoryStream ();
1806 formatter.Serialize (memory_stream, serializable);
1808 int buflen = (int)memory_stream.Length;
1809 IntPtr buffer = Marshal.AllocHGlobal (buflen);
1810 memory_stream.Position = 0;
1811 for (int i = 0; i < buflen; i++)
1812 Marshal.WriteByte (buffer, i, (byte)memory_stream.ReadByte ());
1813 memory_stream.Close ();
1815 XChangeProperty (DisplayHandle, xevent.SelectionRequestEvent.requestor, (IntPtr)xevent.SelectionRequestEvent.property, (IntPtr)xevent.SelectionRequestEvent.target,
1816 8, PropertyMode.Replace, buffer, buflen);
1817 sel_event.SelectionEvent.property = xevent.SelectionRequestEvent.property;
1818 Marshal.FreeHGlobal (buffer);
1821 } else if (Clipboard.IsSourceImage) {
1822 if (xevent.SelectionEvent.target == (IntPtr)Atom.XA_PIXMAP) {
1823 // FIXME - convert image and store as property
1824 } else if (xevent.SelectionEvent.target == (IntPtr)Atom.XA_PIXMAP) {
1825 // FIXME - convert image and store as property
1829 XSendEvent(DisplayHandle, xevent.SelectionRequestEvent.requestor, false, new IntPtr ((int)EventMask.NoEventMask), ref sel_event);
1833 case XEventName.SelectionNotify: {
1834 if (Clipboard.Enumerating) {
1835 Clipboard.Enumerating = false;
1836 if (xevent.SelectionEvent.property != IntPtr.Zero) {
1837 XDeleteProperty(DisplayHandle, FosterParent, (IntPtr)xevent.SelectionEvent.property);
1838 if (!Clipboard.Formats.Contains(xevent.SelectionEvent.property)) {
1839 Clipboard.Formats.Add(xevent.SelectionEvent.property);
1840 #if DriverDebugExtra
1841 Console.WriteLine("Got supported clipboard atom format: {0}", xevent.SelectionEvent.property);
1845 } else if (Clipboard.Retrieving) {
1846 Clipboard.Retrieving = false;
1847 if (xevent.SelectionEvent.property != IntPtr.Zero) {
1848 TranslatePropertyToClipboard(xevent.SelectionEvent.property);
1850 Clipboard.ClearSources ();
1851 Clipboard.Item = null;
1854 Dnd.HandleSelectionNotifyEvent (ref xevent);
1859 case XEventName.KeyRelease:
1860 if (!detectable_key_auto_repeat && XPending (DisplayHandle) != 0) {
1861 XEvent nextevent = new XEvent ();
1863 XPeekEvent (DisplayHandle, ref nextevent);
1865 if (nextevent.type == XEventName.KeyPress &&
1866 nextevent.KeyEvent.keycode == xevent.KeyEvent.keycode &&
1867 nextevent.KeyEvent.time == xevent.KeyEvent.time) {
1871 goto case XEventName.KeyPress;
1873 case XEventName.MotionNotify: {
1876 /* we can't do motion compression across threads, so just punt if we don't match up */
1877 if (Thread.CurrentThread == hwnd.Queue.Thread && hwnd.Queue.Count > 0) {
1878 peek = hwnd.Queue.Peek();
1879 if (peek.AnyEvent.type == XEventName.MotionNotify) {
1883 goto case XEventName.KeyPress;
1886 case XEventName.KeyPress:
1887 hwnd.Queue.EnqueueLocked (xevent);
1888 /* Process KeyPresses immediately. Otherwise multiple Compose messages as a result of a
1889 * single physical keypress are not processed correctly */
1891 case XEventName.ButtonPress:
1892 case XEventName.ButtonRelease:
1893 case XEventName.EnterNotify:
1894 case XEventName.LeaveNotify:
1895 case XEventName.CreateNotify:
1896 case XEventName.DestroyNotify:
1897 case XEventName.FocusIn:
1898 case XEventName.FocusOut:
1899 case XEventName.ClientMessage:
1900 case XEventName.ReparentNotify:
1901 case XEventName.MapNotify:
1902 case XEventName.UnmapNotify:
1903 hwnd.Queue.EnqueueLocked (xevent);
1906 case XEventName.ConfigureNotify:
1907 AddConfigureNotify(xevent);
1910 case XEventName.PropertyNotify:
1912 Console.WriteLine ("UpdateMessageQueue (), got Event: {0}", xevent.ToString ());
1914 if (xevent.PropertyEvent.atom == _NET_ACTIVE_WINDOW) {
1919 IntPtr prop = IntPtr.Zero;
1922 prev_active = ActiveWindow;
1923 XGetWindowProperty(DisplayHandle, RootWindow, _NET_ACTIVE_WINDOW, IntPtr.Zero, new IntPtr (1), false, (IntPtr)Atom.XA_WINDOW, out actual_atom, out actual_format, out nitems, out bytes_after, ref prop);
1924 if (((long)nitems > 0) && (prop != IntPtr.Zero)) {
1925 ActiveWindow = Hwnd.GetHandleFromWindow((IntPtr)Marshal.ReadInt32(prop));
1928 DebugHelper.WriteLine ("PropertyNotify: _NET_ACTIVE_WINDOW: previous = 0x{0:x}, new = 0x{1:x}", prev_active.ToInt32 (), ActiveWindow.ToInt32 ());
1930 if (prev_active != ActiveWindow) {
1931 if (prev_active != IntPtr.Zero) {
1932 PostMessage(prev_active, Msg.WM_ACTIVATE, (IntPtr)WindowActiveFlags.WA_INACTIVE, IntPtr.Zero);
1934 if (ActiveWindow != IntPtr.Zero) {
1935 PostMessage(ActiveWindow, Msg.WM_ACTIVATE, (IntPtr)WindowActiveFlags.WA_ACTIVE, IntPtr.Zero);
1938 if (ModalWindows.Count == 0) {
1941 // Modality Handling
1943 // If there is a modal window on the stack and the new active
1944 // window is MWF window, but not the modal one and not a non-modal
1945 // child of the modal one, switch back to the modal window.
1947 // To identify if a non-modal form is child of a modal form
1948 // we match their ApplicationContexts, which will be the same.
1949 // This is because each modal form runs the loop with a
1950 // new ApplicationContext, which is inherited by the non-modal
1953 Form activeForm = Control.FromHandle (ActiveWindow) as Form;
1954 if (activeForm != null) {
1955 Form modalForm = Control.FromHandle ((IntPtr)ModalWindows.Peek()) as Form;
1956 if (ActiveWindow != (IntPtr)ModalWindows.Peek() &&
1957 (modalForm == null || activeForm.context == modalForm.context)) {
1958 Activate((IntPtr)ModalWindows.Peek());
1965 else if (xevent.PropertyEvent.atom == _NET_WM_STATE) {
1966 // invalidate our cache - we'll query again the next time someone does GetWindowState.
1967 hwnd.cached_window_state = (FormWindowState)(-1);
1968 PostMessage (hwnd.Handle, Msg.WM_WINDOWPOSCHANGED, IntPtr.Zero, IntPtr.Zero);
1976 private IntPtr GetMousewParam(int Delta) {
1979 if ((MouseState & MouseButtons.Left) != 0) {
1980 result |= (int)MsgButtons.MK_LBUTTON;
1983 if ((MouseState & MouseButtons.Middle) != 0) {
1984 result |= (int)MsgButtons.MK_MBUTTON;
1987 if ((MouseState & MouseButtons.Right) != 0) {
1988 result |= (int)MsgButtons.MK_RBUTTON;
1991 Keys mods = ModifierKeys;
1992 if ((mods & Keys.Control) != 0) {
1993 result |= (int)MsgButtons.MK_CONTROL;
1996 if ((mods & Keys.Shift) != 0) {
1997 result |= (int)MsgButtons.MK_SHIFT;
2000 result |= Delta << 16;
2002 return (IntPtr)result;
2004 private IntPtr XGetParent(IntPtr handle) {
2011 XQueryTree(DisplayHandle, handle, out Root, out Parent, out Children, out ChildCount);
2014 if (Children!=IntPtr.Zero) {
2022 private int HandleError (IntPtr display, ref XErrorEvent error_event)
2024 // we need to workaround a problem with the
2025 // ordering of destruction of Drawables and
2026 // Pictures that exists between cairo and
2027 // RENDER on the server.
2028 if (error_event.request_code == (XRequest)render_major_opcode
2029 && error_event.minor_code == 7 /* X_RenderFreePicture from render.h */
2030 && error_event.error_code == render_first_error + 1 /* BadPicture from render.h */) {
2034 if (ErrorExceptions) {
2035 XUngrabPointer (display, IntPtr.Zero);
2036 throw new XException (error_event.display, error_event.resourceid,
2037 error_event.serial, error_event.error_code,
2038 error_event.request_code, error_event.minor_code);
2040 Console.WriteLine("X11 Error encountered: {0}{1}\n",
2041 XException.GetMessage (error_event.display, error_event.resourceid,
2042 error_event.serial, error_event.error_code,
2043 error_event.request_code, error_event.minor_code),
2044 Environment.StackTrace);
2049 private void AccumulateDestroyedHandles (Control c, ArrayList list)
2051 DebugHelper.Enter ();
2054 Control[] controls = c.Controls.GetAllControls ();
2056 DebugHelper.WriteLine ("Checking control:0x{0:x}", c.IsHandleCreated ? c.Handle.ToInt32() : 0);
2058 if (c.IsHandleCreated && !c.IsDisposed) {
2059 Hwnd hwnd = Hwnd.ObjectFromHandle(c.Handle);
2061 #if DriverDebug || DriverDebugDestroy
2062 Console.WriteLine (" + adding {0} to the list of zombie windows", XplatUI.Window (hwnd.Handle));
2063 Console.WriteLine (" + parent X window is {0:X}", XGetParent (hwnd.whole_window).ToInt32());
2067 CleanupCachedWindows (hwnd);
2070 for (int i = 0; i < controls.Length; i ++) {
2071 AccumulateDestroyedHandles (controls[i], list);
2074 DebugHelper.Leave ();
2077 void CleanupCachedWindows (Hwnd hwnd)
2079 if (ActiveWindow == hwnd.Handle) {
2080 SendMessage(hwnd.client_window, Msg.WM_ACTIVATE, (IntPtr)WindowActiveFlags.WA_INACTIVE, IntPtr.Zero);
2081 ActiveWindow = IntPtr.Zero;
2084 if (FocusWindow == hwnd.Handle) {
2085 SendMessage(hwnd.client_window, Msg.WM_KILLFOCUS, IntPtr.Zero, IntPtr.Zero);
2086 FocusWindow = IntPtr.Zero;
2089 if (Grab.Hwnd == hwnd.Handle) {
2090 Grab.Hwnd = IntPtr.Zero;
2091 Grab.Confined = false;
2094 DestroyCaret (hwnd.Handle);
2097 private void PerformNCCalc(Hwnd hwnd) {
2098 XplatUIWin32.NCCALCSIZE_PARAMS ncp;
2102 rect = new Rectangle (0, 0, hwnd.Width, hwnd.Height);
2104 ncp = new XplatUIWin32.NCCALCSIZE_PARAMS();
2105 ptr = Marshal.AllocHGlobal(Marshal.SizeOf(ncp));
2107 ncp.rgrc1.left = rect.Left;
2108 ncp.rgrc1.top = rect.Top;
2109 ncp.rgrc1.right = rect.Right;
2110 ncp.rgrc1.bottom = rect.Bottom;
2112 Marshal.StructureToPtr(ncp, ptr, true);
2113 NativeWindow.WndProc(hwnd.client_window, Msg.WM_NCCALCSIZE, (IntPtr)1, ptr);
2114 ncp = (XplatUIWin32.NCCALCSIZE_PARAMS)Marshal.PtrToStructure(ptr, typeof(XplatUIWin32.NCCALCSIZE_PARAMS));
2115 Marshal.FreeHGlobal(ptr);
2118 rect = new Rectangle(ncp.rgrc1.left, ncp.rgrc1.top, ncp.rgrc1.right - ncp.rgrc1.left, ncp.rgrc1.bottom - ncp.rgrc1.top);
2119 hwnd.ClientRect = rect;
2121 rect = TranslateClientRectangleToXClientRectangle (hwnd);
2124 MoveResizeWindow (DisplayHandle, hwnd.client_window, rect.X, rect.Y, rect.Width, rect.Height);
2127 AddExpose (hwnd, hwnd.WholeWindow == hwnd.ClientWindow, 0, 0, hwnd.Width, hwnd.Height);
2129 #endregion // Private Methods
2132 private void MouseHover(object sender, EventArgs e) {
2136 HoverState.Timer.Enabled = false;
2138 if (HoverState.Window != IntPtr.Zero) {
2139 hwnd = Hwnd.GetObjectFromWindow(HoverState.Window);
2141 xevent = new XEvent ();
2143 xevent.type = XEventName.ClientMessage;
2144 xevent.ClientMessageEvent.display = DisplayHandle;
2145 xevent.ClientMessageEvent.window = HoverState.Window;
2146 xevent.ClientMessageEvent.message_type = HoverState.Atom;
2147 xevent.ClientMessageEvent.format = 32;
2148 xevent.ClientMessageEvent.ptr1 = (IntPtr) (HoverState.Y << 16 | HoverState.X);
2150 hwnd.Queue.EnqueueLocked (xevent);
2157 private void CaretCallback(object sender, EventArgs e) {
2161 Caret.On = !Caret.On;
2163 XDrawLine(DisplayHandle, Caret.Hwnd, Caret.gc, Caret.X, Caret.Y, Caret.X, Caret.Y + Caret.Height);
2165 #endregion // Callbacks
2167 #region Public Properties
2169 internal override int CaptionHeight {
2175 internal override Size CursorSize {
2180 if (XQueryBestCursor(DisplayHandle, RootWindow, 32, 32, out x, out y) != 0) {
2181 return new Size(x, y);
2183 return new Size(16, 16);
2188 internal override bool DragFullWindows {
2194 internal override Size DragSize {
2196 return new Size(4, 4);
2200 internal override Size FrameBorderSize {
2202 return new Size (4, 4);
2206 internal override Size IconSize {
2212 if (XGetIconSizes(DisplayHandle, RootWindow, out list, out count) != 0) {
2216 current = (long)list;
2219 size = new XIconSize();
2221 for (int i = 0; i < count; i++) {
2222 size = (XIconSize)Marshal.PtrToStructure((IntPtr)current, size.GetType());
2223 current += Marshal.SizeOf(size);
2225 // Look for our preferred size
2226 if (size.min_width == 32) {
2228 return new Size(32, 32);
2231 if (size.max_width == 32) {
2233 return new Size(32, 32);
2236 if (size.min_width < 32 && size.max_width > 32) {
2239 // check if we can fit one
2241 while (x < size.max_width) {
2242 x += size.width_inc;
2245 return new Size(32, 32);
2250 if (largest < size.max_width) {
2251 largest = size.max_width;
2255 // We didn't find a match or we wouldn't be here
2256 return new Size(largest, largest);
2259 return new Size(32, 32);
2264 internal override int KeyboardSpeed {
2267 // A lot harder: need to do:
2268 // XkbQueryExtension(0x08051008, 0xbfffdf4c, 0xbfffdf50, 0xbfffdf54, 0xbfffdf58) = 1
2269 // XkbAllocKeyboard(0x08051008, 0xbfffdf4c, 0xbfffdf50, 0xbfffdf54, 0xbfffdf58) = 0x080517a8
2270 // XkbGetControls(0x08051008, 1, 0x080517a8, 0xbfffdf54, 0xbfffdf58) = 0
2272 // And from that we can tell the repetition rate
2274 // Notice, the values must map to:
2275 // [0, 31] which maps to 2.5 to 30 repetitions per second.
2281 internal override int KeyboardDelay {
2284 // Return values must range from 0 to 4, 0 meaning 250ms,
2285 // and 4 meaning 1000 ms.
2287 return 1; // ie, 500 ms
2291 internal override Size MaxWindowTrackSize {
2293 return new Size (WorkingArea.Width, WorkingArea.Height);
2297 internal override bool MenuAccessKeysUnderlined {
2303 internal override Size MinimizedWindowSpacingSize {
2305 return new Size(1, 1);
2309 internal override Size MinimumWindowSize {
2311 return new Size(110, 22);
2315 internal override Size MinimumFixedToolWindowSize {
2316 get { return new Size (27, 22); }
2319 internal override Size MinimumSizeableToolWindowSize {
2320 get { return new Size (37, 22); }
2323 internal override Size MinimumNoBorderWindowSize {
2324 get { return new Size (2, 2); }
2327 internal override Keys ModifierKeys {
2329 return Keyboard.ModifierKeys;
2333 internal override Size SmallIconSize {
2339 if (XGetIconSizes(DisplayHandle, RootWindow, out list, out count) != 0) {
2343 current = (long)list;
2346 size = new XIconSize();
2348 for (int i = 0; i < count; i++) {
2349 size = (XIconSize)Marshal.PtrToStructure((IntPtr)current, size.GetType());
2350 current += Marshal.SizeOf(size);
2352 // Look for our preferred size
2353 if (size.min_width == 16) {
2355 return new Size(16, 16);
2358 if (size.max_width == 16) {
2360 return new Size(16, 16);
2363 if (size.min_width < 16 && size.max_width > 16) {
2366 // check if we can fit one
2368 while (x < size.max_width) {
2369 x += size.width_inc;
2372 return new Size(16, 16);
2377 if (smallest == 0 || smallest > size.min_width) {
2378 smallest = size.min_width;
2382 // We didn't find a match or we wouldn't be here
2383 return new Size(smallest, smallest);
2386 return new Size(16, 16);
2391 internal override int MouseButtonCount {
2397 internal override bool MouseButtonsSwapped {
2399 return false; // FIXME - how to detect?
2403 internal override Point MousePosition {
2405 return mouse_position;
2409 internal override Size MouseHoverSize {
2411 return new Size (1, 1);
2415 internal override int MouseHoverTime {
2417 return HoverState.Interval;
2423 internal override bool MouseWheelPresent {
2425 return true; // FIXME - how to detect?
2429 internal override MouseButtons MouseButtons {
2435 internal override Rectangle VirtualScreen {
2441 IntPtr prop = IntPtr.Zero;
2445 XGetWindowProperty(DisplayHandle, RootWindow, _NET_DESKTOP_GEOMETRY, IntPtr.Zero, new IntPtr (256), false, (IntPtr)Atom.XA_CARDINAL, out actual_atom, out actual_format, out nitems, out bytes_after, ref prop);
2446 if ((long)nitems < 2)
2449 width = Marshal.ReadIntPtr(prop, 0).ToInt32();
2450 height = Marshal.ReadIntPtr(prop, IntPtr.Size).ToInt32();
2454 return new Rectangle(0, 0, width, height);
2457 XWindowAttributes attributes=new XWindowAttributes();
2460 XGetWindowAttributes(DisplayHandle, XRootWindow(DisplayHandle, 0), ref attributes);
2463 return new Rectangle(0, 0, attributes.width, attributes.height);
2467 internal override Rectangle WorkingArea {
2473 IntPtr prop = IntPtr.Zero;
2476 int current_desktop;
2480 XGetWindowProperty(DisplayHandle, RootWindow, _NET_CURRENT_DESKTOP, IntPtr.Zero, new IntPtr(1), false, (IntPtr)Atom.XA_CARDINAL, out actual_atom, out actual_format, out nitems, out bytes_after, ref prop);
2481 if ((long)nitems < 1) {
2485 current_desktop = Marshal.ReadIntPtr(prop, 0).ToInt32();
2488 XGetWindowProperty(DisplayHandle, RootWindow, _NET_WORKAREA, IntPtr.Zero, new IntPtr (256), false, (IntPtr)Atom.XA_CARDINAL, out actual_atom, out actual_format, out nitems, out bytes_after, ref prop);
2489 if ((long)nitems < 4 * (current_desktop + 1)) {
2493 x = Marshal.ReadIntPtr(prop, IntPtr.Size * 4 * current_desktop).ToInt32();
2494 y = Marshal.ReadIntPtr(prop, IntPtr.Size * 4 * current_desktop + IntPtr.Size).ToInt32();
2495 width = Marshal.ReadIntPtr(prop, IntPtr.Size * 4 * current_desktop + IntPtr.Size * 2).ToInt32();
2496 height = Marshal.ReadIntPtr(prop, IntPtr.Size * 4 * current_desktop + IntPtr.Size * 3).ToInt32();
2499 return new Rectangle(x, y, width, height);
2502 XWindowAttributes attributes=new XWindowAttributes();
2505 XGetWindowAttributes(DisplayHandle, XRootWindow(DisplayHandle, 0), ref attributes);
2508 return new Rectangle(0, 0, attributes.width, attributes.height);
2512 internal override bool ThemesEnabled {
2514 return XplatUIX11.themes_enabled;
2519 #endregion // Public properties
2521 #region Public Static Methods
2522 internal override void RaiseIdle (EventArgs e)
2528 internal override IntPtr InitializeDriver() {
2530 if (DisplayHandle==IntPtr.Zero) {
2531 SetDisplay(XOpenDisplay(IntPtr.Zero));
2537 internal override void ShutdownDriver(IntPtr token) {
2539 if (DisplayHandle!=IntPtr.Zero) {
2540 XCloseDisplay(DisplayHandle);
2541 DisplayHandle=IntPtr.Zero;
2546 internal override void EnableThemes() {
2547 themes_enabled = true;
2551 internal override void Activate(IntPtr handle) {
2554 hwnd = Hwnd.ObjectFromHandle(handle);
2558 if (true /* the window manager supports NET_ACTIVE_WINDOW */) {
2559 SendNetWMMessage(hwnd.whole_window, _NET_ACTIVE_WINDOW, (IntPtr)1, IntPtr.Zero, IntPtr.Zero);
2560 XEventQueue q = null;
2561 lock (unattached_timer_list) {
2562 foreach (Timer t in unattached_timer_list) {
2564 q= (XEventQueue) MessageQueues [Thread.CurrentThread];
2565 t.thread = q.Thread;
2566 q.timer_list.Add (t);
2568 unattached_timer_list.Clear ();
2572 // XRaiseWindow(DisplayHandle, handle);
2578 internal override void AudibleAlert(AlertType alert) {
2579 XBell(DisplayHandle, 0);
2584 internal override void CaretVisible(IntPtr handle, bool visible) {
2585 if (Caret.Hwnd == handle) {
2587 if (!Caret.Visible) {
2588 Caret.Visible = true;
2590 Caret.Timer.Start();
2593 Caret.Visible = false;
2600 internal override bool CalculateWindowRect(ref Rectangle ClientRect, CreateParams cp, Menu menu, out Rectangle WindowRect) {
2601 WindowRect = Hwnd.GetWindowRectangle (cp, menu, ClientRect);
2605 internal override void ClientToScreen(IntPtr handle, ref int x, ref int y) {
2611 hwnd = Hwnd.ObjectFromHandle(handle);
2614 XTranslateCoordinates(DisplayHandle, hwnd.client_window, RootWindow, x, y, out dest_x_return, out dest_y_return, out child);
2621 internal override int[] ClipboardAvailableFormats(IntPtr handle) {
2622 DataFormats.Format f;
2625 f = DataFormats.Format.List;
2627 if (XGetSelectionOwner(DisplayHandle, CLIPBOARD) == IntPtr.Zero) {
2631 Clipboard.Formats = new ArrayList();
2634 XConvertSelection(DisplayHandle, CLIPBOARD, (IntPtr)f.Id, (IntPtr)f.Id, FosterParent, IntPtr.Zero);
2636 Clipboard.Enumerating = true;
2637 while (Clipboard.Enumerating) {
2638 UpdateMessageQueue(null);
2643 result = new int[Clipboard.Formats.Count];
2645 for (int i = 0; i < Clipboard.Formats.Count; i++) {
2646 result[i] = ((IntPtr)Clipboard.Formats[i]).ToInt32 ();
2649 Clipboard.Formats = null;
2653 internal override void ClipboardClose(IntPtr handle) {
2654 if (handle != ClipMagic) {
2655 throw new ArgumentException("handle is not a valid clipboard handle");
2660 internal override int ClipboardGetID(IntPtr handle, string format) {
2661 if (handle != ClipMagic) {
2662 throw new ArgumentException("handle is not a valid clipboard handle");
2665 if (format == "Text" ) return (int)Atom.XA_STRING;
2666 else if (format == "Bitmap" ) return (int)Atom.XA_BITMAP;
2667 //else if (format == "MetaFilePict" ) return 3;
2668 //else if (format == "SymbolicLink" ) return 4;
2669 //else if (format == "DataInterchangeFormat" ) return 5;
2670 //else if (format == "Tiff" ) return 6;
2671 else if (format == "OEMText" ) return OEMTEXT.ToInt32();
2672 else if (format == "DeviceIndependentBitmap" ) return (int)Atom.XA_PIXMAP;
2673 else if (format == "Palette" ) return (int)Atom.XA_COLORMAP; // Useless
2674 //else if (format == "PenData" ) return 10;
2675 //else if (format == "RiffAudio" ) return 11;
2676 //else if (format == "WaveAudio" ) return 12;
2677 else if (format == "UnicodeText" ) return UTF16_STRING.ToInt32();
2678 //else if (format == "EnhancedMetafile" ) return 14;
2679 //else if (format == "FileDrop" ) return 15;
2680 //else if (format == "Locale" ) return 16;
2681 else if (format == "Rich Text Format") return RICHTEXTFORMAT.ToInt32 ();
2683 return XInternAtom(DisplayHandle, format, false).ToInt32();
2686 internal override IntPtr ClipboardOpen(bool primary_selection) {
2687 if (!primary_selection)
2688 ClipMagic = CLIPBOARD;
2690 ClipMagic = PRIMARY;
2694 internal override object ClipboardRetrieve(IntPtr handle, int type, XplatUI.ClipboardToObject converter) {
2695 XConvertSelection(DisplayHandle, handle, (IntPtr)type, (IntPtr)type, FosterParent, IntPtr.Zero);
2697 Clipboard.Retrieving = true;
2698 while (Clipboard.Retrieving) {
2699 UpdateMessageQueue(null);
2702 return Clipboard.Item;
2705 internal override void ClipboardStore(IntPtr handle, object obj, int type, XplatUI.ObjectToClipboard converter) {
2706 Clipboard.Converter = converter;
2709 Clipboard.AddSource (type, obj);
2710 XSetSelectionOwner(DisplayHandle, CLIPBOARD, FosterParent, IntPtr.Zero);
2712 // Clearing the selection
2713 Clipboard.ClearSources ();
2714 XSetSelectionOwner(DisplayHandle, CLIPBOARD, IntPtr.Zero, IntPtr.Zero);
2718 internal override void CreateCaret (IntPtr handle, int width, int height)
2720 XGCValues gc_values;
2723 hwnd = Hwnd.ObjectFromHandle(handle);
2725 if (Caret.Hwnd != IntPtr.Zero) {
2726 DestroyCaret(Caret.Hwnd);
2729 Caret.Hwnd = handle;
2730 Caret.Window = hwnd.client_window;
2731 Caret.Width = width;
2732 Caret.Height = height;
2733 Caret.Visible = false;
2736 gc_values = new XGCValues();
2737 gc_values.line_width = width;
2739 Caret.gc = XCreateGC(DisplayHandle, Caret.Window, new IntPtr ((int)GCFunction.GCLineWidth), ref gc_values);
2740 if (Caret.gc == IntPtr.Zero) {
2741 Caret.Hwnd = IntPtr.Zero;
2745 XSetFunction(DisplayHandle, Caret.gc, GXFunction.GXinvert);
2748 internal override IntPtr CreateWindow (CreateParams cp)
2750 XSetWindowAttributes Attributes;
2752 Hwnd parent_hwnd = null;
2757 IntPtr ParentHandle;
2759 IntPtr ClientWindow;
2760 SetWindowValuemask ValueMask;
2765 Attributes = new XSetWindowAttributes();
2771 if (Width<1) Width=1;
2772 if (Height<1) Height=1;
2774 if (cp.Parent != IntPtr.Zero) {
2775 parent_hwnd = Hwnd.ObjectFromHandle(cp.Parent);
2776 ParentHandle = parent_hwnd.client_window;
2778 if (StyleSet (cp.Style, WindowStyles.WS_CHILD)) {
2779 // We need to use our foster parent window until this poor child gets it's parent assigned
2780 ParentHandle=FosterParent;
2782 ParentHandle=RootWindow;
2786 // Set the default location location for forms.
2788 if (cp.control is Form) {
2789 next = Hwnd.GetNextStackedFormLocation (cp, parent_hwnd);
2793 ValueMask = SetWindowValuemask.BitGravity | SetWindowValuemask.WinGravity;
2795 Attributes.bit_gravity = Gravity.NorthWestGravity;
2796 Attributes.win_gravity = Gravity.NorthWestGravity;
2798 // Save what's under the toolwindow
2799 if (ExStyleSet (cp.ExStyle, WindowExStyles.WS_EX_TOOLWINDOW)) {
2800 Attributes.save_under = true;
2801 ValueMask |= SetWindowValuemask.SaveUnder;
2805 // If we're a popup without caption we override the WM
2806 if (StyleSet (cp.Style, WindowStyles.WS_POPUP) && !StyleSet (cp.Style, WindowStyles.WS_CAPTION)) {
2807 Attributes.override_redirect = true;
2808 ValueMask |= SetWindowValuemask.OverrideRedirect;
2814 hwnd.height = Height;
2815 hwnd.parent = Hwnd.ObjectFromHandle(cp.Parent);
2816 hwnd.initial_style = cp.WindowStyle;
2817 hwnd.initial_ex_style = cp.WindowExStyle;
2819 if (StyleSet (cp.Style, WindowStyles.WS_DISABLED)) {
2820 hwnd.enabled = false;
2823 ClientWindow = IntPtr.Zero;
2825 Size XWindowSize = TranslateWindowSizeToXWindowSize (cp);
2826 Rectangle XClientRect = TranslateClientRectangleToXClientRectangle (hwnd, cp.control);
2829 WholeWindow = XCreateWindow(DisplayHandle, ParentHandle, X, Y, XWindowSize.Width, XWindowSize.Height, 0, (int)CreateWindowArgs.CopyFromParent, (int)CreateWindowArgs.InputOutput, IntPtr.Zero, new UIntPtr ((uint)ValueMask), ref Attributes);
2830 if (WholeWindow != IntPtr.Zero) {
2831 ValueMask &= ~(SetWindowValuemask.OverrideRedirect | SetWindowValuemask.SaveUnder);
2833 if (CustomVisual != IntPtr.Zero && CustomColormap != IntPtr.Zero) {
2834 ValueMask = SetWindowValuemask.ColorMap;
2835 Attributes.colormap = CustomColormap;
2837 ClientWindow = XCreateWindow(DisplayHandle, WholeWindow, XClientRect.X, XClientRect.Y, XClientRect.Width, XClientRect.Height, 0, (int)CreateWindowArgs.CopyFromParent, (int)CreateWindowArgs.InputOutput, CustomVisual, new UIntPtr ((uint)ValueMask), ref Attributes);
2841 if ((WholeWindow == IntPtr.Zero) || (ClientWindow == IntPtr.Zero)) {
2842 throw new Exception("Could not create X11 windows");
2845 hwnd.Queue = ThreadQueue(Thread.CurrentThread);
2846 hwnd.WholeWindow = WholeWindow;
2847 hwnd.ClientWindow = ClientWindow;
2849 #if DriverDebug || DriverDebugCreate
2850 Console.WriteLine("Created window {0:X} / {1:X} parent {2:X}, Style {3}, ExStyle {4}", ClientWindow.ToInt32(), WholeWindow.ToInt32(), hwnd.parent != null ? hwnd.parent.Handle.ToInt32() : 0, (WindowStyles)cp.Style, (WindowExStyles)cp.ExStyle);
2853 if (!StyleSet (cp.Style, WindowStyles.WS_CHILD)) {
2854 if ((X != unchecked((int)0x80000000)) && (Y != unchecked((int)0x80000000))) {
2857 hints = new XSizeHints();
2860 hints.flags = (IntPtr)(XSizeHintsFlags.USPosition | XSizeHintsFlags.PPosition);
2861 XSetWMNormalHints(DisplayHandle, WholeWindow, ref hints);
2866 XSelectInput(DisplayHandle, hwnd.whole_window, new IntPtr ((int)(SelectInputMask | EventMask.StructureNotifyMask | EventMask.PropertyChangeMask | Keyboard.KeyEventMask)));
2867 if (hwnd.whole_window != hwnd.client_window)
2868 XSelectInput(DisplayHandle, hwnd.client_window, new IntPtr ((int)(SelectInputMask | EventMask.StructureNotifyMask | Keyboard.KeyEventMask)));
2871 if (ExStyleSet (cp.ExStyle, WindowExStyles.WS_EX_TOPMOST)) {
2873 atoms[0] = _NET_WM_WINDOW_TYPE_NORMAL.ToInt32();
2874 XChangeProperty(DisplayHandle, hwnd.whole_window, _NET_WM_WINDOW_TYPE, (IntPtr)Atom.XA_ATOM, 32, PropertyMode.Replace, atoms, 1);
2876 XSetTransientForHint (DisplayHandle, hwnd.whole_window, RootWindow);
2879 SetWMStyles(hwnd, cp);
2881 // set the group leader
2882 XWMHints wm_hints = new XWMHints ();
2884 wm_hints.flags = (IntPtr)(XWMHintsFlags.InputHint | XWMHintsFlags.StateHint | XWMHintsFlags.WindowGroupHint);
2885 wm_hints.input = !StyleSet (cp.Style, WindowStyles.WS_DISABLED);
2886 wm_hints.initial_state = StyleSet (cp.Style, WindowStyles.WS_MINIMIZE) ? XInitialState.IconicState : XInitialState.NormalState;
2888 if (ParentHandle != RootWindow) {
2889 wm_hints.window_group = hwnd.whole_window;
2891 wm_hints.window_group = ParentHandle;
2895 XSetWMHints(DisplayHandle, hwnd.whole_window, ref wm_hints );
2898 if (StyleSet (cp.Style, WindowStyles.WS_MINIMIZE)) {
2899 SetWindowState(hwnd.Handle, FormWindowState.Minimized);
2900 } else if (StyleSet (cp.Style, WindowStyles.WS_MAXIMIZE)) {
2901 SetWindowState(hwnd.Handle, FormWindowState.Maximized);
2904 // for now make all windows dnd enabled
2905 Dnd.SetAllowDrop (hwnd, true);
2907 // Set caption/window title
2908 Text(hwnd.Handle, cp.Caption);
2910 SendMessage (hwnd.Handle, Msg.WM_CREATE, (IntPtr)1, IntPtr.Zero /* XXX unused */);
2911 SendParentNotify (hwnd.Handle, Msg.WM_CREATE, int.MaxValue, int.MaxValue);
2913 if (StyleSet (cp.Style, WindowStyles.WS_VISIBLE)) {
2914 hwnd.visible = true;
2915 MapWindow(hwnd, WindowType.Both);
2916 if (!(Control.FromHandle(hwnd.Handle) is Form))
2917 SendMessage(hwnd.Handle, Msg.WM_SHOWWINDOW, (IntPtr)1, IntPtr.Zero);
2923 internal override IntPtr CreateWindow(IntPtr Parent, int X, int Y, int Width, int Height) {
2924 CreateParams create_params = new CreateParams();
2926 create_params.Caption = "";
2927 create_params.X = X;
2928 create_params.Y = Y;
2929 create_params.Width = Width;
2930 create_params.Height = Height;
2932 create_params.ClassName=XplatUI.DefaultClassName;
2933 create_params.ClassStyle = 0;
2934 create_params.ExStyle=0;
2935 create_params.Parent=IntPtr.Zero;
2936 create_params.Param=0;
2938 return CreateWindow(create_params);
2941 internal override IntPtr DefineCursor(Bitmap bitmap, Bitmap mask, Color cursor_pixel, Color mask_pixel, int xHotSpot, int yHotSpot) {
2943 Bitmap cursor_bitmap;
2951 IntPtr cursor_pixmap;
2958 if (XQueryBestCursor(DisplayHandle, RootWindow, bitmap.Width, bitmap.Height, out width, out height) == 0) {
2962 // Win32 only allows creation cursors of a certain size
2963 if ((bitmap.Width != width) || (bitmap.Width != height)) {
2964 cursor_bitmap = new Bitmap(bitmap, new Size(width, height));
2965 cursor_mask = new Bitmap(mask, new Size(width, height));
2967 cursor_bitmap = bitmap;
2971 width = cursor_bitmap.Width;
2972 height = cursor_bitmap.Height;
2974 cursor_bits = new Byte[(width / 8) * height];
2975 mask_bits = new Byte[(width / 8) * height];
2977 for (int y = 0; y < height; y++) {
2978 for (int x = 0; x < width; x++) {
2979 c_pixel = cursor_bitmap.GetPixel(x, y);
2980 m_pixel = cursor_mask.GetPixel(x, y);
2982 and = c_pixel == cursor_pixel;
2983 xor = m_pixel == mask_pixel;
2987 // cursor_bits[y * width / 8 + x / 8] &= (byte)~((1 << (x % 8))); // The bit already is 0
2988 mask_bits[y * width / 8 + x / 8] |= (byte)(1 << (x % 8));
2989 } else if (and && !xor) {
2991 cursor_bits[y * width / 8 + x / 8] |= (byte)(1 << (x % 8));
2992 mask_bits[y * width / 8 + x / 8] |= (byte)(1 << (x % 8));
2994 } else if (and && !xor) {
2996 } else if (and && xor) {
2999 // X11 doesn't know the 'reverse screen' concept, so we'll treat them the same
3000 // we want both to be 0 so nothing to be done
3001 //cursor_bits[y * width / 8 + x / 8] &= (byte)~((1 << (x % 8)));
3002 //mask_bits[y * width / 8 + x / 8] |= (byte)(01 << (x % 8));
3008 cursor_pixmap = XCreatePixmapFromBitmapData(DisplayHandle, RootWindow, cursor_bits, width, height, (IntPtr)1, (IntPtr)0, 1);
3009 mask_pixmap = XCreatePixmapFromBitmapData(DisplayHandle, RootWindow, mask_bits, width, height, (IntPtr)1, (IntPtr)0, 1);
3013 fg.pixel = XWhitePixel(DisplayHandle, ScreenNo);
3014 fg.red = (ushort)65535;
3015 fg.green = (ushort)65535;
3016 fg.blue = (ushort)65535;
3018 bg.pixel = XBlackPixel(DisplayHandle, ScreenNo);
3020 cursor = XCreatePixmapCursor(DisplayHandle, cursor_pixmap, mask_pixmap, ref fg, ref bg, xHotSpot, yHotSpot);
3022 XFreePixmap(DisplayHandle, cursor_pixmap);
3023 XFreePixmap(DisplayHandle, mask_pixmap);
3028 internal override Bitmap DefineStdCursorBitmap (StdCursor id) {
3029 CursorFontShape shape;
3036 shape = StdCursorToFontShape (id);
3037 name = shape.ToString ().Replace ("XC_", string.Empty);
3038 size = XcursorGetDefaultSize (DisplayHandle);
3039 theme = XcursorGetTheme (DisplayHandle);
3040 IntPtr images_ptr = XcursorLibraryLoadImages (name, theme, size);
3042 Console.WriteLine ("DefineStdCursorBitmap, id={0}, #id={1}, name{2}, size={3}, theme: {4}, images_ptr={5}", id, (int) id, name, size, Marshal.PtrToStringAnsi (theme), images_ptr);
3045 if (images_ptr == IntPtr.Zero) {
3049 XcursorImages images = (XcursorImages) Marshal.PtrToStructure (images_ptr, typeof (XcursorImages));
3051 Console.WriteLine ("DefineStdCursorBitmap, cursor has {0} images", images.nimage);
3054 if (images.nimage > 0) {
3055 // We only care about the first image.
3056 XcursorImage image = (XcursorImage)Marshal.PtrToStructure (Marshal.ReadIntPtr (images.images), typeof (XcursorImage));
3059 Console.WriteLine ("DefineStdCursorBitmap, loaded image <size={0}, height={1}, width={2}, xhot={3}, yhot={4}, pixels={5}", image.size, image.height, image.width, image.xhot, image.yhot, image.pixels);
3062 if (image.width <= short.MaxValue && image.height <= short.MaxValue) {
3063 int [] pixels = new int [image.width * image.height];
3064 Marshal.Copy (image.pixels, pixels, 0, pixels.Length);
3065 bmp = new Bitmap (image.width, image.height);
3066 for (int w = 0; w < image.width; w++) {
3067 for (int h = 0; h < image.height; h++) {
3068 bmp.SetPixel (w, h, Color.FromArgb (pixels [h * image.width + w]));
3074 XcursorImagesDestroy (images_ptr);
3076 } catch (DllNotFoundException ex) {
3077 Console.WriteLine ("Could not load libXcursor: " + ex.Message + " (" + ex.GetType ().Name + ")");
3085 internal override IntPtr DefineStdCursor(StdCursor id) {
3086 CursorFontShape shape;
3089 shape = StdCursorToFontShape (id);
3092 cursor = XCreateFontCursor(DisplayHandle, shape);
3097 internal static CursorFontShape StdCursorToFontShape (StdCursor id) {
3098 CursorFontShape shape;
3099 // FIXME - define missing shapes
3102 case StdCursor.AppStarting: {
3103 shape = CursorFontShape.XC_watch;
3107 case StdCursor.Arrow: {
3108 shape = CursorFontShape.XC_top_left_arrow;
3112 case StdCursor.Cross: {
3113 shape = CursorFontShape.XC_crosshair;
3117 case StdCursor.Default: {
3118 shape = CursorFontShape.XC_top_left_arrow;
3122 case StdCursor.Hand: {
3123 shape = CursorFontShape.XC_hand1;
3127 case StdCursor.Help: {
3128 shape = CursorFontShape.XC_question_arrow;
3132 case StdCursor.HSplit: {
3133 shape = CursorFontShape.XC_sb_v_double_arrow;
3137 case StdCursor.IBeam: {
3138 shape = CursorFontShape.XC_xterm;
3142 case StdCursor.No: {
3143 shape = CursorFontShape.XC_circle;
3147 case StdCursor.NoMove2D: {
3148 shape = CursorFontShape.XC_fleur;
3152 case StdCursor.NoMoveHoriz: {
3153 shape = CursorFontShape.XC_fleur;
3157 case StdCursor.NoMoveVert: {
3158 shape = CursorFontShape.XC_fleur;
3162 case StdCursor.PanEast: {
3163 shape = CursorFontShape.XC_fleur;
3167 case StdCursor.PanNE: {
3168 shape = CursorFontShape.XC_fleur;
3172 case StdCursor.PanNorth: {
3173 shape = CursorFontShape.XC_fleur;
3177 case StdCursor.PanNW: {
3178 shape = CursorFontShape.XC_fleur;
3182 case StdCursor.PanSE: {
3183 shape = CursorFontShape.XC_fleur;
3187 case StdCursor.PanSouth: {
3188 shape = CursorFontShape.XC_fleur;
3192 case StdCursor.PanSW: {
3193 shape = CursorFontShape.XC_fleur;
3197 case StdCursor.PanWest: {
3198 shape = CursorFontShape.XC_sizing;
3202 case StdCursor.SizeAll: {
3203 shape = CursorFontShape.XC_fleur;
3207 case StdCursor.SizeNESW: {
3208 shape = CursorFontShape.XC_top_right_corner;
3212 case StdCursor.SizeNS: {
3213 shape = CursorFontShape.XC_sb_v_double_arrow;
3217 case StdCursor.SizeNWSE: {
3218 shape = CursorFontShape.XC_top_left_corner;
3222 case StdCursor.SizeWE: {
3223 shape = CursorFontShape.XC_sb_h_double_arrow;
3227 case StdCursor.UpArrow: {
3228 shape = CursorFontShape.XC_center_ptr;
3232 case StdCursor.VSplit: {
3233 shape = CursorFontShape.XC_sb_h_double_arrow;
3237 case StdCursor.WaitCursor: {
3238 shape = CursorFontShape.XC_watch;
3243 shape = (CursorFontShape) 0;
3251 internal override IntPtr DefWndProc(ref Message msg) {
3252 switch ((Msg)msg.Msg) {
3254 case Msg.WM_IME_COMPOSITION:
3255 string s = Keyboard.GetCompositionString ();
3256 foreach (char c in s)
3257 SendMessage (msg.HWnd, Msg.WM_IME_CHAR, (IntPtr) c, msg.LParam);
3260 case Msg.WM_IME_CHAR:
3261 // On Windows API it sends two WM_CHAR messages for each byte, but
3262 // I wonder if it is worthy to emulate it (also no idea how to
3263 // reconstruct those bytes into chars).
3264 SendMessage (msg.HWnd, Msg.WM_CHAR, msg.WParam, msg.LParam);
3267 case Msg.WM_PAINT: {
3270 hwnd = Hwnd.GetObjectFromWindow(msg.HWnd);
3272 hwnd.expose_pending = false;
3278 case Msg.WM_NCPAINT: {
3281 hwnd = Hwnd.GetObjectFromWindow(msg.HWnd);
3283 hwnd.nc_expose_pending = false;
3289 case Msg.WM_NCCALCSIZE: {
3292 if (msg.WParam == (IntPtr)1) {
3293 hwnd = Hwnd.GetObjectFromWindow (msg.HWnd);
3295 XplatUIWin32.NCCALCSIZE_PARAMS ncp;
3296 ncp = (XplatUIWin32.NCCALCSIZE_PARAMS)Marshal.PtrToStructure (msg.LParam, typeof (XplatUIWin32.NCCALCSIZE_PARAMS));
3298 // Add all the stuff X is supposed to draw.
3299 Control ctrl = Control.FromHandle (hwnd.Handle);
3302 Hwnd.Borders rect = Hwnd.GetBorders (ctrl.GetCreateParams (), null);
3304 ncp.rgrc1.top += rect.top;
3305 ncp.rgrc1.bottom -= rect.bottom;
3306 ncp.rgrc1.left += rect.left;
3307 ncp.rgrc1.right -= rect.right;
3309 Marshal.StructureToPtr (ncp, msg.LParam, true);
3316 case Msg.WM_CONTEXTMENU: {
3319 hwnd = Hwnd.GetObjectFromWindow(msg.HWnd);
3321 if ((hwnd != null) && (hwnd.parent != null)) {
3322 SendMessage(hwnd.parent.client_window, Msg.WM_CONTEXTMENU, msg.WParam, msg.LParam);
3327 case Msg.WM_MOUSEWHEEL: {
3330 hwnd = Hwnd.GetObjectFromWindow(msg.HWnd);
3332 if ((hwnd != null) && (hwnd.parent != null)) {
3333 SendMessage(hwnd.parent.client_window, Msg.WM_MOUSEWHEEL, msg.WParam, msg.LParam);
3334 if (msg.Result == IntPtr.Zero) {
3341 case Msg.WM_SETCURSOR: {
3344 hwnd = Hwnd.GetObjectFromWindow(msg.HWnd);
3346 break; // not sure how this happens, but it does
3348 // Pass to parent window first
3349 while ((hwnd.parent != null) && (msg.Result == IntPtr.Zero)) {
3351 msg.Result = NativeWindow.WndProc(hwnd.Handle, Msg.WM_SETCURSOR, msg.HWnd, msg.LParam);
3354 if (msg.Result == IntPtr.Zero) {
3357 switch((HitTest)(msg.LParam.ToInt32() & 0xffff)) {
3358 case HitTest.HTBOTTOM: handle = Cursors.SizeNS.handle; break;
3359 case HitTest.HTBORDER: handle = Cursors.SizeNS.handle; break;
3360 case HitTest.HTBOTTOMLEFT: handle = Cursors.SizeNESW.handle; break;
3361 case HitTest.HTBOTTOMRIGHT: handle = Cursors.SizeNWSE.handle; break;
3362 case HitTest.HTERROR: if ((msg.LParam.ToInt32() >> 16) == (int)Msg.WM_LBUTTONDOWN) {
3363 AudibleAlert(AlertType.Default);
3365 handle = Cursors.Default.handle;
3368 case HitTest.HTHELP: handle = Cursors.Help.handle; break;
3369 case HitTest.HTLEFT: handle = Cursors.SizeWE.handle; break;
3370 case HitTest.HTRIGHT: handle = Cursors.SizeWE.handle; break;
3371 case HitTest.HTTOP: handle = Cursors.SizeNS.handle; break;
3372 case HitTest.HTTOPLEFT: handle = Cursors.SizeNWSE.handle; break;
3373 case HitTest.HTTOPRIGHT: handle = Cursors.SizeNESW.handle; break;
3376 case HitTest.HTGROWBOX:
3377 case HitTest.HTSIZE:
3378 case HitTest.HTZOOM:
3379 case HitTest.HTVSCROLL:
3380 case HitTest.HTSYSMENU:
3381 case HitTest.HTREDUCE:
3382 case HitTest.HTNOWHERE:
3383 case HitTest.HTMAXBUTTON:
3384 case HitTest.HTMINBUTTON:
3385 case HitTest.HTMENU:
3386 case HitTest.HSCROLL:
3387 case HitTest.HTBOTTOM:
3388 case HitTest.HTCAPTION:
3389 case HitTest.HTCLIENT:
3390 case HitTest.HTCLOSE:
3392 default: handle = Cursors.Default.handle; break;
3394 SetCursor(msg.HWnd, handle);
3402 internal override void DestroyCaret(IntPtr handle) {
3403 if (Caret.Hwnd == handle) {
3404 if (Caret.Visible) {
3408 if (Caret.gc != IntPtr.Zero) {
3409 XFreeGC(DisplayHandle, Caret.gc);
3410 Caret.gc = IntPtr.Zero;
3412 Caret.Hwnd = IntPtr.Zero;
3413 Caret.Visible = false;
3418 internal override void DestroyCursor(IntPtr cursor) {
3420 XFreeCursor(DisplayHandle, cursor);
3424 internal override void DestroyWindow(IntPtr handle) {
3426 hwnd = Hwnd.ObjectFromHandle(handle);
3428 // The window should never ever be a zombie here, since we should
3429 // wait until it's completely dead before returning from
3430 // "destroying" calls, but just in case....
3431 if (hwnd == null || hwnd.zombie) {
3432 #if DriverDebug || DriverDebugDestroy
3433 Console.WriteLine("window {0:X} already destroyed", handle.ToInt32());
3438 #if DriverDebug || DriverDebugDestroy
3439 Console.WriteLine("Destroying window {0}", XplatUI.Window(hwnd.client_window));
3442 SendParentNotify (hwnd.Handle, Msg.WM_DESTROY, int.MaxValue, int.MaxValue);
3444 CleanupCachedWindows (hwnd);
3446 ArrayList windows = new ArrayList ();
3448 AccumulateDestroyedHandles (Control.ControlNativeWindow.ControlFromHandle(hwnd.Handle), windows);
3451 foreach (Hwnd h in windows) {
3452 SendMessage (h.Handle, Msg.WM_DESTROY, IntPtr.Zero, IntPtr.Zero);
3457 if (hwnd.whole_window != IntPtr.Zero) {
3458 #if DriverDebug || DriverDebugDestroy
3459 Console.WriteLine ("XDestroyWindow (whole_window = {0:X})", hwnd.whole_window.ToInt32());
3461 Keyboard.DestroyICForWindow (hwnd.whole_window);
3462 XDestroyWindow(DisplayHandle, hwnd.whole_window);
3464 else if (hwnd.client_window != IntPtr.Zero) {
3465 #if DriverDebug || DriverDebugDestroy
3466 Console.WriteLine ("XDestroyWindow (client_window = {0:X})", hwnd.client_window.ToInt32());
3468 Keyboard.DestroyICForWindow (hwnd.client_window);
3469 XDestroyWindow(DisplayHandle, hwnd.client_window);
3475 internal override IntPtr DispatchMessage(ref MSG msg) {
3476 return NativeWindow.WndProc(msg.hwnd, msg.message, msg.wParam, msg.lParam);
3479 IntPtr GetReversibleScreenGC (Color backColor)
3481 XGCValues gc_values;
3485 XColor xcolor = new XColor();
3486 xcolor.red = (ushort)(backColor.R * 257);
3487 xcolor.green = (ushort)(backColor.G * 257);
3488 xcolor.blue = (ushort)(backColor.B * 257);
3489 XAllocColor(DisplayHandle, DefaultColormap, ref xcolor);
3490 pixel = (uint)xcolor.pixel.ToInt32();
3493 gc_values = new XGCValues();
3495 gc_values.subwindow_mode = GCSubwindowMode.IncludeInferiors;
3496 gc_values.foreground = (IntPtr)pixel;
3498 gc = XCreateGC(DisplayHandle, RootWindow, new IntPtr ((int) (GCFunction.GCSubwindowMode | GCFunction.GCForeground)), ref gc_values);
3499 XSetForeground(DisplayHandle, gc, (UIntPtr)pixel);
3500 XSetFunction(DisplayHandle, gc, GXFunction.GXxor);
3505 IntPtr GetReversibleControlGC (Control control, int line_width)
3507 XGCValues gc_values;
3510 gc_values = new XGCValues();
3512 gc_values.subwindow_mode = GCSubwindowMode.IncludeInferiors;
3513 gc_values.line_width = line_width;
3514 gc_values.foreground = XBlackPixel(DisplayHandle, ScreenNo);
3516 // This logic will give us true rubber bands: (libsx, SANE_XOR)
3517 //mask = foreground ^ background;
3518 //XSetForeground(DisplayHandle, gc, 0xffffffff);
3519 //XSetBackground(DisplayHandle, gc, background);
3520 //XSetFunction(DisplayHandle, gc, GXxor);
3521 //XSetPlaneMask(DisplayHandle, gc, mask);
3524 gc = XCreateGC(DisplayHandle, control.Handle, new IntPtr ((int) (GCFunction.GCSubwindowMode | GCFunction.GCLineWidth | GCFunction.GCForeground)), ref gc_values);
3528 XColor xcolor = new XColor();
3530 xcolor.red = (ushort)(control.ForeColor.R * 257);
3531 xcolor.green = (ushort)(control.ForeColor.G * 257);
3532 xcolor.blue = (ushort)(control.ForeColor.B * 257);
3533 XAllocColor(DisplayHandle, DefaultColormap, ref xcolor);
3534 foreground = (uint)xcolor.pixel.ToInt32();
3536 xcolor.red = (ushort)(control.BackColor.R * 257);
3537 xcolor.green = (ushort)(control.BackColor.G * 257);
3538 xcolor.blue = (ushort)(control.BackColor.B * 257);
3539 XAllocColor(DisplayHandle, DefaultColormap, ref xcolor);
3540 background = (uint)xcolor.pixel.ToInt32();
3542 uint mask = foreground ^ background;
3544 XSetForeground(DisplayHandle, gc, (UIntPtr)0xffffffff);
3545 XSetBackground(DisplayHandle, gc, (UIntPtr)background);
3546 XSetFunction(DisplayHandle, gc, GXFunction.GXxor);
3547 XSetPlaneMask(DisplayHandle, gc, (IntPtr)mask);
3552 internal override void DrawReversibleLine(Point start, Point end, Color backColor)
3554 if (backColor.GetBrightness() < 0.5)
3555 backColor = Color.FromArgb(255 - backColor.R, 255 - backColor.G, 255 - backColor.B);
3557 IntPtr gc = GetReversibleScreenGC (backColor);
3559 XDrawLine (DisplayHandle, RootWindow, gc, start.X, start.Y, end.X, end.Y);
3561 XFreeGC(DisplayHandle, gc);
3564 internal override void DrawReversibleFrame (Rectangle rectangle, Color backColor, FrameStyle style)
3566 if (backColor.GetBrightness() < 0.5)
3567 backColor = Color.FromArgb(255 - backColor.R, 255 - backColor.G, 255 - backColor.B);
3569 IntPtr gc = GetReversibleScreenGC (backColor);
3571 if (rectangle.Width < 0) {
3572 rectangle.X += rectangle.Width;
3573 rectangle.Width = -rectangle.Width;
3575 if (rectangle.Height < 0) {
3576 rectangle.Y += rectangle.Height;
3577 rectangle.Height = -rectangle.Height;
3581 GCLineStyle line_style = GCLineStyle.LineSolid;
3582 GCCapStyle cap_style = GCCapStyle.CapButt;
3583 GCJoinStyle join_style = GCJoinStyle.JoinMiter;
3586 case FrameStyle.Dashed:
3587 line_style = GCLineStyle.LineOnOffDash;
3589 case FrameStyle.Thick:
3594 XSetLineAttributes (DisplayHandle, gc, line_width, line_style, cap_style, join_style);
3596 XDrawRectangle(DisplayHandle, RootWindow, gc, rectangle.Left, rectangle.Top, rectangle.Width, rectangle.Height);
3598 XFreeGC(DisplayHandle, gc);
3601 internal override void FillReversibleRectangle (Rectangle rectangle, Color backColor)
3603 if (backColor.GetBrightness() < 0.5)
3604 backColor = Color.FromArgb(255 - backColor.R, 255 - backColor.G, 255 - backColor.B);
3606 IntPtr gc = GetReversibleScreenGC (backColor);
3608 if (rectangle.Width < 0) {
3609 rectangle.X += rectangle.Width;
3610 rectangle.Width = -rectangle.Width;
3612 if (rectangle.Height < 0) {
3613 rectangle.Y += rectangle.Height;
3614 rectangle.Height = -rectangle.Height;
3616 XFillRectangle(DisplayHandle, RootWindow, gc, rectangle.Left, rectangle.Top, rectangle.Width, rectangle.Height);
3618 XFreeGC(DisplayHandle, gc);
3621 internal override void DrawReversibleRectangle(IntPtr handle, Rectangle rect, int line_width)
3624 Control control = Control.FromHandle(handle);
3626 gc = GetReversibleControlGC (control, line_width);
3628 if ((rect.Width > 0) && (rect.Height > 0)) {
3629 XDrawRectangle(DisplayHandle, control.Handle, gc, rect.Left, rect.Top, rect.Width, rect.Height);
3631 if (rect.Width > 0) {
3632 XDrawLine(DisplayHandle, control.Handle, gc, rect.X, rect.Y, rect.Right, rect.Y);
3634 XDrawLine(DisplayHandle, control.Handle, gc, rect.X, rect.Y, rect.X, rect.Bottom);
3637 XFreeGC(DisplayHandle, gc);
3640 internal override void DoEvents() {
3641 DebugHelper.Enter ();
3643 MSG msg = new MSG ();
3646 if (OverrideCursorHandle != IntPtr.Zero) {
3647 OverrideCursorHandle = IntPtr.Zero;
3650 queue = ThreadQueue(Thread.CurrentThread);
3652 queue.DispatchIdle = false;
3655 while (PeekMessage(queue, ref msg, IntPtr.Zero, 0, 0, (uint)PeekMessageFlags.PM_REMOVE)) {
3656 Message m = Message.Create (msg.hwnd, (int)msg.message, msg.wParam, msg.lParam);
3658 if (Application.FilterMessage (ref m))
3661 TranslateMessage (ref msg);
3662 DispatchMessage (ref msg);
3664 string key = msg.hwnd + ":" + msg.message;
3665 if (messageHold[key] != null) {
3666 messageHold[key] = ((int)messageHold[key]) - 1;
3667 DebugHelper.WriteLine ("Got " + msg + " for " + key);
3671 in_doevents = false;
3672 queue.DispatchIdle = true;
3674 DebugHelper.Leave ();
3677 internal override void EnableWindow(IntPtr handle, bool Enable) {
3680 hwnd = Hwnd.ObjectFromHandle(handle);
3682 hwnd.Enabled = Enable;
3686 internal override void EndLoop(Thread thread) {
3687 // This is where we one day will shut down the loop for the thread
3690 internal override IntPtr GetActive() {
3695 IntPtr prop = IntPtr.Zero;
3696 IntPtr active = IntPtr.Zero;
3698 XGetWindowProperty(DisplayHandle, RootWindow, _NET_ACTIVE_WINDOW, IntPtr.Zero, new IntPtr (1), false, (IntPtr)Atom.XA_WINDOW, out actual_atom, out actual_format, out nitems, out bytes_after, ref prop);
3699 if (((long)nitems > 0) && (prop != IntPtr.Zero)) {
3700 active = (IntPtr)Marshal.ReadInt32(prop);
3704 if (active != IntPtr.Zero) {
3707 hwnd = Hwnd.GetObjectFromWindow(active);
3709 active = hwnd.Handle;
3711 active = IntPtr.Zero;
3717 internal override Region GetClipRegion(IntPtr handle) {
3720 hwnd = Hwnd.ObjectFromHandle(handle);
3722 return hwnd.UserClip;
3728 internal override void GetCursorInfo(IntPtr cursor, out int width, out int height, out int hotspot_x, out int hotspot_y) {
3735 internal override void GetDisplaySize(out Size size) {
3736 XWindowAttributes attributes=new XWindowAttributes();
3739 // FIXME - use _NET_WM messages instead?
3740 XGetWindowAttributes(DisplayHandle, XRootWindow(DisplayHandle, 0), ref attributes);
3743 size = new Size(attributes.width, attributes.height);
3746 internal override SizeF GetAutoScaleSize(Font font) {
3749 string magic_string = "The quick brown fox jumped over the lazy dog.";
3750 double magic_number = 44.549996948242189;
3752 g = Graphics.FromHwnd(FosterParent);
3754 width = (float) (g.MeasureString (magic_string, font).Width / magic_number);
3755 return new SizeF(width, font.Height);
3758 internal override IntPtr GetParent(IntPtr handle) {
3761 hwnd = Hwnd.ObjectFromHandle(handle);
3762 if (hwnd != null && hwnd.parent != null) {
3763 return hwnd.parent.Handle;
3768 // This is a nop on win32 and x11
3769 internal override IntPtr GetPreviousWindow(IntPtr handle) {
3773 internal override void GetCursorPos(IntPtr handle, out int x, out int y) {
3783 if (handle != IntPtr.Zero) {
3784 use_handle = Hwnd.ObjectFromHandle(handle).client_window;
3786 use_handle = RootWindow;
3790 QueryPointer (DisplayHandle, use_handle, out root, out child, out root_x, out root_y, out win_x, out win_y, out keys_buttons);
3793 if (handle != IntPtr.Zero) {
3802 internal override IntPtr GetFocus() {
3807 internal override bool GetFontMetrics(Graphics g, Font font, out int ascent, out int descent) {
3808 FontFamily ff = font.FontFamily;
3809 ascent = ff.GetCellAscent (font.Style);
3810 descent = ff.GetCellDescent (font.Style);
3814 internal override Point GetMenuOrigin(IntPtr handle) {
3817 hwnd = Hwnd.ObjectFromHandle(handle);
3820 return hwnd.MenuOrigin;
3825 [MonoTODO("Implement filtering")]
3826 internal override bool GetMessage(Object queue_id, ref MSG msg, IntPtr handle, int wFilterMin, int wFilterMax) {
3833 if (((XEventQueue)queue_id).Count > 0) {
3834 xevent = (XEvent) ((XEventQueue)queue_id).Dequeue ();
3836 UpdateMessageQueue ((XEventQueue)queue_id);
3838 if (((XEventQueue)queue_id).Count > 0) {
3839 xevent = (XEvent) ((XEventQueue)queue_id).Dequeue ();
3840 } else if (((XEventQueue)queue_id).Paint.Count > 0) {
3841 xevent = ((XEventQueue)queue_id).Paint.Dequeue();
3843 msg.hwnd= IntPtr.Zero;
3844 msg.message = Msg.WM_ENTERIDLE;
3849 hwnd = Hwnd.GetObjectFromWindow(xevent.AnyEvent.window);
3851 #if DriverDebugDestroy
3854 Console.WriteLine ( "GetMessage zombie, got Event: " + xevent.ToString () + " for 0x{0:x}", hwnd.Handle.ToInt32());
3856 Console.WriteLine ( "GetMessage, got Event: " + xevent.ToString () + " for 0x{0:x}", hwnd.Handle.ToInt32());
3858 // Handle messages for windows that are already or are about to be destroyed.
3860 // we need a special block for this because unless we remove the hwnd from the paint
3861 // queue it will always stay there (since we don't handle the expose), and we'll
3862 // effectively loop infinitely trying to repaint a non-existant window.
3863 if (hwnd != null && hwnd.zombie && xevent.type == XEventName.Expose) {
3864 hwnd.expose_pending = hwnd.nc_expose_pending = false;
3865 hwnd.Queue.Paint.Remove (hwnd);
3866 goto ProcessNextMessage;
3869 // We need to make sure we only allow DestroyNotify events through for zombie
3870 // hwnds, since much of the event handling code makes requests using the hwnd's
3871 // client_window, and that'll result in BadWindow errors if there's some lag
3872 // between the XDestroyWindow call and the DestroyNotify event.
3873 if (hwnd == null || hwnd.zombie && xevent.AnyEvent.type != XEventName.ClientMessage) {
3874 #if DriverDebug || DriverDebugDestroy
3875 Console.WriteLine("GetMessage(): Got message {0} for non-existent or already destroyed window {1:X}", xevent.type, xevent.AnyEvent.window.ToInt32());
3877 goto ProcessNextMessage;
3881 // If we get here, that means the window is no more but there are Client Messages
3882 // to be processed, probably a Posted message (for instance, an WM_ACTIVATE message)
3883 // We don't want anything else to run but the ClientMessage block, so reset all hwnd
3884 // properties that might cause other processing to occur.
3886 hwnd.resizing_or_moving = false;
3889 if (hwnd.client_window == xevent.AnyEvent.window) {
3891 //Console.WriteLine("Client message {1}, sending to window {0:X}", msg.hwnd.ToInt32(), xevent.type);
3894 //Console.WriteLine("Non-Client message, sending to window {0:X}", msg.hwnd.ToInt32());
3897 msg.hwnd = hwnd.Handle;
3899 // Windows sends WM_ENTERSIZEMOVE when a form resize/move operation starts and WM_EXITSIZEMOVE
3900 // when it is done. The problem in X11 is that there is no concept of start-end of a moving/sizing.
3901 // Configure events ("this window has resized/moved") are sent for each step of the resize. We send a
3902 // WM_ENTERSIZEMOVE when we get the first Configure event. The problem is the WM_EXITSIZEMOVE.
3904 // - There is no way for us to know which is the last Configure event. We can't traverse the events
3905 // queue, because the next configure event might not be pending yet.
3906 // - We can't get ButtonPress/Release events for the window decorations, because they are not part
3907 // of the window(s) we manage.
3908 // - We can't rely on the mouse state to change to "up" before the last Configure event. It doesn't.
3910 // We are almost 100% guaranteed to get another event (e.g Expose or other), but we can't know for sure
3911 // which, so we have here to check if the mouse buttons state is "up" and send the WM_EXITSIZEMOVE
3913 if (hwnd.resizing_or_moving) {
3914 int root_x, root_y, win_x, win_y, keys_buttons;
3916 XQueryPointer (DisplayHandle, hwnd.Handle, out root, out child, out root_x, out root_y,
3917 out win_x, out win_y, out keys_buttons);
3918 if ((keys_buttons & (int)MouseKeyMasks.Button1Mask) == 0 &&
3919 (keys_buttons & (int)MouseKeyMasks.Button2Mask) == 0 &&
3920 (keys_buttons & (int)MouseKeyMasks.Button3Mask) == 0) {
3921 hwnd.resizing_or_moving = false;
3922 SendMessage (hwnd.Handle, Msg.WM_EXITSIZEMOVE, IntPtr.Zero, IntPtr.Zero);
3927 // If you add a new event to this switch make sure to add it in
3928 // UpdateMessage also unless it is not coming through the X event system.
3930 switch(xevent.type) {
3931 case XEventName.KeyPress: {
3932 Keyboard.KeyEvent (FocusWindow, xevent, ref msg);
3934 // F1 key special case - WM_HELP sending
3935 if (msg.wParam == (IntPtr)VirtualKeys.VK_F1 || msg.wParam == (IntPtr)VirtualKeys.VK_HELP) {
3936 // Send wM_HELP and then return it as a keypress message in
3937 // case it needs to be preproccessed.
3938 HELPINFO helpInfo = new HELPINFO ();
3939 GetCursorPos (IntPtr.Zero, out helpInfo.MousePos.x, out helpInfo.MousePos.y);
3940 IntPtr helpInfoPtr = Marshal.AllocHGlobal (Marshal.SizeOf (helpInfo));
3941 Marshal.StructureToPtr (helpInfo, helpInfoPtr, true);
3942 NativeWindow.WndProc (FocusWindow, Msg.WM_HELP, IntPtr.Zero, helpInfoPtr);
3943 Marshal.FreeHGlobal (helpInfoPtr);
3948 case XEventName.KeyRelease: {
3949 Keyboard.KeyEvent (FocusWindow, xevent, ref msg);
3953 case XEventName.ButtonPress: {
3954 switch(xevent.ButtonEvent.button) {
3956 MouseState |= MouseButtons.Left;
3958 msg.message = Msg.WM_LBUTTONDOWN;
3959 msg.wParam = GetMousewParam (0);
3961 msg.message = Msg.WM_NCLBUTTONDOWN;
3962 msg.wParam = (IntPtr) NCHitTest (hwnd, xevent.MotionEvent.x, xevent.MotionEvent.y);
3963 MenuToScreen (xevent.AnyEvent.window, ref xevent.ButtonEvent.x, ref xevent.ButtonEvent.y);
3969 MouseState |= MouseButtons.Middle;
3971 msg.message = Msg.WM_MBUTTONDOWN;
3972 msg.wParam = GetMousewParam (0);
3974 msg.message = Msg.WM_NCMBUTTONDOWN;
3975 msg.wParam = (IntPtr) NCHitTest (hwnd, xevent.MotionEvent.x, xevent.MotionEvent.y);
3976 MenuToScreen (xevent.AnyEvent.window, ref xevent.ButtonEvent.x, ref xevent.ButtonEvent.y);
3982 MouseState |= MouseButtons.Right;
3984 msg.message = Msg.WM_RBUTTONDOWN;
3985 msg.wParam = GetMousewParam (0);
3987 msg.message = Msg.WM_NCRBUTTONDOWN;
3988 msg.wParam = (IntPtr) NCHitTest (hwnd, xevent.MotionEvent.x, xevent.MotionEvent.y);
3989 MenuToScreen (xevent.AnyEvent.window, ref xevent.ButtonEvent.x, ref xevent.ButtonEvent.y);
3995 msg.hwnd = FocusWindow;
3996 msg.message=Msg.WM_MOUSEWHEEL;
3997 msg.wParam=GetMousewParam(120);
4002 msg.hwnd = FocusWindow;
4003 msg.message=Msg.WM_MOUSEWHEEL;
4004 msg.wParam=GetMousewParam(-120);
4010 msg.lParam=(IntPtr) (xevent.ButtonEvent.y << 16 | xevent.ButtonEvent.x);
4011 mouse_position.X = xevent.ButtonEvent.x;
4012 mouse_position.Y = xevent.ButtonEvent.y;
4014 if (!hwnd.Enabled) {
4017 msg.hwnd = hwnd.EnabledHwnd;
4018 XTranslateCoordinates(DisplayHandle, xevent.AnyEvent.window, Hwnd.ObjectFromHandle(msg.hwnd).ClientWindow, xevent.ButtonEvent.x, xevent.ButtonEvent.y, out xevent.ButtonEvent.x, out xevent.ButtonEvent.y, out dummy);
4019 msg.lParam = (IntPtr)(mouse_position.Y << 16 | mouse_position.X);
4022 if (Grab.Hwnd != IntPtr.Zero) {
4023 msg.hwnd = Grab.Hwnd;
4026 if (ClickPending.Pending && ((((long)xevent.ButtonEvent.time - ClickPending.Time) < DoubleClickInterval) && (msg.wParam == ClickPending.wParam) && (msg.lParam == ClickPending.lParam) && (msg.message == ClickPending.Message))) {
4027 // Looks like a genuine double click, clicked twice on the same spot with the same keys
4028 switch(xevent.ButtonEvent.button) {
4030 msg.message = client ? Msg.WM_LBUTTONDBLCLK : Msg.WM_NCLBUTTONDBLCLK;
4035 msg.message = client ? Msg.WM_MBUTTONDBLCLK : Msg.WM_NCMBUTTONDBLCLK;
4040 msg.message = client ? Msg.WM_RBUTTONDBLCLK : Msg.WM_NCRBUTTONDBLCLK;
4044 ClickPending.Pending = false;
4046 ClickPending.Pending = true;
4047 ClickPending.Hwnd = msg.hwnd;
4048 ClickPending.Message = msg.message;
4049 ClickPending.wParam = msg.wParam;
4050 ClickPending.lParam = msg.lParam;
4051 ClickPending.Time = (long)xevent.ButtonEvent.time;
4054 if (msg.message == Msg.WM_LBUTTONDOWN || msg.message == Msg.WM_MBUTTONDOWN || msg.message == Msg.WM_RBUTTONDOWN) {
4055 SendParentNotify(msg.hwnd, msg.message, mouse_position.X, mouse_position.Y);
4061 case XEventName.ButtonRelease: {
4062 switch(xevent.ButtonEvent.button) {
4065 msg.message = Msg.WM_LBUTTONUP;
4067 msg.message = Msg.WM_NCLBUTTONUP;
4068 msg.wParam = (IntPtr) NCHitTest (hwnd, xevent.MotionEvent.x, xevent.MotionEvent.y);
4069 MenuToScreen (xevent.AnyEvent.window, ref xevent.ButtonEvent.x, ref xevent.ButtonEvent.y);
4071 MouseState &= ~MouseButtons.Left;
4072 msg.wParam = GetMousewParam (0);
4078 msg.message = Msg.WM_MBUTTONUP;
4080 msg.message = Msg.WM_NCMBUTTONUP;
4081 msg.wParam = (IntPtr) NCHitTest (hwnd, xevent.MotionEvent.x, xevent.MotionEvent.y);
4082 MenuToScreen (xevent.AnyEvent.window, ref xevent.ButtonEvent.x, ref xevent.ButtonEvent.y);
4084 MouseState &= ~MouseButtons.Middle;
4085 msg.wParam = GetMousewParam (0);
4091 msg.message = Msg.WM_RBUTTONUP;
4093 msg.message = Msg.WM_NCRBUTTONUP;
4094 msg.wParam = (IntPtr) NCHitTest (hwnd, xevent.MotionEvent.x, xevent.MotionEvent.y);
4095 MenuToScreen (xevent.AnyEvent.window, ref xevent.ButtonEvent.x, ref xevent.ButtonEvent.y);
4097 MouseState &= ~MouseButtons.Right;
4098 msg.wParam = GetMousewParam (0);
4103 goto ProcessNextMessage;
4107 goto ProcessNextMessage;
4111 if (!hwnd.Enabled) {
4114 msg.hwnd = hwnd.EnabledHwnd;
4115 XTranslateCoordinates(DisplayHandle, xevent.AnyEvent.window, Hwnd.ObjectFromHandle(msg.hwnd).ClientWindow, xevent.ButtonEvent.x, xevent.ButtonEvent.y, out xevent.ButtonEvent.x, out xevent.ButtonEvent.y, out dummy);
4116 msg.lParam = (IntPtr)(mouse_position.Y << 16 | mouse_position.X);
4119 if (Grab.Hwnd != IntPtr.Zero) {
4120 msg.hwnd = Grab.Hwnd;
4123 msg.lParam=(IntPtr) (xevent.ButtonEvent.y << 16 | xevent.ButtonEvent.x);
4124 mouse_position.X = xevent.ButtonEvent.x;
4125 mouse_position.Y = xevent.ButtonEvent.y;
4127 // Win32 splurts MouseMove events all over the place, regardless of whether the mouse is actually moving or
4128 // not, especially after mousedown and mouseup. To support apps relying on mousemove events between and after
4129 // mouse clicks to repaint or whatever, we generate a mousemove event here. *sigh*
4130 if (msg.message == Msg.WM_LBUTTONUP || msg.message == Msg.WM_MBUTTONUP || msg.message == Msg.WM_RBUTTONUP) {
4131 XEvent motionEvent = new XEvent ();
4132 motionEvent.type = XEventName.MotionNotify;
4133 motionEvent.MotionEvent.display = DisplayHandle;
4134 motionEvent.MotionEvent.window = xevent.ButtonEvent.window;
4135 motionEvent.MotionEvent.x = xevent.ButtonEvent.x;
4136 motionEvent.MotionEvent.y = xevent.ButtonEvent.y;
4137 hwnd.Queue.EnqueueLocked (motionEvent);
4142 case XEventName.MotionNotify: {
4144 #if DriverDebugExtra
4145 Console.WriteLine("GetMessage(): Window {0:X} MotionNotify x={1} y={2}", client ? hwnd.client_window.ToInt32() : hwnd.whole_window.ToInt32(), xevent.MotionEvent.x, xevent.MotionEvent.y);
4148 if (Grab.Hwnd != IntPtr.Zero) {
4149 msg.hwnd = Grab.Hwnd;
4152 NativeWindow.WndProc(msg.hwnd, Msg.WM_SETCURSOR, msg.hwnd, (IntPtr)HitTest.HTCLIENT);
4156 if (xevent.MotionEvent.is_hint != 0)
4160 XQueryPointer (DisplayHandle, xevent.AnyEvent.window,
4161 out root, out child,
4162 out xevent.MotionEvent.x_root,
4163 out xevent.MotionEvent.y_root,
4164 out xevent.MotionEvent.x,
4165 out xevent.MotionEvent.y, out mask);
4168 msg.message = Msg.WM_MOUSEMOVE;
4169 msg.wParam = GetMousewParam(0);
4170 msg.lParam = (IntPtr) (xevent.MotionEvent.y << 16 | xevent.MotionEvent.x & 0xFFFF);
4172 if (!hwnd.Enabled) {
4175 msg.hwnd = hwnd.EnabledHwnd;
4176 XTranslateCoordinates(DisplayHandle, xevent.AnyEvent.window, Hwnd.ObjectFromHandle(msg.hwnd).ClientWindow, xevent.MotionEvent.x, xevent.MotionEvent.y, out xevent.MotionEvent.x, out xevent.MotionEvent.y, out dummy);
4177 msg.lParam = (IntPtr)(mouse_position.Y << 16 | mouse_position.X);
4180 mouse_position.X = xevent.MotionEvent.x;
4181 mouse_position.Y = xevent.MotionEvent.y;
4183 if ((HoverState.Timer.Enabled) &&
4184 (((mouse_position.X + HoverState.Size.Width) < HoverState.X) ||
4185 ((mouse_position.X - HoverState.Size.Width) > HoverState.X) ||
4186 ((mouse_position.Y + HoverState.Size.Height) < HoverState.Y) ||
4187 ((mouse_position.Y - HoverState.Size.Height) > HoverState.Y))) {
4188 HoverState.Timer.Stop();
4189 HoverState.Timer.Start();
4190 HoverState.X = mouse_position.X;
4191 HoverState.Y = mouse_position.Y;
4199 #if DriverDebugExtra
4200 Console.WriteLine("GetMessage(): non-client area {0:X} MotionNotify x={1} y={2}", client ? hwnd.client_window.ToInt32() : hwnd.whole_window.ToInt32(), xevent.MotionEvent.x, xevent.MotionEvent.y);
4202 msg.message = Msg.WM_NCMOUSEMOVE;
4204 if (!hwnd.Enabled) {
4205 msg.hwnd = hwnd.EnabledHwnd;
4206 XTranslateCoordinates(DisplayHandle, xevent.AnyEvent.window, Hwnd.ObjectFromHandle(msg.hwnd).ClientWindow, xevent.MotionEvent.x, xevent.MotionEvent.y, out xevent.MotionEvent.x, out xevent.MotionEvent.y, out dummy);
4207 msg.lParam = (IntPtr)(mouse_position.Y << 16 | mouse_position.X);
4210 ht = NCHitTest (hwnd, xevent.MotionEvent.x, xevent.MotionEvent.y);
4211 NativeWindow.WndProc(hwnd.client_window, Msg.WM_SETCURSOR, msg.hwnd, (IntPtr)ht);
4213 mouse_position.X = xevent.MotionEvent.x;
4214 mouse_position.Y = xevent.MotionEvent.y;
4220 case XEventName.EnterNotify: {
4221 if (!hwnd.Enabled) {
4222 goto ProcessNextMessage;
4224 if (xevent.CrossingEvent.mode == NotifyMode.NotifyGrab || xevent.AnyEvent.window != hwnd.client_window) {
4225 goto ProcessNextMessage;
4227 if (xevent.CrossingEvent.mode == NotifyMode.NotifyUngrab) { // Pseudo motion caused by grabbing
4228 if (LastPointerWindow == xevent.AnyEvent.window)
4229 goto ProcessNextMessage;
4231 if (LastPointerWindow != IntPtr.Zero) {
4232 Point enter_loc = new Point (xevent.ButtonEvent.x, xevent.ButtonEvent.y);
4234 // We need this due to EnterNotify being fired on all the parent controls
4235 // of the Control being grabbed, and obviously in that scenario we are not
4236 // actuallty entering them
4237 Control ctrl = Control.FromHandle (hwnd.client_window);
4238 foreach (Control child_control in ctrl.Controls.GetAllControls ())
4239 if (child_control.Bounds.Contains (enter_loc))
4240 goto ProcessNextMessage;
4242 // A MouseLeave/LeaveNotify event is sent to the previous window
4243 // until the mouse is ungrabbed, not when actually leaving its bounds
4244 int x = xevent.CrossingEvent.x_root;
4245 int y = xevent.CrossingEvent.y_root;
4246 ScreenToClient (LastPointerWindow, ref x, ref y);
4248 XEvent leaveEvent = new XEvent ();
4249 leaveEvent.type = XEventName.LeaveNotify;
4250 leaveEvent.CrossingEvent.display = DisplayHandle;
4251 leaveEvent.CrossingEvent.window = LastPointerWindow;
4252 leaveEvent.CrossingEvent.x = x;
4253 leaveEvent.CrossingEvent.y = y;
4254 leaveEvent.CrossingEvent.mode = NotifyMode.NotifyNormal;
4255 Hwnd last_pointer_hwnd = Hwnd.ObjectFromHandle (LastPointerWindow);
4256 last_pointer_hwnd.Queue.EnqueueLocked (leaveEvent);
4260 LastPointerWindow = xevent.AnyEvent.window;
4262 msg.message = Msg.WM_MOUSE_ENTER;
4263 HoverState.X = xevent.CrossingEvent.x;
4264 HoverState.Y = xevent.CrossingEvent.y;
4265 HoverState.Timer.Enabled = true;
4266 HoverState.Window = xevent.CrossingEvent.window;
4268 // Win32 sends a WM_MOUSEMOVE after mouse enter
4269 XEvent motionEvent = new XEvent ();
4270 motionEvent.type = XEventName.MotionNotify;
4271 motionEvent.MotionEvent.display = DisplayHandle;
4272 motionEvent.MotionEvent.window = xevent.ButtonEvent.window;
4273 motionEvent.MotionEvent.x = xevent.ButtonEvent.x;
4274 motionEvent.MotionEvent.y = xevent.ButtonEvent.y;
4275 hwnd.Queue.EnqueueLocked (motionEvent);
4279 case XEventName.LeaveNotify: {
4280 if (xevent.CrossingEvent.mode == NotifyMode.NotifyUngrab) {
4281 WindowUngrabbed (hwnd.Handle);
4282 goto ProcessNextMessage;
4284 if (!hwnd.Enabled) {
4285 goto ProcessNextMessage;
4287 if ((xevent.CrossingEvent.mode != NotifyMode.NotifyNormal) || (xevent.CrossingEvent.window != hwnd.client_window)) {
4288 goto ProcessNextMessage;
4290 // If a grab is taking place, ignore it - we handle it in EnterNotify
4291 if (Grab.Hwnd != IntPtr.Zero)
4292 goto ProcessNextMessage;
4294 // Reset the cursor explicitly on X11.
4295 // X11 remembers the last set cursor for the window and in cases where
4296 // the control won't get a WM_SETCURSOR X11 will restore the last
4297 // known cursor, which we don't want.
4299 SetCursor (hwnd.client_window, IntPtr.Zero);
4301 msg.message=Msg.WM_MOUSELEAVE;
4302 HoverState.Timer.Enabled = false;
4303 HoverState.Window = IntPtr.Zero;
4308 case XEventName.CreateNotify: {
4309 if (client && (xevent.ConfigureEvent.xevent == xevent.ConfigureEvent.window)) {
4310 msg.message = WM_CREATE;
4311 // Set up CreateStruct
4313 goto ProcessNextMessage;
4320 case XEventName.ReparentNotify: {
4321 if (hwnd.parent == null) { // Toplevel
4322 if ((xevent.ReparentEvent.parent != IntPtr.Zero) && (xevent.ReparentEvent.window == hwnd.whole_window)) {
4323 hwnd.Reparented = true;
4325 // The location given by the event is not reliable between different wm's,
4326 // so use an alternative way of getting it.
4327 Point location = GetTopLevelWindowLocation (hwnd);
4328 hwnd.X = location.X;
4329 hwnd.Y = location.Y;
4331 if (hwnd.opacity != 0xffffffff) {
4334 opacity = (IntPtr)(Int32)hwnd.opacity;
4335 XChangeProperty(DisplayHandle, XGetParent(hwnd.whole_window), _NET_WM_WINDOW_OPACITY, (IntPtr)Atom.XA_CARDINAL, 32, PropertyMode.Replace, ref opacity, 1);
4337 SendMessage(msg.hwnd, Msg.WM_WINDOWPOSCHANGED, msg.wParam, msg.lParam);
4338 goto ProcessNextMessage;
4340 hwnd.Reparented = false;
4341 goto ProcessNextMessage;
4344 goto ProcessNextMessage;
4347 case XEventName.ConfigureNotify: {
4348 if (!client && (xevent.ConfigureEvent.xevent == xevent.ConfigureEvent.window)) { // Ignore events for children (SubstructureNotify) and client areas
4349 #if DriverDebugExtra
4350 Console.WriteLine("GetMessage(): Window {0:X} ConfigureNotify x={1} y={2} width={3} height={4}", hwnd.client_window.ToInt32(), xevent.ConfigureEvent.x, xevent.ConfigureEvent.y, xevent.ConfigureEvent.width, xevent.ConfigureEvent.height);
4353 lock (hwnd.configure_lock) {
4354 Form form = Control.FromHandle (hwnd.client_window) as Form;
4355 if (form != null && !hwnd.resizing_or_moving) {
4356 if (hwnd.x != form.Bounds.X || hwnd.y != form.Bounds.Y) {
4357 SendMessage (form.Handle, Msg.WM_SYSCOMMAND, (IntPtr)SystemCommands.SC_MOVE, IntPtr.Zero);
4358 hwnd.resizing_or_moving = true;
4359 } else if (hwnd.width != form.Bounds.Width || hwnd.height != form.Bounds.Height) {
4360 SendMessage (form.Handle, Msg.WM_SYSCOMMAND, (IntPtr)SystemCommands.SC_SIZE, IntPtr.Zero);
4361 hwnd.resizing_or_moving = true;
4363 if (hwnd.resizing_or_moving)
4364 SendMessage (form.Handle, Msg.WM_ENTERSIZEMOVE, IntPtr.Zero, IntPtr.Zero);
4367 SendMessage(msg.hwnd, Msg.WM_WINDOWPOSCHANGED, IntPtr.Zero, IntPtr.Zero);
4368 hwnd.configure_pending = false;
4370 // We need to adjust our client window to track the resize of whole_window
4371 if (hwnd.whole_window != hwnd.client_window)
4372 PerformNCCalc(hwnd);
4375 goto ProcessNextMessage;
4378 case XEventName.FocusIn: {
4379 // We received focus. We use X11 focus only to know if the app window does or does not have focus
4380 // We do not track the actual focussed window via it. Instead, this is done via FocusWindow internally
4381 // Receiving focus means we've gotten activated and therefore we need to let the actual FocusWindow know
4382 // about it having focus again
4383 if (xevent.FocusChangeEvent.detail != NotifyDetail.NotifyNonlinear) {
4384 goto ProcessNextMessage;
4388 if (FocusWindow == IntPtr.Zero) {
4389 Control c = Control.FromHandle (hwnd.client_window);
4392 goto ProcessNextMessage;
4393 Form form = c.FindForm ();
4395 goto ProcessNextMessage;
4397 if (ActiveWindow != form.Handle) {
4398 ActiveWindow = form.Handle;
4399 SendMessage (ActiveWindow, Msg.WM_ACTIVATE, (IntPtr) WindowActiveFlags.WA_ACTIVE, IntPtr.Zero);
4401 goto ProcessNextMessage;
4403 SendMessage(FocusWindow, Msg.WM_SETFOCUS, IntPtr.Zero, IntPtr.Zero);
4404 Keyboard.FocusIn (FocusWindow);
4405 goto ProcessNextMessage;
4408 case XEventName.FocusOut: {
4409 // Se the comment for our FocusIn handler
4410 if (xevent.FocusChangeEvent.detail != NotifyDetail.NotifyNonlinear) {
4411 goto ProcessNextMessage;
4414 while (Keyboard.ResetKeyState(FocusWindow, ref msg)) {
4415 SendMessage(FocusWindow, msg.message, msg.wParam, msg.lParam);
4418 Keyboard.FocusOut(hwnd.client_window);
4419 SendMessage(FocusWindow, Msg.WM_KILLFOCUS, IntPtr.Zero, IntPtr.Zero);
4420 goto ProcessNextMessage;
4423 // We are already firing WM_SHOWWINDOW messages in the proper places, but I'm leaving this code
4424 // in case we break a scenario not taken into account in the tests
4425 case XEventName.MapNotify: {
4426 /*if (client && (xevent.ConfigureEvent.xevent == xevent.ConfigureEvent.window)) { // Ignore events for children (SubstructureNotify) and client areas
4428 msg.message = Msg.WM_SHOWWINDOW;
4429 msg.wParam = (IntPtr) 1;
4430 // XXX we're missing the lParam..
4433 goto ProcessNextMessage;
4436 case XEventName.UnmapNotify: {
4437 /*if (client && (xevent.ConfigureEvent.xevent == xevent.ConfigureEvent.window)) { // Ignore events for children (SubstructureNotify) and client areas
4438 hwnd.mapped = false;
4439 msg.message = Msg.WM_SHOWWINDOW;
4440 msg.wParam = (IntPtr) 0;
4441 // XXX we're missing the lParam..
4444 goto ProcessNextMessage;
4447 case XEventName.Expose: {
4450 hwnd.expose_pending = false;
4452 hwnd.nc_expose_pending = false;
4454 goto ProcessNextMessage;
4458 if (!hwnd.expose_pending) {
4459 goto ProcessNextMessage;
4462 if (!hwnd.nc_expose_pending) {
4463 goto ProcessNextMessage;
4466 switch (hwnd.border_style) {
4467 case FormBorderStyle.Fixed3D: {
4470 g = Graphics.FromHwnd(hwnd.whole_window);
4471 if (hwnd.border_static)
4472 ControlPaint.DrawBorder3D(g, new Rectangle(0, 0, hwnd.Width, hwnd.Height), Border3DStyle.SunkenOuter);
4474 ControlPaint.DrawBorder3D(g, new Rectangle(0, 0, hwnd.Width, hwnd.Height), Border3DStyle.Sunken);
4479 case FormBorderStyle.FixedSingle: {
4482 g = Graphics.FromHwnd(hwnd.whole_window);
4483 ControlPaint.DrawBorder(g, new Rectangle(0, 0, hwnd.Width, hwnd.Height), Color.Black, ButtonBorderStyle.Solid);
4488 #if DriverDebugExtra
4489 Console.WriteLine("GetMessage(): Window {0:X} Exposed non-client area {1},{2} {3}x{4}", hwnd.client_window.ToInt32(), xevent.ExposeEvent.x, xevent.ExposeEvent.y, xevent.ExposeEvent.width, xevent.ExposeEvent.height);
4492 Rectangle rect = new Rectangle (xevent.ExposeEvent.x, xevent.ExposeEvent.y, xevent.ExposeEvent.width, xevent.ExposeEvent.height);
4493 Region region = new Region (rect);
4494 IntPtr hrgn = region.GetHrgn (null); // Graphics object isn't needed
4495 msg.message = Msg.WM_NCPAINT;
4496 msg.wParam = hrgn == IntPtr.Zero ? (IntPtr)1 : hrgn;
4497 msg.refobject = region;
4500 #if DriverDebugExtra
4501 Console.WriteLine("GetMessage(): Window {0:X} Exposed area {1},{2} {3}x{4}", hwnd.client_window.ToInt32(), xevent.ExposeEvent.x, xevent.ExposeEvent.y, xevent.ExposeEvent.width, xevent.ExposeEvent.height);
4503 if (Caret.Visible == true) {
4504 Caret.Paused = true;
4508 if (Caret.Visible == true) {
4510 Caret.Paused = false;
4512 msg.message = Msg.WM_PAINT;
4516 case XEventName.DestroyNotify: {
4518 // This is a bit tricky, we don't receive our own DestroyNotify, we only get those for our children
4519 hwnd = Hwnd.ObjectFromHandle(xevent.DestroyWindowEvent.window);
4521 // We may get multiple for the same window, act only one the first (when Hwnd still knows about it)
4522 if ((hwnd != null) && (hwnd.client_window == xevent.DestroyWindowEvent.window)) {
4523 CleanupCachedWindows (hwnd);
4525 #if DriverDebugDestroy
4526 Console.WriteLine("Received X11 Destroy Notification for {0}", XplatUI.Window(hwnd.client_window));
4529 msg.hwnd = hwnd.client_window;
4530 msg.message=Msg.WM_DESTROY;
4533 goto ProcessNextMessage;
4539 case XEventName.ClientMessage: {
4540 if (Dnd.HandleClientMessage (ref xevent)) {
4541 goto ProcessNextMessage;
4544 if (xevent.ClientMessageEvent.message_type == AsyncAtom) {
4545 XplatUIDriverSupport.ExecuteClientMessage((GCHandle)xevent.ClientMessageEvent.ptr1);
4546 goto ProcessNextMessage;
4549 if (xevent.ClientMessageEvent.message_type == HoverState.Atom) {
4550 msg.message = Msg.WM_MOUSEHOVER;
4551 msg.wParam = GetMousewParam(0);
4552 msg.lParam = (IntPtr) (xevent.ClientMessageEvent.ptr1);
4556 if (xevent.ClientMessageEvent.message_type == (IntPtr)PostAtom) {
4557 DebugHelper.Indent ();
4558 DebugHelper.WriteLine (String.Format ("Posted message:" + (Msg) xevent.ClientMessageEvent.ptr2.ToInt32 () + " for 0x{0:x}", xevent.ClientMessageEvent.ptr1.ToInt32 ()));
4559 DebugHelper.Unindent ();
4560 msg.hwnd = xevent.ClientMessageEvent.ptr1;
4561 msg.message = (Msg) xevent.ClientMessageEvent.ptr2.ToInt32 ();
4562 msg.wParam = xevent.ClientMessageEvent.ptr3;
4563 msg.lParam = xevent.ClientMessageEvent.ptr4;
4564 if (msg.message == (Msg)Msg.WM_QUIT)
4570 if (xevent.ClientMessageEvent.message_type == _XEMBED) {
4571 #if DriverDebugXEmbed
4572 Console.WriteLine("GOT EMBED MESSAGE {0:X}, detail {1:X}", xevent.ClientMessageEvent.ptr2.ToInt32(), xevent.ClientMessageEvent.ptr3.ToInt32());
4575 if (xevent.ClientMessageEvent.ptr2.ToInt32() == (int)XEmbedMessage.EmbeddedNotify) {
4576 XSizeHints hints = new XSizeHints();
4579 XGetWMNormalHints(DisplayHandle, hwnd.whole_window, ref hints, out dummy);
4581 hwnd.width = hints.max_width;
4582 hwnd.height = hints.max_height;
4583 hwnd.ClientRect = Rectangle.Empty;
4584 SendMessage(msg.hwnd, Msg.WM_WINDOWPOSCHANGED, IntPtr.Zero, IntPtr.Zero);
4588 if (xevent.ClientMessageEvent.message_type == WM_PROTOCOLS) {
4589 if (xevent.ClientMessageEvent.ptr1 == WM_DELETE_WINDOW) {
4590 SendMessage (msg.hwnd, Msg.WM_SYSCOMMAND, (IntPtr)SystemCommands.SC_CLOSE, IntPtr.Zero);
4591 msg.message = Msg.WM_CLOSE;
4595 // We should not get this, but I'll leave the code in case we need it in the future
4596 if (xevent.ClientMessageEvent.ptr1 == WM_TAKE_FOCUS) {
4597 goto ProcessNextMessage;
4600 goto ProcessNextMessage;
4604 goto ProcessNextMessage;
4611 private HitTest NCHitTest (Hwnd hwnd, int x, int y)
4613 // The hit test is sent in screen coordinates
4615 int screen_x, screen_y;
4616 XTranslateCoordinates (DisplayHandle, hwnd.WholeWindow, RootWindow, x, y, out screen_x, out screen_y, out dummy);
4617 return (HitTest) NativeWindow.WndProc (hwnd.client_window, Msg.WM_NCHITTEST, IntPtr.Zero,
4618 (IntPtr) (screen_y << 16 | screen_x & 0xFFFF));
4621 // Our very basic implementation of MoveResize - we can extend it later
4623 internal override void BeginMoveResize (IntPtr handle)
4625 // We *need* to ungrab the pointer in the current display
4626 XplatUI.UngrabWindow (Grab.Hwnd);
4629 GetCursorPos (IntPtr.Zero, out x_root, out y_root);
4631 Hwnd hwnd = Hwnd.ObjectFromHandle (handle);
4632 SendNetWMMessage (hwnd.whole_window, _NET_WM_MOVERESIZE, (IntPtr) x_root, (IntPtr) y_root,
4633 (IntPtr) NetWmMoveResize._NET_WM_MOVERESIZE_SIZE_BOTTOMRIGHT,
4634 (IntPtr) 1); // left button
4637 internal override bool GetText(IntPtr handle, out string text) {
4644 IntPtr prop = IntPtr.Zero;
4646 XGetWindowProperty(DisplayHandle, handle,
4647 _NET_WM_NAME, IntPtr.Zero, new IntPtr (1), false,
4648 UTF8_STRING, out actual_atom, out actual_format, out nitems, out bytes_after, ref prop);
4650 if ((long)nitems > 0 && prop != IntPtr.Zero) {
4651 text = Marshal.PtrToStringUni (prop, (int)nitems);
4656 // fallback on the non-_NET property
4659 textptr = IntPtr.Zero;
4661 XFetchName(DisplayHandle, Hwnd.ObjectFromHandle(handle).whole_window, ref textptr);
4662 if (textptr != IntPtr.Zero) {
4663 text = Marshal.PtrToStringAnsi(textptr);
4674 internal override void GetWindowPos(IntPtr handle, bool is_toplevel, out int x, out int y, out int width, out int height, out int client_width, out int client_height) {
4677 hwnd = Hwnd.ObjectFromHandle(handle);
4683 height = hwnd.height;
4685 PerformNCCalc(hwnd);
4687 client_width = hwnd.ClientRect.Width;
4688 client_height = hwnd.ClientRect.Height;
4693 // Should we throw an exception or fail silently?
4694 // throw new ArgumentException("Called with an invalid window handle", "handle");
4704 internal override FormWindowState GetWindowState(IntPtr handle) {
4707 hwnd = Hwnd.ObjectFromHandle(handle);
4709 if (hwnd.cached_window_state == (FormWindowState)(-1))
4710 hwnd.cached_window_state = UpdateWindowState (handle);
4712 return hwnd.cached_window_state;
4715 private FormWindowState UpdateWindowState (IntPtr handle) {
4720 IntPtr prop = IntPtr.Zero;
4724 XWindowAttributes attributes;
4727 hwnd = Hwnd.ObjectFromHandle(handle);
4731 XGetWindowProperty(DisplayHandle, hwnd.whole_window, _NET_WM_STATE, IntPtr.Zero, new IntPtr (256), false, (IntPtr)Atom.XA_ATOM, out actual_atom, out actual_format, out nitems, out bytes_after, ref prop);
4732 if (((long)nitems > 0) && (prop != IntPtr.Zero)) {
4733 for (int i = 0; i < (long)nitems; i++) {
4734 atom = (IntPtr)Marshal.ReadInt32(prop, i * 4);
4735 if ((atom == _NET_WM_STATE_MAXIMIZED_HORZ) || (atom == _NET_WM_STATE_MAXIMIZED_VERT)) {
4737 } else if (atom == _NET_WM_STATE_HIDDEN) {
4745 return FormWindowState.Minimized;
4746 } else if (maximized == 2) {
4747 return FormWindowState.Maximized;
4750 attributes = new XWindowAttributes();
4751 XGetWindowAttributes(DisplayHandle, hwnd.client_window, ref attributes);
4752 if (attributes.map_state == MapState.IsUnmapped) {
4753 return (FormWindowState)(-1);
4757 return FormWindowState.Normal;
4760 internal override void GrabInfo(out IntPtr handle, out bool GrabConfined, out Rectangle GrabArea) {
4762 GrabConfined = Grab.Confined;
4763 GrabArea = Grab.Area;
4766 internal override void GrabWindow(IntPtr handle, IntPtr confine_to_handle) {
4768 IntPtr confine_to_window;
4770 confine_to_window = IntPtr.Zero;
4772 if (confine_to_handle != IntPtr.Zero) {
4773 XWindowAttributes attributes = new XWindowAttributes();
4775 hwnd = Hwnd.ObjectFromHandle(confine_to_handle);
4778 XGetWindowAttributes(DisplayHandle, hwnd.client_window, ref attributes);
4780 Grab.Area.X = attributes.x;
4781 Grab.Area.Y = attributes.y;
4782 Grab.Area.Width = attributes.width;
4783 Grab.Area.Height = attributes.height;
4784 Grab.Confined = true;
4785 confine_to_window = hwnd.client_window;
4790 hwnd = Hwnd.ObjectFromHandle(handle);
4793 XGrabPointer(DisplayHandle, hwnd.client_window, false,
4794 EventMask.ButtonPressMask | EventMask.ButtonMotionMask |
4795 EventMask.ButtonReleaseMask | EventMask.PointerMotionMask |
4796 EventMask.PointerMotionHintMask | EventMask.LeaveWindowMask,
4797 GrabMode.GrabModeAsync, GrabMode.GrabModeAsync, confine_to_window, IntPtr.Zero, IntPtr.Zero);
4801 internal override void UngrabWindow(IntPtr hwnd) {
4803 XUngrabPointer(DisplayHandle, IntPtr.Zero);
4804 XFlush(DisplayHandle);
4806 WindowUngrabbed (hwnd);
4809 private void WindowUngrabbed (IntPtr hwnd) {
4810 bool was_grabbed = Grab.Hwnd != IntPtr.Zero;
4812 Grab.Hwnd = IntPtr.Zero;
4813 Grab.Confined = false;
4816 // lparam should be the handle to the window gaining the mouse capture,
4817 // but X doesn't seem to give us that information.
4818 // Also only generate WM_CAPTURECHANGED if the window actually was grabbed.
4819 // X will send a NotifyUngrab, but since it comes late sometimes we're
4820 // calling WindowUngrabbed directly from UngrabWindow in order to send
4821 // this WM right away.
4822 SendMessage (hwnd, Msg.WM_CAPTURECHANGED, IntPtr.Zero, IntPtr.Zero);
4826 internal override void HandleException(Exception e) {
4827 StackTrace st = new StackTrace(e, true);
4828 Console.WriteLine("Exception '{0}'", e.Message+st.ToString());
4829 Console.WriteLine("{0}{1}", e.Message, st.ToString());
4832 internal override void Invalidate(IntPtr handle, Rectangle rc, bool clear) {
4835 hwnd = Hwnd.ObjectFromHandle(handle);
4838 AddExpose (hwnd, true, hwnd.X, hwnd.Y, hwnd.Width, hwnd.Height);
4840 AddExpose (hwnd, true, rc.X, rc.Y, rc.Width, rc.Height);
4844 internal override void InvalidateNC (IntPtr handle) {
4847 hwnd = Hwnd.ObjectFromHandle(handle);
4849 AddExpose (hwnd, hwnd.WholeWindow == hwnd.ClientWindow, 0, 0, hwnd.Width, hwnd.Height);
4852 internal override bool IsEnabled(IntPtr handle) {
4853 Hwnd hwnd = Hwnd.ObjectFromHandle (handle);
4854 return (hwnd != null && hwnd.Enabled);
4857 internal override bool IsVisible(IntPtr handle) {
4858 Hwnd hwnd = Hwnd.ObjectFromHandle (handle);
4859 return (hwnd != null && hwnd.visible);
4862 internal override void KillTimer(Timer timer) {
4863 XEventQueue queue = (XEventQueue) MessageQueues [timer.thread];
4865 if (queue == null) {
4866 // This isn't really an error, MS doesn't start the timer if
4867 // it has no assosciated queue. In this case, remove the timer
4868 // from the list of unattached timers (if it was enabled).
4869 lock (unattached_timer_list) {
4870 if (unattached_timer_list.Contains (timer))
4871 unattached_timer_list.Remove (timer);
4875 queue.timer_list.Remove (timer);
4878 internal override void MenuToScreen(IntPtr handle, ref int x, ref int y) {
4884 hwnd = Hwnd.ObjectFromHandle(handle);
4887 XTranslateCoordinates(DisplayHandle, hwnd.whole_window, RootWindow, x, y, out dest_x_return, out dest_y_return, out child);
4894 internal override void OverrideCursor(IntPtr cursor)
4896 if (Grab.Hwnd != IntPtr.Zero) {
4897 XChangeActivePointerGrab (DisplayHandle,
4898 EventMask.ButtonMotionMask |
4899 EventMask.PointerMotionMask |
4900 EventMask.PointerMotionHintMask |
4901 EventMask.ButtonPressMask |
4902 EventMask.ButtonReleaseMask,
4903 cursor, IntPtr.Zero);
4907 OverrideCursorHandle = cursor;
4910 internal override PaintEventArgs PaintEventStart(ref Message msg, IntPtr handle, bool client) {
4911 PaintEventArgs paint_event;
4916 // handle (and paint_hwnd) refers to the window that is should be painted.
4917 // msg.HWnd (and hwnd) refers to the window that got the paint message.
4920 hwnd = Hwnd.ObjectFromHandle(msg.HWnd);
4921 if (msg.HWnd == handle) {
4924 paint_hwnd = Hwnd.ObjectFromHandle (handle);
4927 if (Caret.Visible == true) {
4928 Caret.Paused = true;
4935 dc = Graphics.FromHwnd (paint_hwnd.client_window);
4937 Region clip_region = new Region ();
4938 clip_region.MakeEmpty();
4940 foreach (Rectangle r in hwnd.ClipRectangles) {
4941 clip_region.Union (r);
4944 if (hwnd.UserClip != null) {
4945 clip_region.Intersect(hwnd.UserClip);
4948 dc.Clip = clip_region;
4949 paint_event = new PaintEventArgs(dc, hwnd.Invalid);
4950 hwnd.expose_pending = false;
4952 hwnd.ClearInvalidArea();
4954 hwnd.drawing_stack.Push (paint_event);
4955 hwnd.drawing_stack.Push (dc);
4959 dc = Graphics.FromHwnd (paint_hwnd.whole_window);
4961 if (!hwnd.nc_invalid.IsEmpty) {
4962 dc.SetClip (hwnd.nc_invalid);
4963 paint_event = new PaintEventArgs(dc, hwnd.nc_invalid);
4965 paint_event = new PaintEventArgs(dc, new Rectangle(0, 0, hwnd.width, hwnd.height));
4967 hwnd.nc_expose_pending = false;
4969 hwnd.ClearNcInvalidArea ();
4971 hwnd.drawing_stack.Push (paint_event);
4972 hwnd.drawing_stack.Push (dc);
4978 internal override void PaintEventEnd(ref Message msg, IntPtr handle, bool client) {
4981 hwnd = Hwnd.ObjectFromHandle (msg.HWnd);
4983 Graphics dc = (Graphics)hwnd.drawing_stack.Pop ();
4987 PaintEventArgs pe = (PaintEventArgs)hwnd.drawing_stack.Pop();
4988 pe.SetGraphics (null);
4991 if (Caret.Visible == true) {
4993 Caret.Paused = false;
4997 [MonoTODO("Implement filtering and PM_NOREMOVE")]
4998 internal override bool PeekMessage(Object queue_id, ref MSG msg, IntPtr hWnd, int wFilterMin, int wFilterMax, uint flags) {
4999 XEventQueue queue = (XEventQueue) queue_id;
5002 if ((flags & (uint)PeekMessageFlags.PM_REMOVE) == 0) {
5003 throw new NotImplementedException("PeekMessage PM_NOREMOVE is not implemented yet"); // FIXME - Implement PM_NOREMOVE flag
5007 if (queue.Count > 0) {
5010 // Only call UpdateMessageQueue if real events are pending
5011 // otherwise we go to sleep on the socket
5012 if (XPending(DisplayHandle) != 0) {
5013 UpdateMessageQueue((XEventQueue)queue_id);
5015 } else if (((XEventQueue)queue_id).Paint.Count > 0) {
5020 CheckTimers(queue.timer_list, DateTime.UtcNow);
5025 return GetMessage(queue_id, ref msg, hWnd, wFilterMin, wFilterMax);
5028 internal override bool PostMessage (IntPtr handle, Msg message, IntPtr wparam, IntPtr lparam) {
5029 XEvent xevent = new XEvent ();
5030 Hwnd hwnd = Hwnd.ObjectFromHandle(handle);
5032 xevent.type = XEventName.ClientMessage;
5033 xevent.ClientMessageEvent.display = DisplayHandle;
5036 xevent.ClientMessageEvent.window = hwnd.whole_window;
5038 xevent.ClientMessageEvent.window = IntPtr.Zero;
5041 xevent.ClientMessageEvent.message_type = (IntPtr) PostAtom;
5042 xevent.ClientMessageEvent.format = 32;
5043 xevent.ClientMessageEvent.ptr1 = handle;
5044 xevent.ClientMessageEvent.ptr2 = (IntPtr) message;
5045 xevent.ClientMessageEvent.ptr3 = wparam;
5046 xevent.ClientMessageEvent.ptr4 = lparam;
5049 hwnd.Queue.EnqueueLocked (xevent);
5051 ThreadQueue(Thread.CurrentThread).EnqueueLocked (xevent);
5056 internal override void PostQuitMessage(int exitCode) {
5057 ApplicationContext ctx = Application.MWFThread.Current.Context;
5058 Form f = ctx != null ? ctx.MainForm : null;
5060 PostMessage (Application.MWFThread.Current.Context.MainForm.window.Handle, Msg.WM_QUIT, IntPtr.Zero, IntPtr.Zero);
5062 PostMessage (FosterParent, Msg.WM_QUIT, IntPtr.Zero, IntPtr.Zero);
5063 XFlush(DisplayHandle);
5066 internal override void RequestAdditionalWM_NCMessages(IntPtr hwnd, bool hover, bool leave)
5071 internal override void RequestNCRecalc(IntPtr handle) {
5074 hwnd = Hwnd.ObjectFromHandle(handle);
5080 PerformNCCalc(hwnd);
5081 SendMessage(handle, Msg.WM_WINDOWPOSCHANGED, IntPtr.Zero, IntPtr.Zero);
5082 InvalidateNC(handle);
5085 internal override void ResetMouseHover(IntPtr handle) {
5088 hwnd = Hwnd.ObjectFromHandle(handle);
5093 HoverState.Timer.Enabled = true;
5094 HoverState.X = mouse_position.X;
5095 HoverState.Y = mouse_position.Y;
5096 HoverState.Window = handle;
5100 internal override void ScreenToClient(IntPtr handle, ref int x, ref int y) {
5106 hwnd = Hwnd.ObjectFromHandle(handle);
5109 XTranslateCoordinates (DisplayHandle, RootWindow, hwnd.client_window, x, y, out dest_x_return, out dest_y_return, out child);
5116 internal override void ScreenToMenu(IntPtr handle, ref int x, ref int y) {
5122 hwnd = Hwnd.ObjectFromHandle(handle);
5125 XTranslateCoordinates (DisplayHandle, RootWindow, hwnd.whole_window, x, y, out dest_x_return, out dest_y_return, out child);
5128 Form form = Control.FromHandle (handle) as Form;
5129 if (form != null && form.window_manager != null) {
5130 dest_y_return -= form.window_manager.TitleBarHeight;
5137 bool GraphicsExposePredicate (IntPtr display, ref XEvent xevent, IntPtr arg)
5139 return (xevent.type == XEventName.GraphicsExpose || xevent.type == XEventName.NoExpose) &&
5140 arg == xevent.GraphicsExposeEvent.drawable;
5143 delegate bool EventPredicate (IntPtr display, ref XEvent xevent, IntPtr arg);
5145 void ProcessGraphicsExpose (Hwnd hwnd)
5147 XEvent xevent = new XEvent ();
5148 IntPtr handle = Hwnd.HandleFromObject (hwnd);
5149 EventPredicate predicate = GraphicsExposePredicate;
5152 XIfEvent (Display, ref xevent, predicate, handle);
5153 if (xevent.type != XEventName.GraphicsExpose)
5156 AddExpose (hwnd, xevent.ExposeEvent.window == hwnd.ClientWindow, xevent.GraphicsExposeEvent.x, xevent.GraphicsExposeEvent.y,
5157 xevent.GraphicsExposeEvent.width, xevent.GraphicsExposeEvent.height);
5159 if (xevent.GraphicsExposeEvent.count == 0)
5164 internal override void ScrollWindow(IntPtr handle, Rectangle area, int XAmount, int YAmount, bool with_children) {
5167 XGCValues gc_values;
5169 hwnd = Hwnd.ObjectFromHandle(handle);
5171 Rectangle r = Rectangle.Intersect (hwnd.Invalid, area);
5173 /* We have an invalid area in the window we're scrolling.
5174 Adjust our stored invalid rectangle to to match the scrolled amount */
5189 if (area.Contains (hwnd.Invalid))
5190 hwnd.ClearInvalidArea ();
5191 hwnd.AddInvalidArea(r);
5194 gc_values = new XGCValues();
5196 if (with_children) {
5197 gc_values.subwindow_mode = GCSubwindowMode.IncludeInferiors;
5200 gc = XCreateGC(DisplayHandle, hwnd.client_window, IntPtr.Zero, ref gc_values);
5202 Rectangle visible_rect = GetTotalVisibleArea (hwnd.client_window);
5203 visible_rect.Intersect (area);
5205 Rectangle dest_rect = visible_rect;
5206 dest_rect.Y += YAmount;
5207 dest_rect.X += XAmount;
5208 dest_rect.Intersect (area);
5210 Point src = new Point (dest_rect.X - XAmount, dest_rect.Y - YAmount);
5211 XCopyArea (DisplayHandle, hwnd.client_window, hwnd.client_window, gc, src.X, src.Y,
5212 dest_rect.Width, dest_rect.Height, dest_rect.X, dest_rect.Y);
5214 Rectangle dirty_area = GetDirtyArea (area, dest_rect, XAmount, YAmount);
5215 AddExpose (hwnd, true, dirty_area.X, dirty_area.Y, dirty_area.Width, dirty_area.Height);
5217 ProcessGraphicsExpose (hwnd);
5219 XFreeGC(DisplayHandle, gc);
5222 internal override void ScrollWindow(IntPtr handle, int XAmount, int YAmount, bool with_children) {
5226 hwnd = Hwnd.GetObjectFromWindow(handle);
5228 rect = hwnd.ClientRect;
5231 ScrollWindow(handle, rect, XAmount, YAmount, with_children);
5234 Rectangle GetDirtyArea (Rectangle total_area, Rectangle valid_area, int XAmount, int YAmount)
5236 Rectangle dirty_area = total_area;
5239 dirty_area.Height -= valid_area.Height;
5240 else if (YAmount < 0) {
5241 dirty_area.Height -= valid_area.Height;
5242 dirty_area.Y += valid_area.Height;
5246 dirty_area.Width -= valid_area.Width;
5247 else if (XAmount < 0) {
5248 dirty_area.Width -= valid_area.Width;
5249 dirty_area.X += valid_area.Width;
5255 Rectangle GetTotalVisibleArea (IntPtr handle)
5257 Control c = Control.FromHandle (handle);
5259 Rectangle visible_area = c.ClientRectangle;
5260 visible_area.Location = c.PointToScreen (Point.Empty);
5262 for (Control parent = c.Parent; parent != null; parent = parent.Parent) {
5263 if (!parent.IsHandleCreated || !parent.Visible)
5264 return visible_area; // Non visible, not need to finish computations
5266 Rectangle r = parent.ClientRectangle;
5267 r.Location = parent.PointToScreen (Point.Empty);
5269 visible_area.Intersect (r);
5272 visible_area.Location = c.PointToClient (visible_area.Location);
5273 return visible_area;
5276 internal override void SendAsyncMethod (AsyncMethodData method) {
5278 XEvent xevent = new XEvent ();
5280 hwnd = Hwnd.ObjectFromHandle(method.Handle);
5282 xevent.type = XEventName.ClientMessage;
5283 xevent.ClientMessageEvent.display = DisplayHandle;
5284 xevent.ClientMessageEvent.window = method.Handle;
5285 xevent.ClientMessageEvent.message_type = (IntPtr)AsyncAtom;
5286 xevent.ClientMessageEvent.format = 32;
5287 xevent.ClientMessageEvent.ptr1 = (IntPtr) GCHandle.Alloc (method);
5289 hwnd.Queue.EnqueueLocked (xevent);
5294 delegate IntPtr WndProcDelegate (IntPtr hwnd, Msg message, IntPtr wParam, IntPtr lParam);
5296 internal override IntPtr SendMessage (IntPtr hwnd, Msg message, IntPtr wParam, IntPtr lParam)
5299 h = Hwnd.ObjectFromHandle(hwnd);
5301 if (h != null && h.queue != ThreadQueue (Thread.CurrentThread)) {
5302 AsyncMethodResult result;
5303 AsyncMethodData data;
5305 result = new AsyncMethodResult ();
5306 data = new AsyncMethodData ();
5309 data.Method = new WndProcDelegate (NativeWindow.WndProc);
5310 data.Args = new object[] { hwnd, message, wParam, lParam };
5311 data.Result = result;
5313 SendAsyncMethod (data);
5314 #if DriverDebug || DriverDebugThreads
5315 Console.WriteLine ("Sending {0} message across.", message);
5320 string key = hwnd + ":" + message;
5321 if (messageHold[key] != null)
5322 messageHold[key] = ((int)messageHold[key]) - 1;
5323 return NativeWindow.WndProc(hwnd, message, wParam, lParam);
5326 internal override int SendInput(IntPtr handle, Queue keys) {
5327 if (handle == IntPtr.Zero)
5330 int count = keys.Count;
5331 Hwnd hwnd = Hwnd.ObjectFromHandle(handle);
5333 while (keys.Count > 0) {
5335 MSG msg = (MSG)keys.Dequeue();
5337 XEvent xevent = new XEvent ();
5339 xevent.type = (msg.message == Msg.WM_KEYUP ? XEventName.KeyRelease : XEventName.KeyPress);
5340 xevent.KeyEvent.display = DisplayHandle;
5343 xevent.KeyEvent.window = hwnd.whole_window;
5345 xevent.KeyEvent.window = IntPtr.Zero;
5348 xevent.KeyEvent.keycode = Keyboard.ToKeycode((int)msg.wParam);
5350 hwnd.Queue.EnqueueLocked (xevent);
5355 internal override void SetAllowDrop (IntPtr handle, bool value)
5357 // We allow drop on all windows
5360 internal override DragDropEffects StartDrag (IntPtr handle, object data,
5361 DragDropEffects allowed_effects)
5363 Hwnd hwnd = Hwnd.ObjectFromHandle (handle);
5366 throw new ArgumentException ("Attempt to begin drag from invalid window handle (" + handle.ToInt32 () + ").");
5368 return Dnd.StartDrag (hwnd.client_window, data, allowed_effects);
5371 internal override void SetBorderStyle(IntPtr handle, FormBorderStyle border_style) {
5372 Form form = Control.FromHandle (handle) as Form;
5373 if (form != null && form.window_manager == null) {
5374 CreateParams cp = form.GetCreateParams ();
5375 if (border_style == FormBorderStyle.FixedToolWindow ||
5376 border_style == FormBorderStyle.SizableToolWindow ||
5377 cp.IsSet (WindowExStyles.WS_EX_TOOLWINDOW)) {
5378 form.window_manager = new ToolWindowManager (form);
5382 RequestNCRecalc(handle);
5385 internal override void SetCaretPos(IntPtr handle, int x, int y) {
5386 if (Caret.Hwnd == handle) {
5393 Keyboard.SetCaretPos (Caret, handle, x, y);
5395 if (Caret.Visible == true) {
5397 Caret.Timer.Start();
5402 internal override void SetClipRegion(IntPtr handle, Region region) {
5405 hwnd = Hwnd.ObjectFromHandle(handle);
5410 hwnd.UserClip = region;
5413 internal override void SetCursor(IntPtr handle, IntPtr cursor) {
5416 if (OverrideCursorHandle == IntPtr.Zero) {
5417 if ((LastCursorWindow == handle) && (LastCursorHandle == cursor)) {
5421 LastCursorHandle = cursor;
5422 LastCursorWindow = handle;
5424 hwnd = Hwnd.ObjectFromHandle(handle);
5426 if (cursor != IntPtr.Zero) {
5427 XDefineCursor(DisplayHandle, hwnd.whole_window, cursor);
5429 XUndefineCursor(DisplayHandle, hwnd.whole_window);
5431 XFlush(DisplayHandle);
5436 hwnd = Hwnd.ObjectFromHandle(handle);
5438 XDefineCursor(DisplayHandle, hwnd.whole_window, OverrideCursorHandle);
5442 private void QueryPointer (IntPtr display, IntPtr w, out IntPtr root, out IntPtr child,
5443 out int root_x, out int root_y, out int child_x, out int child_y,
5446 /* this code was written with the help of
5447 glance at gdk. I never would have realized we
5448 needed a loop in order to traverse down in the
5449 hierarchy. I would have assumed you'd get the
5450 most deeply nested child and have to do
5451 XQueryTree to move back up the hierarchy..
5452 stupid me, of course. */
5455 XGrabServer (display);
5457 XQueryPointer(display, w, out root, out c,
5458 out root_x, out root_y, out child_x, out child_y,
5464 IntPtr child_last = IntPtr.Zero;
5465 while (c != IntPtr.Zero) {
5467 XQueryPointer(display, c, out root, out c,
5468 out root_x, out root_y, out child_x, out child_y,
5471 XUngrabServer (display);
5477 internal override void SetCursorPos(IntPtr handle, int x, int y) {
5478 if (handle == IntPtr.Zero) {
5481 int root_x, root_y, child_x, child_y, mask;
5484 * QueryPointer before warping
5485 * because if the warp is on
5486 * the RootWindow, the x/y are
5487 * relative to the current
5490 QueryPointer (DisplayHandle, RootWindow,
5493 out root_x, out root_y,
5494 out child_x, out child_y,
5497 XWarpPointer(DisplayHandle, IntPtr.Zero, IntPtr.Zero, 0, 0, 0, 0, x - root_x, y - root_y);
5499 XFlush (DisplayHandle);
5501 /* then we need to a
5502 * QueryPointer after warping
5503 * to manually generate a
5504 * motion event for the window
5507 QueryPointer (DisplayHandle, RootWindow,
5510 out root_x, out root_y,
5511 out child_x, out child_y,
5514 Hwnd child_hwnd = Hwnd.ObjectFromHandle(child);
5515 if (child_hwnd == null) {
5519 XEvent xevent = new XEvent ();
5521 xevent.type = XEventName.MotionNotify;
5522 xevent.MotionEvent.display = DisplayHandle;
5523 xevent.MotionEvent.window = child_hwnd.client_window;
5524 xevent.MotionEvent.root = RootWindow;
5525 xevent.MotionEvent.x = child_x;
5526 xevent.MotionEvent.y = child_y;
5527 xevent.MotionEvent.x_root = root_x;
5528 xevent.MotionEvent.y_root = root_y;
5529 xevent.MotionEvent.state = mask;
5531 child_hwnd.Queue.EnqueueLocked (xevent);
5536 hwnd = Hwnd.ObjectFromHandle(handle);
5538 XWarpPointer(DisplayHandle, IntPtr.Zero, hwnd.client_window, 0, 0, 0, 0, x, y);
5543 internal override void SetFocus(IntPtr handle) {
5545 IntPtr prev_focus_window;
5547 hwnd = Hwnd.ObjectFromHandle(handle);
5549 if (hwnd.client_window == FocusWindow) {
5553 // Win32 doesn't do anything if disabled
5557 prev_focus_window = FocusWindow;
5558 FocusWindow = hwnd.client_window;
5560 if (prev_focus_window != IntPtr.Zero) {
5561 SendMessage(prev_focus_window, Msg.WM_KILLFOCUS, FocusWindow, IntPtr.Zero);
5563 SendMessage(FocusWindow, Msg.WM_SETFOCUS, prev_focus_window, IntPtr.Zero);
5564 Keyboard.FocusIn (FocusWindow);
5566 //XSetInputFocus(DisplayHandle, Hwnd.ObjectFromHandle(handle).client_window, RevertTo.None, IntPtr.Zero);
5569 internal override void SetIcon(IntPtr handle, Icon icon) {
5572 hwnd = Hwnd.ObjectFromHandle(handle);
5574 SetIcon(hwnd, icon);
5578 internal override void SetMenu(IntPtr handle, Menu menu) {
5581 hwnd = Hwnd.ObjectFromHandle(handle);
5584 RequestNCRecalc(handle);
5587 internal override void SetModal(IntPtr handle, bool Modal) {
5589 ModalWindows.Push(handle);
5591 if (ModalWindows.Contains(handle)) {
5594 if (ModalWindows.Count > 0) {
5595 Activate((IntPtr)ModalWindows.Peek());
5599 Hwnd hwnd = Hwnd.ObjectFromHandle (handle);
5600 Control ctrl = Control.FromHandle (handle);
5601 SetWMStyles (hwnd, ctrl.GetCreateParams ());
5604 internal override IntPtr SetParent(IntPtr handle, IntPtr parent) {
5607 hwnd = Hwnd.ObjectFromHandle(handle);
5608 hwnd.parent = Hwnd.ObjectFromHandle(parent);
5611 #if DriverDebug || DriverDebugParent
5612 Console.WriteLine("Parent for window {0} = {1}", XplatUI.Window(hwnd.Handle), XplatUI.Window(hwnd.parent != null ? hwnd.parent.Handle : IntPtr.Zero));
5614 XReparentWindow(DisplayHandle, hwnd.whole_window, hwnd.parent == null ? FosterParent : hwnd.parent.client_window, hwnd.x, hwnd.y);
5620 internal override void SetTimer (Timer timer) {
5621 XEventQueue queue = (XEventQueue) MessageQueues [timer.thread];
5623 if (queue == null) {
5624 // This isn't really an error, MS doesn't start the timer if
5625 // it has no assosciated queue at this stage (it will be
5626 // enabled when a window is activated).
5627 unattached_timer_list.Add (timer);
5630 queue.timer_list.Add (timer);
5634 internal override bool SetTopmost(IntPtr handle, bool enabled) {
5636 Hwnd hwnd = Hwnd.ObjectFromHandle(handle);
5641 SendNetWMMessage(hwnd.WholeWindow, _NET_WM_STATE, (IntPtr) NetWmStateRequest._NET_WM_STATE_ADD, _NET_WM_STATE_ABOVE, IntPtr.Zero);
5643 int[] atoms = new int[8];
5644 atoms[0] = _NET_WM_STATE_ABOVE.ToInt32();
5645 XChangeProperty(DisplayHandle, hwnd.whole_window, _NET_WM_STATE, (IntPtr)Atom.XA_ATOM, 32, PropertyMode.Replace, atoms, 1);
5651 SendNetWMMessage(hwnd.WholeWindow, _NET_WM_STATE, (IntPtr) NetWmStateRequest._NET_WM_STATE_REMOVE, _NET_WM_STATE_ABOVE, IntPtr.Zero);
5653 XDeleteProperty(DisplayHandle, hwnd.whole_window, _NET_WM_STATE);
5659 internal override bool SetOwner(IntPtr handle, IntPtr handle_owner) {
5663 hwnd = Hwnd.ObjectFromHandle(handle);
5665 if (handle_owner != IntPtr.Zero) {
5666 hwnd_owner = Hwnd.ObjectFromHandle(handle_owner);
5672 atoms[0] = _NET_WM_WINDOW_TYPE_NORMAL.ToInt32();
5673 XChangeProperty(DisplayHandle, hwnd.whole_window, _NET_WM_WINDOW_TYPE, (IntPtr)Atom.XA_ATOM, 32, PropertyMode.Replace, atoms, 1);
5675 if (hwnd_owner != null) {
5676 XSetTransientForHint(DisplayHandle, hwnd.whole_window, hwnd_owner.whole_window);
5678 XSetTransientForHint(DisplayHandle, hwnd.whole_window, RootWindow);
5683 XDeleteProperty(DisplayHandle, hwnd.whole_window, (IntPtr)Atom.XA_WM_TRANSIENT_FOR);
5689 internal override bool SetVisible (IntPtr handle, bool visible, bool activate)
5693 hwnd = Hwnd.ObjectFromHandle(handle);
5694 hwnd.visible = visible;
5698 MapWindow(hwnd, WindowType.Both);
5700 if (Control.FromHandle(handle) is Form) {
5703 s = ((Form)Control.FromHandle(handle)).WindowState;
5706 case FormWindowState.Minimized: SetWindowState(handle, FormWindowState.Minimized); break;
5707 case FormWindowState.Maximized: SetWindowState(handle, FormWindowState.Maximized); break;
5711 SendMessage(handle, Msg.WM_WINDOWPOSCHANGED, IntPtr.Zero, IntPtr.Zero);
5714 UnmapWindow(hwnd, WindowType.Both);
5720 internal override void SetWindowMinMax(IntPtr handle, Rectangle maximized, Size min, Size max) {
5721 Control ctrl = Control.FromHandle (handle);
5722 SetWindowMinMax (handle, maximized, min, max, ctrl != null ? ctrl.GetCreateParams () : null);
5725 internal void SetWindowMinMax (IntPtr handle, Rectangle maximized, Size min, Size max, CreateParams cp)
5731 hwnd = Hwnd.ObjectFromHandle(handle);
5736 min.Width = Math.Max (min.Width, SystemInformation.MinimumWindowSize.Width);
5737 min.Height = Math.Max (min.Height, SystemInformation.MinimumWindowSize.Height);
5739 hints = new XSizeHints();
5741 XGetWMNormalHints(DisplayHandle, hwnd.whole_window, ref hints, out dummy);
5742 if ((min != Size.Empty) && (min.Width > 0) && (min.Height > 0)) {
5744 min = TranslateWindowSizeToXWindowSize (cp, min);
5745 hints.flags = (IntPtr)((int)hints.flags | (int)XSizeHintsFlags.PMinSize);
5746 hints.min_width = min.Width;
5747 hints.min_height = min.Height;
5750 if ((max != Size.Empty) && (max.Width > 0) && (max.Height > 0)) {
5752 max = TranslateWindowSizeToXWindowSize (cp, max);
5753 hints.flags = (IntPtr)((int)hints.flags | (int)XSizeHintsFlags.PMaxSize);
5754 hints.max_width = max.Width;
5755 hints.max_height = max.Height;
5758 if (hints.flags != IntPtr.Zero) {
5759 // The Metacity team has decided that they won't care about this when clicking the maximize icon,
5760 // they will maximize the window to fill the screen/parent no matter what.
5761 // http://bugzilla.ximian.com/show_bug.cgi?id=80021
5762 XSetWMNormalHints(DisplayHandle, hwnd.whole_window, ref hints);
5765 if ((maximized != Rectangle.Empty) && (maximized.Width > 0) && (maximized.Height > 0)) {
5767 maximized.Size = TranslateWindowSizeToXWindowSize (cp);
5768 hints.flags = (IntPtr)XSizeHintsFlags.PPosition;
5769 hints.x = maximized.X;
5770 hints.y = maximized.Y;
5771 hints.width = maximized.Width;
5772 hints.height = maximized.Height;
5774 // Metacity does not seem to follow this constraint for maximized (zoomed) windows
5775 XSetZoomHints(DisplayHandle, hwnd.whole_window, ref hints);
5780 internal override void SetWindowPos(IntPtr handle, int x, int y, int width, int height) {
5783 hwnd = Hwnd.ObjectFromHandle(handle);
5789 // Win32 automatically changes negative width/height to 0.
5795 // X requires a sanity check for width & height; otherwise it dies
5796 if (hwnd.zero_sized && width > 0 && height > 0) {
5798 MapWindow(hwnd, WindowType.Whole);
5800 hwnd.zero_sized = false;
5803 if ((width < 1) || (height < 1)) {
5804 hwnd.zero_sized = true;
5805 UnmapWindow(hwnd, WindowType.Whole);
5808 // Save a server roundtrip (and prevent a feedback loop)
5809 if ((hwnd.x == x) && (hwnd.y == y) &&
5810 (hwnd.width == width) && (hwnd.height == height)) {
5814 if (!hwnd.zero_sized) {
5819 hwnd.height = height;
5820 SendMessage(hwnd.client_window, Msg.WM_WINDOWPOSCHANGED, IntPtr.Zero, IntPtr.Zero);
5822 if (hwnd.fixed_size) {
5823 SetWindowMinMax(handle, Rectangle.Empty, new Size(width, height), new Size(width, height));
5827 Control ctrl = Control.FromHandle (handle);
5828 Size TranslatedSize = TranslateWindowSizeToXWindowSize (ctrl.GetCreateParams (), new Size (width, height));
5829 MoveResizeWindow (DisplayHandle, hwnd.whole_window, x, y, TranslatedSize.Width, TranslatedSize.Height);
5830 PerformNCCalc(hwnd);
5834 // Update our position/size immediately, so
5835 // that future calls to SetWindowPos aren't
5836 // kept from calling XMoveResizeWindow (by the
5837 // "Save a server roundtrip" block above).
5841 hwnd.height = height;
5842 hwnd.ClientRect = Rectangle.Empty;
5845 internal override void SetWindowState(IntPtr handle, FormWindowState state) {
5846 FormWindowState current_state;
5849 hwnd = Hwnd.ObjectFromHandle(handle);
5851 current_state = GetWindowState(handle);
5853 if (current_state == state) {
5858 case FormWindowState.Normal: {
5860 if (current_state == FormWindowState.Minimized) {
5861 MapWindow(hwnd, WindowType.Both);
5862 } else if (current_state == FormWindowState.Maximized) {
5863 SendNetWMMessage(hwnd.whole_window, _NET_WM_STATE, (IntPtr)2 /* toggle */, _NET_WM_STATE_MAXIMIZED_HORZ, _NET_WM_STATE_MAXIMIZED_VERT);
5870 case FormWindowState.Minimized: {
5872 if (current_state == FormWindowState.Maximized) {
5873 SendNetWMMessage(hwnd.whole_window, _NET_WM_STATE, (IntPtr)2 /* toggle */, _NET_WM_STATE_MAXIMIZED_HORZ, _NET_WM_STATE_MAXIMIZED_VERT);
5875 XIconifyWindow(DisplayHandle, hwnd.whole_window, ScreenNo);
5880 case FormWindowState.Maximized: {
5882 if (current_state == FormWindowState.Minimized) {
5883 MapWindow(hwnd, WindowType.Both);
5886 SendNetWMMessage(hwnd.whole_window, _NET_WM_STATE, (IntPtr)1 /* Add */, _NET_WM_STATE_MAXIMIZED_HORZ, _NET_WM_STATE_MAXIMIZED_VERT);
5894 internal override void SetWindowStyle(IntPtr handle, CreateParams cp) {
5897 hwnd = Hwnd.ObjectFromHandle(handle);
5898 SetHwndStyles(hwnd, cp);
5899 SetWMStyles(hwnd, cp);
5902 internal override double GetWindowTransparency(IntPtr handle)
5907 internal override void SetWindowTransparency(IntPtr handle, double transparency, Color key) {
5911 hwnd = Hwnd.ObjectFromHandle(handle);
5917 hwnd.opacity = (uint)(0xffffffff * transparency);
5918 opacity = (IntPtr)((int)hwnd.opacity);
5920 IntPtr w = hwnd.whole_window;
5921 if (hwnd.reparented)
5922 w = XGetParent (hwnd.whole_window);
5923 XChangeProperty(DisplayHandle, w, _NET_WM_WINDOW_OPACITY, (IntPtr)Atom.XA_CARDINAL, 32, PropertyMode.Replace, ref opacity, 1);
5926 internal override bool SetZOrder(IntPtr handle, IntPtr after_handle, bool top, bool bottom) {
5927 Hwnd hwnd = Hwnd.ObjectFromHandle(handle);
5935 XRaiseWindow(DisplayHandle, hwnd.whole_window);
5938 } else if (!bottom) {
5939 Hwnd after_hwnd = null;
5941 if (after_handle != IntPtr.Zero) {
5942 after_hwnd = Hwnd.ObjectFromHandle(after_handle);
5945 XWindowChanges values = new XWindowChanges();
5947 if (after_hwnd == null) {
5948 // Work around metacity 'issues'
5952 atoms[0] = unixtime();
5953 XChangeProperty(DisplayHandle, hwnd.whole_window, _NET_WM_USER_TIME, (IntPtr)Atom.XA_CARDINAL, 32, PropertyMode.Replace, atoms, 1);
5955 XRaiseWindow(DisplayHandle, hwnd.whole_window);
5956 SendNetWMMessage(hwnd.whole_window, _NET_ACTIVE_WINDOW, (IntPtr)1, IntPtr.Zero, IntPtr.Zero);
5958 //throw new ArgumentNullException("after_handle", "Need sibling to adjust z-order");
5961 values.sibling = after_hwnd.whole_window;
5962 values.stack_mode = StackMode.Below;
5965 XConfigureWindow(DisplayHandle, hwnd.whole_window, ChangeWindowFlags.CWStackMode | ChangeWindowFlags.CWSibling, ref values);
5970 XLowerWindow(DisplayHandle, hwnd.whole_window);
5977 internal override void ShowCursor(bool show) {
5978 ; // FIXME - X11 doesn't 'hide' the cursor. we could create an empty cursor
5981 internal override object StartLoop(Thread thread) {
5982 XEventQueue q = ThreadQueue(thread);
5986 internal override TransparencySupport SupportsTransparency() {
5987 // We need to check if the x compositing manager is running
5988 return TransparencySupport.Set;
5991 internal override bool SystrayAdd(IntPtr handle, string tip, Icon icon, out ToolTip tt) {
5992 GetSystrayManagerWindow();
5994 if (SystrayMgrWindow != IntPtr.Zero) {
5995 XSizeHints size_hints;
5998 hwnd = Hwnd.ObjectFromHandle(handle);
6000 Console.WriteLine("Adding Systray Whole:{0:X}, Client:{1:X}", hwnd.whole_window.ToInt32(), hwnd.client_window.ToInt32());
6004 if (hwnd.client_window != hwnd.whole_window) {
6005 Keyboard.DestroyICForWindow (hwnd.client_window);
6006 XDestroyWindow(DisplayHandle, hwnd.client_window);
6007 hwnd.client_window = hwnd.whole_window;
6010 /* by virtue of the way the tests are ordered when determining if it's PAINT
6011 or NCPAINT, client_window == whole_window will always be PAINT. So, if we're
6012 waiting on an nc_expose, drop it and remove the hwnd from the list (unless
6013 there's a pending expose). */
6014 if (hwnd.nc_expose_pending) {
6015 hwnd.nc_expose_pending = false;
6016 if (!hwnd.expose_pending)
6017 hwnd.Queue.Paint.Remove (hwnd);
6020 size_hints = new XSizeHints();
6022 size_hints.flags = (IntPtr)(XSizeHintsFlags.PMinSize | XSizeHintsFlags.PMaxSize | XSizeHintsFlags.PBaseSize);
6024 size_hints.min_width = 24;
6025 size_hints.min_height = 24;
6026 size_hints.max_width = 24;
6027 size_hints.max_height = 24;
6028 size_hints.base_width = 24;
6029 size_hints.base_height = 24;
6031 XSetWMNormalHints(DisplayHandle, hwnd.whole_window, ref size_hints);
6033 int[] atoms = new int[2];
6034 atoms [0] = 1; // Version 1
6035 atoms [1] = 1; // we want to be mapped
6037 // This line cost me 3 days...
6038 XChangeProperty(DisplayHandle, hwnd.whole_window, _XEMBED_INFO, _XEMBED_INFO, 32, PropertyMode.Replace, atoms, 2);
6040 // Need to pick some reasonable defaults
6042 tt.AutomaticDelay = 350;
6043 tt.InitialDelay = 250;
6044 tt.ReshowDelay = 250;
6045 tt.ShowAlways = true;
6047 if ((tip != null) && (tip != string.Empty)) {
6048 tt.SetToolTip(Control.FromHandle(handle), tip);
6054 SendNetClientMessage(SystrayMgrWindow, _NET_SYSTEM_TRAY_OPCODE, IntPtr.Zero, (IntPtr)SystrayRequest.SYSTEM_TRAY_REQUEST_DOCK, hwnd.whole_window);
6062 internal override bool SystrayChange(IntPtr handle, string tip, Icon icon, ref ToolTip tt) {
6065 control = Control.FromHandle(handle);
6066 if (control != null && tt != null) {
6067 tt.SetToolTip(control, tip);
6069 SendMessage(handle, Msg.WM_PAINT, IntPtr.Zero, IntPtr.Zero);
6076 internal override void SystrayRemove(IntPtr handle, ref ToolTip tt) {
6078 SetVisible (handle, false, false);
6080 // The caller can now re-dock it later...
6088 internal override void SystrayBalloon(IntPtr handle, int timeout, string title, string text, ToolTipIcon icon)
6090 ThemeEngine.Current.ShowBalloonWindow (handle, timeout, title, text, icon);
6091 SendMessage(handle, Msg.WM_USER, IntPtr.Zero, (IntPtr) Msg.NIN_BALLOONSHOW);
6095 internal override bool Text(IntPtr handle, string text) {
6098 hwnd = Hwnd.ObjectFromHandle(handle);
6101 XChangeProperty(DisplayHandle, hwnd.whole_window, _NET_WM_NAME, UTF8_STRING, 8,
6102 PropertyMode.Replace, text, Encoding.UTF8.GetByteCount (text));
6104 // XXX this has problems with UTF8.
6105 // we need to either use the actual
6106 // text if it's latin-1, or convert it
6107 // to compound text if it's in a
6108 // different charset.
6109 XStoreName(DisplayHandle, Hwnd.ObjectFromHandle(handle).whole_window, text);
6114 internal override bool TranslateMessage(ref MSG msg) {
6115 return Keyboard.TranslateMessage (ref msg);
6118 internal override void UpdateWindow(IntPtr handle) {
6121 hwnd = Hwnd.ObjectFromHandle(handle);
6123 if (!hwnd.visible || !hwnd.expose_pending || !hwnd.Mapped) {
6127 SendMessage(handle, Msg.WM_PAINT, IntPtr.Zero, IntPtr.Zero);
6128 hwnd.Queue.Paint.Remove(hwnd);
6131 internal override void CreateOffscreenDrawable (IntPtr handle,
6132 int width, int height,
6133 out object offscreen_drawable)
6136 int x_out, y_out, width_out, height_out, border_width_out, depth_out;
6138 XGetGeometry (DisplayHandle, handle,
6140 out x_out, out y_out,
6141 out width_out, out height_out,
6142 out border_width_out, out depth_out);
6144 IntPtr pixmap = XCreatePixmap (DisplayHandle, handle, width, height, depth_out);
6146 offscreen_drawable = pixmap;
6150 internal override void DestroyOffscreenDrawable (object offscreen_drawable)
6152 XFreePixmap (DisplayHandle, (IntPtr)offscreen_drawable);
6155 internal override Graphics GetOffscreenGraphics (object offscreen_drawable)
6157 return Graphics.FromHwnd ((IntPtr) offscreen_drawable);
6160 internal override void BlitFromOffscreen (IntPtr dest_handle,
6162 object offscreen_drawable,
6163 Graphics offscreen_dc,
6166 XGCValues gc_values;
6169 gc_values = new XGCValues();
6171 gc = XCreateGC (DisplayHandle, dest_handle, IntPtr.Zero, ref gc_values);
6173 XCopyArea (DisplayHandle, (IntPtr)offscreen_drawable, dest_handle,
6174 gc, r.X, r.Y, r.Width, r.Height, r.X, r.Y);
6176 XFreeGC (DisplayHandle, gc);
6179 #endregion // Public Static Methods
6182 internal override event EventHandler Idle;
6183 #endregion // Events
6188 #region Xcursor imports
6189 [DllImport ("libXcursor", EntryPoint = "XcursorLibraryLoadCursor")]
6190 internal extern static IntPtr XcursorLibraryLoadCursor (IntPtr display, [MarshalAs (UnmanagedType.LPStr)] string name);
6192 [DllImport ("libXcursor", EntryPoint = "XcursorLibraryLoadImages")]
6193 internal extern static IntPtr XcursorLibraryLoadImages ([MarshalAs (UnmanagedType.LPStr)] string file, IntPtr theme, int size);
6195 [DllImport ("libXcursor", EntryPoint = "XcursorImagesDestroy")]
6196 internal extern static void XcursorImagesDestroy (IntPtr images);
6198 [DllImport ("libXcursor", EntryPoint = "XcursorGetDefaultSize")]
6199 internal extern static int XcursorGetDefaultSize (IntPtr display);
6201 [DllImport ("libXcursor", EntryPoint = "XcursorImageLoadCursor")]
6202 internal extern static IntPtr XcursorImageLoadCursor (IntPtr display, IntPtr image);
6204 [DllImport ("libXcursor", EntryPoint = "XcursorGetTheme")]
6205 internal extern static IntPtr XcursorGetTheme (IntPtr display);
6208 [DllImport ("libX11", EntryPoint="XOpenDisplay")]
6209 internal extern static IntPtr XOpenDisplay(IntPtr display);
6210 [DllImport ("libX11", EntryPoint="XCloseDisplay")]
6211 internal extern static int XCloseDisplay(IntPtr display);
6212 [DllImport ("libX11", EntryPoint="XSynchronize")]
6213 internal extern static IntPtr XSynchronize(IntPtr display, bool onoff);
6215 [DllImport ("libX11", EntryPoint="XCreateWindow")]
6216 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, UIntPtr valuemask, ref XSetWindowAttributes attributes);
6217 internal static IntPtr XCreateWindow(IntPtr display, IntPtr parent, int x, int y, int width, int height, int border_width, int depth, int xclass, IntPtr visual, UIntPtr valuemask, ref XSetWindowAttributes attributes) {
6218 DebugHelper.TraceWriteLine ("XCreateWindow");
6219 return _XCreateWindow(display, parent, x, y, width, height,
6220 border_width, depth, xclass, visual, valuemask, ref attributes);
6222 [DllImport ("libX11", EntryPoint="XCreateSimpleWindow")]
6223 internal extern static IntPtr _XCreateSimpleWindow(IntPtr display, IntPtr parent, int x, int y, int width, int height, int border_width, UIntPtr border, UIntPtr background);
6224 internal static IntPtr XCreateSimpleWindow(IntPtr display, IntPtr parent, int x, int y, int width, int height, int border_width, UIntPtr border, UIntPtr background) {
6225 DebugHelper.TraceWriteLine ("XCreateSimpleWindow");
6226 return _XCreateSimpleWindow(display, parent, x, y, width, height, border_width, border, background);
6228 [DllImport ("libX11", EntryPoint="XMapWindow")]
6229 internal extern static int _XMapWindow(IntPtr display, IntPtr window);
6230 internal static int XMapWindow(IntPtr display, IntPtr window) {
6231 DebugHelper.TraceWriteLine ("XMapWindow");
6232 return _XMapWindow(display, window);
6234 [DllImport ("libX11", EntryPoint="XUnmapWindow")]
6235 internal extern static int _XUnmapWindow(IntPtr display, IntPtr window);
6236 internal static int XUnmapWindow(IntPtr display, IntPtr window) {
6237 DebugHelper.TraceWriteLine ("XUnmapWindow");
6238 return _XUnmapWindow(display, window);
6240 [DllImport ("libX11", EntryPoint="XMapSubwindows")]
6241 internal extern static int _XMapSubindows(IntPtr display, IntPtr window);
6242 internal static int XMapSubindows(IntPtr display, IntPtr window) {
6243 DebugHelper.TraceWriteLine ("XMapSubindows");
6244 return _XMapSubindows(display, window);
6246 [DllImport ("libX11", EntryPoint="XUnmapSubwindows")]
6247 internal extern static int _XUnmapSubwindows(IntPtr display, IntPtr window);
6248 internal static int XUnmapSubwindows(IntPtr display, IntPtr window) {
6249 DebugHelper.TraceWriteLine ("XUnmapSubwindows");
6250 return _XUnmapSubwindows(display, window);
6252 [DllImport ("libX11", EntryPoint="XRootWindow")]
6253 internal extern static IntPtr _XRootWindow(IntPtr display, int screen_number);
6254 internal static IntPtr XRootWindow(IntPtr display, int screen_number) {
6255 DebugHelper.TraceWriteLine ("XRootWindow");
6256 return _XRootWindow(display, screen_number);
6258 [DllImport ("libX11", EntryPoint="XNextEvent")]
6259 internal extern static IntPtr _XNextEvent(IntPtr display, ref XEvent xevent);
6260 internal static IntPtr XNextEvent(IntPtr display, ref XEvent xevent) {
6261 DebugHelper.TraceWriteLine ("XNextEvent");
6262 return _XNextEvent(display, ref xevent);
6264 [DllImport ("libX11", EntryPoint="XConnectionNumber")]
6265 internal extern static int _XConnectionNumber (IntPtr display);
6266 internal static int XConnectionNumber (IntPtr display) {
6267 DebugHelper.TraceWriteLine ("XConnectionNumber");
6268 return _XConnectionNumber (display);
6270 [DllImport ("libX11", EntryPoint="XPending")]
6271 internal extern static int _XPending (IntPtr display);
6272 internal static int XPending (IntPtr display) {
6273 DebugHelper.TraceWriteLine ("XPending");
6274 DebugHelper.DumpCallers (3);
6275 return _XPending (display);
6277 [DllImport ("libX11", EntryPoint="XSelectInput")]
6278 internal extern static IntPtr _XSelectInput(IntPtr display, IntPtr window, IntPtr mask);
6279 internal static IntPtr XSelectInput(IntPtr display, IntPtr window, IntPtr mask) {
6280 DebugHelper.TraceWriteLine ("XSelectInput");
6281 return _XSelectInput(display, window, mask);
6284 [DllImport ("libX11", EntryPoint="XDestroyWindow")]
6285 internal extern static int _XDestroyWindow(IntPtr display, IntPtr window);
6286 internal static int XDestroyWindow(IntPtr display, IntPtr window) {
6287 DebugHelper.TraceWriteLine ("XDestroyWindow 0x{0:x}", window.ToInt32());
6288 return _XDestroyWindow(display, window);
6291 [DllImport ("libX11", EntryPoint="XReparentWindow")]
6292 internal extern static int _XReparentWindow(IntPtr display, IntPtr window, IntPtr parent, int x, int y);
6293 internal static int XReparentWindow(IntPtr display, IntPtr window, IntPtr parent, int x, int y) {
6294 DebugHelper.TraceWriteLine ("XReparentWindow");
6295 return _XReparentWindow(display, window, parent, x, y);
6298 [DllImport ("libX11", EntryPoint="XMoveResizeWindow")]
6299 private extern static int _XMoveResizeWindow(IntPtr display, IntPtr window, int x, int y, int width, int height);
6300 private static int XMoveResizeWindow(IntPtr display, IntPtr window, int x, int y, int width, int height) {
6301 DebugHelper.TraceWriteLine ("XMoveResizeWindow");
6302 return _XMoveResizeWindow(display, window, x, y, width, height);
6305 internal static int MoveResizeWindow(IntPtr display, IntPtr window, int x, int y, int width, int height)
6307 int ret = XMoveResizeWindow (display, window, x, y, width, height);
6308 Keyboard.MoveCurrentCaretPos ();
6312 [DllImport ("libX11", EntryPoint="XResizeWindow")]
6313 internal extern static int _XResizeWindow(IntPtr display, IntPtr window, int width, int height);
6314 internal static int XResizeWindow(IntPtr display, IntPtr window, int width, int height) {
6315 DebugHelper.TraceWriteLine ("XResizeWindow");
6316 return _XResizeWindow(display, window, width, height);
6319 [DllImport ("libX11", EntryPoint="XGetWindowAttributes")]
6320 internal extern static int _XGetWindowAttributes(IntPtr display, IntPtr window, ref XWindowAttributes attributes);
6321 internal static int XGetWindowAttributes(IntPtr display, IntPtr window, ref XWindowAttributes attributes) {
6322 DebugHelper.TraceWriteLine ("XGetWindowAttributes");
6323 return _XGetWindowAttributes(display, window, ref attributes);
6326 [DllImport ("libX11", EntryPoint="XFlush")]
6327 internal extern static int _XFlush(IntPtr display);
6328 internal static int XFlush(IntPtr display) {
6329 DebugHelper.TraceWriteLine ("XFlush");
6330 return _XFlush(display);
6333 [DllImport ("libX11", EntryPoint="XSetWMName")]
6334 internal extern static int _XSetWMName(IntPtr display, IntPtr window, ref XTextProperty text_prop);
6335 internal static int XSetWMName(IntPtr display, IntPtr window, ref XTextProperty text_prop) {
6336 DebugHelper.TraceWriteLine ("XSetWMName");
6337 return _XSetWMName(display, window, ref text_prop);
6340 [DllImport ("libX11", EntryPoint="XStoreName")]
6341 internal extern static int _XStoreName(IntPtr display, IntPtr window, string window_name);
6342 internal static int XStoreName(IntPtr display, IntPtr window, string window_name) {
6343 DebugHelper.TraceWriteLine ("XStoreName");
6344 return _XStoreName(display, window, window_name);
6347 [DllImport ("libX11", EntryPoint="XFetchName")]
6348 internal extern static int _XFetchName(IntPtr display, IntPtr window, ref IntPtr window_name);
6349 internal static int XFetchName(IntPtr display, IntPtr window, ref IntPtr window_name) {
6350 DebugHelper.TraceWriteLine ("XFetchName");
6351 return _XFetchName(display, window, ref window_name);
6354 [DllImport ("libX11", EntryPoint="XSendEvent")]
6355 internal extern static int _XSendEvent(IntPtr display, IntPtr window, bool propagate, IntPtr event_mask, ref XEvent send_event);
6356 internal static int XSendEvent(IntPtr display, IntPtr window, bool propagate, IntPtr event_mask, ref XEvent send_event) {
6357 DebugHelper.TraceWriteLine ("XSendEvent");
6358 return _XSendEvent(display, window, propagate, event_mask, ref send_event);
6361 [DllImport ("libX11", EntryPoint="XQueryTree")]
6362 internal extern static int _XQueryTree(IntPtr display, IntPtr window, out IntPtr root_return, out IntPtr parent_return, out IntPtr children_return, out int nchildren_return);
6363 internal static int XQueryTree(IntPtr display, IntPtr window, out IntPtr root_return, out IntPtr parent_return, out IntPtr children_return, out int nchildren_return) {
6364 DebugHelper.TraceWriteLine ("XQueryTree");
6365 return _XQueryTree(display, window, out root_return, out parent_return, out children_return, out nchildren_return);
6368 [DllImport ("libX11", EntryPoint="XFree")]
6369 internal extern static int _XFree(IntPtr data);
6370 internal static int XFree(IntPtr data) {
6371 DebugHelper.TraceWriteLine ("XFree");
6372 return _XFree(data);
6375 [DllImport ("libX11", EntryPoint="XRaiseWindow")]
6376 internal extern static int _XRaiseWindow(IntPtr display, IntPtr window);
6377 internal static int XRaiseWindow(IntPtr display, IntPtr window) {
6378 DebugHelper.TraceWriteLine ("XRaiseWindow");
6379 return _XRaiseWindow(display, window);
6382 [DllImport ("libX11", EntryPoint="XLowerWindow")]
6383 internal extern static uint _XLowerWindow(IntPtr display, IntPtr window);
6384 internal static uint XLowerWindow(IntPtr display, IntPtr window) {
6385 DebugHelper.TraceWriteLine ("XLowerWindow");
6386 return _XLowerWindow(display, window);
6389 [DllImport ("libX11", EntryPoint="XConfigureWindow")]
6390 internal extern static uint _XConfigureWindow(IntPtr display, IntPtr window, ChangeWindowFlags value_mask, ref XWindowChanges values);
6391 internal static uint XConfigureWindow(IntPtr display, IntPtr window, ChangeWindowFlags value_mask, ref XWindowChanges values) {
6392 DebugHelper.TraceWriteLine ("XConfigureWindow");
6393 return _XConfigureWindow(display, window, value_mask, ref values);
6396 [DllImport ("libX11", EntryPoint="XInternAtom")]
6397 internal extern static IntPtr _XInternAtom(IntPtr display, string atom_name, bool only_if_exists);
6398 internal static IntPtr XInternAtom(IntPtr display, string atom_name, bool only_if_exists) {
6399 DebugHelper.TraceWriteLine ("XInternAtom");
6400 return _XInternAtom(display, atom_name, only_if_exists);
6403 [DllImport ("libX11", EntryPoint="XInternAtoms")]
6404 internal extern static int _XInternAtoms(IntPtr display, string[] atom_names, int atom_count, bool only_if_exists, IntPtr[] atoms);
6405 internal static int XInternAtoms(IntPtr display, string[] atom_names, int atom_count, bool only_if_exists, IntPtr[] atoms) {
6406 DebugHelper.TraceWriteLine ("XInternAtoms");
6407 return _XInternAtoms(display, atom_names, atom_count, only_if_exists, atoms);
6410 [DllImport ("libX11", EntryPoint="XSetWMProtocols")]
6411 internal extern static int _XSetWMProtocols(IntPtr display, IntPtr window, IntPtr[] protocols, int count);
6412 internal static int XSetWMProtocols(IntPtr display, IntPtr window, IntPtr[] protocols, int count) {
6413 DebugHelper.TraceWriteLine ("XSetWMProtocols");
6414 return _XSetWMProtocols(display, window, protocols, count);
6417 [DllImport ("libX11", EntryPoint="XGrabPointer")]
6418 internal extern static int _XGrabPointer(IntPtr display, IntPtr window, bool owner_events, EventMask event_mask, GrabMode pointer_mode, GrabMode keyboard_mode, IntPtr confine_to, IntPtr cursor, IntPtr timestamp);
6419 internal static int XGrabPointer(IntPtr display, IntPtr window, bool owner_events, EventMask event_mask, GrabMode pointer_mode, GrabMode keyboard_mode, IntPtr confine_to, IntPtr cursor, IntPtr timestamp) {
6420 DebugHelper.TraceWriteLine ("XGrabPointer");
6421 return _XGrabPointer(display, window, owner_events, event_mask, pointer_mode, keyboard_mode, confine_to, cursor, timestamp);
6424 [DllImport ("libX11", EntryPoint="XUngrabPointer")]
6425 internal extern static int _XUngrabPointer(IntPtr display, IntPtr timestamp);
6426 internal static int XUngrabPointer(IntPtr display, IntPtr timestamp) {
6427 DebugHelper.TraceWriteLine ("XUngrabPointer");
6428 return _XUngrabPointer(display, timestamp);
6431 [DllImport ("libX11", EntryPoint="XQueryPointer")]
6432 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);
6433 internal 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) {
6434 DebugHelper.TraceWriteLine ("XQueryPointer");
6435 return _XQueryPointer(display, window, out root, out child, out root_x, out root_y, out win_x, out win_y, out keys_buttons);
6438 [DllImport ("libX11", EntryPoint="XTranslateCoordinates")]
6439 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);
6440 internal 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) {
6441 DebugHelper.TraceWriteLine ("XTranslateCoordinates");
6442 return _XTranslateCoordinates (display, src_w, dest_w, src_x, src_y, out intdest_x_return, out dest_y_return, out child_return);
6445 [DllImport ("libX11", EntryPoint="XGetGeometry")]
6446 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);
6447 internal 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) {
6448 DebugHelper.TraceWriteLine ("XGetGeometry");
6449 return _XGetGeometry(display, window, out root, out x, out y, out width, out height, out border_width, out depth);
6452 [DllImport ("libX11", EntryPoint="XGetGeometry")]
6453 internal extern static bool _XGetGeometry(IntPtr display, IntPtr window, IntPtr root, out int x, out int y, out int width, out int height, IntPtr border_width, IntPtr depth);
6454 internal static bool XGetGeometry(IntPtr display, IntPtr window, IntPtr root, out int x, out int y, out int width, out int height, IntPtr border_width, IntPtr depth) {
6455 DebugHelper.TraceWriteLine ("XGetGeometry");
6456 return _XGetGeometry(display, window, root, out x, out y, out width, out height, border_width, depth);
6459 [DllImport ("libX11", EntryPoint="XGetGeometry")]
6460 internal extern static bool _XGetGeometry(IntPtr display, IntPtr window, IntPtr root, out int x, out int y, IntPtr width, IntPtr height, IntPtr border_width, IntPtr depth);
6461 internal static bool XGetGeometry(IntPtr display, IntPtr window, IntPtr root, out int x, out int y, IntPtr width, IntPtr height, IntPtr border_width, IntPtr depth) {
6462 DebugHelper.TraceWriteLine ("XGetGeometry");
6463 return _XGetGeometry(display, window, root, out x, out y, width, height, border_width, depth);
6466 [DllImport ("libX11", EntryPoint="XGetGeometry")]
6467 internal extern static bool _XGetGeometry(IntPtr display, IntPtr window, IntPtr root, IntPtr x, IntPtr y, out int width, out int height, IntPtr border_width, IntPtr depth);
6468 internal static bool XGetGeometry(IntPtr display, IntPtr window, IntPtr root, IntPtr x, IntPtr y, out int width, out int height, IntPtr border_width, IntPtr depth) {
6469 DebugHelper.TraceWriteLine ("XGetGeometry");
6470 return _XGetGeometry(display, window, root, x, y, out width, out height, border_width, depth);
6473 [DllImport ("libX11", EntryPoint="XWarpPointer")]
6474 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);
6475 internal 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) {
6476 DebugHelper.TraceWriteLine ("XWarpPointer");
6477 return _XWarpPointer(display, src_w, dest_w, src_x, src_y, src_width, src_height, dest_x, dest_y);
6480 [DllImport ("libX11", EntryPoint="XClearWindow")]
6481 internal extern static int _XClearWindow(IntPtr display, IntPtr window);
6482 internal static int XClearWindow(IntPtr display, IntPtr window) {
6483 DebugHelper.TraceWriteLine ("XClearWindow");
6484 return _XClearWindow(display, window);
6487 [DllImport ("libX11", EntryPoint="XClearArea")]
6488 internal extern static int _XClearArea(IntPtr display, IntPtr window, int x, int y, int width, int height, bool exposures);
6489 internal static int XClearArea(IntPtr display, IntPtr window, int x, int y, int width, int height, bool exposures) {
6490 DebugHelper.TraceWriteLine ("XClearArea");
6491 return _XClearArea(display, window, x, y, width, height, exposures);
6495 [DllImport ("libX11", EntryPoint="XDefaultScreenOfDisplay")]
6496 internal extern static IntPtr _XDefaultScreenOfDisplay(IntPtr display);
6497 internal static IntPtr XDefaultScreenOfDisplay(IntPtr display) {
6498 DebugHelper.TraceWriteLine ("XDefaultScreenOfDisplay");
6499 return _XDefaultScreenOfDisplay(display);
6502 [DllImport ("libX11", EntryPoint="XScreenNumberOfScreen")]
6503 internal extern static int _XScreenNumberOfScreen(IntPtr display, IntPtr Screen);
6504 internal static int XDefaultScreenOfDisplay(IntPtr display, IntPtr Screen) {
6505 DebugHelper.TraceWriteLine ("XDefaultScreenOfDisplay");
6506 return _XScreenNumberOfScreen(display, Screen);
6509 [DllImport ("libX11", EntryPoint="XDefaultVisual")]
6510 internal extern static IntPtr _XDefaultVisual(IntPtr display, int screen_number);
6511 internal static IntPtr XDefaultScreenOfDisplay(IntPtr display, int screen_number) {
6512 DebugHelper.TraceWriteLine ("XDefaultScreenOfDisplay");
6513 return _XDefaultVisual(display, screen_number);
6516 [DllImport ("libX11", EntryPoint="XDefaultDepth")]
6517 internal extern static uint _XDefaultDepth(IntPtr display, int screen_number);
6518 internal static uint XDefaultDepth(IntPtr display, int screen_number) {
6519 DebugHelper.TraceWriteLine ("XDefaultDepth");
6520 return _XDefaultDepth(display, screen_number);
6523 [DllImport ("libX11", EntryPoint="XDefaultScreen")]
6524 internal extern static int _XDefaultScreen(IntPtr display);
6525 internal static int XDefaultScreen(IntPtr display) {
6526 DebugHelper.TraceWriteLine ("XDefaultScreen");
6527 return _XDefaultScreen(display);
6530 [DllImport ("libX11", EntryPoint="XDefaultColormap")]
6531 internal extern static IntPtr _XDefaultColormap(IntPtr display, int screen_number);
6532 internal static IntPtr XDefaultColormap(IntPtr display, int screen_number) {
6533 DebugHelper.TraceWriteLine ("XDefaultColormap");
6534 return _XDefaultColormap(display, screen_number);
6537 [DllImport ("libX11", EntryPoint="XLookupColor")]
6538 internal extern static int _XLookupColor(IntPtr display, IntPtr Colormap, string Coloranem, ref XColor exact_def_color, ref XColor screen_def_color);
6539 internal static int XLookupColor(IntPtr display, IntPtr Colormap, string Coloranem, ref XColor exact_def_color, ref XColor screen_def_color) {
6540 DebugHelper.TraceWriteLine ("XLookupColor");
6541 return _XLookupColor(display, Colormap, Coloranem, ref exact_def_color, ref screen_def_color);
6544 [DllImport ("libX11", EntryPoint="XAllocColor")]
6545 internal extern static int _XAllocColor(IntPtr display, IntPtr Colormap, ref XColor colorcell_def);
6546 internal static int XAllocColor(IntPtr display, IntPtr Colormap, ref XColor colorcell_def) {
6547 DebugHelper.TraceWriteLine ("XAllocColor");
6548 return _XAllocColor(display, Colormap, ref colorcell_def);
6551 [DllImport ("libX11", EntryPoint="XSetTransientForHint")]
6552 internal extern static int _XSetTransientForHint(IntPtr display, IntPtr window, IntPtr prop_window);
6553 internal static int XSetTransientForHint(IntPtr display, IntPtr window, IntPtr prop_window) {
6554 DebugHelper.TraceWriteLine ("XSetTransientForHint");
6555 return _XSetTransientForHint(display, window, prop_window);
6558 [DllImport ("libX11", EntryPoint="XChangeProperty")]
6559 internal extern static int _XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, ref MotifWmHints data, int nelements);
6560 internal static int XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, ref MotifWmHints data, int nelements) {
6561 DebugHelper.TraceWriteLine ("XChangeProperty");
6562 return _XChangeProperty(display, window, property, type, format, mode, ref data, nelements);
6565 [DllImport ("libX11", EntryPoint="XChangeProperty")]
6566 internal extern static int _XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, ref uint value, int nelements);
6567 internal static int XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, ref uint value, int nelements) {
6568 DebugHelper.TraceWriteLine ("XChangeProperty");
6569 return _XChangeProperty(display, window, property, type, format, mode, ref value, nelements);
6572 [DllImport ("libX11", EntryPoint="XChangeProperty")]
6573 internal extern static int _XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, ref IntPtr value, int nelements);
6574 internal static int XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, ref IntPtr value, int nelements) {
6575 DebugHelper.TraceWriteLine ("XChangeProperty");
6576 return _XChangeProperty(display, window, property, type, format, mode, ref value, nelements);
6579 [DllImport ("libX11", EntryPoint="XChangeProperty")]
6580 internal extern static int _XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, uint[] data, int nelements);
6581 internal static int XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, uint[] data, int nelements) {
6582 DebugHelper.TraceWriteLine ("XChangeProperty");
6583 return _XChangeProperty(display, window, property, type, format, mode, data, nelements);
6586 [DllImport ("libX11", EntryPoint="XChangeProperty")]
6587 internal extern static int _XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, int[] data, int nelements);
6588 internal static int XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, int[] data, int nelements) {
6589 DebugHelper.TraceWriteLine ("XChangeProperty");
6590 return _XChangeProperty(display, window, property, type, format, mode, data, nelements);
6593 [DllImport ("libX11", EntryPoint="XChangeProperty")]
6594 internal extern static int _XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, IntPtr[] data, int nelements);
6595 internal static int XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, IntPtr[] data, int nelements) {
6596 DebugHelper.TraceWriteLine ("XChangeProperty");
6597 return _XChangeProperty(display, window, property, type, format, mode, data, nelements);
6600 [DllImport ("libX11", EntryPoint="XChangeProperty")]
6601 internal extern static int _XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, IntPtr atoms, int nelements);
6602 internal static int XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, IntPtr atoms, int nelements) {
6603 DebugHelper.TraceWriteLine ("XChangeProperty");
6604 return _XChangeProperty(display, window, property, type, format, mode, atoms, nelements);
6607 [DllImport ("libX11", EntryPoint="XChangeProperty", CharSet=CharSet.Ansi)]
6608 internal extern static int _XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, string text, int text_length);
6609 internal static int XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, string text, int text_length) {
6610 DebugHelper.TraceWriteLine ("XChangeProperty");
6611 return _XChangeProperty(display, window, property, type, format, mode, text, text_length);
6614 [DllImport ("libX11", EntryPoint="XDeleteProperty")]
6615 internal extern static int _XDeleteProperty(IntPtr display, IntPtr window, IntPtr property);
6616 internal static int XDeleteProperty(IntPtr display, IntPtr window, IntPtr property) {
6617 DebugHelper.TraceWriteLine ("XDeleteProperty");
6618 return _XDeleteProperty(display, window, property);
6622 [DllImport ("libX11", EntryPoint="XCreateGC")]
6623 internal extern static IntPtr _XCreateGC(IntPtr display, IntPtr window, IntPtr valuemask, ref XGCValues values);
6624 internal static IntPtr XCreateGC(IntPtr display, IntPtr window, IntPtr valuemask, ref XGCValues values) {
6625 DebugHelper.TraceWriteLine ("XCreateGC");
6626 return _XCreateGC(display, window, valuemask, ref values);
6629 [DllImport ("libX11", EntryPoint="XFreeGC")]
6630 internal extern static int _XFreeGC(IntPtr display, IntPtr gc);
6631 internal static int XFreeGC(IntPtr display, IntPtr gc) {
6632 DebugHelper.TraceWriteLine ("XFreeGC");
6633 return _XFreeGC(display, gc);
6636 [DllImport ("libX11", EntryPoint="XSetFunction")]
6637 internal extern static int _XSetFunction(IntPtr display, IntPtr gc, GXFunction function);
6638 internal static int XSetFunction(IntPtr display, IntPtr gc, GXFunction function) {
6639 DebugHelper.TraceWriteLine ("XSetFunction");
6640 return _XSetFunction(display, gc, function);
6643 [DllImport ("libX11", EntryPoint="XSetLineAttributes")]
6644 internal extern static int _XSetLineAttributes(IntPtr display, IntPtr gc, int line_width, GCLineStyle line_style, GCCapStyle cap_style, GCJoinStyle join_style);
6645 internal static int XSetLineAttributes(IntPtr display, IntPtr gc, int line_width, GCLineStyle line_style, GCCapStyle cap_style, GCJoinStyle join_style) {
6646 DebugHelper.TraceWriteLine ("XSetLineAttributes");
6647 return _XSetLineAttributes(display, gc, line_width, line_style, cap_style, join_style);
6650 [DllImport ("libX11", EntryPoint="XDrawLine")]
6651 internal extern static int _XDrawLine(IntPtr display, IntPtr drawable, IntPtr gc, int x1, int y1, int x2, int y2);
6652 internal static int XDrawLine(IntPtr display, IntPtr drawable, IntPtr gc, int x1, int y1, int x2, int y2) {
6653 DebugHelper.TraceWriteLine ("XDrawLine");
6654 return _XDrawLine(display, drawable, gc, x1, y1, x2, y2);
6657 [DllImport ("libX11", EntryPoint="XDrawRectangle")]
6658 internal extern static int _XDrawRectangle(IntPtr display, IntPtr drawable, IntPtr gc, int x1, int y1, int width, int height);
6659 internal static int XDrawRectangle(IntPtr display, IntPtr drawable, IntPtr gc, int x1, int y1, int width, int height) {
6660 DebugHelper.TraceWriteLine ("XDrawRectangle");
6661 return _XDrawRectangle(display, drawable, gc, x1, y1, width, height);
6664 [DllImport ("libX11", EntryPoint="XFillRectangle")]
6665 internal extern static int _XFillRectangle(IntPtr display, IntPtr drawable, IntPtr gc, int x1, int y1, int width, int height);
6666 internal static int XFillRectangle(IntPtr display, IntPtr drawable, IntPtr gc, int x1, int y1, int width, int height) {
6667 DebugHelper.TraceWriteLine ("XFillRectangle");
6668 return _XFillRectangle(display, drawable, gc, x1, y1, width, height);
6671 [DllImport ("libX11", EntryPoint="XSetWindowBackground")]
6672 internal extern static int _XSetWindowBackground(IntPtr display, IntPtr window, IntPtr background);
6673 internal static int XSetWindowBackground(IntPtr display, IntPtr window, IntPtr background) {
6674 DebugHelper.TraceWriteLine ("XSetWindowBackground");
6675 return _XSetWindowBackground(display, window, background);
6678 [DllImport ("libX11", EntryPoint="XCopyArea")]
6679 internal extern static int _XCopyArea(IntPtr display, IntPtr src, IntPtr dest, IntPtr gc, int src_x, int src_y, int width, int height, int dest_x, int dest_y);
6680 internal static int XCopyArea(IntPtr display, IntPtr src, IntPtr dest, IntPtr gc, int src_x, int src_y, int width, int height, int dest_x, int dest_y) {
6681 DebugHelper.TraceWriteLine ("XCopyArea");
6682 return _XCopyArea(display, src, dest, gc, src_x, src_y, width, height, dest_x, dest_y);
6685 [DllImport ("libX11", EntryPoint="XGetWindowProperty")]
6686 internal extern static int _XGetWindowProperty(IntPtr display, IntPtr window, IntPtr atom, IntPtr long_offset, IntPtr long_length, bool delete, IntPtr req_type, out IntPtr actual_type, out int actual_format, out IntPtr nitems, out IntPtr bytes_after, ref IntPtr prop);
6687 internal static int XGetWindowProperty(IntPtr display, IntPtr window, IntPtr atom, IntPtr long_offset, IntPtr long_length, bool delete, IntPtr req_type, out IntPtr actual_type, out int actual_format, out IntPtr nitems, out IntPtr bytes_after, ref IntPtr prop) {
6688 DebugHelper.TraceWriteLine ("XGetWindowProperty");
6689 return _XGetWindowProperty(display, window, atom, long_offset, long_length, delete, req_type, out actual_type, out actual_format, out nitems, out bytes_after, ref prop);
6692 [DllImport ("libX11", EntryPoint="XSetInputFocus")]
6693 internal extern static int _XSetInputFocus(IntPtr display, IntPtr window, RevertTo revert_to, IntPtr time);
6694 internal static int XSetInputFocus(IntPtr display, IntPtr window, RevertTo revert_to, IntPtr time) {
6695 DebugHelper.TraceWriteLine ("XSetInputFocus");
6696 return _XSetInputFocus(display, window, revert_to, time);
6699 [DllImport ("libX11", EntryPoint="XIconifyWindow")]
6700 internal extern static int _XIconifyWindow(IntPtr display, IntPtr window, int screen_number);
6701 internal static int XIconifyWindow(IntPtr display, IntPtr window, int screen_number) {
6702 DebugHelper.TraceWriteLine ("XIconifyWindow");
6703 return _XIconifyWindow(display, window, screen_number);
6706 [DllImport ("libX11", EntryPoint="XDefineCursor")]
6707 internal extern static int _XDefineCursor(IntPtr display, IntPtr window, IntPtr cursor);
6708 internal static int XDefineCursor(IntPtr display, IntPtr window, IntPtr cursor) {
6709 DebugHelper.TraceWriteLine ("XDefineCursor");
6710 return _XDefineCursor(display, window, cursor);
6713 [DllImport ("libX11", EntryPoint="XUndefineCursor")]
6714 internal extern static int _XUndefineCursor(IntPtr display, IntPtr window);
6715 internal static int XUndefineCursor(IntPtr display, IntPtr window) {
6716 DebugHelper.TraceWriteLine ("XUndefineCursor");
6717 return _XUndefineCursor(display, window);
6720 [DllImport ("libX11", EntryPoint="XFreeCursor")]
6721 internal extern static int _XFreeCursor(IntPtr display, IntPtr cursor);
6722 internal static int XFreeCursor(IntPtr display, IntPtr cursor) {
6723 DebugHelper.TraceWriteLine ("XFreeCursor");
6724 return _XFreeCursor(display, cursor);
6727 [DllImport ("libX11", EntryPoint="XCreateFontCursor")]
6728 internal extern static IntPtr _XCreateFontCursor(IntPtr display, CursorFontShape shape);
6729 internal static IntPtr XCreateFontCursor(IntPtr display, CursorFontShape shape) {
6730 DebugHelper.TraceWriteLine ("XCreateFontCursor");
6731 return _XCreateFontCursor(display, shape);
6734 [DllImport ("libX11", EntryPoint="XCreatePixmapCursor")]
6735 internal extern static IntPtr _XCreatePixmapCursor(IntPtr display, IntPtr source, IntPtr mask, ref XColor foreground_color, ref XColor background_color, int x_hot, int y_hot);
6736 internal static IntPtr XCreatePixmapCursor(IntPtr display, IntPtr source, IntPtr mask, ref XColor foreground_color, ref XColor background_color, int x_hot, int y_hot) {
6737 DebugHelper.TraceWriteLine ("XCreatePixmapCursor");
6738 return _XCreatePixmapCursor(display, source, mask, ref foreground_color, ref background_color, x_hot, y_hot);
6741 [DllImport ("libX11", EntryPoint="XCreatePixmapFromBitmapData")]
6742 internal extern static IntPtr _XCreatePixmapFromBitmapData(IntPtr display, IntPtr drawable, byte[] data, int width, int height, IntPtr fg, IntPtr bg, int depth);
6743 internal static IntPtr XCreatePixmapFromBitmapData(IntPtr display, IntPtr drawable, byte[] data, int width, int height, IntPtr fg, IntPtr bg, int depth) {
6744 DebugHelper.TraceWriteLine ("XCreatePixmapFromBitmapData");
6745 return _XCreatePixmapFromBitmapData(display, drawable, data, width, height, fg, bg, depth);
6748 [DllImport ("libX11", EntryPoint="XCreatePixmap")]
6749 internal extern static IntPtr _XCreatePixmap(IntPtr display, IntPtr d, int width, int height, int depth);
6750 internal static IntPtr XCreatePixmap(IntPtr display, IntPtr d, int width, int height, int depth) {
6751 DebugHelper.TraceWriteLine ("XCreatePixmap");
6752 return _XCreatePixmap(display, d, width, height, depth);
6755 [DllImport ("libX11", EntryPoint="XFreePixmap")]
6756 internal extern static IntPtr _XFreePixmap(IntPtr display, IntPtr pixmap);
6757 internal static IntPtr XFreePixmap(IntPtr display, IntPtr pixmap) {
6758 DebugHelper.TraceWriteLine ("XFreePixmap");
6759 return _XFreePixmap(display, pixmap);
6762 [DllImport ("libX11", EntryPoint="XQueryBestCursor")]
6763 internal extern static int _XQueryBestCursor(IntPtr display, IntPtr drawable, int width, int height, out int best_width, out int best_height);
6764 internal static int XQueryBestCursor(IntPtr display, IntPtr drawable, int width, int height, out int best_width, out int best_height) {
6765 DebugHelper.TraceWriteLine ("XQueryBestCursor");
6766 return _XQueryBestCursor(display, drawable, width, height, out best_width, out best_height);
6769 [DllImport ("libX11", EntryPoint="XQueryExtension")]
6770 internal extern static int _XQueryExtension(IntPtr display, string extension_name, ref int major, ref int first_event, ref int first_error);
6771 internal static int XQueryExtension(IntPtr display, string extension_name, ref int major, ref int first_event, ref int first_error) {
6772 DebugHelper.TraceWriteLine ("XQueryExtension");
6773 return _XQueryExtension(display, extension_name, ref major, ref first_event, ref first_error);
6776 [DllImport ("libX11", EntryPoint="XWhitePixel")]
6777 internal extern static IntPtr _XWhitePixel(IntPtr display, int screen_no);
6778 internal static IntPtr XWhitePixel(IntPtr display, int screen_no) {
6779 DebugHelper.TraceWriteLine ("XWhitePixel");
6780 return _XWhitePixel(display, screen_no);
6783 [DllImport ("libX11", EntryPoint="XBlackPixel")]
6784 internal extern static IntPtr _XBlackPixel(IntPtr display, int screen_no);
6785 internal static IntPtr XBlackPixel(IntPtr display, int screen_no) {
6786 DebugHelper.TraceWriteLine ("XBlackPixel");
6787 return _XBlackPixel(display, screen_no);
6790 [DllImport ("libX11", EntryPoint="XGrabServer")]
6791 internal extern static void _XGrabServer(IntPtr display);
6792 internal static void XGrabServer(IntPtr display) {
6793 DebugHelper.TraceWriteLine ("XGrabServer");
6794 _XGrabServer(display);
6797 [DllImport ("libX11", EntryPoint="XUngrabServer")]
6798 internal extern static void _XUngrabServer(IntPtr display);
6799 internal static void XUngrabServer(IntPtr display) {
6800 DebugHelper.TraceWriteLine ("XUngrabServer");
6801 _XUngrabServer(display);
6804 [DllImport ("libX11", EntryPoint="XGetWMNormalHints")]
6805 internal extern static void _XGetWMNormalHints(IntPtr display, IntPtr window, ref XSizeHints hints, out IntPtr supplied_return);
6806 internal static void XGetWMNormalHints(IntPtr display, IntPtr window, ref XSizeHints hints, out IntPtr supplied_return) {
6807 DebugHelper.TraceWriteLine ("XGetWMNormalHints");
6808 _XGetWMNormalHints(display, window, ref hints, out supplied_return);
6811 [DllImport ("libX11", EntryPoint="XSetWMNormalHints")]
6812 internal extern static void _XSetWMNormalHints(IntPtr display, IntPtr window, ref XSizeHints hints);
6813 internal static void XSetWMNormalHints(IntPtr display, IntPtr window, ref XSizeHints hints) {
6814 DebugHelper.TraceWriteLine ("XSetWMNormalHints");
6815 _XSetWMNormalHints(display, window, ref hints);
6818 [DllImport ("libX11", EntryPoint="XSetZoomHints")]
6819 internal extern static void _XSetZoomHints(IntPtr display, IntPtr window, ref XSizeHints hints);
6820 internal static void XSetZoomHints(IntPtr display, IntPtr window, ref XSizeHints hints) {
6821 DebugHelper.TraceWriteLine ("XSetZoomHints");
6822 _XSetZoomHints(display, window, ref hints);
6825 [DllImport ("libX11", EntryPoint="XSetWMHints")]
6826 internal extern static void _XSetWMHints(IntPtr display, IntPtr window, ref XWMHints wmhints);
6827 internal static void XSetWMHints(IntPtr display, IntPtr window, ref XWMHints wmhints) {
6828 DebugHelper.TraceWriteLine ("XSetWMHints");
6829 _XSetWMHints(display, window, ref wmhints);
6832 [DllImport ("libX11", EntryPoint="XGetIconSizes")]
6833 internal extern static int _XGetIconSizes(IntPtr display, IntPtr window, out IntPtr size_list, out int count);
6834 internal static int XGetIconSizes(IntPtr display, IntPtr window, out IntPtr size_list, out int count) {
6835 DebugHelper.TraceWriteLine ("XGetIconSizes");
6836 return _XGetIconSizes(display, window, out size_list, out count);
6839 [DllImport ("libX11", EntryPoint="XSetErrorHandler")]
6840 internal extern static IntPtr _XSetErrorHandler(XErrorHandler error_handler);
6841 internal static IntPtr XSetErrorHandler(XErrorHandler error_handler) {
6842 DebugHelper.TraceWriteLine ("XSetErrorHandler");
6843 return _XSetErrorHandler(error_handler);
6846 [DllImport ("libX11", EntryPoint="XGetErrorText")]
6847 internal extern static IntPtr _XGetErrorText(IntPtr display, byte code, StringBuilder buffer, int length);
6848 internal static IntPtr XGetErrorText(IntPtr display, byte code, StringBuilder buffer, int length) {
6849 DebugHelper.TraceWriteLine ("XGetErrorText");
6850 return _XGetErrorText(display, code, buffer, length);
6853 [DllImport ("libX11", EntryPoint="XInitThreads")]
6854 internal extern static int _XInitThreads();
6855 internal static int XInitThreads() {
6856 DebugHelper.TraceWriteLine ("XInitThreads");
6857 return _XInitThreads();
6860 [DllImport ("libX11", EntryPoint="XConvertSelection")]
6861 internal extern static int _XConvertSelection(IntPtr display, IntPtr selection, IntPtr target, IntPtr property, IntPtr requestor, IntPtr time);
6862 internal static int XConvertSelection(IntPtr display, IntPtr selection, IntPtr target, IntPtr property, IntPtr requestor, IntPtr time) {
6863 DebugHelper.TraceWriteLine ("XConvertSelection");
6864 return _XConvertSelection(display, selection, target, property, requestor, time);
6867 [DllImport ("libX11", EntryPoint="XGetSelectionOwner")]
6868 internal extern static IntPtr _XGetSelectionOwner(IntPtr display, IntPtr selection);
6869 internal static IntPtr XGetSelectionOwner(IntPtr display, IntPtr selection) {
6870 DebugHelper.TraceWriteLine ("XGetSelectionOwner");
6871 return _XGetSelectionOwner(display, selection);
6874 [DllImport ("libX11", EntryPoint="XSetSelectionOwner")]
6875 internal extern static int _XSetSelectionOwner(IntPtr display, IntPtr selection, IntPtr owner, IntPtr time);
6876 internal static int XSetSelectionOwner(IntPtr display, IntPtr selection, IntPtr owner, IntPtr time) {
6877 DebugHelper.TraceWriteLine ("XSetSelectionOwner");
6878 return _XSetSelectionOwner(display, selection, owner, time);
6881 [DllImport ("libX11", EntryPoint="XSetPlaneMask")]
6882 internal extern static int _XSetPlaneMask(IntPtr display, IntPtr gc, IntPtr mask);
6883 internal static int XSetPlaneMask(IntPtr display, IntPtr gc, IntPtr mask) {
6884 DebugHelper.TraceWriteLine ("XSetPlaneMask");
6885 return _XSetPlaneMask(display, gc, mask);
6888 [DllImport ("libX11", EntryPoint="XSetForeground")]
6889 internal extern static int _XSetForeground(IntPtr display, IntPtr gc, UIntPtr foreground);
6890 internal static int XSetForeground(IntPtr display, IntPtr gc, UIntPtr foreground) {
6891 DebugHelper.TraceWriteLine ("XSetForeground");
6892 return _XSetForeground(display, gc, foreground);
6895 [DllImport ("libX11", EntryPoint="XSetBackground")]
6896 internal extern static int _XSetBackground(IntPtr display, IntPtr gc, UIntPtr background);
6897 internal static int XSetBackground(IntPtr display, IntPtr gc, UIntPtr background) {
6898 DebugHelper.TraceWriteLine ("XSetBackground");
6899 return _XSetBackground(display, gc, background);
6902 [DllImport ("libX11", EntryPoint="XBell")]
6903 internal extern static int _XBell(IntPtr display, int percent);
6904 internal static int XBell(IntPtr display, int percent) {
6905 DebugHelper.TraceWriteLine ("XBell");
6906 return _XBell(display, percent);
6909 [DllImport ("libX11", EntryPoint="XChangeActivePointerGrab")]
6910 internal extern static int _XChangeActivePointerGrab (IntPtr display, EventMask event_mask, IntPtr cursor, IntPtr time);
6911 internal static int XChangeActivePointerGrab (IntPtr display, EventMask event_mask, IntPtr cursor, IntPtr time) {
6912 DebugHelper.TraceWriteLine ("XChangeActivePointerGrab");
6913 return _XChangeActivePointerGrab (display, event_mask, cursor, time);
6916 [DllImport ("libX11", EntryPoint="XFilterEvent")]
6917 internal extern static bool _XFilterEvent(ref XEvent xevent, IntPtr window);
6918 internal static bool XFilterEvent(ref XEvent xevent, IntPtr window) {
6919 DebugHelper.TraceWriteLine ("XFilterEvent");
6920 return _XFilterEvent(ref xevent, window);
6923 [DllImport ("libX11", EntryPoint="XkbSetDetectableAutoRepeat")]
6924 internal extern static void _XkbSetDetectableAutoRepeat (IntPtr display, bool detectable, IntPtr supported);
6925 internal static void XkbSetDetectableAutoRepeat (IntPtr display, bool detectable, IntPtr supported) {
6926 DebugHelper.TraceWriteLine ("XkbSetDetectableAutoRepeat");
6927 _XkbSetDetectableAutoRepeat (display, detectable, supported);
6930 [DllImport ("libX11", EntryPoint="XPeekEvent")]
6931 internal extern static void _XPeekEvent (IntPtr display, ref XEvent xevent);
6932 internal static void XPeekEvent (IntPtr display, ref XEvent xevent) {
6933 DebugHelper.TraceWriteLine ("XPeekEvent");
6934 _XPeekEvent (display, ref xevent);
6937 [DllImport ("libX11", EntryPoint="XIfEvent")]
6938 internal extern static void _XIfEvent (IntPtr display, ref XEvent xevent, Delegate event_predicate, IntPtr arg);
6939 internal static void XIfEvent (IntPtr display, ref XEvent xevent, Delegate event_predicate, IntPtr arg) {
6940 DebugHelper.TraceWriteLine ("XIfEvent");
6941 _XIfEvent (display, ref xevent, event_predicate, arg);
6946 #else //no TRACE defined
6948 #region Xcursor imports
6949 [DllImport ("libXcursor", EntryPoint = "XcursorLibraryLoadCursor")]
6950 internal extern static IntPtr XcursorLibraryLoadCursor (IntPtr display, [MarshalAs (UnmanagedType.LPStr)] string name);
6952 [DllImport ("libXcursor", EntryPoint = "XcursorLibraryLoadImages")]
6953 internal extern static IntPtr XcursorLibraryLoadImages ([MarshalAs (UnmanagedType.LPStr)] string file, IntPtr theme, int size);
6955 [DllImport ("libXcursor", EntryPoint = "XcursorImagesDestroy")]
6956 internal extern static void XcursorImagesDestroy (IntPtr images);
6958 [DllImport ("libXcursor", EntryPoint = "XcursorGetDefaultSize")]
6959 internal extern static int XcursorGetDefaultSize (IntPtr display);
6961 [DllImport ("libXcursor", EntryPoint = "XcursorImageLoadCursor")]
6962 internal extern static IntPtr XcursorImageLoadCursor (IntPtr display, IntPtr image);
6964 [DllImport ("libXcursor", EntryPoint = "XcursorGetTheme")]
6965 internal extern static IntPtr XcursorGetTheme (IntPtr display);
6968 [DllImport ("libX11", EntryPoint="XOpenDisplay")]
6969 internal extern static IntPtr XOpenDisplay(IntPtr display);
6970 [DllImport ("libX11", EntryPoint="XCloseDisplay")]
6971 internal extern static int XCloseDisplay(IntPtr display);
6972 [DllImport ("libX11", EntryPoint="XSynchronize")]
6973 internal extern static IntPtr XSynchronize(IntPtr display, bool onoff);
6975 [DllImport ("libX11", EntryPoint="XCreateWindow")]
6976 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, UIntPtr valuemask, ref XSetWindowAttributes attributes);
6978 [DllImport ("libX11", EntryPoint="XCreateSimpleWindow")]
6979 internal extern static IntPtr XCreateSimpleWindow(IntPtr display, IntPtr parent, int x, int y, int width, int height, int border_width, UIntPtr border, UIntPtr background);
6981 [DllImport ("libX11", EntryPoint="XMapWindow")]
6982 internal extern static int XMapWindow(IntPtr display, IntPtr window);
6984 [DllImport ("libX11", EntryPoint="XUnmapWindow")]
6985 internal extern static int XUnmapWindow(IntPtr display, IntPtr window);
6987 [DllImport ("libX11", EntryPoint="XMapSubwindows")]
6988 internal extern static int XMapSubindows(IntPtr display, IntPtr window);
6990 [DllImport ("libX11", EntryPoint="XUnmapSubwindows")]
6991 internal extern static int XUnmapSubwindows(IntPtr display, IntPtr window);
6993 [DllImport ("libX11", EntryPoint="XRootWindow")]
6994 internal extern static IntPtr XRootWindow(IntPtr display, int screen_number);
6996 [DllImport ("libX11", EntryPoint="XNextEvent")]
6997 internal extern static IntPtr XNextEvent(IntPtr display, ref XEvent xevent);
6999 [DllImport ("libX11", EntryPoint="XConnectionNumber")]
7000 internal extern static int XConnectionNumber (IntPtr display);
7002 [DllImport ("libX11", EntryPoint="XPending")]
7003 internal extern static int XPending (IntPtr display);
7005 [DllImport ("libX11", EntryPoint="XSelectInput")]
7006 internal extern static IntPtr XSelectInput(IntPtr display, IntPtr window, IntPtr mask);
7008 [DllImport ("libX11", EntryPoint="XDestroyWindow")]
7009 internal extern static int XDestroyWindow(IntPtr display, IntPtr window);
7011 [DllImport ("libX11", EntryPoint="XReparentWindow")]
7012 internal extern static int XReparentWindow(IntPtr display, IntPtr window, IntPtr parent, int x, int y);
7014 [DllImport ("libX11", EntryPoint="XMoveResizeWindow")]
7015 private extern static int XMoveResizeWindow(IntPtr display, IntPtr window, int x, int y, int width, int height);
7016 internal static int MoveResizeWindow(IntPtr display, IntPtr window, int x, int y, int width, int height)
7018 int ret = XMoveResizeWindow (display, window, x, y, width, height);
7019 Keyboard.MoveCurrentCaretPos ();
7023 [DllImport ("libX11", EntryPoint="XResizeWindow")]
7024 internal extern static int XResizeWindow(IntPtr display, IntPtr window, int width, int height);
7026 [DllImport ("libX11", EntryPoint="XGetWindowAttributes")]
7027 internal extern static int XGetWindowAttributes(IntPtr display, IntPtr window, ref XWindowAttributes attributes);
7029 [DllImport ("libX11", EntryPoint="XFlush")]
7030 internal extern static int XFlush(IntPtr display);
7032 [DllImport ("libX11", EntryPoint="XSetWMName")]
7033 internal extern static int XSetWMName(IntPtr display, IntPtr window, ref XTextProperty text_prop);
7035 [DllImport ("libX11", EntryPoint="XStoreName")]
7036 internal extern static int XStoreName(IntPtr display, IntPtr window, string window_name);
7038 [DllImport ("libX11", EntryPoint="XFetchName")]
7039 internal extern static int XFetchName(IntPtr display, IntPtr window, ref IntPtr window_name);
7041 [DllImport ("libX11", EntryPoint="XSendEvent")]
7042 internal extern static int XSendEvent(IntPtr display, IntPtr window, bool propagate, IntPtr event_mask, ref XEvent send_event);
7044 [DllImport ("libX11", EntryPoint="XQueryTree")]
7045 internal extern static int XQueryTree(IntPtr display, IntPtr window, out IntPtr root_return, out IntPtr parent_return, out IntPtr children_return, out int nchildren_return);
7047 [DllImport ("libX11", EntryPoint="XFree")]
7048 internal extern static int XFree(IntPtr data);
7050 [DllImport ("libX11", EntryPoint="XRaiseWindow")]
7051 internal extern static int XRaiseWindow(IntPtr display, IntPtr window);
7053 [DllImport ("libX11", EntryPoint="XLowerWindow")]
7054 internal extern static uint XLowerWindow(IntPtr display, IntPtr window);
7056 [DllImport ("libX11", EntryPoint="XConfigureWindow")]
7057 internal extern static uint XConfigureWindow(IntPtr display, IntPtr window, ChangeWindowFlags value_mask, ref XWindowChanges values);
7059 [DllImport ("libX11", EntryPoint="XInternAtom")]
7060 internal extern static IntPtr XInternAtom(IntPtr display, string atom_name, bool only_if_exists);
7062 [DllImport ("libX11", EntryPoint="XInternAtoms")]
7063 internal extern static int XInternAtoms(IntPtr display, string[] atom_names, int atom_count, bool only_if_exists, IntPtr[] atoms);
7065 [DllImport ("libX11", EntryPoint="XSetWMProtocols")]
7066 internal extern static int XSetWMProtocols(IntPtr display, IntPtr window, IntPtr[] protocols, int count);
7068 [DllImport ("libX11", EntryPoint="XGrabPointer")]
7069 internal extern static int XGrabPointer(IntPtr display, IntPtr window, bool owner_events, EventMask event_mask, GrabMode pointer_mode, GrabMode keyboard_mode, IntPtr confine_to, IntPtr cursor, IntPtr timestamp);
7071 [DllImport ("libX11", EntryPoint="XUngrabPointer")]
7072 internal extern static int XUngrabPointer(IntPtr display, IntPtr timestamp);
7074 [DllImport ("libX11", EntryPoint="XQueryPointer")]
7075 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);
7077 [DllImport ("libX11", EntryPoint="XTranslateCoordinates")]
7078 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);
7080 [DllImport ("libX11", EntryPoint="XGetGeometry")]
7081 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);
7083 [DllImport ("libX11", EntryPoint="XGetGeometry")]
7084 internal extern static bool XGetGeometry(IntPtr display, IntPtr window, IntPtr root, out int x, out int y, out int width, out int height, IntPtr border_width, IntPtr depth);
7086 [DllImport ("libX11", EntryPoint="XGetGeometry")]
7087 internal extern static bool XGetGeometry(IntPtr display, IntPtr window, IntPtr root, out int x, out int y, IntPtr width, IntPtr height, IntPtr border_width, IntPtr depth);
7089 [DllImport ("libX11", EntryPoint="XGetGeometry")]
7090 internal extern static bool XGetGeometry(IntPtr display, IntPtr window, IntPtr root, IntPtr x, IntPtr y, out int width, out int height, IntPtr border_width, IntPtr depth);
7092 [DllImport ("libX11", EntryPoint="XWarpPointer")]
7093 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);
7095 [DllImport ("libX11", EntryPoint="XClearWindow")]
7096 internal extern static int XClearWindow(IntPtr display, IntPtr window);
7098 [DllImport ("libX11", EntryPoint="XClearArea")]
7099 internal extern static int XClearArea(IntPtr display, IntPtr window, int x, int y, int width, int height, bool exposures);
7102 [DllImport ("libX11", EntryPoint="XDefaultScreenOfDisplay")]
7103 internal extern static IntPtr XDefaultScreenOfDisplay(IntPtr display);
7105 [DllImport ("libX11", EntryPoint="XScreenNumberOfScreen")]
7106 internal extern static int XScreenNumberOfScreen(IntPtr display, IntPtr Screen);
7108 [DllImport ("libX11", EntryPoint="XDefaultVisual")]
7109 internal extern static IntPtr XDefaultVisual(IntPtr display, int screen_number);
7111 [DllImport ("libX11", EntryPoint="XDefaultDepth")]
7112 internal extern static uint XDefaultDepth(IntPtr display, int screen_number);
7114 [DllImport ("libX11", EntryPoint="XDefaultScreen")]
7115 internal extern static int XDefaultScreen(IntPtr display);
7117 [DllImport ("libX11", EntryPoint="XDefaultColormap")]
7118 internal extern static IntPtr XDefaultColormap(IntPtr display, int screen_number);
7120 [DllImport ("libX11", EntryPoint="XLookupColor")]
7121 internal extern static int XLookupColor(IntPtr display, IntPtr Colormap, string Coloranem, ref XColor exact_def_color, ref XColor screen_def_color);
7123 [DllImport ("libX11", EntryPoint="XAllocColor")]
7124 internal extern static int XAllocColor(IntPtr display, IntPtr Colormap, ref XColor colorcell_def);
7126 [DllImport ("libX11", EntryPoint="XSetTransientForHint")]
7127 internal extern static int XSetTransientForHint(IntPtr display, IntPtr window, IntPtr prop_window);
7129 [DllImport ("libX11", EntryPoint="XChangeProperty")]
7130 internal extern static int XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, ref MotifWmHints data, int nelements);
7132 [DllImport ("libX11", EntryPoint="XChangeProperty")]
7133 internal extern static int XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, ref uint value, int nelements);
7135 [DllImport ("libX11", EntryPoint="XChangeProperty")]
7136 internal extern static int XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, ref IntPtr value, int nelements);
7138 [DllImport ("libX11", EntryPoint="XChangeProperty")]
7139 internal extern static int XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, uint[] data, int nelements);
7141 [DllImport ("libX11", EntryPoint="XChangeProperty")]
7142 internal extern static int XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, int[] data, int nelements);
7144 [DllImport ("libX11", EntryPoint="XChangeProperty")]
7145 internal extern static int XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, IntPtr[] data, int nelements);
7147 [DllImport ("libX11", EntryPoint="XChangeProperty")]
7148 internal extern static int XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, IntPtr atoms, int nelements);
7150 [DllImport ("libX11", EntryPoint="XChangeProperty", CharSet=CharSet.Ansi)]
7151 internal extern static int XChangeProperty(IntPtr display, IntPtr window, IntPtr property, IntPtr type, int format, PropertyMode mode, string text, int text_length);
7153 [DllImport ("libX11", EntryPoint="XDeleteProperty")]
7154 internal extern static int XDeleteProperty(IntPtr display, IntPtr window, IntPtr property);
7157 [DllImport ("libX11", EntryPoint="XCreateGC")]
7158 internal extern static IntPtr XCreateGC(IntPtr display, IntPtr window, IntPtr valuemask, ref XGCValues values);
7160 [DllImport ("libX11", EntryPoint="XFreeGC")]
7161 internal extern static int XFreeGC(IntPtr display, IntPtr gc);
7163 [DllImport ("libX11", EntryPoint="XSetFunction")]
7164 internal extern static int XSetFunction(IntPtr display, IntPtr gc, GXFunction function);
7166 [DllImport ("libX11", EntryPoint="XSetLineAttributes")]
7167 internal extern static int XSetLineAttributes(IntPtr display, IntPtr gc, int line_width, GCLineStyle line_style, GCCapStyle cap_style, GCJoinStyle join_style);
7169 [DllImport ("libX11", EntryPoint="XDrawLine")]
7170 internal extern static int XDrawLine(IntPtr display, IntPtr drawable, IntPtr gc, int x1, int y1, int x2, int y2);
7172 [DllImport ("libX11", EntryPoint="XDrawRectangle")]
7173 internal extern static int XDrawRectangle(IntPtr display, IntPtr drawable, IntPtr gc, int x1, int y1, int width, int height);
7175 [DllImport ("libX11", EntryPoint="XFillRectangle")]
7176 internal extern static int XFillRectangle(IntPtr display, IntPtr drawable, IntPtr gc, int x1, int y1, int width, int height);
7178 [DllImport ("libX11", EntryPoint="XSetWindowBackground")]
7179 internal extern static int XSetWindowBackground(IntPtr display, IntPtr window, IntPtr background);
7181 [DllImport ("libX11", EntryPoint="XCopyArea")]
7182 internal extern static int XCopyArea(IntPtr display, IntPtr src, IntPtr dest, IntPtr gc, int src_x, int src_y, int width, int height, int dest_x, int dest_y);
7184 [DllImport ("libX11", EntryPoint="XGetWindowProperty")]
7185 internal extern static int XGetWindowProperty(IntPtr display, IntPtr window, IntPtr atom, IntPtr long_offset, IntPtr long_length, bool delete, IntPtr req_type, out IntPtr actual_type, out int actual_format, out IntPtr nitems, out IntPtr bytes_after, ref IntPtr prop);
7187 [DllImport ("libX11", EntryPoint="XSetInputFocus")]
7188 internal extern static int XSetInputFocus(IntPtr display, IntPtr window, RevertTo revert_to, IntPtr time);
7190 [DllImport ("libX11", EntryPoint="XIconifyWindow")]
7191 internal extern static int XIconifyWindow(IntPtr display, IntPtr window, int screen_number);
7193 [DllImport ("libX11", EntryPoint="XDefineCursor")]
7194 internal extern static int XDefineCursor(IntPtr display, IntPtr window, IntPtr cursor);
7196 [DllImport ("libX11", EntryPoint="XUndefineCursor")]
7197 internal extern static int XUndefineCursor(IntPtr display, IntPtr window);
7199 [DllImport ("libX11", EntryPoint="XFreeCursor")]
7200 internal extern static int XFreeCursor(IntPtr display, IntPtr cursor);
7202 [DllImport ("libX11", EntryPoint="XCreateFontCursor")]
7203 internal extern static IntPtr XCreateFontCursor(IntPtr display, CursorFontShape shape);
7205 [DllImport ("libX11", EntryPoint="XCreatePixmapCursor")]
7206 internal extern static IntPtr XCreatePixmapCursor(IntPtr display, IntPtr source, IntPtr mask, ref XColor foreground_color, ref XColor background_color, int x_hot, int y_hot);
7208 [DllImport ("libX11", EntryPoint="XCreatePixmapFromBitmapData")]
7209 internal extern static IntPtr XCreatePixmapFromBitmapData(IntPtr display, IntPtr drawable, byte[] data, int width, int height, IntPtr fg, IntPtr bg, int depth);
7211 [DllImport ("libX11", EntryPoint="XCreatePixmap")]
7212 internal extern static IntPtr XCreatePixmap(IntPtr display, IntPtr d, int width, int height, int depth);
7214 [DllImport ("libX11", EntryPoint="XFreePixmap")]
7215 internal extern static IntPtr XFreePixmap(IntPtr display, IntPtr pixmap);
7217 [DllImport ("libX11", EntryPoint="XQueryBestCursor")]
7218 internal extern static int XQueryBestCursor(IntPtr display, IntPtr drawable, int width, int height, out int best_width, out int best_height);
7220 [DllImport ("libX11", EntryPoint="XQueryExtension")]
7221 internal extern static int XQueryExtension(IntPtr display, string extension_name, ref int major, ref int first_event, ref int first_error);
7223 [DllImport ("libX11", EntryPoint="XWhitePixel")]
7224 internal extern static IntPtr XWhitePixel(IntPtr display, int screen_no);
7226 [DllImport ("libX11", EntryPoint="XBlackPixel")]
7227 internal extern static IntPtr XBlackPixel(IntPtr display, int screen_no);
7229 [DllImport ("libX11", EntryPoint="XGrabServer")]
7230 internal extern static void XGrabServer(IntPtr display);
7232 [DllImport ("libX11", EntryPoint="XUngrabServer")]
7233 internal extern static void XUngrabServer(IntPtr display);
7235 [DllImport ("libX11", EntryPoint="XGetWMNormalHints")]
7236 internal extern static void XGetWMNormalHints(IntPtr display, IntPtr window, ref XSizeHints hints, out IntPtr supplied_return);
7238 [DllImport ("libX11", EntryPoint="XSetWMNormalHints")]
7239 internal extern static void XSetWMNormalHints(IntPtr display, IntPtr window, ref XSizeHints hints);
7241 [DllImport ("libX11", EntryPoint="XSetZoomHints")]
7242 internal extern static void XSetZoomHints(IntPtr display, IntPtr window, ref XSizeHints hints);
7244 [DllImport ("libX11", EntryPoint="XSetWMHints")]
7245 internal extern static void XSetWMHints(IntPtr display, IntPtr window, ref XWMHints wmhints);
7247 [DllImport ("libX11", EntryPoint="XGetIconSizes")]
7248 internal extern static int XGetIconSizes(IntPtr display, IntPtr window, out IntPtr size_list, out int count);
7250 [DllImport ("libX11", EntryPoint="XSetErrorHandler")]
7251 internal extern static IntPtr XSetErrorHandler(XErrorHandler error_handler);
7253 [DllImport ("libX11", EntryPoint="XGetErrorText")]
7254 internal extern static IntPtr XGetErrorText(IntPtr display, byte code, StringBuilder buffer, int length);
7256 [DllImport ("libX11", EntryPoint="XInitThreads")]
7257 internal extern static int XInitThreads();
7259 [DllImport ("libX11", EntryPoint="XConvertSelection")]
7260 internal extern static int XConvertSelection(IntPtr display, IntPtr selection, IntPtr target, IntPtr property, IntPtr requestor, IntPtr time);
7262 [DllImport ("libX11", EntryPoint="XGetSelectionOwner")]
7263 internal extern static IntPtr XGetSelectionOwner(IntPtr display, IntPtr selection);
7265 [DllImport ("libX11", EntryPoint="XSetSelectionOwner")]
7266 internal extern static int XSetSelectionOwner(IntPtr display, IntPtr selection, IntPtr owner, IntPtr time);
7268 [DllImport ("libX11", EntryPoint="XSetPlaneMask")]
7269 internal extern static int XSetPlaneMask(IntPtr display, IntPtr gc, IntPtr mask);
7271 [DllImport ("libX11", EntryPoint="XSetForeground")]
7272 internal extern static int XSetForeground(IntPtr display, IntPtr gc, UIntPtr foreground);
7274 [DllImport ("libX11", EntryPoint="XSetBackground")]
7275 internal extern static int XSetBackground(IntPtr display, IntPtr gc, UIntPtr background);
7277 [DllImport ("libX11", EntryPoint="XBell")]
7278 internal extern static int XBell(IntPtr display, int percent);
7280 [DllImport ("libX11", EntryPoint="XChangeActivePointerGrab")]
7281 internal extern static int XChangeActivePointerGrab (IntPtr display, EventMask event_mask, IntPtr cursor, IntPtr time);
7283 [DllImport ("libX11", EntryPoint="XFilterEvent")]
7284 internal extern static bool XFilterEvent(ref XEvent xevent, IntPtr window);
7286 [DllImport ("libX11", EntryPoint="XkbSetDetectableAutoRepeat")]
7287 internal extern static void XkbSetDetectableAutoRepeat (IntPtr display, bool detectable, IntPtr supported);
7289 [DllImport ("libX11", EntryPoint="XPeekEvent")]
7290 internal extern static void XPeekEvent (IntPtr display, ref XEvent xevent);
7292 [DllImport ("libX11", EntryPoint="XIfEvent")]
7293 internal extern static void XIfEvent (IntPtr display, ref XEvent xevent, Delegate event_predicate, IntPtr arg);